|
From: Rainer M. <ra...@tb...> - 2006-04-19 13:35:36
|
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
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 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 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
>> 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
>
|