KendrickOrg/kendrick

Understand how rates are computed in Gillespie and TauLeap algorithms

SergeStinckwich opened this issue · 2 comments

In the following method, the rates for the Gillespie algorithm are computed by multiplying the number of compartments by the probability. Why we are doing that?

Check if this is working for all Kendrick models (including models that are composed of 2 or 3 concerns). Add more tests/examples to check this.

doGillespieIteration: t
	| rates deltaT chosen transitions |
	rates := OrderedCollection new.
	model t: t.
	transitions := model transitions.
	transitions
		do: [ :tr | 
			| prob |
			(tr from at: #status) = #empty
				ifTrue: [ model currentCompartment: tr to ]
				ifFalse: [ model currentCompartment: tr from ].
			model nextCompartment: tr to.
			prob := (tr probability value: model) abs.
			rates add: prob * (model atCompartment: tr from) ].
	rates sum = 0
		ifTrue: [ ^ 0.0 ].
	deltaT := rand2 next ln negated / rates sum.
	chosen := self rouletteWheelSelectAmong: rates.
	(transitions at: chosen) executeOn: model times: 1.
	^ deltaT

Same question for TauLeap algorithm:

doTauLeapIteration: t
	model t: t.
	model transitions
		do: [ :tr | 
			| rate numPoisson prob |
			"model parameters at: #scope put: tr scope.
		model parameters at: #contactingSource put: (tr from)."
			(tr from at: #status) = #empty
				ifTrue: [ model currentCompartment: tr to ]
				ifFalse: [ model currentCompartment: tr from ].
			model nextCompartment: tr to.
			prob := (tr probability value: model) abs.
			"prob isDictionary ifTrue: [ prob := prob values sum ]."
			rate := prob * (model atCompartment: tr from).
			numPoisson := (PMPoissonGenerator lambda: rate * step) next.
			tr executeOn: model times: numPoisson ]

The doGillespieIteration: t method returns deltaT. This method calculates the time interval for moving to a new event.

Since kendrick relies on the compartmental approach and the current version of this method has been implemented to take into account epidemiological models.

In the implementation of this method, we consider that an event can be seen as the existence of a transition. Then the rate of passage from one compartment to another is done with a probability that the event occurs.

Therefore, we consider the total rate (rates) as the product of the probability by the number of compartments

Can we already close this issue?