From: Rainer M. <ra...@tb...> - 2006-04-19 13:36:35
|
Ok, I'll delete my file and try update again. At the lib/sbml lists people already reported several problems with CVS. It's also strange that the online CVS is some much behind for this file, while having newer versions of other files. Rainer On Wed, 19 Apr 2006, Christoph Flamm wrote: > hi Rainer, > > i also have the declaration, and my cvs is in sync too > > =;) xtof > > Andrew Finney writes: > > Rainer > > > > strange > > > > I have the declaration at > > SBML_odeSolver\src\sbmlsolver\integratorInstance.h line 143 > > > > my CVS is saying that I'm in sync > > > > what do you have? > > > > yours Andrew > > > > > -----Original Message----- > > > From: Rainer Machne [mailto:ra...@tb...] > > > Sent: 19 April 2006 12:42 > > > To: Andrew Finney > > > Cc: SOSlib Development > > > Subject: RE: comment on proposed exact event implementation[Scanned] > > > > > > Andrew > > > > > > I have correct the simple event detection, so that it doesn't > > > set trigger flags to 0, if the trigger is actually still fired. > > > > > > Some questions regarding the new code: > > > > > > Now that enginge->processEvents is set either to 1 or to 0 in > > > II_integrateOneStep and II_integrateOneStepWithoutEventProcessing, > > > respectively, the functions > > > > > > II_simpleOneStep and II_cvodeOneStep > > > > > > shouldn't be public anymore. > > > > > > Before this new switch, they were public, so that > > > applications which knew what type of solver is required > > > (currently ODEs or no ODEs, but eventually also DAEs or even > > > stochastic solvers) can use these `solver'OneStep functions directly. > > > > > > Should we remove these functions from the API or should we > > > keep the possibility to use different solvers directly? > > > > > > In the second case we need to move the engine->processEvents > > > setting to some other place! > > > > > > Also I didn't find a function declaration for > > > II_integrateOneStepWithoutEventProcessing. I guess you wanted > > > this function to be public, or did you just use it for testing? > > > > > > > > > Rainer > > > > > > > > > > > > > > > On Wed, 19 Apr 2006, Andrew Finney wrote: > > > > > > > Rainer > > > > > > > > I guess you need to go ahead and modify the code. > > > > Any performance hit is my problem. > > > > > > > > yours Andrew > > > > > > > >> -----Original Message----- > > > >> From: Rainer Machne [mailto:ra...@tb...] > > > >> Sent: 19 April 2006 11:47 > > > >> To: Andrew Finney > > > >> Subject: RE: comment on proposed exact event > > > implementation[Scanned] > > > >> > > > >> Andrew > > > >> > > > >>> I'm more worried about the performance hit of evaluating the not > > > >>> trigger expression. > > > >> > > > >> Ok, I still don't get what you mean. > > > >> > > > >> Do you mind, if I correct the current event handling - as outlined > > > >> two emails below - and submit it, or do you think it would > > > slow down > > > >> your models? > > > >> > > > >> Rainer > > > >> > > > >> > > > >> > > > >> On Wed, 12 Apr 2006, Andrew Finney wrote: > > > >> > > > >>> Rainer > > > >>> > > > >>> you're doing the right thing don't worry :-) > > > >>> > > > >>>> -----Original Message----- > > > >>>> From: Rainer Machne [mailto:ra...@tb...] > > > >>>> Sent: 12 April 2006 17:53 > > > >>>> To: Andrew Finney > > > >>>> Cc: Christoph Flamm > > > >>>> Subject: RE: comment on proposed exact event > > > >> implementation[Scanned] > > > >>>> > > > >>>> Andrew > > > >>>> > > > >>>> On Wed, 12 Apr 2006, Andrew Finney wrote: > > > >>>> > > > >>>>> Rainer > > > >>>>> > > > >>>>> Our model is based on simple Jarnac code. > > > >>>>> > > > >>>>> I'm more worried about the performance hit of > > > evaluating the not > > > >>>>> trigger expression. > > > >>>> > > > >>>> I don't really understand what you mean. > > > >>>> > > > >>>> > > > >>>> You mean the additional evaluations when > > > >>>> > > > >>>>>>> else > > > >>>>>>> data->trigger[i] = 0; > > > >>>> > > > >>>> would be replaced by > > > >>>> > > > >>>>>>> else if ( evaluateAST(trigger, data) == 0 ) > > > >>>>>>> data->trigger[i] = 0; > > > >>>> > > > >>>> > > > >>>> ?? > > > >>>> > > > >>>> > > > >>>> The double evaluation could be avoided by putting the > > > evaluations > > > >>>> within the if/else blocks: > > > >>>> > > > >>>> if ( data->trigger[i] == 0 ) > > > >>>> { > > > >>>> if ( evaluateAST(trigger, data) ) > > > >>>> { > > > >>>> data->trigger[i] = 1; > > > >>>> } > > > >>>> } > > > >>>> else /* only if trigger is 1 */ > > > >>>> { > > > >>>> if ( !evaluateAST(trigger, data) ) > > > >>>> { > > > >>>> data->trigger[i] = 0; > > > >>>> } > > > >>>> } > > > >>>> > > > >>>> but I don't see a way around the evaluation of each trigger. > > > >>>> > > > >>>> Do I get something wrong? > > > >>>> > > > >>>> > > > >>>> Rainer > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>>> > > > >>>>> yours Andrew > > > >>>>> > > > >>>>>> -----Original Message----- > > > >>>>>> From: Rainer Machne [mailto:ra...@tb...] > > > >>>>>> Sent: 12 April 2006 17:37 > > > >>>>>> To: Andrew Finney > > > >>>>>> Cc: Christoph Flamm > > > >>>>>> Subject: RE: comment on proposed exact event > > > >>>> implementation[Scanned] > > > >>>>>> > > > >>>>>> Andrew > > > >>>>>> > > > >>>>>> > > > >>>>>> On Wed, 12 Apr 2006, Andrew Finney wrote: > > > >>>>>> > > > >>>>>>> Rainer > > > >>>>>>> > > > >>>>>>> below is all correct > > > >>>>>>> > > > >>>>>>> it will make our model run slower or even incorrectly but > > > >>>> I'll work > > > >>>>>>> around it perhaps we'll need yet another option. > > > >>>>>> > > > >>>>>> > > > >>>>>> The current implementation > > > >>>>>> > > > >>>>>>> if ( data->trigger[i] == 0 && evaluateAST(trigger, data) ) > > > >>>>>>> fired++; (leading to assignment execution in calling code) > > > >>>>>>> data->trigger[i] = 1; > > > >>>>>>> else > > > >>>>>>> data->trigger[i] = 0; > > > >>>>>> > > > >>>>>> means that event triggers are set to 0, whenever they > > > >> have already > > > >>>>>> been fired, even when the trigger is still true. > > > >>>>>> > > > >>>>>> That means that events are again executed in the time step > > > >>>>>> afterwards, even if they have been true ever since their last > > > >>>>>> execution. > > > >>>>>> It is a completely wrong interpretation of events! > > > >>>>>> > > > >>>>>> Does your model really require this? > > > >>>>>> > > > >>>>>> As in the very old version, triggers should be > > > evaluated before > > > >>>>>> integration and only set to 0 if they are really false. > > > >>>>>> > > > >>>>>> Rainer > > > >>>>>> > > > >>>>>> > > > >>>>>> > > > >>>>>> > > > >>>>>> > > > >>>>>>>> -----Original Message----- > > > >>>>>>>> From: Rainer Machne [mailto:ra...@tb...] > > > >>>>>>>> Sent: 12 April 2006 17:15 > > > >>>>>>>> To: Andrew Finney > > > >>>>>>>> Cc: Christoph Flamm > > > >>>>>>>> Subject: RE: comment on proposed exact event > > > >>>>>> implementation[Scanned] > > > >>>>>>>> > > > >>>>>>>> Andrew > > > >>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>>> Why do we cheat? As I remember, we do exactly the > > > >>>> above for the > > > >>>>>>>>>> inexact event handling! > > > >>>>>>>>> > > > >>>>>>>>> I have not got the code in front of me... > > > >>>>>>>> > > > >>>>>>>> > > > >>>>>>>> It was more correct in a very old version and seems to be > > > >>>>>> incorrect > > > >>>>>>>> for a while now! > > > >>>>>>>> > > > >>>>>>>> > > > >>>>>>>> In the former file odeIntegrate.c did: > > > >>>>>>>> > > > >>>>>>>> the function integrate() did > > > >>>>>>>> > > > >>>>>>>> for ( i=0; i<data->nt; i++ ) { > > > >>>>>>>> data->flag[i] = evaluateAST(data->trigger[i],data); > > > >>>>>>>> } > > > >>>>>>>> > > > >>>>>>>> before integration, i.e. evaluate trigger state at > > > time 0. So > > > >>>>>>>> triggers that are already true are set to 1, others to 0. > > > >>>>>>>> > > > >>>>>>>> Then in the integration loop the function checkTrigger > > > >>>> was called > > > >>>>>>>> after the CVode call. It did > > > >>>>>>>> > > > >>>>>>>> > > > >>>>>>>> if(evaluateAST(data->trigger[i],data)==0) > > > >>>>>>>> { > > > >>>>>>>> data->flag[i] = 0; > > > >>>>>>>> } > > > >>>>>>>> else if((data->flag[i]==0) && > > > >>>>>>>> (evaluateAST(data->trigger[i],data)==1)) > > > >>>>>>>> { > > > >>>>>>>> data->flag[i] = 1; > > > >>>>>>>> ... > > > >>>>>>>> } > > > >>>>>>>> > > > >>>>>>>> So trigger flags were set to 0 only when the trigger > > > >>>> condition is > > > >>>>>>>> really false and to 1 as soon as they become true. > > > They stay 1 > > > >>>>>>>> (eventually having been set at time 0) as long as they are > > > >>>>>> true, but > > > >>>>>>>> their assignments are only evaluated when they were 0 before. > > > >>>>>>>> > > > >>>>>>>> This should do it, right? > > > >>>>>>>> > > > >>>>>>>> In the current version it is wrong: > > > >>>>>>>> > > > >>>>>>>> It's the line 636 in integratorInstance > > > >>>>>>>> > > > >>>>>>>> if ( data->trigger[i] == 0 && evaluateAST(trigger, data) ) > > > >>>>>>>> fired++; (leading to assignment execution in > > > calling code) > > > >>>>>>>> data->trigger[i] = 1; > > > >>>>>>>> else > > > >>>>>>>> data->trigger[i] = 0; > > > >>>>>>>> > > > >>>>>>>> > > > >>>>>>>> I.e. it misses the evaluation for false triggers, but just > > > >>>>>> sets any > > > >>>>>>>> trigger false that was true, even if they are still true. > > > >>>>>>>> > > > >>>>>>>> It might just require to add > > > >>>>>>>> > > > >>>>>>>> else if ( evaluateAST(trigger, data) == 0 ) > > > >>>>>>>> data->trigger[i] = 0; > > > >>>>>>>> > > > >>>>>>>> instead of the simple else. > > > >>>>>>>> > > > >>>>>>>> Right? > > > >>>>>>>> > > > >>>>>>>> We should correct that for the simple event handling! > > > >>>>>>>> > > > >>>>>>>> I have to think about the other stuff. > > > >>>>>>>> > > > >>>>>>>> Rainer > > > >>>>>>>> > > > >>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> you wrote: > > > >>>>>>>>> > > > >>>>>>>>>> This can become tricky. As far as I understood the root > > > >>>>>> finder, it > > > >>>>>>>>>> stops integrating at the time where it found the root. > > > >>>>>>>>> > > > >>>>>>>>>> Thus we might have to include a code > > > >>>>>>>>>> > > > >>>>>>>>>> if ( triggerWasTrue ) > > > >>>>>>>>>> rootFunction = 1.0; > > > >>>>>>>>>> > > > >>>>>>>>>> to suppress root finding for triggers that are > > > already true. > > > >>>>>>>>>> The same should probably be done for combined > > > >>>> triggers, for the > > > >>>>>>>>>> expression that becomes true first and needs to wait for > > > >>>>>> the second > > > >>>>>>>>>> (or all) other inequalities of the trigger. > > > >>>>>>>>> > > > >>>>>>>>> My understanding is that the root finder only detects > > > >>>> transitions > > > >>>>>>>>> because x < 10 maps to x - 10 == 0. The root is only > > > >>>> true at the > > > >>>>>>>>> transition not at all points x < 10. > > > >>>>>>>>> > > > >>>>>>>>> I think we need to be very careful about when and how > > > >>>> we suppress > > > >>>>>>>>> root expressions. Any suppression inevitably means you > > > >>>>>> potentially > > > >>>>>>>>> miss a transition. Having written that I don't know the > > > >>>>>> theory but > > > >>>>>>>>> I intuitively think that its not possible to resolve > > > >> very close > > > >>>>>>>>> transitions. > > > >>>>>>>>> > > > >>>>>>>>> The issues that I think we need to look out for are: > > > >>>>>>>>> > > > >>>>>>>>> a) restarting integration where the root is still true > > > >>>>>>>>> we might get stuck there! > > > >>>>>>>>> > > > >>>>>>>>> Is that what you were worried about? > > > >>>>>>>>> > > > >>>>>>>>> either fingers crossed cvode will ignore the initial > > > >>>>>>>> state when root > > > >>>>>>>>> finding > > > >>>>>>>>> or if not we might need to nudge forward by an epsilon > > > >>>>>> with root > > > >>>>>>>>> finding switched off :-( > > > >>>>>>>>> (the algorithm I posted didn't include this concept) > > > >>>>>>>>> this might be a good idea since it forces time > > > >>>> forward and the > > > >>>>>>>>> simulation out of deadlocks. > > > >>>>>>>>> the problem is choosing an epsilon. I guess it could > > > >>>>>> be a very > > > >>>>>>>>> small fraction of the time step length. > > > >>>>>>>>> > > > >>>>>>>>> Perhaps this should be a constant set by the user: it > > > >>>>>>>> represents the > > > >>>>>>>>> minimum gap between event transitions. > > > >>>>>>>>> > > > >>>>>>>>> b) the integration, correctly, settles in a state with > > > >>>> a root true > > > >>>>>>>>> this untypical behaviour but could happen. it would be > > > >>>>>> nice not to > > > >>>>>>>>> blow up > > > >>>>>>>>> > > > >>>>>>>>> this should be a test case > > > >>>>>>>>> > > > >>>>>>>>> e.g. x tends to 10 with a trigger x < 10 > > > >>>>>>>>> > > > >>>>>>>>> The problem is that the algorithm may end up being very > > > >>>>>>>> inefficient > > > >>>>>>>>> in this case. > > > >>>>>>>>> > > > >>>>>>>>> ideally the nudge described above needs to be > > > >>>>>> proportional to the > > > >>>>>>>>> internal cvode step size > > > >>>>>>>>> can we get the internal integration step size > > > >>>> from cvode? > > > >>>>>>>>> > > > >>>>>>>>> c) a model with an event based feedback loop that drives > > > >>>>>>>> the model to a > > > >>>>>>>>> state where events > > > >>>>>>>>> are firing all the time. > > > >>>>>>>>> > > > >>>>>>>>> yours Andrew > > > >>>>>>>>> > > > >>>>>>>>>> -----Original Message----- > > > >>>>>>>>>> From: Rainer Machne [mailto:ra...@tb...] > > > >>>>>>>>>> Sent: 12 April 2006 15:51 > > > >>>>>>>>>> To: Andrew Finney > > > >>>>>>>>>> Cc: Christoph Flamm > > > >>>>>>>>>> Subject: RE: comment on proposed exact event > > > >>>>>>>> implementation[Scanned] > > > >>>>>>>>>> > > > >>>>>>>>>> Andrew > > > >>>>>>>>>> > > > >>>>>>>>>> On Wed, 12 Apr 2006, Andrew Finney wrote: > > > >>>>>>>>>> > > > >>>>>>>>>>> Rainer > > > >>>>>>>>>>> > > > >>>>>>>>>>> a trigger can contain inequality and equality > > > >>>>>>>>>>> > > > >>>>>>>>>>> but they are found by equivalent root expressions so I > > > >>>>>> don't think > > > >>>>>>>>>>> they are important > > > >>>>>>>>>>> > > > >>>>>>>>>>> Oh there is one other really important issue: > > > >>>>>>>>>>> > > > >>>>>>>>>>> We need to be careful about the SBML requirement that > > > >>>>>> events are > > > >>>>>>>>>>> triggered on all transitions from false to true > > > >>>>>>>>>>> > > > >>>>>>>>>>> In MathSBML Bruce Shapiro created following logic > > > >roughly< > > > >>>>>>>>>> (assume no > > > >>>>>>>>>>> delays on events) > > > >>>>>>>>>>> > > > >>>>>>>>>>> starting integration.... > > > >>>>>>>>>>> triggerWasTrue = false; > > > >>>>>>>>>>> > > > >>>>>>>>>>> OnRootFound: > > > >>>>>>>>>>> > > > >>>>>>>>>>> if (triggerExpression and !triggerWasTrue) > > > >>>>>>>>>>> { > > > >>>>>>>>>>> fire event; > > > >>>>>>>>>>> triggerWasTrue = true; > > > >>>>>>>>>>> } > > > >>>>>>>>>>> > > > >>>>>>>>>>> if (!triggerExpression) > > > >>>>>>>>>>> triggerWasTrue = false; > > > >>>>>>>>>>> > > > >>>>>>>>>>> We kind achive this in the inexact method but its really a > > > >>>>>>>>>> cheat the > > > >>>>>>>>>>> above I think is the only way to do it properly... > > > >>>>>>>>>> > > > >>>>>>>>>> Why do we cheat? As I remember, we do exactly the > > > >>>> above for the > > > >>>>>>>>>> inexact event handling! > > > >>>>>>>>>> > > > >>>>>>>>>> The exact detection/root finder code needs to > > > >>>>>>>>>> > > > >>>>>>>>>> * do the same, i.e. handle false/true transitions when a > > > >>>>>>>> root is found > > > >>>>>>>>>> > > > >>>>>>>>>> and additionally > > > >>>>>>>>>> > > > >>>>>>>>>> * handle triggers that are (logic) combinations of > > > >>>>>>>> in/equalities, i.e. > > > >>>>>>>>>> both must be true. > > > >>>>>>>>>> > > > >>>>>>>>>> In/equalities combined by logic operators can further be > > > >>>>>>>> subdivided: > > > >>>>>>>>>> > > > >>>>>>>>>> e.g.: > > > >>>>>>>>>> trigger a < 10 || b > 20 > > > >>>>>>>>>> > > > >>>>>>>>>> can be handled as two separate triggers, while and > > > >>>> exclusive OR > > > >>>>>>>>>> needs combined handling again as outlined before: > > > >>>>>>>>>> > > > >>>>>>>>>> e.g. > > > >>>>>>>>>> > > > >>>>>>>>>> trigger: a < 10 && b > 20 > > > >>>>>>>>>> > > > >>>>>>>>>> becomes to root conditions in the function g: > > > >>>>>>>>>> > > > >>>>>>>>>> a - 10 = 0; > > > >>>>>>>>>> b - 20 = 0; > > > >>>>>>>>>> > > > >>>>>>>>>> * keep integrating if only a or b is true > > > >>>>>>>>>> * exact event happens when the second conditions also > > > >>>>>> becomes true > > > >>>>>>>>>> > > > >>>>>>>>>> > > > >>>>>>>>>> This can become tricky. As far as I understood the root > > > >>>>>> finder, it > > > >>>>>>>>>> stops integrating at the time where it found the root. > > > >>>>>>>>>> > > > >>>>>>>>>> Thus we might have to include a code > > > >>>>>>>>>> > > > >>>>>>>>>> if ( triggerWasTrue ) > > > >>>>>>>>>> rootFunction = 1.0; > > > >>>>>>>>>> > > > >>>>>>>>>> to supress root finding for triggers that are already true. > > > >>>>>>>>>> The same should probably be done for combined > > > >>>> triggers, for the > > > >>>>>>>>>> expression that becomes true first and needs to wait for > > > >>>>>> the second > > > >>>>>>>>>> (or all) other inequalities of the trigger. > > > >>>>>>>>>> > > > >>>>>>>>>> Rainer > > > >>>>>>>>>> > > > >>>>>>>>>> > > > >>>>>>>>>>> > > > >>>>>>>>>>> yours Andrew > > > >>>>>>>>>>> > > > >>>>>>>>>>>> -----Original Message----- > > > >>>>>>>>>>>> From: Rainer Machne [mailto:ra...@tb...] > > > >>>>>>>>>>>> Sent: 12 April 2006 15:21 > > > >>>>>>>>>>>> To: Christoph Flamm > > > >>>>>>>>>>>> Cc: Andrew Finney > > > >>>>>>>>>>>> Subject: RE: comment on proposed exact event > > > >>>>>>>>>> implementation[Scanned] > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> Hi Xtof, > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> On Wed, 12 Apr 2006, Christoph Flamm wrote: > > > >>>>>>>>>>>> > > > >>>>>>>>>>>>> hi andrew, > > > >>>>>>>>>>>>> > > > >>>>>>>>>>>>> am i getting that right, in essence the recipe > > > to evaluate > > > >>>>>>>>>>>> letfChild - > > > >>>>>>>>>>>>> rightChild works in general to find the exact > > > timepoint of > > > >>>>>>>>>>>> the event > > > >>>>>>>>>>>>> with root finding? > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> No, for this example of an event: > > > >>>>>>>>>>>> > > > >>>>>>>>>>>>> e.g. a < 10 && b > 10 becomes 2 root expressions 10 - a > > > >>>>>>>>>> == 0 and b > > > >>>>>>>>>>>> - 10 > == 0 > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> we need to separately evaluate both trigger > > > >> conditions, i.e. > > > >>>>>>>>>>>> as Andrew said the event trigger becomes 2 root > > > >>>>>>>>>> expressions for the > > > >>>>>>>>>>>> g(x,p,t) root finding function!! > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> That means that not every root found be the root > > > finder is > > > >>>>>>>>>> an event. > > > >>>>>>>>>>>> For above event, the first (e.g. a) that moved beyond the > > > >>>>>>>>>> threshold > > > >>>>>>>>>>>> (10) must wait for the second (b) to also move > > > >>>> beyond its own > > > >>>>>>>>>>>> threshold. I.e. for such event structures the event > > > >>>> assignment > > > >>>>>>>>>>>> evaluation must wait until the second root. > > > >>>>>>>>>>>> ... or somehow like this. > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> ... let's try to formulate this generally: > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> * An event trigger is a boolean expression, but can > > > >>>> be a logic > > > >>>>>>>>>>>> combination of different boolean expressions ... ? > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> * Only equalities and inequalities can be > > > evaluated by our > > > >>>>>>>>>> leftChild > > > >>>>>>>>>>>> - rightChild == 0 condition in the root function > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> * logic operators must be broken down into their > > > >>>>>>>>>> in/equality relation > > > >>>>>>>>>>>> (which must be in there somewhere??) > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> mmhm ... questions: > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> 1) we only need to care about logic operators vs. > > > >>>> in/equality > > > >>>>>>>>>>>> operators ? > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> 2) must there be in/equalities in a trigger? > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> Rainer > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> > > > >>>>>>>>>>>> > > > >>>>>>>>>>>>> > > > >>>>>>>>>>>>> =;) xtof > > > >>>>>>>>>>>>> > > > >>>>>>>>>>>>> Andrew Finney writes: > > > >>>>>>>>>>>>>> Rainer > > > >>>>>>>>>>>>>> > > > >>>>>>>>>>>>>> First I assume you run-through a trigger expression > > > >>>>>>>>>>>> separating out > > > >>>>>>>>>>>>>> all the inequalities > > > >>>>>>>>>>>>>> > > > >>>>>>>>>>>>>> e.g. a < 10 && b > 10 becomes 2 root expressions 10 - a > > > >>>>>>>>>>>> == 0 and b - > > > >>>>>>>>>>>>>> 10 == 0 > > > >>>>>>>>>>>>>> > > > >>>>>>>>>>>>>> when you find a root you re-evaluate the complete > > > >>>>>>>>>> triggers to see > > > >>>>>>>>>>>>>> what's really fired. > > > >>>>>>>>>>>>>> > > > >>>>>>>>>>>>>> or is there a better approach? > > > >>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> Are there other forms of events, where this method can > > > >>>>>>>>>>>> not be applied? > > > >>>>>>>>>>>>>> > > > >>>>>>>>>>>>>> Well there is equality e.g. x == 40 I think that should > > > >>>>>>>>>> work as x - > > > >>>>>>>>>>>>>> 40 == 0 Inequality is fine to you map x != 40 to x > > > >>>> - 40 == 0 > > > >>>>>>>>>>>>>> > > > >>>>>>>>>>>>>> In both cases you need to revaluate the trigger > > > >>>>>> expression but > > > >>>>>>>>>>>>>> probably with an epsilon (especially equality) or you > > > >>>>>>>>>> may have to > > > >>>>>>>>>>>>>> force a value from 39.9999 to 40 after the root > > > >>>>>>>> finding process. > > > >>>>>>>>>>>>>> > > > >>>>>>>>>>>>>> One thing to very careful of is time dependant > > > >>>>>>>> expressions (ones > > > >>>>>>>>>>>>>> containing the csymbol for time) not so much in the > > > >>>>>>>> triggers but > > > >>>>>>>>>>>>>> make sure time is set right when you roll > > > >>>>>> integration back or > > > >>>>>>>>>>>>>> forward...hopefully that's obvious. > > > >>>>>>>>>>>>>> > > > >>>>>>>>>>>>>> yours Andrew > > > >>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> -----Original Message----- > > > >>>>>>>>>>>>>>> From: Rainer Machne [mailto:ra...@tb...] > > > >>>>>>>>>>>>>>> Sent: 12 April 2006 14:40 > > > >>>>>>>>>>>>>>> To: Christoph Flamm > > > >>>>>>>>>>>>>>> Cc: Andrew Finney > > > >>>>>>>>>>>>>>> Subject: Re: comment on proposed exact event > > > >>>>>>>>>>>>>>> implementation[Scanned] > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> Hi Andrew and Xtof > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> another question: > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> Currently we tell the root function to evaluate the > > > >>>>>> expression > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> leftChildofTrigger - rightChildOfTrigger > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> for which the root finder tries to find a root, i.e. > > > >>>>>>>>>>>> time points > > > >>>>>>>>>>>>>>> where this expression evaluates to 0. > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> This is valid for event like > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> if x > 40 > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> where the method will try find a time point where > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> x - 40 == 0. > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> Is this generally valid? Are there other forms of > > > >>>>>>>> events, where > > > >>>>>>>>>>>>>>> this method can not be applied? > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> Rainer > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> On Wed, 12 Apr 2006, Christoph Flamm wrote: > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>>> hi andrew, > > > >>>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>>> yes, you are right root finding is the only proper > > > >>>>>>>>>>>> way to detect > > > >>>>>>>>>>>>>>>> events accurately. also the code we need to implement > > > >>>>>>>>>>>> would be > > > >>>>>>>>>>>>>>>> much simpler with root finding. the down side of > > > >>>>>>>> this approach > > > >>>>>>>>>>>>>>> is, that the > > > >>>>>>>>>>>>>>>> integration with root finding turned on drastically > > > >>>>>>>>>>>> slowes down > > > >>>>>>>>>>>>>>>> the integration speed especially if we have a lot of > > > >>>>>>>> triggers! > > > >>>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>>> the other problem which we did not touch during the > > > >>>>>>>>>>>>>>> hackathon is what > > > >>>>>>>>>>>>>>>> happens if to events trigger exactely at the > > > >>>> same time but > > > >>>>>>>>>>>>>>>> influence each other. > > > >>>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>>> suppose the following two events: > > > >>>>>>>>>>>>>>>> (1) if x > 20 then diminish the concentration > > > >> of y to 10 > > > >>>>>>>>>>>>>>>> (2) if y > 20 then diminish the concentration > > > >> of x to 10 > > > >>>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>>> this is something like a cyclic dependency of the > > > >>>>>>>>>> events. if both > > > >>>>>>>>>>>>>>>> events are triggered at the same time, which > > > >>>>>>>>>>>> could happen, > > > >>>>>>>>>>>>>>> what shall > > > >>>>>>>>>>>>>>>> we do? which ever event we execute first > > > >> invalidates the > > > >>>>>>>>>>>>>>> trigger for > > > >>>>>>>>>>>>>>>> the second one. > > > >>>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>>> in such a case an priority ordering of the > > > >>>> events is needed > > > >>>>>>>>>>>>>>> to resolve > > > >>>>>>>>>>>>>>>> the problem right? is an answer to something like > > > >>>>>> that in the > > > >>>>>>>>>>>>>>>> SBML specs? > > > >>>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>>> i think that the method i suggested at the hackaton > > > >>>>>>>>>>>> would give > > > >>>>>>>>>>>>>>>> us a good balance between speed and "accuracy of > > > >>>> the event > > > >>>>>>>>>>>>>>> detection" (but > > > >>>>>>>>>>>>>>>> the coding is more difficult!) > > > >>>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>>> rainer suggested as an alternative to the mixed > > > >>>>>>>>>>>>>>>> root-finding/non-root-finding strategy to make the > > > >>>>>>>>>>>> integration > > > >>>>>>>>>>>>>>>> step smaller until the exact time of an event is > > > >>>>>>>>>>>> localized (this > > > >>>>>>>>>>>>>>> also slows > > > >>>>>>>>>>>>>>>> down integration speed). > > > >>>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>>> so for which solution should we head? > > > >>>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>>> =;) xtof > > > >>>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>>> p.s. next week i meet an mathematician from the > > > >>>>>>>>>>>> MPI-MIS who is > > > >>>>>>>>>>>>>>>> an expert for DDEs to discuss which solving method > > > >>>>>>>>>>>> would be best > > > >>>>>>>>>>>>>>>> to incooporate into the SOSlib. > > > >>>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>>> > > > >>>>>>>>>>>>>>> > > > >>>>>>>>>>>>> > > > >>>>>>>>>>>>> > > > >>>>>>>>>>>> > > > >>>>>>>>>>> > > > >>>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>> > > > >>>>>>> > > > >>>>>> > > > >>>>> > > > >>>> > > > >>> > > > >> > > > > > > > > > > > > > ------------------------------------------------------- > > Using Tomcat but need to do more? Need to support web services, security? > > Get stuff done quickly with pre-integrated technology to make your job easier > > Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo > > http://sel.as-us.falkag.net/sel?cmd_______________________________________________ > > sbmlsolver-devel mailing list > > sbm...@li... > > https://lists.sourceforge.net/lists/listinfo/sbmlsolver-devel > > |