Source code for dipde.internals.externalpopulation

# Copyright 2013 Allen Institute
# This file is part of dipde
# dipde is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# 
# dipde is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with dipde.  If not, see <http://www.gnu.org/licenses/>.

import sympy.parsing.sympy_parser as symp
from sympy.utilities.lambdify import lambdify
from sympy.abc import t as sym_t


[docs]class ExternalPopulation(object): '''External (i.e. background) source for connections to Internal Populations. This class provides a background drive to internal population. It is used as the source argument to a connection, in order to provide background drive. Parameters ---------- firing_rate : numeric, str Output firing rate of the population. If numeric type, this defines a constant background generator; if str, it is interpreted as a SymPy function with independent variable 't'. record : bool (default=False) If True, a history of the output firing rate is recorded (firing_rate_record attribute). **kwargs Any additional keyword args are stored as metadata (metadata attribute). Attributes ---------- self.firing_rate_string : str String representation of firing_rate input parameter. self.metadata : dict Dictonary of metadata, constructed by kwargs not parsed during construction. self.firing_rate_record : list List of firing rates recorded during Simulation. self.t_record : list List of times that firing rates were recorded during Simulation. ''' def __init__(self, firing_rate, record=False, **kwargs): self.firing_rate_string = str(firing_rate) self.closure = lambdify(sym_t,symp.parse_expr(self.firing_rate_string)) self.record = record self.type = "external" # Additional metadata: self.metadata = kwargs
[docs] def firing_rate(self, t): '''Firing rate of the population at time t (Hz).''' curr_firing_rate = self.closure(t) if curr_firing_rate < 0: raise RuntimeError("negative firing rate requested: %s, at t=%s" % (self.firing_rate_string, t)) # pragma: no cover return curr_firing_rate
[docs] def initialize(self): '''Initialize the population at the beginning of a simulation. Calling this method resets the recorder that tracks firing rate during a simulation. This method is called by the Simulation object ( initialization method), but can also be called by a user when defining an alternative time stepping loop. ''' if self.record == True: self.initialize_firing_rate_recorder()
[docs] def update(self): '''Update the population one time step. This method is called by the Simulation object to update the population one time step. In turn, this method calls the update_firing_rate_recorder method to register the current firing rate with the recorder. ''' if self.record == True: self.update_firing_rate_recorder()
[docs] def initialize_firing_rate_recorder(self): '''Initialize recorder at the beginning of a simulation. This method is typically called by the initialize method rather than on its own. It resets the lists that track the firing rate during execution of the simulation. ''' # Set up firing rate recorder: self.firing_rate_record = [self.curr_firing_rate] self.t_record = [self.simulation.t]
[docs] def update_firing_rate_recorder(self): '''Record current time and firing rate, if record==True. This method is called once per time step. If record is True, calling this method will append the current time and firing rate to the firing rate recorder. ''' self.firing_rate_record.append(self.curr_firing_rate) self.t_record.append(self.simulation.t)
@property def curr_firing_rate(self): '''Property that accesses the current firing rate of the population (Hz).''' return float(self.firing_rate(self.simulation.t))