VectorXd math_ext::interpolate_y(const VectorXd &x_in, const VectorXd &y_in, const VectorXd &y_out)
{
    const int n=x_in.size(), m=y_out.size();
    VectorXd x_out(m);
    for(int n1=0;n1<m;++n1)
    {
        if(y_out(n1)<=y_in(0))
        {
            //x_out(n1)=x_in(0)+(y_out(n1)-y_in(0))*(x_in(1)-x_in(0))/(y_in(1)-y_in(0));
            x_out(n1)=x_in(0);
            continue;
        }
        else if(y_out(n1)>=y_in(n-1))
        {
            //x_out(n1)=x_in(n-1)+(y_out(n1)-y_in(n-1))*(x_in(n-2)-x_in(n-1))/(y_in(n-2)-y_in(n-1));
            x_out(n1)=x_in(n-1);
            continue;
        }
        for(int n2=1;n2<n;++n2)
        {
            if(y_out(n1)>y_in(n2-1) && y_out(n1)<=y_in(n2))
            {
                x_out(n1)=x_in(n2-1)+(x_in(n2)-x_in(n2-1))*(y_out(n1)-y_in(n2-1))/(y_in(n2)-y_in(n2-1));
                break;
            }
            else
                continue;
        }
    }
    return(x_out);
}
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
const QString QmvTuple::htmlLabel()
{
    QString label;
    QTextOStream x_out(&label);

        // remove plurals
    QString title = parentClass()->relationTitle() ;
    title.replace( QRegExp("s$"), "" );
    
    x_out << "<table width=100% cellpadding=0 cellspacing=0>";
    x_out << QString("<tr><th bgcolor=yellow align=left colspan=2>%1 Details</th></tr>")
        .arg( title);

    QmvAttList attlist = parent_class->sortedAttlist( "mtat_view_order",
                                                      QmvClass::NoBlank|QmvClass::NoSystem|QmvClass::NoZero );

    for (QmvAttribute * at_ptr = attlist.first(); at_ptr != 0; at_ptr = attlist.next())
    {
        QString value = attributeValue(at_ptr->attributeName());
        switch ( at_ptr->inputMethod() )
        {
            case QmvAttribute::Colour:
                    // strip the alpha value (expecting form .. #AARRGGBB
                value.replace(1, 2, "");
                x_out << QString("<tr><td>%1:</td><td bgcolor=%2></td></tr>")
                    .arg(at_ptr->attributeTitle())
                    .arg(value);

                break;

            default:
                x_out << QString("<tr><td>%1:</td><td><strong>%2</strong></td></tr>")
                    .arg(at_ptr->attributeTitle())
                    .arg(value);
                break;
        }
    }
    
    x_out << "</table>";
    
    return label;
}