void Model::mapRowSeedsToPseudoParameters()

in api/model.cpp [1261:1333]


void Model::mapRowSeedsToPseudoParameters()
{
    // for each pseudoparameter
    for( size_t index = 0; index < GetParameters().size(); ++index )
    {
        Parameter* param = GetParameters()[ index ];
        vector<Parameter*>* comps = param->GetComponents();
        if( comps )
        {
            // Prepare a temporary collection for all seeds being added
            RowSeedCollection newSeeds;
            // This parameter is really a pseudoparameter
            for( RowSeedCollection::iterator iseeds = m_rowSeeds.begin(); iseeds != m_rowSeeds.end(); )
            {
                // partition the seed terms into related, unrelated (to pseudoparam)
                RowSeed relatedTerms, unrelatedTerms;
                for( RowSeed::iterator iseed = iseeds->begin(); iseed != iseeds->end(); ++iseed )
                {
                    if( find( comps->begin(), comps->end(), iseed->first ) == comps->end() )
                    {
                        unrelatedTerms.insert( *iseed );
                    }
                    else
                    {
                        relatedTerms.insert( *iseed );
                    }
                }
                // if any of seed's terms relate to underlying parameters
                if( !relatedTerms.empty() )
                {
                    // Get rid of the seed, since we'll replace it
                    m_rowSeeds.erase( iseeds++ );
                    // for each value of the pseudoparameter
                    for( int vidx = 0; vidx < param->GetValueCount(); ++vidx )
                    {
                        RowSeed::iterator irel;
                        for( irel = relatedTerms.begin(); irel != relatedTerms.end(); ++irel )
                        {
                            vector<Parameter*>::iterator ip = find( comps->begin(), comps->end(), irel->first );
                            if( comps->end() == ip )
                            {
                                break;
                            }
                            int nParam = static_cast<int>( distance( comps->begin(), ip ) );
                            size_t nRealVal = param->GetModel()->GetResults()[ vidx ][ nParam ];
                            if( nRealVal != irel->second )
                            {
                                break;
                            }
                        }
                        // if value is excluded in overlapping underlying params
                        if( relatedTerms.end() == irel )
                        {
                            // generate a new seed using unrelated + this pseudo/value
                            RowSeed newSeed( unrelatedTerms );
                            newSeed.insert( make_pair( param, vidx ) );
                            // Put it into a temporary collection so we don't hit it again on this iteration
                            newSeeds.push_back( newSeed );
                        }
                    }
                }
                else
                {
                    // no new seed, just increment loop iterator
                    ++iseeds;
                }
            }

            // copy all new seeds to the main collection
            __push_back( m_rowSeeds, newSeeds.begin(), newSeeds.end() );
        }
    }
}