#! /usr/bin/python import lems.api as lems model = lems.Model() model.add(lems.Dimension('voltage', m=1, l=3, t=-3, i=-1)) model.add(lems.Dimension('time', t=1)) model.add(lems.Dimension('capacitance', m=-1, l=-2, t=4, i=2)) model.add(lems.Unit('milliVolt', 'mV', 'voltage', -3)) model.add(lems.Unit('milliSecond', 'ms', 'time', -3)) model.add(lems.Unit('microFarad', 'uF', 'capacitance', -12)) iaf1 = lems.ComponentType('iaf1') model.add(iaf1) iaf1.add(lems.Parameter('threshold', 'voltage')) iaf1.add(lems.Parameter('reset', 'voltage')) iaf1.add(lems.Parameter('refractoryPeriod', 'time')) iaf1.add(lems.Parameter('capacitance', 'capacitance')) iaf1.add(lems.Exposure('vexp', 'voltage')) dp = lems.DerivedParameter('range', 'threshold - reset', 'voltage') iaf1.add(dp) iaf1.dynamics.add(lems.StateVariable('v','voltage', 'vexp')) iaf1.dynamics.add(lems.DerivedVariable('v2',dimension='voltage', value='v*2')) cdv = lems.ConditionalDerivedVariable('v_abs','voltage') cdv.add(lems.Case('v .geq. 0','v')) cdv.add(lems.Case('v .lt. 0','-1*v')) iaf1.dynamics.add(cdv)
def build_lems_for_model(src): model = lems.Model() model.add(lems.Dimension('time', t=1)) # model.add(lems.Dimension('au')) # primary element of the model is a mass model component mass = lems.ComponentType(src.name, extends="baseCellMembPot") model.add(mass) ######### Adding v is required to ease mapping to NEURON... mass.dynamics.add(lems.StateVariable(name="v", dimension="voltage", exposure="v")) mass.add(lems.Attachments(name="synapses",type_="basePointCurrentDL")) for input in src.input: mass.dynamics.add(lems.DerivedVariable(name=input, dimension='none', exposure=input, select='synapses[*]/I', reduce='add')) mass.add(lems.Exposure(input, 'none')) for key, val in src.const.items(): mass.add(lems.Parameter(key, 'none')) # TODO units mass.add(lems.Constant(name="MSEC", dimension="time", value="1ms")) mass.add(lems.Constant(name="PI", dimension="none", value="3.14159265359")) states = [] der_vars = [] # for key in src.param: # mass.add(lems.Parameter(key, 'au')) # TODO units for key, val in src.auxex: val = val.replace('**', '^') mass.dynamics.add(lems.DerivedVariable(key, value=val)) for key in src.obsrv: name_dv = key.replace('(','_').replace(')','').replace(' - ','_min_') mass.dynamics.add(lems.DerivedVariable(name_dv, value=key, exposure=name_dv)) mass.add(lems.Exposure(name_dv, 'none')) for src_svar in src.state_space: name = src_svar.name ddt = src_svar.drift.replace('**', '^') mass.dynamics.add(lems.StateVariable(name, 'none', name)) mass.dynamics.add(lems.TimeDerivative(name, '(%s)/MSEC'%ddt)) mass.add(lems.Exposure(name, 'none')) ''' On condition is not need on the model but NeuroML requires its definition --> <OnCondition test="r .lt. 0"> <EventOut port="spike"/> </OnCondition>''' oc = lems.OnCondition(test='v .gt. 0') oc.actions.append(lems.EventOut(port='spike')) mass.dynamics.add(oc) return model
#!/usr/bin/env python3 import lems.api as lems from lems.base.util import validate_lems model = lems.Model() model.add(lems.Dimension(name="time", t=1)) model.add(lems.Unit(name="second", symbol="s", dimension="time", power=1)) model.add( lems.Unit(name="milli second", symbol="ms", dimension="time", power=-3)) lorenz = lems.ComponentType( name="lorenz1963", description= "The Lorenz system is a simplified model for atomspheric convection, derived from the Navier Stokes equations" ) model.add(lorenz) lorenz.add( lems.Parameter(name="sigma", dimension="none", description="Prandtl Number")) lorenz.add( lems.Parameter(name="beta", dimension="none", description="Also named b elsewhere")) lorenz.add( lems.Parameter( name="rho", dimension="none",