|
From: Andrew F. <af...@ph...> - 2006-04-19 14:41:53
|
Rainer
I think a simpler API is easier to maintain.
yours Andrew=20
> -----Original Message-----
> From: Rainer Machne [mailto:ra...@tb...]=20
> Sent: 19 April 2006 15:35
> To: Andrew Finney
> Cc: SOSlib Development
> Subject: RE: [SOSlib-devel] simple event handling corrected[Scanned]
>=20
>=20
> On Wed, 19 Apr 2006, Andrew Finney wrote:
>=20
> >
> >> * remove redundant function II_checkTrigger or alternatively
> >> * provide this function as API -- maybe without the event=20
> execution ??
> >>
> >>
> >
> > if it aint called get rid of it
>=20
> Ok, I agree.
>=20
> I just thought that, if the function
>=20
> IntegratorInstance_integrateOneStepWithoutEventProcessing
>=20
> is part of the API, people might still be interested in a=20
> simple external checking for number of events.
>=20
> Besides the confusion about it's declaration, the question=20
> whether you wanted this function part of the API was=20
> regarding this function.
>=20
> What use do you imagine for this function? Is it just for testing?
>=20
>=20
>=20
>=20
> >> * decide on whether or not to have API functions for solverOneStep=20
> >> (for each solver, no ODES, CVODES, IDA, etc.) or if this should be=20
> >> handled inside the library and integrateOneStep will be=20
> the only API=20
> >> one step function
> >>
> >
> > my preference is to have only one API one step function
>=20
> Ok, I guess the few if statments in the integrateOneStep will=20
> not be really a performance drawback.
>=20
> Initially, I made the cvodeOneStep and simpleOneStep=20
> functions public (part of the API) to enable the most direct=20
> use of a specific solver for applications that know what type=20
> of model they have.
>=20
> It would be easy but is not possible anymore with the
>=20
> engine->processEvents
>=20
> option, set within above discussed function, unless we add
>=20
> cvodeOneStepWithoutEventProcessing
> simpleOneStepWithoutEventProcessing
>=20
> and eventually
>=20
> idaOneStepWithoutEventProcessing
>=20
> and others.
>=20
> The integratorOneStep was thought to be a simple wrapper for=20
> applications that don't know there model types.
>=20
> Rainer
>=20
>=20
>=20
>=20
> >> -----Original Message-----
> >> From: sbm...@li...
> >> [mailto:sbm...@li...] On Behalf Of=20
> >> Rainer Machne
> >> Sent: 19 April 2006 14:56
> >> To: SOSlib Development
> >> Subject: [SOSlib-devel] simple event handling corrected[Scanned]
> >>
> >> Hi All
> >>
> >> Just wanted to let you know, that I have submitted a
> >> (hopefully) corrected version of the simple event handling.
> >>
> >> TODOs found:
> >>
> >> * clean up the use of the SBML_ODESOLVER_API tag (part of C++ API=20
> >> todo)
> >>
> >> * decide wheter private functions should be declared at=20
> the header of=20
> >> the c file
> >>
> >> * remove redundant function II_checkTrigger or alternatively
> >> * provide this function as API -- maybe without the event=20
> execution ??
> >>
> >>
> >> * decide on whether or not to have API functions for solverOneStep=20
> >> (for each solver, no ODES, CVODES, IDA, etc.) or if this should be=20
> >> handled inside the library and integrateOneStep will be=20
> the only API=20
> >> one step function
> >>
> >> Rainer
> >>
> >>
> >>
> >>
> >> On Wed, 19 Apr 2006, Andrew Finney wrote:
> >>
> >>> Rainer
> >>>
> >>> IntegratorInstance_processEventsAndAssignments
> >>>
> >>> doesn't have a declaration: its not required as its not=20
> part of the=20
> >>> API the SBML_ODESOLVER_API qualification is redundant - I
> >> guess that
> >>> confused you That's my fault. Remind me to update the=20
> 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=20
> 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
> >> 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=20
> >>>>>> 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=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
> >> 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] =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=20
> 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=20
> incorrectly but
> >>>>>>>>>> I'll work
> >>>>>>>>>>>>> around it perhaps we'll need yet another option.
> >>>>>>>>>>>>
> >>>>>>>>>>>>
> >>>>>>>>>>>> The current implementation
> >>>>>>>>>>>>
> >>>>>>>>>>>>> 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;
> >>>>>>>>>>>>
> >>>>>>>>>>>> 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=20
> 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=20
> 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=20
> 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,=20
> 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
> >> 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
> >> triggers, but just
> >>>>>>>>>>>> sets any
> >>>>>>>>>>>>>> trigger false that was true, even if they are=20
> 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=20
> understood the root
> >>>>>>>>>>>> finder, it
> >>>>>>>>>>>>>>>> stops integrating at the time where it found=20
> 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
> >> 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=20
> means you
> >>>>>>>>>>>> potentially
> >>>>>>>>>>>>>>> miss a transition. Having written that I=20
> 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=20
> 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=20
> guess it could
> >>>>>>>>>>>> be a very
> >>>>>>>>>>>>>>> small fraction of the time step length.
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> Perhaps this should be a constant set by=20
> 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=20
> 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=20
> 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=20
> 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
> >> 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 =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=20
> understood the root
> >>>>>>>>>>>> finder, it
> >>>>>>>>>>>>>>>> stops integrating at the time where it found=20
> 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
> >> 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=20
> 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=20
> !=3D 40 to x
> >>>>>>>>>> - 40 =3D=3D 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=20
> 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=20
> [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
> >> 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=20
> point where
> >>>>>>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>>>>>> x - 40 =3D=3D 0.
> >>>>>>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>>>>>> Is this generally valid? Are there=20
> 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=20
> 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=20
> 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=20
> 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=20
> "accuracy of
> >>>>>>>>>> the event
> >>>>>>>>>>>>>>>>>>>>> detection" (but
> >>>>>>>>>>>>>>>>>>>>>> the coding is more difficult!)
> >>>>>>>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>>>>>>> rainer suggested as an alternative to=20
> the mixed=20
> >>>>>>>>>>>>>>>>>>>>>> root-finding/non-root-finding strategy
> >> to make the
> >>>>>>>>>>>>>>>>>> integration
> >>>>>>>>>>>>>>>>>>>>>> step smaller until the exact time of=20
> 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
> >> 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=20
> 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
> >>>>>
> >>>>
> >>>
> >>
> >>
> >> -------------------------------------------------------
> >> Using Tomcat but need to do more? Need to support web services,=20
> >> security?
> >> Get stuff done quickly with pre-integrated technology to make your=20
> >> job easier Download IBM WebSphere Application Server
> >> 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
|