1 #ifndef EVENTVARIABLEFIRETIME_H
3 #define EVENTVARIABLEFIRETIME_H
5 #include "simpactevent.h"
9 class EventVariableFireTime_Helper
12 EventVariableFireTime_Helper() { m_fireTime = -1; m_alpha = -1; }
13 ~EventVariableFireTime_Helper() { }
15 void checkFireTime(
double t) { assert(std::abs(m_fireTime - t) < 1e-8); }
16 void setFireTime(
double tFire);
17 double getFireTime()
const { assert(m_fireTime);
return m_fireTime; }
20 double calculateInternalTimeInterval(
const State *pState,
double t0,
double dt,
const EventBase *pEvt);
21 double solveForRealTimeInterval(
const State *pState,
double Tdiff,
double t0,
const EventBase *pEvt);
23 void calculateScaleFactor(
double currentTime,
const EventBase *pEvt);
31 class EventVariableFireTime :
public SimpactEvent
34 EventVariableFireTime() : SimpactEvent() { }
35 EventVariableFireTime(Person *pPerson) : SimpactEvent(pPerson) { }
36 EventVariableFireTime(Person *pPerson1, Person *pPerson2) : SimpactEvent(pPerson1, pPerson2) { }
37 ~EventVariableFireTime() { }
39 void checkFireTime(
double t) { m_helper.checkFireTime(t); }
41 void fire(
State *pState,
double t) { m_helper.checkFireTime(t); }
42 void setFireTime(
double tFire) { m_helper.setFireTime(tFire); }
43 double getFireTime()
const {
return m_helper.getFireTime(); }
45 double getNewInternalTimeDifference(
GslRandomNumberGenerator *pRndGen,
const State *pState) {
return m_helper.getNewInternalTimeDifference(pRndGen, pState); }
46 double calculateInternalTimeInterval(
const State *pState,
double t0,
double dt) {
return m_helper.calculateInternalTimeInterval(pState, t0, dt,
this); }
47 double solveForRealTimeInterval(
const State *pState,
double Tdiff,
double t0) {
return m_helper.solveForRealTimeInterval(pState, Tdiff, t0,
this); }
49 EventVariableFireTime_Helper m_helper;
53 inline void EventVariableFireTime_Helper::setFireTime(
double tFire)
63 assert(m_fireTime > 0);
71 inline double EventVariableFireTime_Helper::calculateInternalTimeInterval(
const State *pState,
double t0,
double dt,
const EventBase *pEvt)
74 calculateScaleFactor(t0, pEvt);
76 double dT = dt * m_alpha;
80 inline double EventVariableFireTime_Helper::solveForRealTimeInterval(
const State *pState,
double Tdiff,
double t0,
const EventBase *pEvt)
83 calculateScaleFactor(t0, pEvt);
85 double dt = Tdiff/m_alpha;
89 inline void EventVariableFireTime_Helper::calculateScaleFactor(
double currentTime,
const EventBase *pEvt)
94 double dTleft = pEvt->getInternalTimeLeft();
95 assert(dTleft > 0 && dTleft <= 1.0);
97 double dtLeft = m_fireTime - currentTime;
100 m_alpha = dTleft/dtLeft;
103 #endif // EVENTVARIABLEFIRETIME_H
This class both describes the simulation state and contains the core algorithm (as shown on the main ...
Definition: state.h:40
This class allows you to generate random numbers, and uses the GNU Scientific Library for this...
Definition: gslrandomnumbergenerator.h:16
This is the base class for events in the mNRM algorithm.
Definition: eventbase.h:62