Example 8: Regimes in Dynamics definitions

Example 8: Regimes in Dynamics definitions#

This example introduces the Regime, Transition and OnEntry elements within a Dynamics block. Rather than having a single state instance, the entity can be on one of the defined regimes at any given time. The Transition element occurring inside a condition block serves to move it from one regime to another. The OnEntry block inside a regime can contain initialization directives that apply each time the entity enters that regime.

<ComponentType name="refractiaf">
   <Parameter name="threshold" dimension="voltage" />
   <Parameter name="refractoryPeriod" dimension="time" />
   <Parameter name="capacitance" dimension="capacitance" />
   <Parameter name="vleak" dimension="voltage" />
   <Parameter name="gleak" dimension="conductance" />
   <Parameter name="current" dimension="current" />
   <Parameter name="vreset" dimension="voltage" />
   <Parameter name="deltaV" dimension="voltage" />
   <Parameter name="v0" dimension="voltage" />
   <EventPort name="out" direction="out" />
   <EventPort name="in" direction="in" />
   <Dynamics>
      <StateVariable name="v" dimension="voltage" />
      <OnStart>
         <StateAssignment variable="v" value="v0" />
      </OnStart>
      <Regime name="refr">
         <StateVariable name="tin" dimension="time" />
         <OnEntry>
            <StateAssignment variable="tin" value="t" />
            <StateAssignment variable="v" value="vreset" />
         </OnEntry>
         <OnCondition test="t .gt. tin + refractoryPeriod">
            <Transition regime="int" />
         </OnCondition>
      </Regime>
      <Regime name="int" initial="true">
         <TimeDerivative variable="v" value="(current + gleak * (vleak - v)) / capacitance" />
         <OnCondition test="v .gt. threshold">
            <EventOut port="out" />
            <Transition regime="refr" />
         </OnCondition>
         <OnEvent port="in">
            <StateAssignment variable="v" value="v + deltaV" />
         </OnEvent>
      </Regime>
   </Dynamics>
</ComponentType>

Full listing:

<Lems>

    <Target component="sim1"/> 


    <Include file="ex2dims.xml"/>
    <Include file="spikegenerators.xml"/>
    <Include file="misciaf.xml"/>


    <ComponentType name="refractiaf">
        <Parameter name="threshold" dimension="voltage"/>
        <Parameter name="refractoryPeriod" dimension="time"/>
        <Parameter name="capacitance" dimension="capacitance"/>
        <Parameter name="vleak" dimension="voltage"/>
        <Parameter name="gleak" dimension="conductance"/>

        <Parameter name="current" dimension="current"/>
        <Parameter name="vreset" dimension="voltage"/>
        <Parameter name="deltaV" dimension="voltage"/>
        <Parameter name="v0" dimension="voltage"/>

        <EventPort name="out" direction="out"/>
        <EventPort name="in" direction="in"/>

        <Exposure name="v" dimension="voltage"/>

        <Dynamics>     
            <StateVariable name="v" exposure="v" dimension="voltage" /> 
            <StateVariable name="tin" dimension="time"/>       
            
            <OnStart>
                <StateAssignment variable="v" value="v0"/>
            </OnStart>

            <Regime name="refr">         
                <OnEntry>             
                    <StateAssignment variable="tin" value="t" />             
                    <StateAssignment variable="v" value="vreset" />          
                </OnEntry>                   
                <OnCondition test="t .gt. tin + refractoryPeriod">                 
                    <Transition regime="int" />             
                </OnCondition>         
            </Regime>          

            <Regime name="int" initial="true">         
                <TimeDerivative variable="v" value="(current + gleak * (vleak - v)) / capacitance" />         
                <OnCondition test="v .gt. threshold">             
                    <EventOut port="out" />             
                    <Transition regime="refr" />         
                </OnCondition>         
                <OnEvent port="in">
                    <StateAssignment variable="v" value="v + deltaV"/>
                </OnEvent>

            </Regime>
        </Dynamics>

    </ComponentType>


    <Component id="gen1" type="spikeGenerator" period="7ms"/>

    
    <Component id="multiregime" type="refractiaf" threshold="-50mV" v0="-80mV"
               refractoryPeriod="20ms" capacitance="1pF" vreset="-80mV" vleak="-90mV" 
               gleak="5pS" current="0.00001nA" deltaV="5mV"/>


    <ComponentType name="Network">
        <Children name="populations" type="Population"/>
        <Children name="connectivities" type="EventConnectivity"/>
    </ComponentType>


    <ComponentType name="Population">
        <ComponentReference name="component" type="Component"/>
        <Parameter name="size" dimension="none"/>
        <Structure>
                <MultiInstantiate number="size" component="component"/>
        </Structure>
    </ComponentType>


    <ComponentType name="EventConnectivity">
        <Link name="source" type="Population"/>
        <Link name="target" type="Population"/>
        <Child name="Connections" type="ConnectionPattern"/>
    </ComponentType>


    <ComponentType name="ConnectionPattern"/>


    <ComponentType name="AllAll" extends="ConnectionPattern">
        <Structure>
            <ForEach instances="../source" as="a">
                <ForEach instances="../target" as="b">
                    <EventConnection from="a" to="b"/>
                </ForEach>
            </ForEach>    
        </Structure>
    </ComponentType>


    <Network id="net1">
        <Population id="p1" component="gen1" size="1"/>
        <Population id="p3" component="multiregime" size="2"/>

        <EventConnectivity id="p1-p3" source="p1" target="p3">
            <Connections type="AllAll"/>
        </EventConnectivity>
    </Network>


    <Include file="SingleSimulation.xml" />

    <Simulation id="sim1" length="80ms" step="0.05ms" target="net1">
        <Display id="d0" title="Example 8: Regimes in dynamics definitions" timeScale="1ms" xmin="-10" xmax="90" ymin="-90" ymax="20">
            <Line id="gen_vmr" quantity="p3[0]/v" scale="1mV" timeScale="1ms" color="#00c000"/>
            <Line id="gen_sv" quantity="p1[0]/tsince" scale="1ms" timeScale="1ms" color="#f00000"/>
        </Display>
    </Simulation>


</Lems>