def test_expr_in_funccall(): lems = ''' <ComponentType> <Exposure name="n" dimension="none"/> <Requirement name="v" dimension="none"/> <Dynamics> <StateVariable name="n" dimension="none"/> <DerivedVariable name="_aux0" value="(v + 55) / 10"/> <ConditionalDerivedVariable name="alpha__aux0"> <Case condition="fabs(_aux0) .gt. 1e-6" value="0.1 * _aux0 / (1 - exp(-_aux0))"/> <Case value="0.1 / (1 - 0.5 * _aux0)"/> </ConditionalDerivedVariable> <TimeDerivative variable="n" value="alpha__aux0"/> </Dynamics> </ComponentType>''' mod = LemsCompTypeGenerator().compile_to_string(""" PARAMETER { v (mV) } STATE { n } FUNCTION alpha(x)(/ms){ if(fabs(x) > 1e-6){ alpha=0.1*x/(1-exp(-x)) }else{ alpha=0.1/(1-0.5*x) } } DERIVATIVE dn { n' = alpha((v + 55)/10)} """) assert (xml_compare(mod, lems))
def test_after_if(): lems = ''' <ComponentType> <Exposure name="n" dimension="none"/> <Requirement name="v" dimension="none"/> <Dynamics> <StateVariable name="n" dimension="none"/> <DerivedVariable name="alpha_v::x" value="(v + 55) / 10"/> <ConditionalDerivedVariable name="alpha_v"> <Case condition="fabs(alpha_v::x) .gt. 1e-6" value="0.1 * alpha_v::x / (1 - exp(-alpha_v::x))"/> <Case value="0.1 / (1 - 0.5 * alpha_v::x)"/> </ConditionalDerivedVariable> <TimeDerivative variable="n" value="alpha_v"/> </Dynamics> </ComponentType>''' mod = LemsCompTypeGenerator().compile_to_string(""" PARAMETER { v (mV) } DERIVATIVE dn { n' = alpha(v)} FUNCTION alpha(Vm)(/ms){ LOCAL x x = (Vm + 55) / 10 if(fabs(x) > 1e-6){ alpha=0.1*x/(1-exp(-x)) }else{ alpha=0.1/(1-0.5*x) } } STATE { n } """) assert (xml_compare(mod, lems))
def test_dx_func(): lems = ''' <ComponentType> <Exposure name="x" dimension="none"/> <Requirement name="v" dimension="none"/> <Dynamics> <StateVariable name="x" dimension="none"/> <DerivedVariable name="f_3" value="2 * 3"/> <TimeDerivative value="sin(f_3)" variable="x"/> </Dynamics> </ComponentType> ''' mod = LemsCompTypeGenerator().compile_to_string(''' PARAMETER { v } STATE { x } FUNCTION f(a){f=2*a} DERIVATIVE dx {x' = sin(f(3))} ''') assert (xml_compare(mod, lems))
def test_v_scoping(): lems = ''' <ComponentType> <Exposure name="x" dimension="none"/> <Requirement name="v" dimension="none"/> <Dynamics> <StateVariable name="x" dimension="none"/> <DerivedVariable name="f_x" value="-x"/> <TimeDerivative value="f_x + v" variable="x"/> </Dynamics> </ComponentType> ''' mod = LemsCompTypeGenerator().compile_to_string(''' PARAMETER { v } STATE { x } FUNCTION f(v){f=-v} DERIVATIVE dx {x' = f(x) + v} ''') assert (xml_compare(mod, lems))
def test_double_funccall(): lems = ''' <ComponentType> <Exposure name="x" dimension="none"/> <Requirement name="v" dimension="none"/> <Dynamics> <StateVariable name="x" dimension="none"/> <ConditionalDerivedVariable name="f_v__b"> <Case condition="v .neq. 0" value="v"/> <Case value="1 * v"/> </ConditionalDerivedVariable> <DerivedVariable name="f_v" value="2 * f_v__b"/> <ConditionalDerivedVariable name="f_4__b"> <Case condition="4 .neq. 0" value="4"/> <Case value="1 * 4"/> </ConditionalDerivedVariable> <DerivedVariable name="f_4" value="2 * f_4__b"/> <TimeDerivative value="f_v + f_v - f_4" variable="x"/> </Dynamics> </ComponentType> ''' # TODO: test expr in func arguments mod = LemsCompTypeGenerator().compile_to_string(''' PARAMETER { v(mV) } STATE { x } FUNCTION f(a){ LOCAL b if(a!=0){ b=a } else{ b=1*a } f = 2 * b } DERIVATIVE dx {x' = f(v) + f(v) - f(4)} ''') assert (xml_compare(mod, lems))
def test_scoping_mangling(): lems = ''' <ComponentType> <Exposure name="n" dimension="none"/> <Requirement name="v" dimension="none"/> <Dynamics> <StateVariable name="n" dimension="none"/> <DerivedVariable name="dn::a" value="10"/> <DerivedVariable name="_aux0" value="(v + 55) / dn::a"/> <DerivedVariable name="alpha__aux0::a" value="0.1"/> <ConditionalDerivedVariable name="alpha__aux0"> <Case condition="fabs(_aux0) .gt. alpha__aux0::a" value="alpha__aux0::a * _aux0 / (1 - exp(-_aux0))"/> <Case value="alpha__aux0::a / (1 - 0.5 * _aux0)"/> </ConditionalDerivedVariable> <TimeDerivative variable="n" value="alpha__aux0"/> </Dynamics> </ComponentType>''' mod = LemsCompTypeGenerator().compile_to_string(""" PARAMETER { v (mV) } STATE { n } FUNCTION alpha(x)(/ms){ LOCAL a a = 0.1 if(fabs(x) > a){ alpha=a*x/(1-exp(-x)) }else{ alpha=a/(1-0.5*x) } } DERIVATIVE dn { LOCAL a a = 10 n' = alpha((v + 55)/a)} """) assert (xml_compare(mod, lems))
def test_multiple_call(): lems = ''' <ComponentType> <Exposure name="n" dimension="none"/> <Requirement name="v" dimension="none"/> <Dynamics> <StateVariable name="n" dimension="none"/> <DerivedVariable name="dn::x" value="(v + 55) / 10"/> <ConditionalDerivedVariable name="alpha_id_dn::x"> <Case condition="fabs(id_id_dn::x) .gt. 1e-6" value="0.1 * id_dn::x / (1 - exp(-id_dn::x))"/> <Case value="0.1 / (1 - 0.5 * id_dn::x)"/> </ConditionalDerivedVariable> <DerivedVariable name="dn::x" value="(v + 55) / 10"/> <DerivedVariable name="id_dn::x" value="dn::x"/> <DerivedVariable name="id_id_dn::x" value="id_dn::x"/> <TimeDerivative variable="n" value="alpha_id_dn::x"/> </Dynamics> </ComponentType>''' mod = LemsCompTypeGenerator().compile_to_string(""" PARAMETER { v (mV) } STATE { n } FUNCTION id(x){id = x} FUNCTION alpha(x)(/ms){ if(fabs(id(x)) > 1e-6){ alpha=0.1*x/(1-exp(-x)) }else{ alpha=0.1/(1-0.5*x) } } DERIVATIVE dn { LOCAL x x = (v + 55)/10 n' = alpha(id(x))} """) assert (xml_compare(mod, lems))