|
From: Andrew F. <af...@ph...> - 2006-04-19 14:05:21
|
Rainer
you wrote:
> * clean up the use of the SBML_ODESOLVER_API tag (part of C++=20
> API todo)
yes
>=20
> * decide wheter private functions should be declared at the=20
> header of the c file
>=20
see last email
> * remove redundant function II_checkTrigger or alternatively
> * provide this function as API -- maybe without the event execution ??
>=20
>=20
if it aint called get rid of it
> * decide on whether or not to have API functions for=20
> solverOneStep (for each solver, no ODES, CVODES, IDA, etc.)=20
> or if this should be handled inside the library and=20
> integrateOneStep will be the only API one step function
> =20
my preference is to have only one API one step function
yours Andrew
> -----Original Message-----
> From: sbm...@li...=20
> [mailto:sbm...@li...] On=20
> Behalf Of Rainer Machne
> Sent: 19 April 2006 14:56
> To: SOSlib Development
> Subject: [SOSlib-devel] simple event handling corrected[Scanned]
>=20
> Hi All
>=20
> Just wanted to let you know, that I have submitted a=20
> (hopefully) corrected version of the simple event handling.
>=20
> TODOs found:
>=20
> * clean up the use of the SBML_ODESOLVER_API tag (part of C++=20
> API todo)
>=20
> * decide wheter private functions should be declared at the=20
> header of the c file
>=20
> * remove redundant function II_checkTrigger or alternatively
> * provide this function as API -- maybe without the event execution ??
>=20
>=20
> * decide on whether or not to have API functions for=20
> solverOneStep (for each solver, no ODES, CVODES, IDA, etc.)=20
> or if this should be handled inside the library and=20
> integrateOneStep will be the only API one step function
>=20
> Rainer
>=20
>=20
>=20
>=20
> On Wed, 19 Apr 2006, Andrew Finney wrote:
>=20
> > Rainer
> >
> > IntegratorInstance_processEventsAndAssignments
> >
> > doesn't have a declaration: its not required as its not part of the=20
> > API the SBML_ODESOLVER_API qualification is redundant - I=20
> guess that=20
> > confused you That's my fault. Remind me to update the dynalically=20
> > compiled version of this function.
> >
> > you're probably OK as far as CVS goes
> >
> > Andrew
> >
> >> -----Original Message-----
> >> From: Rainer Machne [mailto:ra...@tb...]
> >> Sent: 19 April 2006 14:35
> >> To: Andrew Finney
> >> Cc: SOSlib Development
> >> Subject: Re: [SOSlib-devel] RE: comment on proposed exact event=20
> >> implementation[Scanned]
> >>
> >>
> >> On Wed, 19 Apr 2006, Andrew Finney wrote:
> >>
> >>> Rainer
> >>>
> >>> strange
> >>>
> >>> I have the declaration at
> >>> SBML_odeSolver\src\sbmlsolver\integratorInstance.h line 143
> >>
> >> At line 143 I only have a declaration for=20
> >> IntegratorInstance_integrateOneStepWithoutEventProcessing
> >>
> >> but can't find a declaration for
> >> IntegratorInstance_processEventsAndAssignments
> >>
> >>>
> >>> my CVS is saying that I'm in sync
> >>>
> >>> what do you have?
> >>
> >> mine too. that's really strange. Maybe cvs update checks only for=20
> >> version numbers and there is a problem with that?
> >>
> >> I have v 1.27 2006/04/11 13:10:45 afinney
> >>
> >> Strangely, the only CVS has version 1.26 from 5 weeks ago, while=20
> >> other files there are more recent.
> >>
> >> Rainer
> >>
> >>>
> >>> 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=20
> doesn't set=20
> >>>> 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=20
> >>>> II_integrateOneStep and=20
> 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=20
> >>>> `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=20
> >>>> II_integrateOneStepWithoutEventProcessing. I guess you=20
> wanted this=20
> >>>> 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] =3D 0;
> >>>>>>>>
> >>>>>>>> would be replaced by
> >>>>>>>>
> >>>>>>>>>>> else if ( evaluateAST(trigger, data) =3D=3D 0 )
> >>>>>>>>>>> data->trigger[i] =3D 0;
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> ??
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> The double evaluation could be avoided by putting the
> >>>> evaluations
> >>>>>>>> within the if/else blocks:
> >>>>>>>>
> >>>>>>>> if ( data->trigger[i] =3D=3D 0 )
> >>>>>>>> {
> >>>>>>>> if ( evaluateAST(trigger, data) )
> >>>>>>>> {
> >>>>>>>> data->trigger[i] =3D 1;
> >>>>>>>> }
> >>>>>>>> }
> >>>>>>>> else /* only if trigger is 1 */
> >>>>>>>> {
> >>>>>>>> if ( !evaluateAST(trigger, data) )
> >>>>>>>> {
> >>>>>>>> data->trigger[i] =3D 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] =3D=3D 0 &&=20
> evaluateAST(trigger, data) )
> >>>>>>>>>>> fired++; (leading to assignment execution in
> >> calling code)
> >>>>>>>>>>> data->trigger[i] =3D 1;
> >>>>>>>>>>> else
> >>>>>>>>>>> data->trigger[i] =3D 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=20
> >>>>>>>>>> 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=3D0; i<data->nt; i++ ) {
> >>>>>>>>>>>> data->flag[i] =3D =
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)=3D=3D0)
> >>>>>>>>>>>> {
> >>>>>>>>>>>> data->flag[i] =3D 0;
> >>>>>>>>>>>> }
> >>>>>>>>>>>> else if((data->flag[i]=3D=3D0) &&
> >>>>>>>>>>>> (evaluateAST(data->trigger[i],data)=3D=3D1))
> >>>>>>>>>>>> {
> >>>>>>>>>>>> data->flag[i] =3D 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=20
> 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] =3D=3D 0 &&
> >> evaluateAST(trigger, data) )
> >>>>>>>>>>>> fired++; (leading to assignment execution in
> >>>> calling code)
> >>>>>>>>>>>> data->trigger[i] =3D 1;
> >>>>>>>>>>>> else
> >>>>>>>>>>>> data->trigger[i] =3D 0;
> >>>>>>>>>>>>
> >>>>>>>>>>>>
> >>>>>>>>>>>> I.e. it misses the evaluation for false=20
> 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) =3D=3D 0 )
> >>>>>>>>>>>> data->trigger[i] =3D 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 =3D 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=20
> 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 =3D=3D 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=20
> an epsilon
> >>>>>>>>>> with root
> >>>>>>>>>>>>> finding switched off :-(
> >>>>>>>>>>>>> (the algorithm I posted didn't include=20
> 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=20
> 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=20
> 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 =3D false;
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> OnRootFound:
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> if (triggerExpression and !triggerWasTrue)
> >>>>>>>>>>>>>>> {
> >>>>>>>>>>>>>>> fire event;
> >>>>>>>>>>>>>>> triggerWasTrue =3D true;
> >>>>>>>>>>>>>>> }
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> if (!triggerExpression)
> >>>>>>>>>>>>>>> triggerWasTrue =3D 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=20
> 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=20
> 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 =3D 0;
> >>>>>>>>>>>>>> b - 20 =3D 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 =3D 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=20
> 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
> >>>>>>>>>>>>>> =3D=3D 0 and b
> >>>>>>>>>>>>>>>> - 10 > =3D=3D 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 =3D=3D 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
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>> =3D;) 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
> >>>>>>>>>>>>>>>> =3D=3D 0 and b -
> >>>>>>>>>>>>>>>>>> 10 =3D=3D 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 =3D=3D 40 I think
> >> that should
> >>>>>>>>>>>>>> work as x -
> >>>>>>>>>>>>>>>>>> 40 =3D=3D 0 Inequality is fine to you map x !=3D 40 =
to x
> >>>>>>>> - 40 =3D=3D 0
> >>>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>>> In both cases you need to revaluate the trigger
> >>>>>>>>>> expression but
> >>>>>>>>>>>>>>>>>> probably with an epsilon (especially=20
> 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=20
> >>>>>>>>>>>>>>>>>>> implementation[Scanned]
> >>>>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>>>> Hi Andrew and Xtof
> >>>>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>>>> another question:
> >>>>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>>>> Currently we tell the root function to=20
> evaluate the
> >>>>>>>>>> expression
> >>>>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>>>> leftChildofTrigger - rightChildOfTrigger
> >>>>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>>>> for which the root finder tries to find a=20
> 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 =3D=3D 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=20
> 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=20
> drastically
> >>>>>>>>>>>>>>>> slowes down
> >>>>>>>>>>>>>>>>>>>> the integration speed especially if we
> >> have a lot of
> >>>>>>>>>>>> triggers!
> >>>>>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>>>>> the other problem which we did not touch=20
> 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=20
> 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=20
> >>>>>>>>>>>>>>>>>>>> root-finding/non-root-finding strategy=20
> 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?
> >>>>>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>>>>> =3D;) xtof
> >>>>>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>>>>> p.s. next week i meet an mathematician from the
> >>>>>>>>>>>>>>>> MPI-MIS who is
> >>>>>>>>>>>>>>>>>>>> an expert for DDEs to discuss which=20
> 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=20
> >>> Apache Geronimo
> >>>
> >>=20
> http://sel.as-us.falkag.net/sel?cmd__________________________________
> >> _
> >>> ____________
> >>> sbmlsolver-devel mailing list
> >>> sbm...@li...
> >>> https://lists.sourceforge.net/lists/listinfo/sbmlsolver-devel
> >>>
> >>
> >
>=20
>=20
> -------------------------------------------------------
> Using Tomcat but need to do more? Need to support web=20
> services, security?
> Get stuff done quickly with pre-integrated technology to make=20
> your job easier Download IBM WebSphere Application Server=20
> v.1.0.1 based on Apache Geronimo
> http://sel.as-us.falkag.net/sel?cmd=3Dlnk&kid=3D120709&bid=3D263057&
> dat=3D121642
> _______________________________________________
> sbmlsolver-devel mailing list
> sbm...@li...
> https://lists.sourceforge.net/lists/listinfo/sbmlsolver-devel
>=20
|