コード例 #1
0
   VariableSet GeneralConstraint::differenceVariables( const VariableSet& vs1,
                                                       const VariableSet& vs2 )
   {
      VariableSet tempSet;
      for(VariableSet::const_iterator it=vs1.begin();
         it!=vs1.end();
         ++it)
      {
         VariableSet::const_iterator it2 = vs2.find(*it);
         if(it2==vs2.end()) tempSet.insert(*it);
      }
      for(VariableSet::const_iterator it=vs2.begin();
         it!=vs2.end();
         ++it)
      {
         VariableSet::const_iterator it2 = vs1.find(*it);
         if(it2==vs1.end()) tempSet.insert(*it);
      }

      return tempSet;

   }  // End of method 'GeneralConstraint::differenceVariables()'
コード例 #2
0
ファイル: Variable.cpp プロジェクト: iangodin/constructor
void merge( VariableSet &vs, const VariableSet &other )
{
	if ( vs.empty() )
		vs = other;
	else
	{
		for ( auto i: other )
		{
			auto cur = vs.find( i.first );
			if ( cur == vs.end() )
			{
				vs.emplace( std::make_pair( i.first, i.second ) );
			}
			else
				cur->second.merge( i.second );
		}
	}
}
コード例 #3
0
   GeneralConstraint& GeneralConstraint::changeState(
                                               const VariableList& varList,
                                               const Matrix<double>& convertMat)
   {
      VariableSet allVariable = getCurrentUnknowns();

      // check input 
      int varNum(0);
      for(VariableList::const_iterator it = varList.begin();
          it!=varList.end();
          ++it)
      {
         if(allVariable.find(*it)==allVariable.end())
         {
            Exception e("The variable doesn't exist in the solver.");
            GPSTK_THROW(e);
         }

         varNum++;
      }
      
      if(varNum!=convertMat.rows() || varNum!=convertMat.cols())
      {
         Exception e("The size of input doesn't match.");
         GPSTK_THROW(e);
      }

      const int numOfVar(varNum);

      Vector<double> vectorOfSolution(numOfVar,0.0);
      Matrix<double> matrixOfCovariance(numOfVar,numOfVar,0.0);

      int i = 0;
      for(VariableList::const_iterator iti = varList.begin();
          iti != varList.end();
          ++iti)
      {
         vectorOfSolution(i) = solver.getSolution(*iti);

         VariableList tempList(varList);

         int j(0);
         for(VariableList::iterator itj = tempList.begin();
            itj!=tempList.end();
            ++itj)
         {
            matrixOfCovariance(i,j) = solver.getCovariance(*iti,*itj);

            j++;
         }

         i++;
      }

      Vector<double> solution = convertMat*vectorOfSolution;
      Matrix<double> covariance = convertMat*matrixOfCovariance
                                 *transpose(convertMat);

      i = 0;
      for(VariableList::const_iterator iti=varList.begin();
         iti!=varList.end();
         ++iti)
      {
         setSolution(*iti,solution(i));

         std::list<Variable> tempList(varList);

         int j(0);
         for(std::list<Variable>::iterator itj = tempList.begin();
            itj!=tempList.end();
            ++itj)
         {
            setCovariance(*iti,*itj,covariance(i,j));

            j++;
         }

         i++;
      }
      
      return (*this);

   }  // Ebd if method 'GeneralConstraint::changeState()'
コード例 #4
0
ファイル: Stepper.cpp プロジェクト: ecell/spatiocyte
void Stepper::unregisterProcess( Process* aProcess )
{ 
    ProcessVector::iterator ip( std::find( theProcessVector.begin(), 
                                    theProcessVector.end(),
                                    aProcess ) );
    
    if( ip == theProcessVector.end() )
    {
        THROW_EXCEPTION_INSIDE( NotFound,
                                asString() + ": Failed to dissociate [" +
                                aProcess->asString() + "] (no such Process is "
                                "associated to this stepper)" );
    }

    typedef std::set< Variable* > VariableSet;
    VariableSet aVarSet;
    Process::VariableReferenceVector const& aVarRefVector(
        aProcess->getVariableReferenceVector() );
    std::transform( aVarRefVector.begin(), aVarRefVector.end(),
                    inserter( aVarSet, aVarSet.begin() ),
                    std::mem_fun_ref( &VariableReference::getVariable ) );

    VariableVector aNewVector;
    VariableVector::size_type aReadWriteVariableOffset,
                             aReadOnlyVariableOffset;

    for( VariableVector::iterator i( theVariableVector.begin() ),
                                  e( theVariableVector.begin()
                                     + theReadWriteVariableOffset );
         i != e; ++i )
    {
        VariableSet::iterator j( aVarSet.find( *i ) );
        if ( j != aVarSet.end() )
            aVarSet.erase( j );
        else
            aNewVector.push_back( *i );
    }

    aReadWriteVariableOffset = aNewVector.size();

    for( VariableVector::iterator i( theVariableVector.begin()
                                     + theReadWriteVariableOffset ),
                                  e( theVariableVector.begin()
                                     + theReadOnlyVariableOffset );
         i != e; ++i )
    {
        VariableSet::iterator j( aVarSet.find( *i ) );
        if ( j != aVarSet.end() )
            aVarSet.erase( j );
        else
            aNewVector.push_back( *i );
    }

    aReadOnlyVariableOffset = aNewVector.size();

    for( VariableVector::iterator i( theVariableVector.begin()
                                     + theReadOnlyVariableOffset ),
                                  e( theVariableVector.end() );
         i != e; ++i )
    {
        VariableSet::iterator j( aVarSet.find( *i ) );
        if ( j != aVarSet.end() )
            aVarSet.erase( j );
        else
            aNewVector.push_back( *i );
    }

    theVariableVector.swap( aNewVector );
    theReadWriteVariableOffset = aReadWriteVariableOffset;
    theReadOnlyVariableOffset = aReadOnlyVariableOffset;

    theProcessVector.erase( ip );
}