16 # pragma warning (disable: 4786)
17 # pragma warning (disable: 4243)
19 # pragma warning (disable: 4355)
45 mSpeciesMultiplier(0),
49 mDependentReactions(0),
50 mSubstrateMultiplier(0),
57 mSpeciesMultiplier(src.mSpeciesMultiplier),
58 mMethodSpecies(src.mMethodSpecies),
59 mModelSpecies(src.mModelSpecies),
60 mCalculations(src.mCalculations),
61 mDependentReactions(src.mDependentReactions),
62 mSubstrateMultiplier(src.mSubstrateMultiplier),
63 mMethodSubstrates(src.mMethodSubstrates),
64 mModelSubstrates(src.mModelSubstrates),
65 mpParticleFlux(src.mpParticleFlux)
108 mpModel(src.mpModel),
109 mNumReactions(src.mNumReactions),
110 mMaxSteps(src.mMaxSteps),
111 mNextReactionTime(src.mNextReactionTime),
112 mNextReactionIndex(src.mNextReactionIndex),
113 mDoCorrection(src.mDoCorrection),
116 mMethodState(src.mMethodState),
117 mReactionDependencies(src.mReactionDependencies),
118 mMaxStepsReached(src.mMaxStepsReached)
149 while (Time < EndTime)
206 for (; ppEntity != endEntity; ++ppEntity, ++pValue)
208 if (dynamic_cast< const CMetab * >(*ppEntity) != NULL)
210 *pValue = floor(*pValue + 0.5);
224 size_t NumReactions = 0;
230 for (; it != end; ++it)
236 if (Balances.
size() == 0 && Substrates.
size() == 0)
241 itDependencies->mpParticleFlux = (
C_FLOAT64 *)(*it)->getParticleFluxReference()->getValuePointer();
243 itDependencies->mSpeciesMultiplier.resize(Balances.
size());
244 itDependencies->mMethodSpecies.resize(Balances.
size());
245 itDependencies->mModelSpecies.resize(Balances.
size());
247 std::set< const CCopasiObject * > changed;
257 for (; itBalance != endBalance; ++itBalance)
259 const CMetab * pMetab = (*itBalance)->getMetabolite();
263 itDependencies->mSpeciesMultiplier[Index] = floor((*itBalance)->getMultiplicity() + 0.5);
264 itDependencies->mMethodSpecies[Index] = pMethodStateValue + StateTemplate.
getIndex(pMetab);
274 itDependencies->mSpeciesMultiplier.resize(Index,
true);
275 itDependencies->mMethodSpecies.resize(Index,
true);
276 itDependencies->mModelSpecies.resize(Index,
true);
278 itDependencies->mSubstrateMultiplier.resize(Substrates.
size());
279 itDependencies->mMethodSubstrates.resize(Substrates.
size());
280 itDependencies->mModelSubstrates.resize(Substrates.
size());
287 for (; itSubstrate != endSubstrate; ++itSubstrate, ++Index)
289 const CMetab * pMetab = (*itSubstrate)->getMetabolite();
291 itDependencies->mSubstrateMultiplier[Index] = floor((*itSubstrate)->getMultiplicity() + 0.5);
292 itDependencies->mMethodSubstrates[Index] = pMethodStateValue + StateTemplate.
getIndex(pMetab);
296 std::set< const CCopasiObject * > dependend;
304 for (; itReaction != end; ++itReaction, ++Index)
306 if ((*itReaction)->getParticleFluxReference()->dependsOn(changed))
308 dependend.insert((*itReaction)->getParticleFluxReference());
309 itDependencies->mDependentReactions[Count] = Index;
315 itDependencies->mDependentReactions.resize(Count,
true);
376 for (; ppEntity != ppEntityEnd; ++ppEntity)
380 if (dynamic_cast<const CModelValue *>(*ppEntity) != NULL)
386 else if (dynamic_cast<const CCompartment *>(*ppEntity) != NULL)
435 return endTime - curTime;
460 mNextReactionIndex--;
465 return endTime - curTime;
479 for (; pMultiplier != endMultiplier; ++pMultiplier, ++ppLocalSpecies, ++ppModelSpecies)
481 **ppLocalSpecies += *pMultiplier;
482 **ppModelSpecies = **ppLocalSpecies;
486 std::vector< Refresh * >::const_iterator itCalcualtion = Dependencies.
mCalculations.begin();
487 std::vector< Refresh * >::const_iterator endCalcualtion = Dependencies.
mCalculations.end();
489 while (itCalcualtion != endCalcualtion)
491 (**itCalcualtion++)();
501 for (; pDependentReaction != endDependentReactions; ++pDependentReaction)
512 for (; pAmu != endAmu; ++pAmu)
546 bool ApplyCorrection =
false;
553 for (; pMultiplier != endMultiplier; ++pMultiplier, ++ppLocalSubstrate, ++ppModelSubstrate)
555 Multiplicity = *pMultiplier;
558 **ppLocalSubstrate = floor(**ppModelSubstrate + 0.5);
560 if (Multiplicity > 1.01)
562 ApplyCorrection =
true;
564 Number = **ppLocalSubstrate;
566 LowerBound = Number - Multiplicity;
567 SubstrateDevisor *= pow(Number, Multiplicity - 1.0);
570 while (Number > LowerBound)
572 SubstrateMultiplier *= Number;
579 if (SubstrateMultiplier < 0.5 || SubstrateDevisor < 0.5)
591 Amu *= SubstrateMultiplier / SubstrateDevisor;
virtual bool isValidProblem(const CCopasiProblem *pProblem)
CReactionDependencies & operator=(const CReactionDependencies &rhs)
CCopasiVectorN< CEvent > & getEvents()
virtual C_FLOAT64 getRandomOO()
virtual size_t size() const
void calculateAmu(const size_t &index)
std::vector< Refresh * > mCalculations
CVector< C_FLOAT64 > mAmu
void updateSimulatedValues(const bool &updateMoieties)
std::vector< CReactionDependencies > mReactionDependencies
CTrajectoryProblem * mpProblem
void resize(size_t size, const bool ©=false)
size_t getIndex(const CModelEntity *entity) const
virtual bool isValidProblem(const CCopasiProblem *pProblem)
void setTime(const C_FLOAT64 &time)
CVector< C_FLOAT64 > mSpeciesMultiplier
size_t getTotSteps() const
#define MCTrajectoryMethod
CVector< C_FLOAT64 * > mModelSubstrates
std::vector< CType * >::const_iterator const_iterator
CModelEntity ** endFixed()
void setState(const CState &state)
const C_FLOAT64 & getDuration() const
const Value & getValue() const
C_FLOAT64 * mpParticleFlux
C_FLOAT64 mNextReactionTime
virtual void start(const CState *initialState)
C_FLOAT64 doSingleStep(const C_FLOAT64 &curTime, const C_FLOAT64 &endTime)
CModelEntity ** beginIndependent()
unsigned C_INT32 mMaxSteps
CStochDirectMethod(const CCopasiContainer *pParent=NULL)
void setTime(const C_FLOAT64 &time)
const C_FLOAT64 & getTime() const
virtual bool elevateChildren()
const CStateTemplate & getStateTemplate() const
CVector< C_FLOAT64 > mSubstrateMultiplier
CVector< C_FLOAT64 * > mMethodSpecies
const ModelType & getModelType() const
CRandom * mpRandomGenerator
CCopasiVectorNS< CReaction > & getReactions()
static std::vector< Refresh * > buildUpdateSequence(const DataObjectSet &objects, const DataObjectSet &uptoDateObjects, const DataObjectSet &context=DataObjectSet())
virtual void * getValuePointer() const
CVector< size_t > mDependentReactions
CCopasiParameter * assertParameter(const std::string &name, const CCopasiParameter::Type type, const CType &defaultValue)
CVector< C_FLOAT64 * > mMethodSubstrates
const CState & getState() const
const CModelEntity::Status & getStatus() const
CVector< C_FLOAT64 * > mModelSpecies
std::string suitableForStochasticSimulation() const
virtual Status step(const double &deltaT)
CModel * getModel() const
CModelEntity ** endIndependent()
C_FLOAT64 * beginIndependent()
void initializeParameter()
virtual void initialize(unsigned C_INT32 seed=CRandom::getSystemSeed())
CCopasiObject * getValueReference() const
size_t mNextReactionIndex