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() );
}
}
}