From 9f023ff5655af9ab6a4ecaf58c464627530c09e7 Mon Sep 17 00:00:00 2001 From: schmitfe Date: Mon, 4 Dec 2023 12:38:45 +0100 Subject: [PATCH 01/23] Add EI_clustered_network to PyNEST examples --- .../Network_Schematic.png | Bin 0 -> 250599 bytes .../examples/EI_clustered_network/README.rst | 67 ++ .../default_parameters.py | 123 ++++ .../EI_clustered_network/general_helper.py | 97 +++ .../examples/EI_clustered_network/helper.py | 118 ++++ .../examples/EI_clustered_network/network.py | 652 ++++++++++++++++++ .../EI_clustered_network/run_simulation.py | 81 +++ 7 files changed, 1138 insertions(+) create mode 100644 pynest/examples/EI_clustered_network/Network_Schematic.png create mode 100644 pynest/examples/EI_clustered_network/README.rst create mode 100644 pynest/examples/EI_clustered_network/default_parameters.py create mode 100644 pynest/examples/EI_clustered_network/general_helper.py create mode 100644 pynest/examples/EI_clustered_network/helper.py create mode 100644 pynest/examples/EI_clustered_network/network.py create mode 100644 pynest/examples/EI_clustered_network/run_simulation.py diff --git a/pynest/examples/EI_clustered_network/Network_Schematic.png b/pynest/examples/EI_clustered_network/Network_Schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..fddc9f5da1c89d5cfd8adfae390e757819ea8141 GIT binary patch literal 250599 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
!qc?FDssi9qCr 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

+FUIML62yNQbu<})xkZk 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 literal 0 HcmV?d00001 diff --git a/pynest/examples/EI_clustered_network/README.rst b/pynest/examples/EI_clustered_network/README.rst new file mode 100644 index 0000000000..1b14d49c32 --- /dev/null +++ b/pynest/examples/EI_clustered_network/README.rst @@ -0,0 +1,67 @@ +EI-clustered circuit model +=========================== + +This is PyNEST implementation of the EI-clustered circuit model described by Rostami et al. [1]_. + +.. figure:: Network_Schematic.png + :scale: 50 % + :alt: EI-clustered circuit model + + Schematic of the EI-clustered circuit model. The network consists of Q clusters with one excitatory and one inhibitory population each. + +Citing this code +---------------- + +If you use this code, we ask you to cite the paper by Rostami et al. [1]_ and the NEST release on Zenodo. + +File structure +-------------- +* `run_simulation.py`: an example script to try out the EI-clustered circuit model +* `network.py`: the main Network class with functions to build and simulate the network +* `helper.py`: helper functions for calculation of synaptic weights and currents +* `general_helper.py`: helper functions to merge dictionaries and plot function for raster plots +* `default_parameters.py`: default parameters for the network and simulation + +Running the simulation +---------------------- + +.. code-block:: bash + + python3 run_simulation.py + +A raster plot of the network activity is saved as ``Rasterplot.png``. + +The code can be parallelized by using multiple threads during the NEST simulation. +This can be done by setting the parameter ``n_jobs`` in the ``run_simulation.py`` script. + +Contributions to this PyNEST model implementation +-------------------------------------------------------------- +2023: inital bersion of code and documentation by Felix J. Schmitt, Vahid Rostami and Martin Nawrot. + +Acknowledgments +--------------- + +Funding for the study by Rostami et al. [1]_: This work was supported by the German Research Foundation (DFG), +in parts through the Collaborative Research Center ’Motor Control in Health and Disease’ +(DFG-SFB 1451, Project-ID 431549029) and under the Institutional Strategy of the University of Cologne within the +German Excellence Initiative (DFG-ZUK 81/1) and in parts through the DFG graduate school +’Neural Circuit Analysis’ (DFG-RTG 1960, ID 365082554) and through the European Union’s Horizon 2020 Framework +Programme for Research and Innovation under grant agreement number 945539 (Human Brain Project SGA3). + +Other implementations of the EI-clustered model +----------------------------------------------- + +A `GeNN version `__ by Felix J. Schmitt, Vahid Rostami and Martin Nawrot [2]_. + +References +---------- + +.. [1] Rostami V, Rost T, Riehle A, van Albada SJ and Nawrot MP. 2020. + Excitatory and inhibitory motor cortical clusters account for balance, variability, and task performance. + bioRxiv 2020.02.27.968339. DOI: `10.1101/2020.02.27.968339 `__. + + +.. [2] Schmitt FJ, Rostami V and Nawrot MP. 2023. + Efficient parameter calibration and real-time simulation of large-scale spiking neural networks with GeNN + and NEST. Front. Neuroinform. 17:941696. DOI: `10.3389/fninf.2023.941696 `__. + diff --git a/pynest/examples/EI_clustered_network/default_parameters.py b/pynest/examples/EI_clustered_network/default_parameters.py new file mode 100644 index 0000000000..507457920f --- /dev/null +++ b/pynest/examples/EI_clustered_network/default_parameters.py @@ -0,0 +1,123 @@ +# -*- coding: utf-8 -*- +# +# helper.py +# +# This file is part of NEST. +# +# Copyright (C) 2004 The NEST Initiative +# +# NEST 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 2 of the License, or +# (at your option) any later version. +# +# NEST 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 NEST. If not, see . + +"""PyNEST EI-clustered network: default parameters for EI-clustered network +------------------------------------------- + +default parameters for EI-clustered network simulation +""" +import numpy as np + +############################################ +# general parameters +############################################ +eps = np.finfo(float).eps +n_jobs = 1 + +dt=0.1 +simtime=1000. +warmup=0. +record_voltage = False +record_from = 'all' +recording_interval = dt +return_weights = False + +############################################ +# neuron parameters +############################################ +neuron_type = 'iaf_psc_exp' # 'gif_psc_exp' +E_L = 0. +C_m = 1. +tau_E = 20. +tau_I = 10. +t_ref = 5. +V_th_E = 20. +V_th_I = 20. +V_r = 0. +I_xE = 1. +I_xI = 2. +delta_I_xE = 0. +delta_I_xI = 0. +I_th_E = 1.25 +I_th_I = 0.78 +V_m = 'rand' + +# synapse parameters +tau_syn_ex = 3. +tau_syn_in = 2. +delay = 0.1 # synaptic delay + +#Distribution of synaptic weights +#available distributions= https://nest-simulator.readthedocs.io/en/stable/guides/connection_management.html#dist-params + +DistParams={'distribution':'normal', 'sigma': 0.0, 'fraction': False} + +syn_params={"U": 0.2, "u": 0.0, "tau_rec": 120.0, + "tau_fac": 0.0} + + +############################################ +# network parameters +############################################ + +# number of units +N_E = 1200 +N_I = 300 + +# cluster number +Q = 6 +# cluster weight ratios +jplus = np.ones((2,2)) + +# connection probabilities +ps = np.array([[0.2,0.5],[0.5,0.5]]) + +# connections strengths +# weights are js/sqrt(N) +# nan means they are calculated +js = np.ones((2,2))*np.nan +# factors for inhibitory weights +ge = 1.2 +gi = 1. +gie = 1. + +# factor multiplied with weights +s = 1. +fixed_indegree = False + +############################################ +# stimulation parameters +############################################ +stim_clusters = None # clusters to be stimulated +stim_amp = 0. # amplitude of the stimulation current in pA +stim_starts = [] # list of stimulation start times +stim_ends = [] # list of stimulation end times + + + + + + + + + + + diff --git a/pynest/examples/EI_clustered_network/general_helper.py b/pynest/examples/EI_clustered_network/general_helper.py new file mode 100644 index 0000000000..e9fd539629 --- /dev/null +++ b/pynest/examples/EI_clustered_network/general_helper.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +# +# helper.py +# +# This file is part of NEST. +# +# Copyright (C) 2004 The NEST Initiative +# +# NEST 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 2 of the License, or +# (at your option) any later version. +# +# NEST 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 NEST. If not, see . + +"""PyNEST EI-clustered network: general helper functions +------------------------------------------- + +Helper functions for merging dictionaries and some plotting functions. +""" +import matplotlib.pyplot as plt +from types import ModuleType +import copy +import numpy as np + +def merge_params(params, default_values): + """ + Updates default Values defined in a module with params-dictionary. + :param params: dictionary of parameters + :param default_values: module with default values + :return: updated dictionary + """ + return nested_update(module_to_dict(default_values), params) + + + +def module_to_dict(module): + """ + Creates dict of explicit variables in module which are not imported modules. + Generates for each variable name an entry in the dictionary. + :param module: module + :return: dict of explicit variables + """ + module_dict = {} + if module: + module_dict = {key: value for key, value in module.__dict__.items() if not (key.startswith('__') or key.startswith('_') or isinstance(value, ModuleType))} + return module_dict + + +def nested_update(d, d2): + """ + Updates values in d with values of d2. Adds new keys if they are not present. + :param d: dictionary to be updated + :param d2: dictionary with update values + :return: updated dictionary + """ + d_local=copy.deepcopy(d) + for key in d2: + if isinstance(d2[key], dict) and key in d_local: + d_local[key] = nested_update(d_local[key], d2[key]) + else: + d_local[key] = d2[key] + return d_local + +def raster_plot(spiketimes, tlim=None, colorgroups=None, ax=None, markersize=0.5): + """ + Plots raster plot of spiketimes. + :param spiketimes: spiketimes (np.array): Row 0: spiketimes, Row 1: neuron ID. + :param tlim: time limits of plot (list): [tmin, tmax], if None: [min(spiketimes), max(spiketimes)] + :param colorgroups: list of tuples (color, start_neuron_ID, stop_neuron_ID]) for coloring neurons, if None: all black + :param ax: axis object, if None: new figure + :param markersize: size of markers + :return: axis object + """ + if ax is None: + fig, ax = plt.subplots() + if tlim is None: + tlim = [min(spiketimes[0]), max(spiketimes[0])] + if colorgroups is None: + colorgroups = [('k', 0, max(spiketimes[1]))] + for color, start, stop in colorgroups: + ax.plot(spiketimes[0][np.logical_and(spiketimes[1] >= start, spiketimes[1] < stop)], + spiketimes[1][np.logical_and(spiketimes[1] >= start, spiketimes[1] < stop)], + color=color, marker='.', linestyle='None', markersize=markersize) + ax.set_xlim(tlim) + ax.set_ylim([0, max(spiketimes[1])]) + ax.set_xlabel('Time [ms]') + ax.set_ylabel('Neuron ID') + return ax + + diff --git a/pynest/examples/EI_clustered_network/helper.py b/pynest/examples/EI_clustered_network/helper.py new file mode 100644 index 0000000000..74fb21bf33 --- /dev/null +++ b/pynest/examples/EI_clustered_network/helper.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- +# +# helper.py +# +# This file is part of NEST. +# +# Copyright (C) 2004 The NEST Initiative +# +# NEST 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 2 of the License, or +# (at your option) any later version. +# +# NEST 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 NEST. If not, see . + +"""PyNEST EI-clustered network: Helper Functions +------------------------------------------- + +Helper functions to calculate synaptic weights and first passage times for exponential synapses to construct +random balanced networks. +""" + +import numpy as np +small = 1e-10 + + +def max_psp_exp(tau_m, tau_syn, c_m=1., e_l=0.): + """ + Calculates the maximum psp amplitude for exponential synapses and unit J. + :param tau_m: Membrane time constant [ms] + :param tau_syn: Synapse time constant [ms] + :param c_m: Membrane capacity [pF] + :param e_l: Resting potential [mV] + :return: maximum psp amplitude + """ + tmax = np.log(tau_syn / tau_m) / (1 / tau_m - 1 / tau_syn) + B = tau_m * tau_syn / c_m / (tau_syn - tau_m) + return (e_l - B) * np.exp(-tmax / tau_m) + B * np.exp(-tmax / tau_syn) + + +def calc_js(params): + """ + calculates the synaptic weights for exponential synapses before clustering + :param params: dictionary of network parameters + :return: synaptic weights 2x2 matrix + """ + N_E = params.get('N_E') # excitatory units + N_I = params.get('N_I') # inhibitory units + N = N_E + N_I # total units + ps = params.get('ps') # connection probs + ge = params.get('ge') + gi = params.get('gi') + gie = params.get('gie') + V_th_E = params.get('V_th_E') # threshold voltage + V_th_I = params.get('V_th_I') + tau_E = params.get('tau_E') + tau_I = params.get('tau_I') + E_L = params.get('E_L') + neuron_type = params.get('neuron_type') + if ('iaf_psc_exp' in neuron_type) or ('gif_psc_exp' in neuron_type): + tau_syn_ex = params.get('tau_syn_ex') + tau_syn_in = params.get('tau_syn_in') + amp_EE = max_psp_exp(tau_E, tau_syn_ex) + amp_EI = max_psp_exp(tau_E, tau_syn_in) + amp_IE = max_psp_exp(tau_I, tau_syn_ex) + amp_II = max_psp_exp(tau_I, tau_syn_in) + else: + amp_EE = 1. + amp_EI = 1. + amp_IE = 1. + amp_II = 1. + + js = np.zeros((2, 2)) + K_EE = N_E * ps[0, 0] + js[0, 0] = (V_th_E - E_L) * (K_EE ** -0.5) * N ** 0.5 / amp_EE + js[0, 1] = -ge * js[0, 0] * ps[0, 0] * N_E * amp_EE / (ps[0, 1] * N_I * amp_EI) + K_IE = N_E * ps[1, 0] + js[1, 0] = gie * (V_th_I - E_L) * (K_IE ** -0.5) * N ** 0.5 / amp_IE + js[1, 1] = -gi * js[1, 0] * ps[1, 0] * N_E * amp_IE / (ps[1, 1] * N_I * amp_II) + return js + + +def fpt(tau_m, e_l, i_e, c_m, vtarget, vstart): + """ + calculate first pasage time between Vstart and Vtarget. + :param tau_m: Membrane time constant [ms] + :param e_l: Resting potential [mV] + :param i_e: external current [pA] + :param c_m: Membrane capacity [pF] + :param vtarget: target voltage [mV] + :param vstart: start voltage [mV] + :return: first passage time [ms] + """ + inner = (vtarget - e_l - tau_m * i_e / c_m) / (vstart - e_l - tau_m * i_e / c_m + small) + if inner < 0: + return np.nan + else: + return -tau_m * np.log(inner) + +def v_fpt(tau_m, e_l, i_e, c_m, ttarget, vtarget, t_ref): + """ + Calculate the initial voltage required to obtain a certain first passage time. + :param tau_m: Membrane time constant [ms] + :param e_l: Resting potential [mV] + :param i_e: external current [pA] + :param c_m: Membrane capacity [pF] + :param ttarget: target first passage time [ms] + :param vtarget: target voltage [mV] + :param t_ref: refractory period [ms] + :return: initial voltage [mV] + """ + return (vtarget - e_l - tau_m * i_e / c_m) * np.exp(ttarget / tau_m) + e_l + tau_m * i_e / c_m diff --git a/pynest/examples/EI_clustered_network/network.py b/pynest/examples/EI_clustered_network/network.py new file mode 100644 index 0000000000..ed972d2a19 --- /dev/null +++ b/pynest/examples/EI_clustered_network/network.py @@ -0,0 +1,652 @@ +# -*- coding: utf-8 -*- +# +# network.py +# +# This file is part of NEST. +# +# Copyright (C) 2004 The NEST Initiative +# +# NEST 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 2 of the License, or +# (at your option) any later version. +# +# NEST 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 NEST. If not, see . + +"""PyNEST EI-clustered network: Network Class +---------------------------------------- + +Main file of the EI-clustered network defining the ``ClusteredNetwork`` class with functions to +build and simulate the network. + +""" + +import nest +import numpy as np +import pickle +import helper +import general_helper + + +class ClusteredNetwork(object): + """ Provides functions to create neuron populations, stimulation devices and recording devices for an EI-clustered network + and setups the simulation in NEST (v3.x). + + Creates an object with functions to create neuron populations, + stimulation devices and recording devices for an EI-clustered network. + Initializes the object. Creates the attributes Populations, RecordingDevices and + Currentsources to be filled during network construction. + Attribute params contains all parameters used to construct network. + + Parameters: + defaultValues (module): A Module which contains the default configuration + parameters (dict): Dictionary with parameters which should be modified from their default values + """ + + def __init__(self, defaultValues, parameters): + self.params = general_helper.merge_params(parameters, defaultValues) + self.Populations = [] + self.RecordingDevices = [] + self.Currentsources = [] + self.ModelBuildPipeline = [self.setup_nest, self.create_populations, self.create_stimulation, + self.create_recording_devices, self.connect] + + @classmethod + def Clustered_Network_from_Rj_Rep(cls, Rj, Rep, defaultValues, parameters): + """ Creates a ClusteredNetwork object with parameters Rj and Rep + + Rj and Rep are used to calculate the parameters jplus (weight clustering) or pplus (probability clustering) + + Parameters: + Rj (float): Ratio excitatory to inhibitory clustering strength + Rep (float): Excitatory clustering strength + defaultValues (module): A Module which contains the default configuration + parameters (dict): Dictionary with parameters which should be modified from their default values + + Returns: + object: ClusteredNetwork object with parameters + """ + params = general_helper.merge_params(parameters, defaultValues) + if params['clustering'] == 'weight': + jep = Rep + jip = 1. + (jep - 1) * Rj + params['jplus'] = np.array([[jep, jip], [jip, jip]]) + elif params['clustering'] == 'probabilities': + pep = Rep + pip = 1. + (pep - 1) * Rj + params['pplus'] = np.array([[pep, pip], [pip, pip]]) + else: + raise ValueError("Clustering type not recognized") + return cls(defaultValues, params) + + + def clean_network(self): + """ Creates clean network + + Creates empty attributes of a network. + """ + self.Populations = [] + self.RecordingDevices = [] + self.Currentsources = [] + + def setup_nest(self): + """ Initializes the NEST kernel. + + Reset the NEST kernel and pass parameters to it. + Updates randseed of parameters to the actual used one if none is supplied. + """ + nest.ResetKernel() + nest.set_verbosity('M_WARNING') + nest.local_num_threads = self.params.get('n_jobs', 1) + nest.resolution = self.params.get('dt') + self.params['randseed'] = self.params.get('randseed', np.random.randint(1000000)) + nest.rng_seed = self.params.get('randseed') + #nest.print_time = True + + def create_populations(self): + """ Create all neuron populations. + + Q excitatory and inhibitory neuron populations with the parameters of the network are created. + + """ + # make sure number of clusters and units are compatible + assert self.params['N_E'] % self.params['Q'] == 0, 'N_E needs to be evenly divisible by Q' + assert self.params['N_I'] % self.params['Q'] == 0, 'N_I needs to be evenly divisible by Q' + + N = self.params['N_E'] + self.params['N_I'] # total units + try: + DistParams = self.params['DistParams'] + except AttributeError: + DistParams = {'distribution': 'normal', 'sigma': 0.0, 'fraction': False} + + if self.params['I_th_E'] is None: + I_xE = self.params['I_xE'] + else: + I_xE = self.params['I_th_E'] * (self.params['V_th_E'] - self.params['E_L']) / self.params['tau_E'] * \ + self.params['C_m'] + + if self.params['I_th_I'] is None: + I_xI = self.params['I_xI'] + else: + I_xI = self.params['I_th_I'] * (self.params['V_th_I'] - self.params['E_L']) / self.params['tau_I'] * \ + self.params['C_m'] + + E_neuron_params = {'E_L': self.params['E_L'], 'C_m': self.params['C_m'], 'tau_m': self.params['tau_E'], + 't_ref': self.params['t_ref'], 'V_th': self.params['V_th_E'], 'V_reset': self.params['V_r'], + 'I_e': I_xE} + I_neuron_params = {'E_L': self.params['E_L'], 'C_m': self.params['C_m'], 'tau_m': self.params['tau_I'], + 't_ref': self.params['t_ref'], 'V_th': self.params['V_th_I'], 'V_reset': self.params['V_r'], + 'I_e': I_xI} + if 'iaf_psc_exp' in self.params['neuron_type']: + E_neuron_params['tau_syn_ex'] = self.params['tau_syn_ex'] + E_neuron_params['tau_syn_in'] = self.params['tau_syn_in'] + I_neuron_params['tau_syn_in'] = self.params['tau_syn_in'] + I_neuron_params['tau_syn_ex'] = self.params['tau_syn_ex'] + + # iaf_psc_exp allows stochasticity, if not used - ignore + try: + if self.params['delta_'] is not None: + E_neuron_params['delta'] = self.params['delta_'] + I_neuron_params['delta'] = self.params['delta_'] + if self.params['rho'] is not None: + E_neuron_params['rho'] = self.params['rho'] + I_neuron_params['rho'] = self.params['rho'] + except KeyError: + pass + else: + assert 'iaf_psc_exp' in self.params['neuron_type'], "iaf_psc_exp neuron model is the only implemented model" + + # create the neuron populations + E_pops = [] + I_pops = [] + for q in range(self.params['Q']): + E_pops.append(nest.Create(self.params['neuron_type'], int(self.params['N_E'] / self.params['Q']))) + nest.SetStatus(E_pops[-1], E_neuron_params) + for q in range(self.params['Q']): + I_pops.append(nest.Create(self.params['neuron_type'], int(self.params['N_I'] / self.params['Q']))) + nest.SetStatus(I_pops[-1], I_neuron_params) + + if self.params['delta_I_xE'] > 0: + for E_pop in E_pops: + I_xEs = nest.GetStatus(E_pop, 'I_e') + nest.SetStatus(E_pop, [ + {'I_e': (1 - 0.5 * self.params['delta_I_xE'] + np.random.rand() * self.params['delta_I_xE']) * ixe} + for ixe in I_xEs]) + + if self.params['delta_I_xI'] > 0: + for I_pop in I_pops: + I_xIs = nest.GetStatus(I_pop, 'I_e') + nest.SetStatus(I_pop, [ + {'I_e': (1 - 0.5 * self.params['delta_I_xI'] + np.random.rand() * self.params['delta_I_xI']) * ixi} + for ixi in I_xIs]) + if self.params['V_m'] == 'rand': + T_0_E = self.params['t_ref'] + helper.fpt(self.params['tau_E'], self.params['E_L'], I_xE, + self.params['C_m'], self.params['V_th_E'], + self.params['V_r']) + if np.isnan(T_0_E): + T_0_E = 10. + for E_pop in E_pops: + nest.SetStatus(E_pop, [{'V_m': helper.v_fpt(self.params['tau_E'], self.params['E_L'], I_xE, + self.params['C_m'], T_0_E * np.random.rand(), + self.params['V_th_E'], self.params['t_ref'])} for i + in range(len(E_pop))]) + + T_0_I = self.params['t_ref'] + helper.fpt(self.params['tau_I'], self.params['E_L'], I_xI, + self.params['C_m'], self.params['V_th_I'], + self.params['V_r']) + if np.isnan(T_0_I): + T_0_I = 10. + for I_pop in I_pops: + nest.SetStatus(I_pop, [{'V_m': helper.v_fpt(self.params['tau_I'], self.params['E_L'], I_xI, + self.params['C_m'], T_0_I * np.random.rand(), + self.params['V_th_E'], self.params['t_ref'])} for i + in range(len(I_pop))]) + else: + nest.SetStatus(nest.NodeCollection([x for x in range(1, N + 1)]), + [{'V_m': self.params['V_m']} for i in range(N)]) + self.Populations = [E_pops, I_pops] + + + def connect(self): + """ + Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme + """ + # if CLustering is set to "Weight" or is not set at all or is not in dictionary, use the connect_weight function + try: + if self.params['clustering'] == 'weight': + self.connect_weight() + elif self.params['clustering'] == 'probabilities': + self.connect_probabilities() + else: + raise ValueError('Clustering method %s not implemented' % self.params['clustering']) + except KeyError: + self.connect_weight() + + def connect_probabilities(self): + """ Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme + by increasing the probabilies of the connections within the clusters and decreasing the probabilites of the + connections between the clusters. The weights are calculated so that the total input to a neuron + is balanced. + """ + # self.Populations[0] -> Excitatory population + # self.Populations[1] -> Inhibitory population + # connectivity parameters + js = self.params['js'] # connection weights + N = self.params['N_E'] + self.params['N_I'] # total units + if np.isnan(js).any(): + js = helper.calc_js(self.params) + js *= self.params['s'] + + if self.params['Q'] > 1: + pminus = (self.params['Q'] - self.params['pplus']) / float(self.params['Q'] - 1) + else: + self.params['pplus'] = np.ones((2, 2)) + pminus = np.ones((2, 2)) + + p_plus= self.params['pplus']*self.params['ps'] + p_minus = pminus*self.params['ps'] + + iterations = np.ones((2, 2), dtype=int) + # test if any of the probabilities is larger than 1 + if np.any(p_plus > 1): + print('The probability of connection is larger than 1') + print('p_plus: ', p_plus) + print('p_minus: ', p_minus) + for i in range(2): + for j in range(2): + if p_plus[i, j] > 1: + iterations[i, j] = int(np.ceil(p_plus[i, j])) + p_plus[i, j] /= iterations[i, j] + print('p_plus: ', p_plus) + print(iterations) + + # define the synapses and connect the populations + # EE + j_ee = js[0, 0] / np.sqrt(N) + nest.CopyModel("static_synapse", "EE", + {"weight": j_ee, "delay": self.params['delay']}) + + + if self.params['fixed_indegree']: + K_EE_plus = int(p_plus[0, 0] * self.params['N_E'] / self.params['Q']) + print('K_EE+: ', K_EE_plus) + K_EE_minus = int(p_minus[0, 0] * self.params['N_E'] / self.params['Q']) + print('K_EE-: ', K_EE_minus) + conn_params_EE_plus = {'rule': 'fixed_indegree', 'indegree': K_EE_plus, 'allow_autapses': False, + 'allow_multapses': True} + conn_params_EE_minus = {'rule': 'fixed_indegree', 'indegree': K_EE_minus, 'allow_autapses': False, + 'allow_multapses': True} + + else: + conn_params_EE_plus = {'rule': 'pairwise_bernoulli', 'p': p_plus[0, 0], 'allow_autapses': False, + 'allow_multapses': True} + conn_params_EE_minus = {'rule': 'pairwise_bernoulli', 'p': p_minus[0, 0], 'allow_autapses': False, + 'allow_multapses': True} + for i, pre in enumerate(self.Populations[0]): + for j, post in enumerate(self.Populations[0]): + if i == j: + # same cluster + for n in range(iterations[0, 0]): + nest.Connect(pre, post, conn_params_EE_plus, 'EE') + else: + nest.Connect(pre, post, conn_params_EE_minus, 'EE') + + # EI + j_ei = js[0, 1] / np.sqrt(N) + nest.CopyModel("static_synapse", "EI", + {"weight": j_ei, "delay": self.params['delay']}) + + if self.params['fixed_indegree']: + K_EI_plus = int(p_plus[0, 1] * self.params['N_I'] / self.params['Q']) + print('K_EI+: ', K_EI_plus) + K_EI_minus = int(p_minus[0, 1] * self.params['N_I'] / self.params['Q']) + print('K_EI-: ', K_EI_minus) + conn_params_EI_plus = {'rule': 'fixed_indegree', 'indegree': K_EI_plus, 'allow_autapses': False, + 'allow_multapses': True} + conn_params_EI_minus = {'rule': 'fixed_indegree', 'indegree': K_EI_minus, 'allow_autapses': False, + 'allow_multapses': True} + + else: + conn_params_EI_plus = {'rule': 'pairwise_bernoulli', 'p': p_plus[0, 1], 'allow_autapses': False, + 'allow_multapses': True} + conn_params_EI_minus = {'rule': 'pairwise_bernoulli', 'p': p_minus[0, 1], 'allow_autapses': False, + 'allow_multapses': True} + for i, pre in enumerate(self.Populations[1]): + for j, post in enumerate(self.Populations[0]): + if i == j: + # same cluster + for n in range(iterations[0, 1]): + nest.Connect(pre, post, conn_params_EI_plus, 'EI') + else: + nest.Connect(pre, post, conn_params_EI_minus, 'EI') + + # IE + j_ie = js[1, 0] / np.sqrt(N) + nest.CopyModel("static_synapse", "IE", + {"weight": j_ie, "delay": self.params['delay']}) + + if self.params['fixed_indegree']: + K_IE_plus = int(p_plus[1, 0] * self.params['N_E'] / self.params['Q']) + print('K_IE+: ', K_IE_plus) + K_IE_minus = int(p_minus[1, 0] * self.params['N_E'] / self.params['Q']) + print('K_IE-: ', K_IE_minus) + conn_params_IE_plus = {'rule': 'fixed_indegree', 'indegree': K_IE_plus, 'allow_autapses': False, + 'allow_multapses': True} + conn_params_IE_minus = {'rule': 'fixed_indegree', 'indegree': K_IE_minus, 'allow_autapses': False, + 'allow_multapses': True} + + else: + conn_params_IE_plus = {'rule': 'pairwise_bernoulli', 'p': p_plus[1, 0], 'allow_autapses': False, + 'allow_multapses': True} + conn_params_IE_minus = {'rule': 'pairwise_bernoulli', 'p': p_minus[1, 0], 'allow_autapses': False, + 'allow_multapses': True} + for i, pre in enumerate(self.Populations[0]): + for j, post in enumerate(self.Populations[1]): + if i == j: + # same cluster + for n in range(iterations[1, 0]): + nest.Connect(pre, post, conn_params_IE_plus, 'IE') + else: + nest.Connect(pre, post, conn_params_IE_minus, 'IE') + + # II + j_ii = js[1, 1] / np.sqrt(N) + nest.CopyModel("static_synapse", "II", + {"weight": j_ii, "delay": self.params['delay']}) + + if self.params['fixed_indegree']: + K_II_plus = int(p_plus[1, 1] * self.params['N_I'] / self.params['Q']) + print('K_II+: ', K_II_plus) + K_II_minus = int(p_minus[1, 1] * self.params['N_I'] / self.params['Q']) + print('K_II-: ', K_II_minus) + conn_params_II_plus = {'rule': 'fixed_indegree', 'indegree': K_II_plus, 'allow_autapses': False, + 'allow_multapses': True} + conn_params_II_minus = {'rule': 'fixed_indegree', 'indegree': K_II_minus, 'allow_autapses': False, + 'allow_multapses': True} + + else: + conn_params_II_plus = {'rule': 'pairwise_bernoulli', 'p': p_plus[1, 1], 'allow_autapses': False, + 'allow_multapses': True} + conn_params_II_minus = {'rule': 'pairwise_bernoulli', 'p': p_minus[1, 1], 'allow_autapses': False, + 'allow_multapses': True} + for i, pre in enumerate(self.Populations[1]): + for j, post in enumerate(self.Populations[1]): + if i == j: + # same cluster + for n in range(iterations[1, 1]): + nest.Connect(pre, post, conn_params_II_plus, 'II') + else: + nest.Connect(pre, post, conn_params_II_minus, 'II') + + + def connect_weight(self): + """ Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme + by increasing the weights of the connections within the clusters and decreasing the weights of the + connections between the clusters. The weights are calculated so that the total input to a neuron + is balanced. + """ + # self.Populations[0] -> Excitatory population + # self.Populations[1] -> Inhibitory population + # connectivity parameters + js = self.params['js'] # connection weights + N = self.params['N_E'] + self.params['N_I'] # total units + + # if js are not given compute them so that sqrt(K) spikes equal v_thr-E_L and rows are balanced + if np.isnan(js).any(): + js = helper.calc_js(self.params) + js *= self.params['s'] + + # jminus is calculated so that row sums remain constant + if self.params['Q'] > 1: + jminus = (self.params['Q'] - self.params['jplus']) / float(self.params['Q'] - 1) + else: + self.params['jplus'] = np.ones((2, 2)) + jminus = np.ones((2, 2)) + + # define the synapses and connect the populations + # EE + j_ee = js[0, 0] / np.sqrt(N) + nest.CopyModel("static_synapse", "EE_plus", + {"weight": self.params['jplus'][0, 0] * j_ee, "delay": self.params['delay']}) + nest.CopyModel("static_synapse", "EE_minus", {"weight": jminus[0, 0] * j_ee, "delay": self.params['delay']}) + if self.params['fixed_indegree']: + K_EE = int(self.params['ps'][0, 0] * self.params['N_E'] / self.params['Q']) + print('K_EE: ', K_EE) + conn_params_EE = {'rule': 'fixed_indegree', 'indegree': K_EE, 'allow_autapses': False, + 'allow_multapses': False} + + else: + conn_params_EE = {'rule': 'pairwise_bernoulli', 'p': self.params['ps'][0, 0], 'allow_autapses': False, + 'allow_multapses': False} + for i, pre in enumerate(self.Populations[0]): + for j, post in enumerate(self.Populations[0]): + if i == j: + # same cluster + nest.Connect(pre, post, conn_params_EE, 'EE_plus') + else: + nest.Connect(pre, post, conn_params_EE, 'EE_minus') + + # EI + j_ei = js[0, 1] / np.sqrt(N) + nest.CopyModel("static_synapse", "EI_plus", + {"weight": j_ei * self.params['jplus'][0, 1], "delay": self.params['delay']}) + nest.CopyModel("static_synapse", "EI_minus", {"weight": j_ei * jminus[0, 1], "delay": self.params['delay']}) + if self.params['fixed_indegree']: + K_EI = int(self.params['ps'][0, 1] * self.params['N_I'] / self.params['Q']) + print('K_EI: ', K_EI) + conn_params_EI = {'rule': 'fixed_indegree', 'indegree': K_EI, 'allow_autapses': False, + 'allow_multapses': False} + else: + conn_params_EI = {'rule': 'pairwise_bernoulli', 'p': self.params['ps'][0, 1], 'allow_autapses': False, + 'allow_multapses': False} + for i, pre in enumerate(self.Populations[1]): + for j, post in enumerate(self.Populations[0]): + if i == j: + # same cluster + nest.Connect(pre, post, conn_params_EI, 'EI_plus') + else: + nest.Connect(pre, post, conn_params_EI, 'EI_minus') + # IE + j_ie = js[1, 0] / np.sqrt(N) + nest.CopyModel("static_synapse", "IE_plus", + {"weight": j_ie * self.params['jplus'][1, 0], "delay": self.params['delay']}) + nest.CopyModel("static_synapse", "IE_minus", {"weight": j_ie * jminus[1, 0], "delay": self.params['delay']}) + + if self.params['fixed_indegree']: + K_IE = int(self.params['ps'][1, 0] * self.params['N_E'] / self.params['Q']) + print('K_IE: ', K_IE) + conn_params_IE = {'rule': 'fixed_indegree', 'indegree': K_IE, 'allow_autapses': False, + 'allow_multapses': False} + else: + conn_params_IE = {'rule': 'pairwise_bernoulli', 'p': self.params['ps'][1, 0], 'allow_autapses': False, + 'allow_multapses': False} + for i, pre in enumerate(self.Populations[0]): + for j, post in enumerate(self.Populations[1]): + if i == j: + # same cluster + nest.Connect(pre, post, conn_params_IE, 'IE_plus') + else: + nest.Connect(pre, post, conn_params_IE, 'IE_minus') + + # II + j_ii = js[1, 1] / np.sqrt(N) + nest.CopyModel("static_synapse", "II_plus", + {"weight": j_ii * self.params['jplus'][1, 1], "delay": self.params['delay']}) + nest.CopyModel("static_synapse", "II_minus", {"weight": j_ii * jminus[1, 1], "delay": self.params['delay']}) + if self.params['fixed_indegree']: + K_II = int(self.params['ps'][1, 1] * self.params['N_I'] / self.params['Q']) + print('K_II: ', K_II) + conn_params_II = {'rule': 'fixed_indegree', 'indegree': K_II, 'allow_autapses': False, + 'allow_multapses': False} + else: + conn_params_II = {'rule': 'pairwise_bernoulli', 'p': self.params['ps'][1, 1], 'allow_autapses': False, + 'allow_multapses': False} + for i, pre in enumerate(self.Populations[1]): + for j, post in enumerate(self.Populations[1]): + if i == j: + # same cluster + nest.Connect(pre, post, conn_params_II, 'II_plus') + else: + nest.Connect(pre, post, conn_params_II, 'II_minus') + #print('Js: ', js / np.sqrt(N)) + + def create_stimulation(self): + """ + Creates a current source and connects it to the specified cluster/s. + """ + if self.params['stim_clusters'] is not None: + stim_amp = self.params['stim_amp'] # amplitude of the stimulation current in pA + stim_starts = self.params['stim_starts'] # list of stimulation start times + stim_ends = self.params['stim_ends'] # list of stimulation end times + amplitude_values = [] + amplitude_times = [] + for start, end in zip(stim_starts, stim_ends): + amplitude_times.append(start + self.params['warmup']) + amplitude_values.append(stim_amp) + amplitude_times.append(end + self.params['warmup']) + amplitude_values.append(0.) + self.Currentsources = [nest.Create('step_current_generator')] + for stim_cluster in self.params['stim_clusters']: + nest.Connect(self.Currentsources[0], self.Populations[0][stim_cluster]) + nest.SetStatus(self.Currentsources[0], + {'amplitude_times': amplitude_times, 'amplitude_values': amplitude_values}) + + def create_recording_devices(self): + """ + Creates a spike recorder connected to all neuron populations created by create_populations + """ + self.RecordingDevices = [nest.Create("spike_recorder")] + self.RecordingDevices[0].record_to = "memory" + + all_units = self.Populations[0][0] + for E_pop in self.Populations[0][1:]: + all_units += E_pop + for I_pop in self.Populations[1]: + all_units += I_pop + nest.Connect(all_units, self.RecordingDevices[0], "all_to_all") # Spikerecorder + + def set_model_build_pipeline(self, Pipeline): + """ + Sets the ModelBuildPipeline. + Parameters: + Pipeline (list of functions): ordered list of functions executed to build the network model + """ + self.ModelBuildPipeline = Pipeline + + def setup_network(self): + """ + Initializes NEST and creates the network in NEST, ready to be simulated. + Functions saved in ModelBuildPipeline are executed. + nest.Prepare is executed in this function. + """ + for func in self.ModelBuildPipeline: + func() + nest.Prepare() + + + def simulate(self): + """ + Simulates network for a period of warmup+simtime + """ + if self.params['warmup'] + self.params['simtime'] <= 0.1: + pass + else: + nest.Run(self.params['warmup'] + self.params['simtime']) + + def get_recordings(self): + """ + Extracts spikes form the Spikerecorder connected to all populations created in create_populations. + Cuts the warmup period away and sets time relative to end of warmup. + Ids 1:N_E correspond to excitatory neurons, N_E+1:N_E+N_I correspond to inhibitory neurons. + + Returns: + spiketimes (np.array): Row 0: spiketimes, Row 1: neuron ID. + """ + events = nest.GetStatus(self.RecordingDevices[0], 'events')[0] + # convert them to the format accepted by spiketools + spiketimes = np.append(events['times'][None, :], events['senders'][None, :], axis=0) + spiketimes[1] -= 1 + # remove the pre warmup spikes + spiketimes = spiketimes[:, spiketimes[0] >= self.params['warmup']] + spiketimes[0] -= self.params['warmup'] + return spiketimes + + def get_parameter(self): + """ + Returns all parameters used to create the network. + Return: + parameters (dict): Dictionary with all parameters for the simulation / network creation. + """ + return self.params + + def create_and_simulate(self): + """ + Creates the EI-clustered network and simulates it with the parameters supplied in the object creation. + + Returns: + spiketimes (np.array): Row 0: spiketimes, Row 1: neuron ID. + Ids 1:N_E correspond to excitatory neurons, + N_E+1:N_E+N_I correspond to inhibitory neurons. + """ + self.setup_network() + self.simulate() + return self.get_recordings() + + def get_firing_rates(self, spiketimes=None): + """ + Calculates the firing rates of all excitatory neurons and the firing rates of all inhibitory neurons + created by self.create_populations. If spiketimes are not supplied, they get extracted. + Parameters: + spiketimes: (optional, np.array 2xT) spiketimes of simulation + Returns: + (e_rate, i_rate) average firing rate of excitatory/inhibitory neurons (spikes/s) + """ + if spiketimes is None: + spiketimes = self.get_recordings() + e_count = spiketimes[:, spiketimes[1] < self.params['N_E']].shape[1] + i_count = spiketimes[:, spiketimes[1] >= self.params['N_E']].shape[1] + e_rate = e_count / float(self.params['N_E']) / float(self.params['simtime']) * 1000. + i_rate = i_count / float(self.params['N_I']) / float(self.params['simtime']) * 1000. + return e_rate, i_rate + + def set_I_x(self, I_XE, I_XI): + """ + Adds DC currents for the excitatory and inhibitory neurons. Allows also the usage of a baseline defined by the + model setup. + """ + for E_pop in self.Populations[0]: + I_e_loc = E_pop.get('I_e') + E_pop.set({'I_e': I_e_loc + I_XE}) + for I_pop in self.Populations[1]: + I_e_loc = I_pop.get('I_e') + I_pop.set({'I_e': I_e_loc + I_XI}) + + def get_simulation(self, PathSpikes=None): + """ + Creates the network, simulates it and extracts the firing rates. If PathSpikes is supplied the spikes get saved + to a pickle file. If a timeout is supplied, a timeout handler is created which stops the execution. + Parameters: + PathSpikes: (optional) Path of file for spiketimes + timeout: (optional) Time of timeout in seconds + Returns: + Dictionary with firing rates, timing information (dict) and parameters (dict) + """ + + self.setup_network() + self.simulate() + spiketimes = self.get_recordings() + e_rate, i_rate = self.get_firing_rates(spiketimes) + + if PathSpikes is not None: + with open(PathSpikes, 'wb') as outfile: + pickle.dump(spiketimes, outfile) + + nest.Cleanup() + return {'e_rate': e_rate, 'i_rate': i_rate, 'params': self.get_parameter(), + 'spiketimes': spiketimes} diff --git a/pynest/examples/EI_clustered_network/run_simulation.py b/pynest/examples/EI_clustered_network/run_simulation.py new file mode 100644 index 0000000000..9e3b17ce6a --- /dev/null +++ b/pynest/examples/EI_clustered_network/run_simulation.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +# +# network.py +# +# This file is part of NEST. +# +# Copyright (C) 2004 The NEST Initiative +# +# NEST 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 2 of the License, or +# (at your option) any later version. +# +# NEST 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 NEST. If not, see . + +"""PyNEST EI-clustered network: Run Simulation +---------------------------------------- + +This is an example script for running the EI-clustered model with two stimulations +and generating a raster plot. +""" + + +import numpy as np +import default_parameters as default +import network +import general_helper +import matplotlib.pyplot as plt + +if __name__ == '__main__': + # set the parameters for the simulation + params = {'n_jobs': 12, #number of threads used for parallelization in NEST + 'N_E': 4000, #number of excitatory neurons + 'N_I': 1000, #number of inhibitory neurons + 'E_L': 0., #leak potential + 'V_th_E': 20.,#threshold potential for excitatory neurons + 'V_th_I': 20.,#threshold potential for inhibitory neurons + 'V_r': 0., #reset potential + 'C_m': 1., #membrane capacity + 'tau_E': 20., #membrane time constant for excitatory neurons + 'tau_I': 10., #membrane time constant for inhibitory neurons + 't_ref': 5., #refractory period + 'ps': np.array([[0.2, 0.5], [0.5, 0.5]]), #connection probabilities + 'ge': 1.2, #excitatory synaptic weight factor + 'I_th_E': 1.25, #Background current for excitatory neurons in multiples of I_rheobase + 'I_th_I': 0.78, #Background current for inhibitory neurons in multiples of I_rheobase + 'dt': 0.1, #simulation time step + 'neuron_type': 'iaf_psc_exp', #neuron model used in NEST iaf and gif are available + 'simtime': 10000, #simulation time in ms + 'warmup': 1000, #warmup time in ms (time before recording starts) + 'Q': 20, #number of clusters + 'clustering': 'weight', #type of clustering used 'weight' or + 'stim_clusters': [2,3,4], #list of clusters which are stimulated + 'stim_starts': [2000,6000], #list of stimulation start times + 'stim_ends': [3500,7500], #list of stimulation end times + 'stim_amp': 0.15, #amplitude of the stimulation current in pA + #'probabilities' + } + + Rj= 0.82 # ration excitatory to inhibitory clustering + Rep = 6. # excitatory clustering strength + + # Creates object which creates the EI clustered network in NEST + EI_Network = network.ClusteredNetwork.Clustered_Network_from_Rj_Rep(Rj, Rep, default, params) + + # Runs the simulation and returns the spiketimes + # get simulation initializes the network in NEST and runs the simulation + # it returns a dict with the average rates, the spiketimes and the used parameters + Result = EI_Network.get_simulation() + ax = general_helper.raster_plot(Result['spiketimes'], tlim=(0, params['simtime']),colorgroups=[ + ('k', 0, params['N_E']), ("darkred", params['N_E'], params['N_E'] + params['N_I'])]) + plt.savefig('Rasterplot.png') + print('Firing rate of excitatory neurons: ' + str(Result['e_rate']) + ' Spikes/s') + print('Firing rate of inhibitory neurons: ' + str(Result['i_rate']) + ' Spikes/s') + From 625115d33e5a33712811bd731f9c2e69313d8233 Mon Sep 17 00:00:00 2001 From: schmitfe Date: Thu, 14 Dec 2023 14:53:05 +0100 Subject: [PATCH 02/23] Fix issues with copyright headers --- pynest/examples/EI_clustered_network/default_parameters.py | 2 +- pynest/examples/EI_clustered_network/general_helper.py | 2 +- pynest/examples/EI_clustered_network/run_simulation.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pynest/examples/EI_clustered_network/default_parameters.py b/pynest/examples/EI_clustered_network/default_parameters.py index 507457920f..49e866d1bf 100644 --- a/pynest/examples/EI_clustered_network/default_parameters.py +++ b/pynest/examples/EI_clustered_network/default_parameters.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# helper.py +# default_parameters.py # # This file is part of NEST. # diff --git a/pynest/examples/EI_clustered_network/general_helper.py b/pynest/examples/EI_clustered_network/general_helper.py index e9fd539629..aa419d66ed 100644 --- a/pynest/examples/EI_clustered_network/general_helper.py +++ b/pynest/examples/EI_clustered_network/general_helper.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# helper.py +# general_helper.py # # This file is part of NEST. # diff --git a/pynest/examples/EI_clustered_network/run_simulation.py b/pynest/examples/EI_clustered_network/run_simulation.py index 9e3b17ce6a..fe7df07eb7 100644 --- a/pynest/examples/EI_clustered_network/run_simulation.py +++ b/pynest/examples/EI_clustered_network/run_simulation.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# network.py +# run_simulation.py # # This file is part of NEST. # From dd61cbcb9b21e5270f898283c86bc020c4450621 Mon Sep 17 00:00:00 2001 From: schmitfe Date: Thu, 14 Dec 2023 14:59:21 +0100 Subject: [PATCH 03/23] Fix issues with too long lines and trailing newlines --- .../default_parameters.py | 42 +++++--------- .../EI_clustered_network/general_helper.py | 12 ++-- .../examples/EI_clustered_network/network.py | 4 +- .../EI_clustered_network/run_simulation.py | 58 +++++++++---------- 4 files changed, 51 insertions(+), 65 deletions(-) diff --git a/pynest/examples/EI_clustered_network/default_parameters.py b/pynest/examples/EI_clustered_network/default_parameters.py index 49e866d1bf..428f0b3767 100644 --- a/pynest/examples/EI_clustered_network/default_parameters.py +++ b/pynest/examples/EI_clustered_network/default_parameters.py @@ -32,9 +32,9 @@ eps = np.finfo(float).eps n_jobs = 1 -dt=0.1 -simtime=1000. -warmup=0. +dt = 0.1 +simtime = 1000. +warmup = 0. record_voltage = False record_from = 'all' recording_interval = dt @@ -43,7 +43,7 @@ ############################################ # neuron parameters ############################################ -neuron_type = 'iaf_psc_exp' # 'gif_psc_exp' +neuron_type = 'iaf_psc_exp' # 'gif_psc_exp' E_L = 0. C_m = 1. tau_E = 20. @@ -65,14 +65,13 @@ tau_syn_in = 2. delay = 0.1 # synaptic delay -#Distribution of synaptic weights -#available distributions= https://nest-simulator.readthedocs.io/en/stable/guides/connection_management.html#dist-params +# Distribution of synaptic weights +# available distributions= https://nest-simulator.readthedocs.io/en/stable/guides/connection_management.html#dist-params -DistParams={'distribution':'normal', 'sigma': 0.0, 'fraction': False} - -syn_params={"U": 0.2, "u": 0.0, "tau_rec": 120.0, - "tau_fac": 0.0} +DistParams = {'distribution': 'normal', 'sigma': 0.0, 'fraction': False} +syn_params = {"U": 0.2, "u": 0.0, "tau_rec": 120.0, + "tau_fac": 0.0} ############################################ # network parameters @@ -85,15 +84,15 @@ # cluster number Q = 6 # cluster weight ratios -jplus = np.ones((2,2)) +jplus = np.ones((2, 2)) # connection probabilities -ps = np.array([[0.2,0.5],[0.5,0.5]]) +ps = np.array([[0.2, 0.5], [0.5, 0.5]]) # connections strengths # weights are js/sqrt(N) # nan means they are calculated -js = np.ones((2,2))*np.nan +js = np.ones((2, 2)) * np.nan # factors for inhibitory weights ge = 1.2 gi = 1. @@ -106,18 +105,7 @@ ############################################ # stimulation parameters ############################################ -stim_clusters = None # clusters to be stimulated +stim_clusters = None # clusters to be stimulated stim_amp = 0. # amplitude of the stimulation current in pA -stim_starts = [] # list of stimulation start times -stim_ends = [] # list of stimulation end times - - - - - - - - - - - +stim_starts = [] # list of stimulation start times +stim_ends = [] # list of stimulation end times diff --git a/pynest/examples/EI_clustered_network/general_helper.py b/pynest/examples/EI_clustered_network/general_helper.py index aa419d66ed..6abd28dbc6 100644 --- a/pynest/examples/EI_clustered_network/general_helper.py +++ b/pynest/examples/EI_clustered_network/general_helper.py @@ -29,6 +29,7 @@ import copy import numpy as np + def merge_params(params, default_values): """ Updates default Values defined in a module with params-dictionary. @@ -39,7 +40,6 @@ def merge_params(params, default_values): return nested_update(module_to_dict(default_values), params) - def module_to_dict(module): """ Creates dict of explicit variables in module which are not imported modules. @@ -49,7 +49,8 @@ def module_to_dict(module): """ module_dict = {} if module: - module_dict = {key: value for key, value in module.__dict__.items() if not (key.startswith('__') or key.startswith('_') or isinstance(value, ModuleType))} + module_dict = {key: value for key, value in module.__dict__.items() if + not (key.startswith('__') or key.startswith('_') or isinstance(value, ModuleType))} return module_dict @@ -60,7 +61,7 @@ def nested_update(d, d2): :param d2: dictionary with update values :return: updated dictionary """ - d_local=copy.deepcopy(d) + d_local = copy.deepcopy(d) for key in d2: if isinstance(d2[key], dict) and key in d_local: d_local[key] = nested_update(d_local[key], d2[key]) @@ -68,12 +69,13 @@ def nested_update(d, d2): d_local[key] = d2[key] return d_local + def raster_plot(spiketimes, tlim=None, colorgroups=None, ax=None, markersize=0.5): """ Plots raster plot of spiketimes. :param spiketimes: spiketimes (np.array): Row 0: spiketimes, Row 1: neuron ID. :param tlim: time limits of plot (list): [tmin, tmax], if None: [min(spiketimes), max(spiketimes)] - :param colorgroups: list of tuples (color, start_neuron_ID, stop_neuron_ID]) for coloring neurons, if None: all black + :param colorgroups: list of tuples (color, start_neuron_ID, stop_neuron_ID]) for coloring neurons, if None: black :param ax: axis object, if None: new figure :param markersize: size of markers :return: axis object @@ -93,5 +95,3 @@ def raster_plot(spiketimes, tlim=None, colorgroups=None, ax=None, markersize=0.5 ax.set_xlabel('Time [ms]') ax.set_ylabel('Neuron ID') return ax - - diff --git a/pynest/examples/EI_clustered_network/network.py b/pynest/examples/EI_clustered_network/network.py index ed972d2a19..0112a3d118 100644 --- a/pynest/examples/EI_clustered_network/network.py +++ b/pynest/examples/EI_clustered_network/network.py @@ -35,8 +35,8 @@ class ClusteredNetwork(object): - """ Provides functions to create neuron populations, stimulation devices and recording devices for an EI-clustered network - and setups the simulation in NEST (v3.x). + """ Provides functions to create neuron populations, stimulation devices and recording devices for an + EI-clustered network and setups the simulation in NEST (v3.x). Creates an object with functions to create neuron populations, stimulation devices and recording devices for an EI-clustered network. diff --git a/pynest/examples/EI_clustered_network/run_simulation.py b/pynest/examples/EI_clustered_network/run_simulation.py index fe7df07eb7..4d502cf599 100644 --- a/pynest/examples/EI_clustered_network/run_simulation.py +++ b/pynest/examples/EI_clustered_network/run_simulation.py @@ -26,7 +26,6 @@ and generating a raster plot. """ - import numpy as np import default_parameters as default import network @@ -35,35 +34,35 @@ if __name__ == '__main__': # set the parameters for the simulation - params = {'n_jobs': 12, #number of threads used for parallelization in NEST - 'N_E': 4000, #number of excitatory neurons - 'N_I': 1000, #number of inhibitory neurons - 'E_L': 0., #leak potential - 'V_th_E': 20.,#threshold potential for excitatory neurons - 'V_th_I': 20.,#threshold potential for inhibitory neurons - 'V_r': 0., #reset potential - 'C_m': 1., #membrane capacity - 'tau_E': 20., #membrane time constant for excitatory neurons - 'tau_I': 10., #membrane time constant for inhibitory neurons - 't_ref': 5., #refractory period - 'ps': np.array([[0.2, 0.5], [0.5, 0.5]]), #connection probabilities - 'ge': 1.2, #excitatory synaptic weight factor - 'I_th_E': 1.25, #Background current for excitatory neurons in multiples of I_rheobase - 'I_th_I': 0.78, #Background current for inhibitory neurons in multiples of I_rheobase - 'dt': 0.1, #simulation time step - 'neuron_type': 'iaf_psc_exp', #neuron model used in NEST iaf and gif are available - 'simtime': 10000, #simulation time in ms - 'warmup': 1000, #warmup time in ms (time before recording starts) - 'Q': 20, #number of clusters - 'clustering': 'weight', #type of clustering used 'weight' or - 'stim_clusters': [2,3,4], #list of clusters which are stimulated - 'stim_starts': [2000,6000], #list of stimulation start times - 'stim_ends': [3500,7500], #list of stimulation end times - 'stim_amp': 0.15, #amplitude of the stimulation current in pA - #'probabilities' + params = {'n_jobs': 12, # number of threads used for parallelization in NEST + 'N_E': 4000, # number of excitatory neurons + 'N_I': 1000, # number of inhibitory neurons + 'E_L': 0., # leak potential + 'V_th_E': 20., # threshold potential for excitatory neurons + 'V_th_I': 20., # threshold potential for inhibitory neurons + 'V_r': 0., # reset potential + 'C_m': 1., # membrane capacity + 'tau_E': 20., # membrane time constant for excitatory neurons + 'tau_I': 10., # membrane time constant for inhibitory neurons + 't_ref': 5., # refractory period + 'ps': np.array([[0.2, 0.5], [0.5, 0.5]]), # connection probabilities + 'ge': 1.2, # excitatory synaptic weight factor + 'I_th_E': 1.25, # Background current for excitatory neurons in multiples of I_rheobase + 'I_th_I': 0.78, # Background current for inhibitory neurons in multiples of I_rheobase + 'dt': 0.1, # simulation time step + 'neuron_type': 'iaf_psc_exp', # neuron model used in NEST iaf and gif are available + 'simtime': 10000, # simulation time in ms + 'warmup': 1000, # warmup time in ms (time before recording starts) + 'Q': 20, # number of clusters + 'clustering': 'weight', # type of clustering used 'weight' or + 'stim_clusters': [2, 3, 4], # list of clusters which are stimulated + 'stim_starts': [2000, 6000], # list of stimulation start times + 'stim_ends': [3500, 7500], # list of stimulation end times + 'stim_amp': 0.15, # amplitude of the stimulation current in pA + # 'probabilities' } - Rj= 0.82 # ration excitatory to inhibitory clustering + Rj = 0.82 # ration excitatory to inhibitory clustering Rep = 6. # excitatory clustering strength # Creates object which creates the EI clustered network in NEST @@ -73,9 +72,8 @@ # get simulation initializes the network in NEST and runs the simulation # it returns a dict with the average rates, the spiketimes and the used parameters Result = EI_Network.get_simulation() - ax = general_helper.raster_plot(Result['spiketimes'], tlim=(0, params['simtime']),colorgroups=[ + ax = general_helper.raster_plot(Result['spiketimes'], tlim=(0, params['simtime']), colorgroups=[ ('k', 0, params['N_E']), ("darkred", params['N_E'], params['N_E'] + params['N_I'])]) plt.savefig('Rasterplot.png') print('Firing rate of excitatory neurons: ' + str(Result['e_rate']) + ' Spikes/s') print('Firing rate of inhibitory neurons: ' + str(Result['i_rate']) + ' Spikes/s') - From 9a7f79da4f4f06fa3767b3f9f2e6422001ee1a4a Mon Sep 17 00:00:00 2001 From: schmitfe Date: Thu, 14 Dec 2023 15:07:50 +0100 Subject: [PATCH 04/23] Used isort on files to fix imports --- pynest/examples/EI_clustered_network/general_helper.py | 5 +++-- pynest/examples/EI_clustered_network/helper.py | 1 + pynest/examples/EI_clustered_network/network.py | 7 ++++--- pynest/examples/EI_clustered_network/run_simulation.py | 4 ++-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/pynest/examples/EI_clustered_network/general_helper.py b/pynest/examples/EI_clustered_network/general_helper.py index 6abd28dbc6..6683cf730d 100644 --- a/pynest/examples/EI_clustered_network/general_helper.py +++ b/pynest/examples/EI_clustered_network/general_helper.py @@ -24,9 +24,10 @@ Helper functions for merging dictionaries and some plotting functions. """ -import matplotlib.pyplot as plt -from types import ModuleType import copy +from types import ModuleType + +import matplotlib.pyplot as plt import numpy as np diff --git a/pynest/examples/EI_clustered_network/helper.py b/pynest/examples/EI_clustered_network/helper.py index 74fb21bf33..2d91f47937 100644 --- a/pynest/examples/EI_clustered_network/helper.py +++ b/pynest/examples/EI_clustered_network/helper.py @@ -27,6 +27,7 @@ """ import numpy as np + small = 1e-10 diff --git a/pynest/examples/EI_clustered_network/network.py b/pynest/examples/EI_clustered_network/network.py index 0112a3d118..4a8bf1a361 100644 --- a/pynest/examples/EI_clustered_network/network.py +++ b/pynest/examples/EI_clustered_network/network.py @@ -27,11 +27,12 @@ """ -import nest -import numpy as np import pickle -import helper + import general_helper +import helper +import nest +import numpy as np class ClusteredNetwork(object): diff --git a/pynest/examples/EI_clustered_network/run_simulation.py b/pynest/examples/EI_clustered_network/run_simulation.py index 4d502cf599..39f260b12c 100644 --- a/pynest/examples/EI_clustered_network/run_simulation.py +++ b/pynest/examples/EI_clustered_network/run_simulation.py @@ -26,11 +26,11 @@ and generating a raster plot. """ -import numpy as np import default_parameters as default -import network import general_helper import matplotlib.pyplot as plt +import network +import numpy as np if __name__ == '__main__': # set the parameters for the simulation From c0473fbfc0f9c25c799f3f451bc0db5ca6500574 Mon Sep 17 00:00:00 2001 From: schmitfe Date: Thu, 14 Dec 2023 15:19:50 +0100 Subject: [PATCH 05/23] Use black to reformat code --- .../default_parameters.py | 51 +- .../EI_clustered_network/general_helper.py | 28 +- .../examples/EI_clustered_network/helper.py | 55 +- .../examples/EI_clustered_network/network.py | 808 ++++++++++++------ .../EI_clustered_network/run_simulation.py | 84 +- 5 files changed, 658 insertions(+), 368 deletions(-) diff --git a/pynest/examples/EI_clustered_network/default_parameters.py b/pynest/examples/EI_clustered_network/default_parameters.py index 428f0b3767..9a9affa487 100644 --- a/pynest/examples/EI_clustered_network/default_parameters.py +++ b/pynest/examples/EI_clustered_network/default_parameters.py @@ -33,45 +33,44 @@ n_jobs = 1 dt = 0.1 -simtime = 1000. -warmup = 0. +simtime = 1000.0 +warmup = 0.0 record_voltage = False -record_from = 'all' +record_from = "all" recording_interval = dt return_weights = False ############################################ # neuron parameters ############################################ -neuron_type = 'iaf_psc_exp' # 'gif_psc_exp' -E_L = 0. -C_m = 1. -tau_E = 20. -tau_I = 10. -t_ref = 5. -V_th_E = 20. -V_th_I = 20. -V_r = 0. -I_xE = 1. -I_xI = 2. -delta_I_xE = 0. -delta_I_xI = 0. +neuron_type = "iaf_psc_exp" # 'gif_psc_exp' +E_L = 0.0 +C_m = 1.0 +tau_E = 20.0 +tau_I = 10.0 +t_ref = 5.0 +V_th_E = 20.0 +V_th_I = 20.0 +V_r = 0.0 +I_xE = 1.0 +I_xI = 2.0 +delta_I_xE = 0.0 +delta_I_xI = 0.0 I_th_E = 1.25 I_th_I = 0.78 -V_m = 'rand' +V_m = "rand" # synapse parameters -tau_syn_ex = 3. -tau_syn_in = 2. +tau_syn_ex = 3.0 +tau_syn_in = 2.0 delay = 0.1 # synaptic delay # Distribution of synaptic weights # available distributions= https://nest-simulator.readthedocs.io/en/stable/guides/connection_management.html#dist-params -DistParams = {'distribution': 'normal', 'sigma': 0.0, 'fraction': False} +DistParams = {"distribution": "normal", "sigma": 0.0, "fraction": False} -syn_params = {"U": 0.2, "u": 0.0, "tau_rec": 120.0, - "tau_fac": 0.0} +syn_params = {"U": 0.2, "u": 0.0, "tau_rec": 120.0, "tau_fac": 0.0} ############################################ # network parameters @@ -95,17 +94,17 @@ js = np.ones((2, 2)) * np.nan # factors for inhibitory weights ge = 1.2 -gi = 1. -gie = 1. +gi = 1.0 +gie = 1.0 # factor multiplied with weights -s = 1. +s = 1.0 fixed_indegree = False ############################################ # stimulation parameters ############################################ stim_clusters = None # clusters to be stimulated -stim_amp = 0. # amplitude of the stimulation current in pA +stim_amp = 0.0 # amplitude of the stimulation current in pA stim_starts = [] # list of stimulation start times stim_ends = [] # list of stimulation end times diff --git a/pynest/examples/EI_clustered_network/general_helper.py b/pynest/examples/EI_clustered_network/general_helper.py index 6683cf730d..4215c04756 100644 --- a/pynest/examples/EI_clustered_network/general_helper.py +++ b/pynest/examples/EI_clustered_network/general_helper.py @@ -50,8 +50,15 @@ def module_to_dict(module): """ module_dict = {} if module: - module_dict = {key: value for key, value in module.__dict__.items() if - not (key.startswith('__') or key.startswith('_') or isinstance(value, ModuleType))} + module_dict = { + key: value + for key, value in module.__dict__.items() + if not ( + key.startswith("__") + or key.startswith("_") + or isinstance(value, ModuleType) + ) + } return module_dict @@ -86,13 +93,18 @@ def raster_plot(spiketimes, tlim=None, colorgroups=None, ax=None, markersize=0.5 if tlim is None: tlim = [min(spiketimes[0]), max(spiketimes[0])] if colorgroups is None: - colorgroups = [('k', 0, max(spiketimes[1]))] + colorgroups = [("k", 0, max(spiketimes[1]))] for color, start, stop in colorgroups: - ax.plot(spiketimes[0][np.logical_and(spiketimes[1] >= start, spiketimes[1] < stop)], - spiketimes[1][np.logical_and(spiketimes[1] >= start, spiketimes[1] < stop)], - color=color, marker='.', linestyle='None', markersize=markersize) + ax.plot( + spiketimes[0][np.logical_and(spiketimes[1] >= start, spiketimes[1] < stop)], + spiketimes[1][np.logical_and(spiketimes[1] >= start, spiketimes[1] < stop)], + color=color, + marker=".", + linestyle="None", + markersize=markersize, + ) ax.set_xlim(tlim) ax.set_ylim([0, max(spiketimes[1])]) - ax.set_xlabel('Time [ms]') - ax.set_ylabel('Neuron ID') + ax.set_xlabel("Time [ms]") + ax.set_ylabel("Neuron ID") return ax diff --git a/pynest/examples/EI_clustered_network/helper.py b/pynest/examples/EI_clustered_network/helper.py index 2d91f47937..2d7cbcc46b 100644 --- a/pynest/examples/EI_clustered_network/helper.py +++ b/pynest/examples/EI_clustered_network/helper.py @@ -31,7 +31,7 @@ small = 1e-10 -def max_psp_exp(tau_m, tau_syn, c_m=1., e_l=0.): +def max_psp_exp(tau_m, tau_syn, c_m=1.0, e_l=0.0): """ Calculates the maximum psp amplitude for exponential synapses and unit J. :param tau_m: Membrane time constant [ms] @@ -51,38 +51,38 @@ def calc_js(params): :param params: dictionary of network parameters :return: synaptic weights 2x2 matrix """ - N_E = params.get('N_E') # excitatory units - N_I = params.get('N_I') # inhibitory units + N_E = params.get("N_E") # excitatory units + N_I = params.get("N_I") # inhibitory units N = N_E + N_I # total units - ps = params.get('ps') # connection probs - ge = params.get('ge') - gi = params.get('gi') - gie = params.get('gie') - V_th_E = params.get('V_th_E') # threshold voltage - V_th_I = params.get('V_th_I') - tau_E = params.get('tau_E') - tau_I = params.get('tau_I') - E_L = params.get('E_L') - neuron_type = params.get('neuron_type') - if ('iaf_psc_exp' in neuron_type) or ('gif_psc_exp' in neuron_type): - tau_syn_ex = params.get('tau_syn_ex') - tau_syn_in = params.get('tau_syn_in') + ps = params.get("ps") # connection probs + ge = params.get("ge") + gi = params.get("gi") + gie = params.get("gie") + V_th_E = params.get("V_th_E") # threshold voltage + V_th_I = params.get("V_th_I") + tau_E = params.get("tau_E") + tau_I = params.get("tau_I") + E_L = params.get("E_L") + neuron_type = params.get("neuron_type") + if ("iaf_psc_exp" in neuron_type) or ("gif_psc_exp" in neuron_type): + tau_syn_ex = params.get("tau_syn_ex") + tau_syn_in = params.get("tau_syn_in") amp_EE = max_psp_exp(tau_E, tau_syn_ex) amp_EI = max_psp_exp(tau_E, tau_syn_in) amp_IE = max_psp_exp(tau_I, tau_syn_ex) amp_II = max_psp_exp(tau_I, tau_syn_in) else: - amp_EE = 1. - amp_EI = 1. - amp_IE = 1. - amp_II = 1. + amp_EE = 1.0 + amp_EI = 1.0 + amp_IE = 1.0 + amp_II = 1.0 js = np.zeros((2, 2)) K_EE = N_E * ps[0, 0] - js[0, 0] = (V_th_E - E_L) * (K_EE ** -0.5) * N ** 0.5 / amp_EE + js[0, 0] = (V_th_E - E_L) * (K_EE**-0.5) * N**0.5 / amp_EE js[0, 1] = -ge * js[0, 0] * ps[0, 0] * N_E * amp_EE / (ps[0, 1] * N_I * amp_EI) K_IE = N_E * ps[1, 0] - js[1, 0] = gie * (V_th_I - E_L) * (K_IE ** -0.5) * N ** 0.5 / amp_IE + js[1, 0] = gie * (V_th_I - E_L) * (K_IE**-0.5) * N**0.5 / amp_IE js[1, 1] = -gi * js[1, 0] * ps[1, 0] * N_E * amp_IE / (ps[1, 1] * N_I * amp_II) return js @@ -98,12 +98,15 @@ def fpt(tau_m, e_l, i_e, c_m, vtarget, vstart): :param vstart: start voltage [mV] :return: first passage time [ms] """ - inner = (vtarget - e_l - tau_m * i_e / c_m) / (vstart - e_l - tau_m * i_e / c_m + small) + inner = (vtarget - e_l - tau_m * i_e / c_m) / ( + vstart - e_l - tau_m * i_e / c_m + small + ) if inner < 0: return np.nan else: return -tau_m * np.log(inner) + def v_fpt(tau_m, e_l, i_e, c_m, ttarget, vtarget, t_ref): """ Calculate the initial voltage required to obtain a certain first passage time. @@ -116,4 +119,8 @@ def v_fpt(tau_m, e_l, i_e, c_m, ttarget, vtarget, t_ref): :param t_ref: refractory period [ms] :return: initial voltage [mV] """ - return (vtarget - e_l - tau_m * i_e / c_m) * np.exp(ttarget / tau_m) + e_l + tau_m * i_e / c_m + return ( + (vtarget - e_l - tau_m * i_e / c_m) * np.exp(ttarget / tau_m) + + e_l + + tau_m * i_e / c_m + ) diff --git a/pynest/examples/EI_clustered_network/network.py b/pynest/examples/EI_clustered_network/network.py index 4a8bf1a361..8ea0adbb9d 100644 --- a/pynest/examples/EI_clustered_network/network.py +++ b/pynest/examples/EI_clustered_network/network.py @@ -29,14 +29,15 @@ import pickle +import numpy as np + import general_helper import helper import nest -import numpy as np class ClusteredNetwork(object): - """ Provides functions to create neuron populations, stimulation devices and recording devices for an + """Provides functions to create neuron populations, stimulation devices and recording devices for an EI-clustered network and setups the simulation in NEST (v3.x). Creates an object with functions to create neuron populations, @@ -55,12 +56,17 @@ def __init__(self, defaultValues, parameters): self.Populations = [] self.RecordingDevices = [] self.Currentsources = [] - self.ModelBuildPipeline = [self.setup_nest, self.create_populations, self.create_stimulation, - self.create_recording_devices, self.connect] + self.ModelBuildPipeline = [ + self.setup_nest, + self.create_populations, + self.create_stimulation, + self.create_recording_devices, + self.connect, + ] @classmethod def Clustered_Network_from_Rj_Rep(cls, Rj, Rep, defaultValues, parameters): - """ Creates a ClusteredNetwork object with parameters Rj and Rep + """Creates a ClusteredNetwork object with parameters Rj and Rep Rj and Rep are used to calculate the parameters jplus (weight clustering) or pplus (probability clustering) @@ -74,21 +80,20 @@ def Clustered_Network_from_Rj_Rep(cls, Rj, Rep, defaultValues, parameters): object: ClusteredNetwork object with parameters """ params = general_helper.merge_params(parameters, defaultValues) - if params['clustering'] == 'weight': + if params["clustering"] == "weight": jep = Rep - jip = 1. + (jep - 1) * Rj - params['jplus'] = np.array([[jep, jip], [jip, jip]]) - elif params['clustering'] == 'probabilities': + jip = 1.0 + (jep - 1) * Rj + params["jplus"] = np.array([[jep, jip], [jip, jip]]) + elif params["clustering"] == "probabilities": pep = Rep - pip = 1. + (pep - 1) * Rj - params['pplus'] = np.array([[pep, pip], [pip, pip]]) + pip = 1.0 + (pep - 1) * Rj + params["pplus"] = np.array([[pep, pip], [pip, pip]]) else: raise ValueError("Clustering type not recognized") return cls(defaultValues, params) - def clean_network(self): - """ Creates clean network + """Creates clean network Creates empty attributes of a network. """ @@ -97,426 +102,674 @@ def clean_network(self): self.Currentsources = [] def setup_nest(self): - """ Initializes the NEST kernel. + """Initializes the NEST kernel. Reset the NEST kernel and pass parameters to it. Updates randseed of parameters to the actual used one if none is supplied. """ nest.ResetKernel() - nest.set_verbosity('M_WARNING') - nest.local_num_threads = self.params.get('n_jobs', 1) - nest.resolution = self.params.get('dt') - self.params['randseed'] = self.params.get('randseed', np.random.randint(1000000)) - nest.rng_seed = self.params.get('randseed') - #nest.print_time = True + nest.set_verbosity("M_WARNING") + nest.local_num_threads = self.params.get("n_jobs", 1) + nest.resolution = self.params.get("dt") + self.params["randseed"] = self.params.get( + "randseed", np.random.randint(1000000) + ) + nest.rng_seed = self.params.get("randseed") + # nest.print_time = True def create_populations(self): - """ Create all neuron populations. + """Create all neuron populations. Q excitatory and inhibitory neuron populations with the parameters of the network are created. """ # make sure number of clusters and units are compatible - assert self.params['N_E'] % self.params['Q'] == 0, 'N_E needs to be evenly divisible by Q' - assert self.params['N_I'] % self.params['Q'] == 0, 'N_I needs to be evenly divisible by Q' - - N = self.params['N_E'] + self.params['N_I'] # total units + assert ( + self.params["N_E"] % self.params["Q"] == 0 + ), "N_E needs to be evenly divisible by Q" + assert ( + self.params["N_I"] % self.params["Q"] == 0 + ), "N_I needs to be evenly divisible by Q" + + N = self.params["N_E"] + self.params["N_I"] # total units try: - DistParams = self.params['DistParams'] + DistParams = self.params["DistParams"] except AttributeError: - DistParams = {'distribution': 'normal', 'sigma': 0.0, 'fraction': False} + DistParams = {"distribution": "normal", "sigma": 0.0, "fraction": False} - if self.params['I_th_E'] is None: - I_xE = self.params['I_xE'] + if self.params["I_th_E"] is None: + I_xE = self.params["I_xE"] else: - I_xE = self.params['I_th_E'] * (self.params['V_th_E'] - self.params['E_L']) / self.params['tau_E'] * \ - self.params['C_m'] - - if self.params['I_th_I'] is None: - I_xI = self.params['I_xI'] + I_xE = ( + self.params["I_th_E"] + * (self.params["V_th_E"] - self.params["E_L"]) + / self.params["tau_E"] + * self.params["C_m"] + ) + + if self.params["I_th_I"] is None: + I_xI = self.params["I_xI"] else: - I_xI = self.params['I_th_I'] * (self.params['V_th_I'] - self.params['E_L']) / self.params['tau_I'] * \ - self.params['C_m'] - - E_neuron_params = {'E_L': self.params['E_L'], 'C_m': self.params['C_m'], 'tau_m': self.params['tau_E'], - 't_ref': self.params['t_ref'], 'V_th': self.params['V_th_E'], 'V_reset': self.params['V_r'], - 'I_e': I_xE} - I_neuron_params = {'E_L': self.params['E_L'], 'C_m': self.params['C_m'], 'tau_m': self.params['tau_I'], - 't_ref': self.params['t_ref'], 'V_th': self.params['V_th_I'], 'V_reset': self.params['V_r'], - 'I_e': I_xI} - if 'iaf_psc_exp' in self.params['neuron_type']: - E_neuron_params['tau_syn_ex'] = self.params['tau_syn_ex'] - E_neuron_params['tau_syn_in'] = self.params['tau_syn_in'] - I_neuron_params['tau_syn_in'] = self.params['tau_syn_in'] - I_neuron_params['tau_syn_ex'] = self.params['tau_syn_ex'] + I_xI = ( + self.params["I_th_I"] + * (self.params["V_th_I"] - self.params["E_L"]) + / self.params["tau_I"] + * self.params["C_m"] + ) + + E_neuron_params = { + "E_L": self.params["E_L"], + "C_m": self.params["C_m"], + "tau_m": self.params["tau_E"], + "t_ref": self.params["t_ref"], + "V_th": self.params["V_th_E"], + "V_reset": self.params["V_r"], + "I_e": I_xE, + } + I_neuron_params = { + "E_L": self.params["E_L"], + "C_m": self.params["C_m"], + "tau_m": self.params["tau_I"], + "t_ref": self.params["t_ref"], + "V_th": self.params["V_th_I"], + "V_reset": self.params["V_r"], + "I_e": I_xI, + } + if "iaf_psc_exp" in self.params["neuron_type"]: + E_neuron_params["tau_syn_ex"] = self.params["tau_syn_ex"] + E_neuron_params["tau_syn_in"] = self.params["tau_syn_in"] + I_neuron_params["tau_syn_in"] = self.params["tau_syn_in"] + I_neuron_params["tau_syn_ex"] = self.params["tau_syn_ex"] # iaf_psc_exp allows stochasticity, if not used - ignore try: - if self.params['delta_'] is not None: - E_neuron_params['delta'] = self.params['delta_'] - I_neuron_params['delta'] = self.params['delta_'] - if self.params['rho'] is not None: - E_neuron_params['rho'] = self.params['rho'] - I_neuron_params['rho'] = self.params['rho'] + if self.params["delta_"] is not None: + E_neuron_params["delta"] = self.params["delta_"] + I_neuron_params["delta"] = self.params["delta_"] + if self.params["rho"] is not None: + E_neuron_params["rho"] = self.params["rho"] + I_neuron_params["rho"] = self.params["rho"] except KeyError: pass else: - assert 'iaf_psc_exp' in self.params['neuron_type'], "iaf_psc_exp neuron model is the only implemented model" + assert ( + "iaf_psc_exp" in self.params["neuron_type"] + ), "iaf_psc_exp neuron model is the only implemented model" # create the neuron populations E_pops = [] I_pops = [] - for q in range(self.params['Q']): - E_pops.append(nest.Create(self.params['neuron_type'], int(self.params['N_E'] / self.params['Q']))) + for q in range(self.params["Q"]): + E_pops.append( + nest.Create( + self.params["neuron_type"], + int(self.params["N_E"] / self.params["Q"]), + ) + ) nest.SetStatus(E_pops[-1], E_neuron_params) - for q in range(self.params['Q']): - I_pops.append(nest.Create(self.params['neuron_type'], int(self.params['N_I'] / self.params['Q']))) + for q in range(self.params["Q"]): + I_pops.append( + nest.Create( + self.params["neuron_type"], + int(self.params["N_I"] / self.params["Q"]), + ) + ) nest.SetStatus(I_pops[-1], I_neuron_params) - if self.params['delta_I_xE'] > 0: + if self.params["delta_I_xE"] > 0: for E_pop in E_pops: - I_xEs = nest.GetStatus(E_pop, 'I_e') - nest.SetStatus(E_pop, [ - {'I_e': (1 - 0.5 * self.params['delta_I_xE'] + np.random.rand() * self.params['delta_I_xE']) * ixe} - for ixe in I_xEs]) - - if self.params['delta_I_xI'] > 0: + I_xEs = nest.GetStatus(E_pop, "I_e") + nest.SetStatus( + E_pop, + [ + { + "I_e": ( + 1 + - 0.5 * self.params["delta_I_xE"] + + np.random.rand() * self.params["delta_I_xE"] + ) + * ixe + } + for ixe in I_xEs + ], + ) + + if self.params["delta_I_xI"] > 0: for I_pop in I_pops: - I_xIs = nest.GetStatus(I_pop, 'I_e') - nest.SetStatus(I_pop, [ - {'I_e': (1 - 0.5 * self.params['delta_I_xI'] + np.random.rand() * self.params['delta_I_xI']) * ixi} - for ixi in I_xIs]) - if self.params['V_m'] == 'rand': - T_0_E = self.params['t_ref'] + helper.fpt(self.params['tau_E'], self.params['E_L'], I_xE, - self.params['C_m'], self.params['V_th_E'], - self.params['V_r']) + I_xIs = nest.GetStatus(I_pop, "I_e") + nest.SetStatus( + I_pop, + [ + { + "I_e": ( + 1 + - 0.5 * self.params["delta_I_xI"] + + np.random.rand() * self.params["delta_I_xI"] + ) + * ixi + } + for ixi in I_xIs + ], + ) + if self.params["V_m"] == "rand": + T_0_E = self.params["t_ref"] + helper.fpt( + self.params["tau_E"], + self.params["E_L"], + I_xE, + self.params["C_m"], + self.params["V_th_E"], + self.params["V_r"], + ) if np.isnan(T_0_E): - T_0_E = 10. + T_0_E = 10.0 for E_pop in E_pops: - nest.SetStatus(E_pop, [{'V_m': helper.v_fpt(self.params['tau_E'], self.params['E_L'], I_xE, - self.params['C_m'], T_0_E * np.random.rand(), - self.params['V_th_E'], self.params['t_ref'])} for i - in range(len(E_pop))]) - - T_0_I = self.params['t_ref'] + helper.fpt(self.params['tau_I'], self.params['E_L'], I_xI, - self.params['C_m'], self.params['V_th_I'], - self.params['V_r']) + nest.SetStatus( + E_pop, + [ + { + "V_m": helper.v_fpt( + self.params["tau_E"], + self.params["E_L"], + I_xE, + self.params["C_m"], + T_0_E * np.random.rand(), + self.params["V_th_E"], + self.params["t_ref"], + ) + } + for i in range(len(E_pop)) + ], + ) + + T_0_I = self.params["t_ref"] + helper.fpt( + self.params["tau_I"], + self.params["E_L"], + I_xI, + self.params["C_m"], + self.params["V_th_I"], + self.params["V_r"], + ) if np.isnan(T_0_I): - T_0_I = 10. + T_0_I = 10.0 for I_pop in I_pops: - nest.SetStatus(I_pop, [{'V_m': helper.v_fpt(self.params['tau_I'], self.params['E_L'], I_xI, - self.params['C_m'], T_0_I * np.random.rand(), - self.params['V_th_E'], self.params['t_ref'])} for i - in range(len(I_pop))]) + nest.SetStatus( + I_pop, + [ + { + "V_m": helper.v_fpt( + self.params["tau_I"], + self.params["E_L"], + I_xI, + self.params["C_m"], + T_0_I * np.random.rand(), + self.params["V_th_E"], + self.params["t_ref"], + ) + } + for i in range(len(I_pop)) + ], + ) else: - nest.SetStatus(nest.NodeCollection([x for x in range(1, N + 1)]), - [{'V_m': self.params['V_m']} for i in range(N)]) + nest.SetStatus( + nest.NodeCollection([x for x in range(1, N + 1)]), + [{"V_m": self.params["V_m"]} for i in range(N)], + ) self.Populations = [E_pops, I_pops] - def connect(self): """ Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme """ # if CLustering is set to "Weight" or is not set at all or is not in dictionary, use the connect_weight function try: - if self.params['clustering'] == 'weight': + if self.params["clustering"] == "weight": self.connect_weight() - elif self.params['clustering'] == 'probabilities': + elif self.params["clustering"] == "probabilities": self.connect_probabilities() else: - raise ValueError('Clustering method %s not implemented' % self.params['clustering']) + raise ValueError( + "Clustering method %s not implemented" % self.params["clustering"] + ) except KeyError: self.connect_weight() def connect_probabilities(self): - """ Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme - by increasing the probabilies of the connections within the clusters and decreasing the probabilites of the - connections between the clusters. The weights are calculated so that the total input to a neuron - is balanced. + """Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme + by increasing the probabilies of the connections within the clusters and decreasing the probabilites of the + connections between the clusters. The weights are calculated so that the total input to a neuron + is balanced. """ # self.Populations[0] -> Excitatory population # self.Populations[1] -> Inhibitory population # connectivity parameters - js = self.params['js'] # connection weights - N = self.params['N_E'] + self.params['N_I'] # total units + js = self.params["js"] # connection weights + N = self.params["N_E"] + self.params["N_I"] # total units if np.isnan(js).any(): js = helper.calc_js(self.params) - js *= self.params['s'] + js *= self.params["s"] - if self.params['Q'] > 1: - pminus = (self.params['Q'] - self.params['pplus']) / float(self.params['Q'] - 1) + if self.params["Q"] > 1: + pminus = (self.params["Q"] - self.params["pplus"]) / float( + self.params["Q"] - 1 + ) else: - self.params['pplus'] = np.ones((2, 2)) + self.params["pplus"] = np.ones((2, 2)) pminus = np.ones((2, 2)) - p_plus= self.params['pplus']*self.params['ps'] - p_minus = pminus*self.params['ps'] + p_plus = self.params["pplus"] * self.params["ps"] + p_minus = pminus * self.params["ps"] iterations = np.ones((2, 2), dtype=int) # test if any of the probabilities is larger than 1 if np.any(p_plus > 1): - print('The probability of connection is larger than 1') - print('p_plus: ', p_plus) - print('p_minus: ', p_minus) + print("The probability of connection is larger than 1") + print("p_plus: ", p_plus) + print("p_minus: ", p_minus) for i in range(2): for j in range(2): if p_plus[i, j] > 1: iterations[i, j] = int(np.ceil(p_plus[i, j])) p_plus[i, j] /= iterations[i, j] - print('p_plus: ', p_plus) + print("p_plus: ", p_plus) print(iterations) # define the synapses and connect the populations # EE j_ee = js[0, 0] / np.sqrt(N) - nest.CopyModel("static_synapse", "EE", - {"weight": j_ee, "delay": self.params['delay']}) - - - if self.params['fixed_indegree']: - K_EE_plus = int(p_plus[0, 0] * self.params['N_E'] / self.params['Q']) - print('K_EE+: ', K_EE_plus) - K_EE_minus = int(p_minus[0, 0] * self.params['N_E'] / self.params['Q']) - print('K_EE-: ', K_EE_minus) - conn_params_EE_plus = {'rule': 'fixed_indegree', 'indegree': K_EE_plus, 'allow_autapses': False, - 'allow_multapses': True} - conn_params_EE_minus = {'rule': 'fixed_indegree', 'indegree': K_EE_minus, 'allow_autapses': False, - 'allow_multapses': True} + nest.CopyModel( + "static_synapse", "EE", {"weight": j_ee, "delay": self.params["delay"]} + ) + + if self.params["fixed_indegree"]: + K_EE_plus = int(p_plus[0, 0] * self.params["N_E"] / self.params["Q"]) + print("K_EE+: ", K_EE_plus) + K_EE_minus = int(p_minus[0, 0] * self.params["N_E"] / self.params["Q"]) + print("K_EE-: ", K_EE_minus) + conn_params_EE_plus = { + "rule": "fixed_indegree", + "indegree": K_EE_plus, + "allow_autapses": False, + "allow_multapses": True, + } + conn_params_EE_minus = { + "rule": "fixed_indegree", + "indegree": K_EE_minus, + "allow_autapses": False, + "allow_multapses": True, + } else: - conn_params_EE_plus = {'rule': 'pairwise_bernoulli', 'p': p_plus[0, 0], 'allow_autapses': False, - 'allow_multapses': True} - conn_params_EE_minus = {'rule': 'pairwise_bernoulli', 'p': p_minus[0, 0], 'allow_autapses': False, - 'allow_multapses': True} + conn_params_EE_plus = { + "rule": "pairwise_bernoulli", + "p": p_plus[0, 0], + "allow_autapses": False, + "allow_multapses": True, + } + conn_params_EE_minus = { + "rule": "pairwise_bernoulli", + "p": p_minus[0, 0], + "allow_autapses": False, + "allow_multapses": True, + } for i, pre in enumerate(self.Populations[0]): for j, post in enumerate(self.Populations[0]): if i == j: # same cluster for n in range(iterations[0, 0]): - nest.Connect(pre, post, conn_params_EE_plus, 'EE') + nest.Connect(pre, post, conn_params_EE_plus, "EE") else: - nest.Connect(pre, post, conn_params_EE_minus, 'EE') + nest.Connect(pre, post, conn_params_EE_minus, "EE") # EI j_ei = js[0, 1] / np.sqrt(N) - nest.CopyModel("static_synapse", "EI", - {"weight": j_ei, "delay": self.params['delay']}) - - if self.params['fixed_indegree']: - K_EI_plus = int(p_plus[0, 1] * self.params['N_I'] / self.params['Q']) - print('K_EI+: ', K_EI_plus) - K_EI_minus = int(p_minus[0, 1] * self.params['N_I'] / self.params['Q']) - print('K_EI-: ', K_EI_minus) - conn_params_EI_plus = {'rule': 'fixed_indegree', 'indegree': K_EI_plus, 'allow_autapses': False, - 'allow_multapses': True} - conn_params_EI_minus = {'rule': 'fixed_indegree', 'indegree': K_EI_minus, 'allow_autapses': False, - 'allow_multapses': True} + nest.CopyModel( + "static_synapse", "EI", {"weight": j_ei, "delay": self.params["delay"]} + ) + + if self.params["fixed_indegree"]: + K_EI_plus = int(p_plus[0, 1] * self.params["N_I"] / self.params["Q"]) + print("K_EI+: ", K_EI_plus) + K_EI_minus = int(p_minus[0, 1] * self.params["N_I"] / self.params["Q"]) + print("K_EI-: ", K_EI_minus) + conn_params_EI_plus = { + "rule": "fixed_indegree", + "indegree": K_EI_plus, + "allow_autapses": False, + "allow_multapses": True, + } + conn_params_EI_minus = { + "rule": "fixed_indegree", + "indegree": K_EI_minus, + "allow_autapses": False, + "allow_multapses": True, + } else: - conn_params_EI_plus = {'rule': 'pairwise_bernoulli', 'p': p_plus[0, 1], 'allow_autapses': False, - 'allow_multapses': True} - conn_params_EI_minus = {'rule': 'pairwise_bernoulli', 'p': p_minus[0, 1], 'allow_autapses': False, - 'allow_multapses': True} + conn_params_EI_plus = { + "rule": "pairwise_bernoulli", + "p": p_plus[0, 1], + "allow_autapses": False, + "allow_multapses": True, + } + conn_params_EI_minus = { + "rule": "pairwise_bernoulli", + "p": p_minus[0, 1], + "allow_autapses": False, + "allow_multapses": True, + } for i, pre in enumerate(self.Populations[1]): for j, post in enumerate(self.Populations[0]): if i == j: # same cluster for n in range(iterations[0, 1]): - nest.Connect(pre, post, conn_params_EI_plus, 'EI') + nest.Connect(pre, post, conn_params_EI_plus, "EI") else: - nest.Connect(pre, post, conn_params_EI_minus, 'EI') + nest.Connect(pre, post, conn_params_EI_minus, "EI") # IE j_ie = js[1, 0] / np.sqrt(N) - nest.CopyModel("static_synapse", "IE", - {"weight": j_ie, "delay": self.params['delay']}) - - if self.params['fixed_indegree']: - K_IE_plus = int(p_plus[1, 0] * self.params['N_E'] / self.params['Q']) - print('K_IE+: ', K_IE_plus) - K_IE_minus = int(p_minus[1, 0] * self.params['N_E'] / self.params['Q']) - print('K_IE-: ', K_IE_minus) - conn_params_IE_plus = {'rule': 'fixed_indegree', 'indegree': K_IE_plus, 'allow_autapses': False, - 'allow_multapses': True} - conn_params_IE_minus = {'rule': 'fixed_indegree', 'indegree': K_IE_minus, 'allow_autapses': False, - 'allow_multapses': True} + nest.CopyModel( + "static_synapse", "IE", {"weight": j_ie, "delay": self.params["delay"]} + ) + + if self.params["fixed_indegree"]: + K_IE_plus = int(p_plus[1, 0] * self.params["N_E"] / self.params["Q"]) + print("K_IE+: ", K_IE_plus) + K_IE_minus = int(p_minus[1, 0] * self.params["N_E"] / self.params["Q"]) + print("K_IE-: ", K_IE_minus) + conn_params_IE_plus = { + "rule": "fixed_indegree", + "indegree": K_IE_plus, + "allow_autapses": False, + "allow_multapses": True, + } + conn_params_IE_minus = { + "rule": "fixed_indegree", + "indegree": K_IE_minus, + "allow_autapses": False, + "allow_multapses": True, + } else: - conn_params_IE_plus = {'rule': 'pairwise_bernoulli', 'p': p_plus[1, 0], 'allow_autapses': False, - 'allow_multapses': True} - conn_params_IE_minus = {'rule': 'pairwise_bernoulli', 'p': p_minus[1, 0], 'allow_autapses': False, - 'allow_multapses': True} + conn_params_IE_plus = { + "rule": "pairwise_bernoulli", + "p": p_plus[1, 0], + "allow_autapses": False, + "allow_multapses": True, + } + conn_params_IE_minus = { + "rule": "pairwise_bernoulli", + "p": p_minus[1, 0], + "allow_autapses": False, + "allow_multapses": True, + } for i, pre in enumerate(self.Populations[0]): for j, post in enumerate(self.Populations[1]): if i == j: # same cluster for n in range(iterations[1, 0]): - nest.Connect(pre, post, conn_params_IE_plus, 'IE') + nest.Connect(pre, post, conn_params_IE_plus, "IE") else: - nest.Connect(pre, post, conn_params_IE_minus, 'IE') + nest.Connect(pre, post, conn_params_IE_minus, "IE") # II j_ii = js[1, 1] / np.sqrt(N) - nest.CopyModel("static_synapse", "II", - {"weight": j_ii, "delay": self.params['delay']}) - - if self.params['fixed_indegree']: - K_II_plus = int(p_plus[1, 1] * self.params['N_I'] / self.params['Q']) - print('K_II+: ', K_II_plus) - K_II_minus = int(p_minus[1, 1] * self.params['N_I'] / self.params['Q']) - print('K_II-: ', K_II_minus) - conn_params_II_plus = {'rule': 'fixed_indegree', 'indegree': K_II_plus, 'allow_autapses': False, - 'allow_multapses': True} - conn_params_II_minus = {'rule': 'fixed_indegree', 'indegree': K_II_minus, 'allow_autapses': False, - 'allow_multapses': True} + nest.CopyModel( + "static_synapse", "II", {"weight": j_ii, "delay": self.params["delay"]} + ) + + if self.params["fixed_indegree"]: + K_II_plus = int(p_plus[1, 1] * self.params["N_I"] / self.params["Q"]) + print("K_II+: ", K_II_plus) + K_II_minus = int(p_minus[1, 1] * self.params["N_I"] / self.params["Q"]) + print("K_II-: ", K_II_minus) + conn_params_II_plus = { + "rule": "fixed_indegree", + "indegree": K_II_plus, + "allow_autapses": False, + "allow_multapses": True, + } + conn_params_II_minus = { + "rule": "fixed_indegree", + "indegree": K_II_minus, + "allow_autapses": False, + "allow_multapses": True, + } else: - conn_params_II_plus = {'rule': 'pairwise_bernoulli', 'p': p_plus[1, 1], 'allow_autapses': False, - 'allow_multapses': True} - conn_params_II_minus = {'rule': 'pairwise_bernoulli', 'p': p_minus[1, 1], 'allow_autapses': False, - 'allow_multapses': True} + conn_params_II_plus = { + "rule": "pairwise_bernoulli", + "p": p_plus[1, 1], + "allow_autapses": False, + "allow_multapses": True, + } + conn_params_II_minus = { + "rule": "pairwise_bernoulli", + "p": p_minus[1, 1], + "allow_autapses": False, + "allow_multapses": True, + } for i, pre in enumerate(self.Populations[1]): for j, post in enumerate(self.Populations[1]): if i == j: # same cluster for n in range(iterations[1, 1]): - nest.Connect(pre, post, conn_params_II_plus, 'II') + nest.Connect(pre, post, conn_params_II_plus, "II") else: - nest.Connect(pre, post, conn_params_II_minus, 'II') - + nest.Connect(pre, post, conn_params_II_minus, "II") def connect_weight(self): - """ Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme - by increasing the weights of the connections within the clusters and decreasing the weights of the - connections between the clusters. The weights are calculated so that the total input to a neuron - is balanced. + """Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme + by increasing the weights of the connections within the clusters and decreasing the weights of the + connections between the clusters. The weights are calculated so that the total input to a neuron + is balanced. """ # self.Populations[0] -> Excitatory population # self.Populations[1] -> Inhibitory population # connectivity parameters - js = self.params['js'] # connection weights - N = self.params['N_E'] + self.params['N_I'] # total units + js = self.params["js"] # connection weights + N = self.params["N_E"] + self.params["N_I"] # total units # if js are not given compute them so that sqrt(K) spikes equal v_thr-E_L and rows are balanced if np.isnan(js).any(): js = helper.calc_js(self.params) - js *= self.params['s'] + js *= self.params["s"] # jminus is calculated so that row sums remain constant - if self.params['Q'] > 1: - jminus = (self.params['Q'] - self.params['jplus']) / float(self.params['Q'] - 1) + if self.params["Q"] > 1: + jminus = (self.params["Q"] - self.params["jplus"]) / float( + self.params["Q"] - 1 + ) else: - self.params['jplus'] = np.ones((2, 2)) + self.params["jplus"] = np.ones((2, 2)) jminus = np.ones((2, 2)) # define the synapses and connect the populations # EE j_ee = js[0, 0] / np.sqrt(N) - nest.CopyModel("static_synapse", "EE_plus", - {"weight": self.params['jplus'][0, 0] * j_ee, "delay": self.params['delay']}) - nest.CopyModel("static_synapse", "EE_minus", {"weight": jminus[0, 0] * j_ee, "delay": self.params['delay']}) - if self.params['fixed_indegree']: - K_EE = int(self.params['ps'][0, 0] * self.params['N_E'] / self.params['Q']) - print('K_EE: ', K_EE) - conn_params_EE = {'rule': 'fixed_indegree', 'indegree': K_EE, 'allow_autapses': False, - 'allow_multapses': False} + nest.CopyModel( + "static_synapse", + "EE_plus", + { + "weight": self.params["jplus"][0, 0] * j_ee, + "delay": self.params["delay"], + }, + ) + nest.CopyModel( + "static_synapse", + "EE_minus", + {"weight": jminus[0, 0] * j_ee, "delay": self.params["delay"]}, + ) + if self.params["fixed_indegree"]: + K_EE = int(self.params["ps"][0, 0] * self.params["N_E"] / self.params["Q"]) + print("K_EE: ", K_EE) + conn_params_EE = { + "rule": "fixed_indegree", + "indegree": K_EE, + "allow_autapses": False, + "allow_multapses": False, + } else: - conn_params_EE = {'rule': 'pairwise_bernoulli', 'p': self.params['ps'][0, 0], 'allow_autapses': False, - 'allow_multapses': False} + conn_params_EE = { + "rule": "pairwise_bernoulli", + "p": self.params["ps"][0, 0], + "allow_autapses": False, + "allow_multapses": False, + } for i, pre in enumerate(self.Populations[0]): for j, post in enumerate(self.Populations[0]): if i == j: # same cluster - nest.Connect(pre, post, conn_params_EE, 'EE_plus') + nest.Connect(pre, post, conn_params_EE, "EE_plus") else: - nest.Connect(pre, post, conn_params_EE, 'EE_minus') + nest.Connect(pre, post, conn_params_EE, "EE_minus") # EI j_ei = js[0, 1] / np.sqrt(N) - nest.CopyModel("static_synapse", "EI_plus", - {"weight": j_ei * self.params['jplus'][0, 1], "delay": self.params['delay']}) - nest.CopyModel("static_synapse", "EI_minus", {"weight": j_ei * jminus[0, 1], "delay": self.params['delay']}) - if self.params['fixed_indegree']: - K_EI = int(self.params['ps'][0, 1] * self.params['N_I'] / self.params['Q']) - print('K_EI: ', K_EI) - conn_params_EI = {'rule': 'fixed_indegree', 'indegree': K_EI, 'allow_autapses': False, - 'allow_multapses': False} + nest.CopyModel( + "static_synapse", + "EI_plus", + { + "weight": j_ei * self.params["jplus"][0, 1], + "delay": self.params["delay"], + }, + ) + nest.CopyModel( + "static_synapse", + "EI_minus", + {"weight": j_ei * jminus[0, 1], "delay": self.params["delay"]}, + ) + if self.params["fixed_indegree"]: + K_EI = int(self.params["ps"][0, 1] * self.params["N_I"] / self.params["Q"]) + print("K_EI: ", K_EI) + conn_params_EI = { + "rule": "fixed_indegree", + "indegree": K_EI, + "allow_autapses": False, + "allow_multapses": False, + } else: - conn_params_EI = {'rule': 'pairwise_bernoulli', 'p': self.params['ps'][0, 1], 'allow_autapses': False, - 'allow_multapses': False} + conn_params_EI = { + "rule": "pairwise_bernoulli", + "p": self.params["ps"][0, 1], + "allow_autapses": False, + "allow_multapses": False, + } for i, pre in enumerate(self.Populations[1]): for j, post in enumerate(self.Populations[0]): if i == j: # same cluster - nest.Connect(pre, post, conn_params_EI, 'EI_plus') + nest.Connect(pre, post, conn_params_EI, "EI_plus") else: - nest.Connect(pre, post, conn_params_EI, 'EI_minus') + nest.Connect(pre, post, conn_params_EI, "EI_minus") # IE j_ie = js[1, 0] / np.sqrt(N) - nest.CopyModel("static_synapse", "IE_plus", - {"weight": j_ie * self.params['jplus'][1, 0], "delay": self.params['delay']}) - nest.CopyModel("static_synapse", "IE_minus", {"weight": j_ie * jminus[1, 0], "delay": self.params['delay']}) - - if self.params['fixed_indegree']: - K_IE = int(self.params['ps'][1, 0] * self.params['N_E'] / self.params['Q']) - print('K_IE: ', K_IE) - conn_params_IE = {'rule': 'fixed_indegree', 'indegree': K_IE, 'allow_autapses': False, - 'allow_multapses': False} + nest.CopyModel( + "static_synapse", + "IE_plus", + { + "weight": j_ie * self.params["jplus"][1, 0], + "delay": self.params["delay"], + }, + ) + nest.CopyModel( + "static_synapse", + "IE_minus", + {"weight": j_ie * jminus[1, 0], "delay": self.params["delay"]}, + ) + + if self.params["fixed_indegree"]: + K_IE = int(self.params["ps"][1, 0] * self.params["N_E"] / self.params["Q"]) + print("K_IE: ", K_IE) + conn_params_IE = { + "rule": "fixed_indegree", + "indegree": K_IE, + "allow_autapses": False, + "allow_multapses": False, + } else: - conn_params_IE = {'rule': 'pairwise_bernoulli', 'p': self.params['ps'][1, 0], 'allow_autapses': False, - 'allow_multapses': False} + conn_params_IE = { + "rule": "pairwise_bernoulli", + "p": self.params["ps"][1, 0], + "allow_autapses": False, + "allow_multapses": False, + } for i, pre in enumerate(self.Populations[0]): for j, post in enumerate(self.Populations[1]): if i == j: # same cluster - nest.Connect(pre, post, conn_params_IE, 'IE_plus') + nest.Connect(pre, post, conn_params_IE, "IE_plus") else: - nest.Connect(pre, post, conn_params_IE, 'IE_minus') + nest.Connect(pre, post, conn_params_IE, "IE_minus") # II j_ii = js[1, 1] / np.sqrt(N) - nest.CopyModel("static_synapse", "II_plus", - {"weight": j_ii * self.params['jplus'][1, 1], "delay": self.params['delay']}) - nest.CopyModel("static_synapse", "II_minus", {"weight": j_ii * jminus[1, 1], "delay": self.params['delay']}) - if self.params['fixed_indegree']: - K_II = int(self.params['ps'][1, 1] * self.params['N_I'] / self.params['Q']) - print('K_II: ', K_II) - conn_params_II = {'rule': 'fixed_indegree', 'indegree': K_II, 'allow_autapses': False, - 'allow_multapses': False} + nest.CopyModel( + "static_synapse", + "II_plus", + { + "weight": j_ii * self.params["jplus"][1, 1], + "delay": self.params["delay"], + }, + ) + nest.CopyModel( + "static_synapse", + "II_minus", + {"weight": j_ii * jminus[1, 1], "delay": self.params["delay"]}, + ) + if self.params["fixed_indegree"]: + K_II = int(self.params["ps"][1, 1] * self.params["N_I"] / self.params["Q"]) + print("K_II: ", K_II) + conn_params_II = { + "rule": "fixed_indegree", + "indegree": K_II, + "allow_autapses": False, + "allow_multapses": False, + } else: - conn_params_II = {'rule': 'pairwise_bernoulli', 'p': self.params['ps'][1, 1], 'allow_autapses': False, - 'allow_multapses': False} + conn_params_II = { + "rule": "pairwise_bernoulli", + "p": self.params["ps"][1, 1], + "allow_autapses": False, + "allow_multapses": False, + } for i, pre in enumerate(self.Populations[1]): for j, post in enumerate(self.Populations[1]): if i == j: # same cluster - nest.Connect(pre, post, conn_params_II, 'II_plus') + nest.Connect(pre, post, conn_params_II, "II_plus") else: - nest.Connect(pre, post, conn_params_II, 'II_minus') - #print('Js: ', js / np.sqrt(N)) + nest.Connect(pre, post, conn_params_II, "II_minus") + # print('Js: ', js / np.sqrt(N)) def create_stimulation(self): """ Creates a current source and connects it to the specified cluster/s. """ - if self.params['stim_clusters'] is not None: - stim_amp = self.params['stim_amp'] # amplitude of the stimulation current in pA - stim_starts = self.params['stim_starts'] # list of stimulation start times - stim_ends = self.params['stim_ends'] # list of stimulation end times + if self.params["stim_clusters"] is not None: + stim_amp = self.params[ + "stim_amp" + ] # amplitude of the stimulation current in pA + stim_starts = self.params["stim_starts"] # list of stimulation start times + stim_ends = self.params["stim_ends"] # list of stimulation end times amplitude_values = [] amplitude_times = [] for start, end in zip(stim_starts, stim_ends): - amplitude_times.append(start + self.params['warmup']) + amplitude_times.append(start + self.params["warmup"]) amplitude_values.append(stim_amp) - amplitude_times.append(end + self.params['warmup']) - amplitude_values.append(0.) - self.Currentsources = [nest.Create('step_current_generator')] - for stim_cluster in self.params['stim_clusters']: + amplitude_times.append(end + self.params["warmup"]) + amplitude_values.append(0.0) + self.Currentsources = [nest.Create("step_current_generator")] + for stim_cluster in self.params["stim_clusters"]: nest.Connect(self.Currentsources[0], self.Populations[0][stim_cluster]) - nest.SetStatus(self.Currentsources[0], - {'amplitude_times': amplitude_times, 'amplitude_values': amplitude_values}) + nest.SetStatus( + self.Currentsources[0], + { + "amplitude_times": amplitude_times, + "amplitude_values": amplitude_values, + }, + ) def create_recording_devices(self): """ @@ -550,15 +803,14 @@ def setup_network(self): func() nest.Prepare() - def simulate(self): """ Simulates network for a period of warmup+simtime """ - if self.params['warmup'] + self.params['simtime'] <= 0.1: + if self.params["warmup"] + self.params["simtime"] <= 0.1: pass else: - nest.Run(self.params['warmup'] + self.params['simtime']) + nest.Run(self.params["warmup"] + self.params["simtime"]) def get_recordings(self): """ @@ -569,13 +821,15 @@ def get_recordings(self): Returns: spiketimes (np.array): Row 0: spiketimes, Row 1: neuron ID. """ - events = nest.GetStatus(self.RecordingDevices[0], 'events')[0] + events = nest.GetStatus(self.RecordingDevices[0], "events")[0] # convert them to the format accepted by spiketools - spiketimes = np.append(events['times'][None, :], events['senders'][None, :], axis=0) + spiketimes = np.append( + events["times"][None, :], events["senders"][None, :], axis=0 + ) spiketimes[1] -= 1 # remove the pre warmup spikes - spiketimes = spiketimes[:, spiketimes[0] >= self.params['warmup']] - spiketimes[0] -= self.params['warmup'] + spiketimes = spiketimes[:, spiketimes[0] >= self.params["warmup"]] + spiketimes[0] -= self.params["warmup"] return spiketimes def get_parameter(self): @@ -610,10 +864,14 @@ def get_firing_rates(self, spiketimes=None): """ if spiketimes is None: spiketimes = self.get_recordings() - e_count = spiketimes[:, spiketimes[1] < self.params['N_E']].shape[1] - i_count = spiketimes[:, spiketimes[1] >= self.params['N_E']].shape[1] - e_rate = e_count / float(self.params['N_E']) / float(self.params['simtime']) * 1000. - i_rate = i_count / float(self.params['N_I']) / float(self.params['simtime']) * 1000. + e_count = spiketimes[:, spiketimes[1] < self.params["N_E"]].shape[1] + i_count = spiketimes[:, spiketimes[1] >= self.params["N_E"]].shape[1] + e_rate = ( + e_count / float(self.params["N_E"]) / float(self.params["simtime"]) * 1000.0 + ) + i_rate = ( + i_count / float(self.params["N_I"]) / float(self.params["simtime"]) * 1000.0 + ) return e_rate, i_rate def set_I_x(self, I_XE, I_XI): @@ -622,11 +880,11 @@ def set_I_x(self, I_XE, I_XI): model setup. """ for E_pop in self.Populations[0]: - I_e_loc = E_pop.get('I_e') - E_pop.set({'I_e': I_e_loc + I_XE}) + I_e_loc = E_pop.get("I_e") + E_pop.set({"I_e": I_e_loc + I_XE}) for I_pop in self.Populations[1]: - I_e_loc = I_pop.get('I_e') - I_pop.set({'I_e': I_e_loc + I_XI}) + I_e_loc = I_pop.get("I_e") + I_pop.set({"I_e": I_e_loc + I_XI}) def get_simulation(self, PathSpikes=None): """ @@ -645,9 +903,13 @@ def get_simulation(self, PathSpikes=None): e_rate, i_rate = self.get_firing_rates(spiketimes) if PathSpikes is not None: - with open(PathSpikes, 'wb') as outfile: + with open(PathSpikes, "wb") as outfile: pickle.dump(spiketimes, outfile) nest.Cleanup() - return {'e_rate': e_rate, 'i_rate': i_rate, 'params': self.get_parameter(), - 'spiketimes': spiketimes} + return { + "e_rate": e_rate, + "i_rate": i_rate, + "params": self.get_parameter(), + "spiketimes": spiketimes, + } diff --git a/pynest/examples/EI_clustered_network/run_simulation.py b/pynest/examples/EI_clustered_network/run_simulation.py index 39f260b12c..1c8479e2c0 100644 --- a/pynest/examples/EI_clustered_network/run_simulation.py +++ b/pynest/examples/EI_clustered_network/run_simulation.py @@ -26,54 +26,64 @@ and generating a raster plot. """ +import matplotlib.pyplot as plt +import numpy as np + import default_parameters as default import general_helper -import matplotlib.pyplot as plt import network -import numpy as np -if __name__ == '__main__': +if __name__ == "__main__": # set the parameters for the simulation - params = {'n_jobs': 12, # number of threads used for parallelization in NEST - 'N_E': 4000, # number of excitatory neurons - 'N_I': 1000, # number of inhibitory neurons - 'E_L': 0., # leak potential - 'V_th_E': 20., # threshold potential for excitatory neurons - 'V_th_I': 20., # threshold potential for inhibitory neurons - 'V_r': 0., # reset potential - 'C_m': 1., # membrane capacity - 'tau_E': 20., # membrane time constant for excitatory neurons - 'tau_I': 10., # membrane time constant for inhibitory neurons - 't_ref': 5., # refractory period - 'ps': np.array([[0.2, 0.5], [0.5, 0.5]]), # connection probabilities - 'ge': 1.2, # excitatory synaptic weight factor - 'I_th_E': 1.25, # Background current for excitatory neurons in multiples of I_rheobase - 'I_th_I': 0.78, # Background current for inhibitory neurons in multiples of I_rheobase - 'dt': 0.1, # simulation time step - 'neuron_type': 'iaf_psc_exp', # neuron model used in NEST iaf and gif are available - 'simtime': 10000, # simulation time in ms - 'warmup': 1000, # warmup time in ms (time before recording starts) - 'Q': 20, # number of clusters - 'clustering': 'weight', # type of clustering used 'weight' or - 'stim_clusters': [2, 3, 4], # list of clusters which are stimulated - 'stim_starts': [2000, 6000], # list of stimulation start times - 'stim_ends': [3500, 7500], # list of stimulation end times - 'stim_amp': 0.15, # amplitude of the stimulation current in pA - # 'probabilities' - } + params = { + "n_jobs": 12, # number of threads used for parallelization in NEST + "N_E": 4000, # number of excitatory neurons + "N_I": 1000, # number of inhibitory neurons + "E_L": 0.0, # leak potential + "V_th_E": 20.0, # threshold potential for excitatory neurons + "V_th_I": 20.0, # threshold potential for inhibitory neurons + "V_r": 0.0, # reset potential + "C_m": 1.0, # membrane capacity + "tau_E": 20.0, # membrane time constant for excitatory neurons + "tau_I": 10.0, # membrane time constant for inhibitory neurons + "t_ref": 5.0, # refractory period + "ps": np.array([[0.2, 0.5], [0.5, 0.5]]), # connection probabilities + "ge": 1.2, # excitatory synaptic weight factor + "I_th_E": 1.25, # Background current for excitatory neurons in multiples of I_rheobase + "I_th_I": 0.78, # Background current for inhibitory neurons in multiples of I_rheobase + "dt": 0.1, # simulation time step + "neuron_type": "iaf_psc_exp", # neuron model used in NEST iaf and gif are available + "simtime": 10000, # simulation time in ms + "warmup": 1000, # warmup time in ms (time before recording starts) + "Q": 20, # number of clusters + "clustering": "weight", # type of clustering used 'weight' or + "stim_clusters": [2, 3, 4], # list of clusters which are stimulated + "stim_starts": [2000, 6000], # list of stimulation start times + "stim_ends": [3500, 7500], # list of stimulation end times + "stim_amp": 0.15, # amplitude of the stimulation current in pA + # 'probabilities' + } Rj = 0.82 # ration excitatory to inhibitory clustering - Rep = 6. # excitatory clustering strength + Rep = 6.0 # excitatory clustering strength # Creates object which creates the EI clustered network in NEST - EI_Network = network.ClusteredNetwork.Clustered_Network_from_Rj_Rep(Rj, Rep, default, params) + EI_Network = network.ClusteredNetwork.Clustered_Network_from_Rj_Rep( + Rj, Rep, default, params + ) # Runs the simulation and returns the spiketimes # get simulation initializes the network in NEST and runs the simulation # it returns a dict with the average rates, the spiketimes and the used parameters Result = EI_Network.get_simulation() - ax = general_helper.raster_plot(Result['spiketimes'], tlim=(0, params['simtime']), colorgroups=[ - ('k', 0, params['N_E']), ("darkred", params['N_E'], params['N_E'] + params['N_I'])]) - plt.savefig('Rasterplot.png') - print('Firing rate of excitatory neurons: ' + str(Result['e_rate']) + ' Spikes/s') - print('Firing rate of inhibitory neurons: ' + str(Result['i_rate']) + ' Spikes/s') + ax = general_helper.raster_plot( + Result["spiketimes"], + tlim=(0, params["simtime"]), + colorgroups=[ + ("k", 0, params["N_E"]), + ("darkred", params["N_E"], params["N_E"] + params["N_I"]), + ], + ) + plt.savefig("Rasterplot.png") + print("Firing rate of excitatory neurons: " + str(Result["e_rate"]) + " Spikes/s") + print("Firing rate of inhibitory neurons: " + str(Result["i_rate"]) + " Spikes/s") From 4da274583786d39b599878586a44cd4cead0af4b Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Wed, 24 Jan 2024 10:38:00 +0100 Subject: [PATCH 06/23] shrink image and move to static folder, add EI to example index, add links to README --- doc/htmldoc/examples/index.rst | 44 +++++++++++------- .../pynest/EI_clustered_network_schematic.png | Bin 0 -> 106060 bytes .../Network_Schematic.png | Bin 250599 -> 0 bytes .../examples/EI_clustered_network/README.rst | 15 +++--- 4 files changed, 33 insertions(+), 26 deletions(-) create mode 100644 doc/htmldoc/static/img/pynest/EI_clustered_network_schematic.png delete mode 100644 pynest/examples/EI_clustered_network/Network_Schematic.png diff --git a/doc/htmldoc/examples/index.rst b/doc/htmldoc/examples/index.rst index b7977d0076..7b8a0fb6aa 100644 --- a/doc/htmldoc/examples/index.rst +++ b/doc/htmldoc/examples/index.rst @@ -80,6 +80,17 @@ PyNEST examples * :doc:`../auto_examples/Potjans_2014/index` + + + .. grid-item-card:: EI clustered network (Rostami) + :img-top: ../static/img/pynest/EI_clustered_network_schematic.png + + :doc:`../auto_examples/EI_clustered_network/index` + + + +.. grid:: 1 1 2 3 + .. grid-item-card:: GLIF (from Allen institute) :img-top: ../static/img/pynest/glif_cond.png @@ -87,10 +98,6 @@ PyNEST examples * :doc:`../auto_examples/glif_psc_neuron` * :doc:`../auto_examples/glif_psc_double_alpha_neuron` - - -.. grid:: 1 1 2 3 - .. grid-item-card:: Compartmental neurons :img-top: ../static/img/pynest/dendritic_synapse_conductances.png @@ -98,13 +105,6 @@ PyNEST examples * :doc:`../auto_examples/compartmental_model/two_comps` - .. grid-item-card:: Rate neurons - :img-top: ../static/img/pynest/rate_neuron.png - - * :doc:`../auto_examples/lin_rate_ipn_network` - * :doc:`../auto_examples/rate_neuron_dm` - - .. grid-item-card:: GIF (from Gerstner lab) :img-top: ../static/img/pynest/gif_pop.png @@ -116,6 +116,13 @@ PyNEST examples .. grid:: 1 1 2 3 + .. grid-item-card:: Rate neurons + :img-top: ../static/img/pynest/rate_neuron.png + + * :doc:`../auto_examples/lin_rate_ipn_network` + * :doc:`../auto_examples/rate_neuron_dm` + + .. grid-item-card:: Hodgkin-Huxley :img-top: ../static/img/pynest/hh_phase.png @@ -127,14 +134,14 @@ PyNEST examples * :doc:`../auto_examples/BrodyHopfield` +.. grid:: 1 1 2 3 + .. grid-item-card:: Brette and Gerstner :img-top: ../static/img/pynest/brette_gerstner2c.png * :doc:`../auto_examples/brette_gerstner_fig_2c` * :doc:`../auto_examples/brette_gerstner_fig_3d` -.. grid:: 1 1 2 3 - .. grid-item-card:: Precise spiking :img-top: ../static/img/pynest/precisespiking.png @@ -146,11 +153,6 @@ PyNEST examples * :doc:`../auto_examples/CampbellSiegert` - .. grid-item-card:: SONATA network - :img-top: ../static/img/300_pointneurons.png - - * :doc:`../auto_examples/sonata_example/sonata_network` - .. grid:: 1 1 2 3 @@ -232,6 +234,11 @@ PyNEST examples .. grid:: 1 1 2 3 + .. grid-item-card:: SONATA network + :img-top: ../static/img/300_pointneurons.png + + * :doc:`../auto_examples/sonata_example/sonata_network` + .. grid-item-card:: HPC benchmark :img-top: ../static/img/nest_logo-faded.png @@ -331,6 +338,7 @@ PyNEST examples ../auto_examples/astrocytes/astrocyte_interaction ../auto_examples/astrocytes/astrocyte_small_network ../auto_examples/astrocytes/astrocyte_brunel + ../auto_examples/EI_clustered_network/index .. toctree:: :hidden: diff --git a/doc/htmldoc/static/img/pynest/EI_clustered_network_schematic.png b/doc/htmldoc/static/img/pynest/EI_clustered_network_schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..26e0fe5527c0c3b939099e33e3a947704b400297 GIT binary patch literal 106060 zcmeFZWl&wwvM#!CcL_m)6Ck*|ySuwP1lQmmf zy<7Eu98yWGHRl*Tdi3c2`s<#Pge%C2Bf;asgFql8NeK}p5D4541Oi)!g$Ay$PA+eQ zK*Xw^DjLp8hHgX-j`n7jHl{?*9uB5NrtX$zAdvgw%n!{Zoq9*nS4MagFdt@o5ZJGs z_wIMAFq*v|l|1WAzN934S52w!6czbN;pe>D{&Ly$x-KtY+N`5ho})IN!E+H7PuTSO zlybVZe))L&ypeNveIkF_eEDp=&3c~NCRdm-clP`;2e(#kc%gjX9sKa}VDS9ZIgl|o z@7p*r7ZoR#Te&b7+&34j^yH1&M#sP(y>qyC935RTwtIc}G|qC?KE?0WpLIL*;C*v= z+Q{go)*v5oo*TpSnt#RWm-|{R9Zv}UdLcb6|MJXpck5(vCo`ZwIu*^oJgbYu`nn^? zFS^q&-!5`!ZRTF1pPjfhN4%dbS;nvTdg1eKNMC$M_L=bH=VLU>{r+=P*YnrC-Wz@E@9jfjJo&!*BS9AbbGwAuGZH(Skwp>4@N-wX@)KjynH~3&>#1ED zxAyu3PJ_mJg74GZ^AyI3YKQQI&dInAV;K(X0-|v2R6D+y2;XP-+IKH!w{!dv)+7O< z)xXf+%N#xE7$u(3lS$A|ghL>dXW$}^w$XK9em?9n5F!B=q0L3NI-~8w2FF-{n=sic zP7#F^qMF1p8KF`&n#!>orJ`*SHV$t&b|+*YMJJz`4ntBEt8k>-mLE>TPbE*(kt)hd z)Duf#ozamltyT5kv?(&3lPW2#T^0Mmd%Y}O-g><%oektC2NA_YqHE9@T(qs9$xSGq4G#RJc3%R0mSy|gd-q`R0+zBrBi z{m13mW|v@}J<*h~tdxARAMT#6Jk%v`gP3rO#_{sBt!{PdAD@O%+%udWp9sgE_f>B3 zc3-aA9;2Lmxn`dG8urXPa(PORk})rmgDL-tGRn?;|-P4)vO^4>+qI z*};&Rl=vm;N?;#(wh|`?)-Vum{g@tCG{Qi`VWj_O#Zq?-8gWdHK9TjmLIE`=wXG2BWO&PcJdKK&P>d<*8!u?^%wSO6idf=>jjF(%N zZi4R?Syev$z!kG$hxb_UKJ*ugeHlJcrecidx7uS05y{j^l%4r<*Ezb&QC<6=d za5li@o1|%%_QA$$BM5Pk@EH99-xM z(w3;-ZL*F4>k1oT7?hFRo;^uyGWGKjOEh@eDtWw)Dp!Xcnx(8Lgb6ZlMIcC|g;tR* z{fgZhOzEdj$*J$^5Qw{7*z6jCr`MF*^ntdFPp$1s{TJHfI@%59UdL)!ivdXq zOcJTEn(0-5(-@PDl_m9=9I%}Q%E|tO<)vWqvUNO?68}R2ck~ogsxAszpbW*_=?>pp zkmbKu%H{qP?@U8%xy0How)2zj{lGHbi2I?#t)MY|1Y<1TPyIRk0;Q)&eLT3a_|Mo| z8RlgU&`-8%=J2NPzF7NnI!{9kx&NHJ1!tbE(^0oQqYBeRx#i9BP+;-=MUa@R8evFB%&#nCQ#; zQ-3N1i5ATtM1~pKG6Lg>p-I#0+;E#C0_3~&WV)n3%ysx<)beY&=;V^w7cd0Z#$6ax z!iT2{*=jU;EosI0gav+%1B2>~1&cSNxB7U~^sUiIexFp&@PT9}D3X&_ku0n!9g=i! zsoJSCv1g2vHFRbRmlTW>Q`bHz|I;=v+)96b7XvCUJRuua#8C$pqoifDr2hk)Mv;ua zoD}MD5BX5ryS6M5mX?!2#@4YE5WiBgP0{rZW~?W3zla(nMqG$xiAF{L`)*MsfI4@@d(2lMr)fI3p+8<8{d_wi|!LzB9OF=nAs$BZHyJZt7cI_H>aVE0_Uu zIdCh=sx+he7*Np&GR<y;kc`MQJ4GO~(r>UtF)MpY zNE9v35nIDMEzCdCu`ye1^z{OMNp>q%@zEXrj2P{HpdzkYx$cLtE@wak4~3?DI?*U% z3_l~-&$AOtpSX-^cm?}+(d`Nx1t&`V6vU2lHqLg*lE?#Y5-ebI6cz1X`IF@y{LGOio4vk;L8 ze`?R83u>KRMO_JeSDXj0-L=PH-7#9klTi3QD0m$s8M6LdTib^W@$k$d&g1uJ7(KDy zdCMIKDhYSxQA$C+xPl7lxc6uk%sn#V?M@kr&nlh5mlX)(Uz3{Onz5z`k$4!h11bBEY1&H5Ml#R2>my0-!bq(yHEzVKYOIVg!% zQXkEc4EtSnCcQ=07~7C<_c8(UNuia9`bO}h7Vn2CvB z?hH8s3WpFYF6$|BehkV9X4+UT2t6hxq#LkAau;y;N=VQjQV;A2DriDDu-dE;&m8?D zZRz`h=sFcX6LRe1a7MfAqg#%!$Am#cq6g6TXI1zW_xxh;snSQ-sM7)$56O>S|4`|#q@^w*?^sFik%|+RqP$ms@jaQTJ>*9D2XZcafw{Iq^9BTE$Pt1vDz+HqmEtq2+lTbJCLLEiKd>*I%0;PHwt zKZuaVn2(S&h`1U}&kdxpSP}3=^T1Pt=UOa>Z0By8p20cGAUSg&d(?kkkDvb(h zkOLkOSoT3p3bCXVDw@*tExwk804GuA`aJE}M;}EUjAQs>vc8B5uu=cT6?6#*Jd&RZ z3hG*oC*L>^m`sl~lLyN+*eJ@0%Z8PB1t%B}94uzU`_K1DyH%4dxM#>5R!QU#%ymdQ ztl1-(zm4I&8xH{M%2?T{6K15#u1`q zS0s>|JPnD&bN2H`iJ?SS2HxO0pBor)D>lD-RrE$@oC>Qedok+lhXHURNSvdC?*=S` z$Gik$2b;vbt@!yj#I7F-TKx3KIJ8i^yzRdALK~5HPblGBM{ua0;)J!A??!JcQ`i?kMO=fLaMe@Z5gRIn$e4fBWiZLTS4#^36QHHTW&B8xY-Rmb63WFLB!h!! z(7di4r$cxFCsBlmNhvSrBeO?t@XimSU$)MMK3E7D?MD!b88SnGyLx6wV~&a2Lt(Gt z#3eX#0v!|j=+6!Oke&7Ku!Qoz%yg9c6!t7~soX@@QK!V;?}-LcX~8C1K_@F&!xTZc zi^e3JK@1pF7_k5Rke6F*IPQ+*bEx}3k!mg2*jU9-SC$8 zvHcwV4A4bV(ZRHs>FkTE(}-jNDmk9`m|;q1s4~91=;>o&6p-03>4wlC$RX=&7gp6} zo_+x&htnhWZ(5OvS;9GB}TUFN2jKW~4nxlEse~s0&?`u=-s(scKn5+VGE5DuExN4aJ;-$htqB zP0GO5UM*TH2WvD`;vSoPF`N}Jrd>?!cfkKboQZae9j1R>87m$mp~xJ(83_uC&;=Vj zc%?##+l+V+cO+r43$rRIYW(3TK0*IgI(<&{jJ;TU-W}0w4}^^ADikranFx!~y;~i; zl)Q*Q8BA|UYx+DnBU8Nf+k(dET~KXqSNvjjK7HkL?#;3M&sVa#Ir-GZ=fr`R7O~nk zhk(pOtaNod(TCCAu+VZc_-_U$p}#+KU9o=t3X`!w$_fD`NQMCa{dXYKOQ(&8%Qr8T zQYp_zB4wGq?>x07C?3v%6ZRqUvI?jidyBLUzBO zJb`9S%#@z6kgL!hFJ-FO{CkP^3_Xjq0`+C$c;|t*?2|asiSlmAeQT`DcuWvsvg)u; zdMzbY5X~yqRcEoXBM~vZ1n%-7`7ohmM~yi8(NCt}b3d*HL}S7@p-~zfq#<%DYzGH& z_z{Os3Y7Ll*f{MKxLGdKu?4xV2pAs;1L~xSDrAvFuC-!J{fPC-AmU6o(?c}Cj${Qj zr{P%J2;M_{qwIid&-s%r+n^;2$z*paqQXm!6dgXYV1QITrz{4C``x#qx+;HZqddK! z&T}Hv;#FZf0}=BPdbj2-fC{v7t~KBtkf&n4oU`e5qf%m?>86W$C{3{*YS=56r>GFr z*u$WZy$#>%%;XM-13!nW{%YqjYyxrF&QF zbeW7P_X9n+zdv-2y|!629(8yxv(`}^s?~*|b?*q3d87a*#hcHEhf$In;!F2g(xMP_k{RdD<9Xbt*#K!HL1&2V@+Or`NL* z9^-R@A-7wU;ufdsN_v@v^^kCh>_l~r9b~KyDa)wvn1^k+`N9Ma`(5>FEDcv8wS^E6 zd%@|x`{5@yE0{AT6bZ?~!o)6AuonWYb#pmbj7T!%77KYqv-|dno#j#lG$RCXykJ{p zSoptWQ%}03il-K^r-^R6$#7i>sPRXjQWX)5FJcNK8MG;1WI}x!35_eEidfSq>9{p%kC6o;X5?C4o~Fm>?D=qy9}}yCynmH*3h9 zp^UslAAO>E*_x&Y9ZXBB6O=$nI)XY7xf$>nT0>s#Rxg>ukS1JI$%ujkUIdO|i1CmX zK(p27T1!}fW}U7+i%4uesVgF^D46*;c%oZFFP8p+WfB($9z6|Sq-94k^U@Z+`VRzu zfOiKLPfo84IoLu}{_p&%Bv;`HNF0lJ*a@z$;P{@Ulm^!W$G8L2vg939grCIBlxpmM zfJKYL^`KI+n2@=VP)P=XI&O+;E9Rgn!sUBUI{iO=B8-EmN7AJb z!S84wll`m(+ggsKVAbJy?j>b$wKq90V*ZQ5?=xwvRwH_bV+{);W~wU!iIks|z;b#>tkM$hEntxYW&5PgTxeC6U&np6gU_y<}yB6pJgE*I2j1shs-~#E?Mog3_{ zo49K`IZX&jC>|Kjcu;q9mxc+OraRP5Xez^_^yzL?e-a;6&YpK?bwRCBWo6QHM#A@V zPnUAOI5xPS$qJReE=KHhX`A zyS)3pJ~>@Mwb)6gvdz$vQA&q3t6dIC38!6{$hyJ-|H8&9nq_>I{TgFoWIoGBOs#BAsi$oga*AKx6Q2#`a6S#V`g3k`_KP0=ctVLml5kBJA5MLJt(`giEx)B`> z2AQuAXl{8tlwkLkRixv)8otEv%G?Fp%`Wi?)0r5OtHAlj7%G0}nxh5YEyf2{iPlk4m{TToi42DqSmPf=rQ%T+kqpAy~s<0+_9N6%wq!&IQx`$zqQolAjs%Xt!a@z)4dqWZQ zwLU;C?_fJ_Vig>0hLwuFRrFnf4n;6m6JDDZ56sm>t&Ou?QrfH-D{FS`msa<)5sNH1 zO4(suN52AVAEavVP*p`@J_P@(g?>2i)%YSj%XU7+Z7uJ`hT^*HI(_e?Jh7G#YFO*$ z$0YgMG|0Re{cnNxd*s(-nFJ#_*g*pDrg~|D=u2lP(s+%O_X*tmaxk2-C;7AK;wqM* z>Df-Enql{dLTET91~L?WWsCjN5`)fQ4Y-uci=^{;Q2rlxNcmW-4t6m{jg3i>KgIv_kbdlJL=~Y|xkX(X?0c*lCsRSvQvR|wQ3R@6+ z7`b7%u^!nLNliDT^b?hGnwD^&f}K`=yE;W_8|dE8cC7q|lj$1J0@x)}MRX*jozx_% z-9c{X8IO>WG%jTg$oS<*6xdAo61`gn$t@LgZB^gZ1RXlVw_gjH;9X{;kNkW~)I{I2 z7HnDd>^>iVnLH2_e;=34fdb1-l{fUbIt81kli^OQusBT$7qaHIPOTZ5CN>B$j`QB} zTG3M&QDRYP$Er}}dcO>tJFL}?vKubck{~ncB;=-OvynGxpQ&>Ze}>phreId?YLuif zTEtAOhJC-Jh$b+z4|MalE#u=6tNZej~XyZ zzs=5mXFp@X-;+hAq`zbiN|lBj^+BHW>`4{}_7-#4I;0=3D#s8FN$ZI3u}N-R1L?b= z7#KFcCAw%^zqo()W=0$~oqU~-%89b1m6z>M^o3Rk|L~GV$&y8ep37}iE_ztXcFk8_ z8cj~rq(;S4+T-n7ksojLl_}5R1IhOsWUN(K_yhWQ@s#e*roj{?9xErawqyG0s~(s1quK63Ps>661UP6tH5K1xM@~cP4dAW zySG2&$FVOb5X)Hbv?_pTpeNrs^W5zHRmtjE?!Lp2`Ok*jh-A6lVMxD=-;ez2E^ z+TRc>N8OA;jX5LzwoWFaaq%0DbBHv5%V=;>w-S^J&~=CSB!3tbBfjj8G}N-4mpF=(Ets8O5NG!0+^_=P`vmkDkKTj zeuSu=9po_+T0LqTI)Ffes-;D3Ea)+lddF8jX`d31!gSwtG0QB!s(kcZUuQ;EdaPiJ zpc2(&nxHcht(nL2;t@Z*wcn}{{Vu)kR_IQXTK6t)i|6EUpHn2Gt>A0j`U4i&RjT-+ zz_2Jpm+wg>ME2L+E=cfQX@qAP<|)bWc7*_qG7BF)S$W;Pas8&drSg+;!aXmAk3^5E z)?rH(ZNTuNN$U*D8Mc z#PUjXD_{o8E9X&T!Ej^l$7FG7Vq$%srpC+?D#X%qVer@|WU-Xc(!qzC3kc+oRE2qG zu1lZ;C3ptYv(PCyDJs=MPgN6k-nHfP(`|gC^%0b%XqGy|ifrLIBSXGvMA1wQt+yeJ z(;8+VW0u7DQBu-lGc$!e(5o^7tg!2n4^J89t@ro@0JinQ`F*D63l4@q4%mi7ITu7G1-?5p}qs>(%VV{s^Fyk;M5aD++WW4 z?|8L8@pEoaKy3-!M%wx!Lip=uYStg08ZX(UgI>(nrR*O+AsPIMzw*?M`~U{A)Y0pr zt$gD*OhEKxGLU~H@kL9B52YnzlHJt5Q#;dsG)?;uzW_xb)hw|E3>n!!7TmPltEIWX z$?o;0=FcrekcDGe$^*pPn=rVRz#A_bvNBx8_O^6}CiX_Abndnez#R~Xhu_`7(Ae74 znaIf0+|rJhTF2lZfj%b#O2OQ@>ebw@cHdBJqgj@A1XR8EBjyK?VSE;1;8Hk z?uHKZjC2h2wzl;DKEugb)D;l&Plf)EGn`a_7l-JTOr7jq9F0vyT}|zrN&j7hiSd8U zcW`mE`MVtxV|r5?Q(IuD6R;}de=I33DXZ{bGu}*KZfWcAcNSpm{}}0PY4+d7`VZaS z?)=@(zbgVv|1Y`!G5TM7|2r5MB`eD%VsGs7rkPIo3ODk zFwioxGMmt{n3)*Ta&j_r(wdnvbFdjPv#_#ovj3YXNjoQJLpx*BH&K9aI!i!~8K88P8Q2&&I9S=4 zfh_=E{(F#`siPC%iElC)8R(e*ap&z=xPZ+7hBbWiQ$WDq8Ngn+gdI%{o$Vb}?CouM zN#0ZQg}gn*6Z-&;gPf8CbL(D)yVI2pQ{ zn*3b|nD>uc#ukQl=B7Y=|I?xVb=~s+a9AcB944mhEG)Df46N+5ET+IYahkGn(i*Xt zv2z$Rvoe_)n*OJBCwntzH$z8LL33cIz-|Bs`nww<%D<+h`p?mB7N&1@VqjvSWniRb zVo_ma;9}zBVrKrtz{thGKtlh|4b#6x^}lw^L;wG>3D4gF{{{oVynkE+-~~V{`u~Ef zf7Ag6DtMWzg# zp|T)R7h736uw+|K&{2TrbozBKh zy?#N0QgMEnpzi0x_~J(ow<1esvrpyf>QYp!&)3l^x0feMySnUx$Dc|Sq^J^`EeoXh zPwf)FoakEhrbbCo<>8NsxxDQ4=Xq1<4<%pZJ*_o7&BkC05HF(E_jmUld!4&G)8Q|t ziGHfDz7;^COU6_13t8GS^^Jm9G5(`~?Vk4ud78tafyce|K^`S^-GQyLz0bdY%Ti5D zGAbVAix7G-aM&dGISL|BY41T^TvcIdV&DZg6xjb?GrVdit-<$&V|4wd*i(7jL?^)*^LW2(A8odCUorKwJqe-QfW$HswN|yCfZx}Ci&UacR~M#|N3Sv zy*|09{7Vq@GS2}I^wqxW$YZcG7{X-85#4fh&SY@D<-Dz#O;eWz%L5%I3_S&I>P_{> z&Tcw}P;PI2K*V23uhT2-lRHKmC`%KqdSwj;>z_~Gp@ZNjL#AhEH_kl=B_cM?AIp2! z%(9Fhaf)z=gDkdeu$gyn_Jhg}AtCRiL6kiyCT@msQl0B0*1B)!>Mn~ylJ zoUkwiFr-1JEdEBX-fm@x@Z}8V;_^~{o>BXur2supu-oRQ+vvu6rn?=|PpAe>uYAn^ zf?7vUR8$s1efge;)c!|T5&@JFX91(`ocsdbH;!tX)s~b`Weowe+I1iWP0c}NdEVaJ zHQzNF2}cfmeCsd!2Qwv&H;dMT!^7N`r>az;WH7moP=Uad&a|#Q?02L?d?e&F( zg|&TtwY2bDTwLJrxHDi!ic+g*9zMv&!`GOV6QuKPum4gG?lj1B+8t|oI4E&GS$>~~ z37m^+iP|JEKS4=c2Lbu`@si2&=4kM0e@aqDh9~=L&au-kfpXR*LcP99J#G~kfokIq zR?phauCzr(MdH&_lQ-NoryH+!$L5cDQp409?gx(mXxa1dh9u;=!-0Z1Fs5f`6x9xi z7-?drw{LiS#`7ri!ouNSRr{Sd@LOJA9^aHnNK9mXTsm5)-k;2Y+3JhRv0rQJA7v;1 zLLfU878%)X!}e&0BPuE?^OGaiZOx~C1}sx4;&`c^*>niAs=AsSgsGyU!eBmzAA(FE z<>|=<3Jwk)`N1ANOxOJN?k=#iyDtjw{-pV|0XVXv;$oxwi=CeS{`en1hO1Jk&zL{<56|^*RMPW_Dz|Yemld-%6fWo4h{?uFvz*e1#&pr zIIlOy^=ok%8RIkR`cb2<4n;Mk+VxfL=SF314^||kr04EDHY-huSfA7s^!4RML?8p9 zkw_RBV+p_9`IAd0RoJibwcTwZ6c-ocuv%fFp`kVC(9M?XkEgO)pSkno=H@autP2DL z1Sm+IPl^*}C6F*N#S!{G#R9wd-RgB4@7M}^QD1}evreRJ5r~8xEY=1dy@%Ysm=*3Q z?Xt!gemyTVNw{`z?24&L;8lMJ3Bc!HQugzX*N0Uzt=sLqLPx99vmGt zeSWweJt)b|4XU-CQ&Lr(IqGY6J=Q|T=UDeD&Cd^s!eg(pTj2tHGPQP*f`S52!p&LN z{PNGJ%~D-dem=#Qr*rW-`?V8mU57@Uqxs4}m&4i0&s$=}B_&`$wExm?PuFdB-Eije zVc!u(UbCOdmt_Hd9@Fb>m&Ek+K9G}>|I)7i*3~5h9N9v(`8XQ;*7f1s)bupj$1Tea zyZUNi`L@>=ueDR#nPSzaEy7oWU3S{u-Nhgv7**Hz>5Z4?lQcEWJH>b3O>=YLN&^9I8=Asw zez6@dzv;jMi;QeG`%AOs>0-F;JcPgAdBIR*g86n|e!zj*t!IB(Rz5aX zRK&bK?edSR%@h_EuD9N}-ZOQTc`@ShY`Yi#<~tGH7gEg(bzpEF&ou~bo0bFBJJ z?{+ltZGoPz!^_tzM(=%EbaQJBfb?QE%c;?2m}rKAclRj{ug+P_xL;}i#B-?$R0D2l zHulqF`J5RG3ri-QCuMuvWU=1fw{PY?3(rJO4%xMtpnNWJYJWTYV|u212A@T09|C=g zfU7GTU^0{s(V?2vW^ad?FQ0K@9qj%m#k{bzlpF}E=f_*8`<-N`%TadYN)3$$2jU;> z_J108(~Sq?$bacHqK9^O20$Sc78PXydr(nVzx*vtU+H;mm7SAAMNj_`5Fr^)frf`S z{B(c0(Bi?292(f@w9Dju=YWoZ0Yv!bsqZWIa1t#k8(UID1UwL%cb6HjGX38OfCy`O zzFES=##RC>tgA~9&3l6bgcmU*BO}kvyfIFc*s>ivv-w!hvFqj2<@oTRJMP)#rSU)v z@h`2~2*70#p&>r0{URbK4^I4~{{jz>+ZLc=uMHdf5Fwv<(G#R7o%{h|Kr5C9T# zHa0fZwz_oh%G(~OQ&LiRt|o-<9v>em61<beVy%tW_xVsiJSxhzGWa40@*0edsfn!C(+hxd3({ihl1Z!@`7l%S7d^c% zk868PW4!E9xl8m7lt4_@P~UOq0=Rd7x$CszGFO|@G|du~nVGrensc;R8wng3qunyc z81Jo4iyl1?sb-r!;Unq1KMD&ePg*YJKKNWI0$KtlfXMK^fCIc3Ju55g?d*Y5n931H zIceBJ1_uY%X#c|d=3W3S*t#m$YS1kE+^zumDins$JLY_=KRzKLNGT#uI=Ra2R8PT!ist_#@B4ru&vOom@Q%)8D1nOSdRiG03Torr{X4Tc@((s!qdy}l z&PVgHfZOED{^+Y7=Nq0bQud+c0&>b590DL~P`?CZzm48^`rF^QPl&jFN6|SgK5ivF+NQUG;pQ zU518+0GvrkNQg;Fx`}L4j~^7dJz4SbmoqUTGpkN{czDP;!Fcyh+|jYB{OA07zS30lPz{m(B5i4ur-rin(DsDmN!obUK zDFHMzY#|8+zc=pWa{W!r73+flm4viqbpOug)T>SA>hVtgr}2By{-NPv$z{$V_d`R-@Vs6{99fg4gqkTDp9Ae zs;X+Z`YnCGwDuCxy|LbOSa!LB>3Y2QM!d#*!ZF|w5g{|ZZclj5doX}Vs4p&&m|_7u zcZ_rQXJAGKA%K?M$F5UZ!Y}|qiW=VOva0=1sqf;#dfNWVhr)9PBH(s~B;w)uIhiBw z)QhEF;j}B)d?S?bp$zQ&{Jibl?{yer zCTsmk!*1ITA>PJdzs1_pAzy|pvhncX3FMziS1kp^kgYmD&sM!R3K@cgmsAQ9A&%1d;|)Vq&6+xj6bk>am*vhC<H()rg;I5^9ITQW29?269Qne;j9ZGh28$cQl0H(R5%L`;wYcJm>6_< z3-J4&Z*-jrW8@*;sfi6Uf?&LHz`@Ld*jQ?!6S7k}C{+g#wQO zJ^_3F=u+UOpnxitbN)_u`uXVz79QS;S+^s!?+QP1(t?bWGX)^P=vY`ghjeOElk@X? z(yWTQx}yM|H*Q9}o%$PNTTd}hCuU%XK_=i*P*xUJR73;79|{>+>=j52a40ARzOOI+ zh|?Pe$>w%;biyHsS%AN_;i=f#9y8uXe*H>DNB0dVlkT8bAppwv1E@sxzt!ceTuuG{ z?H#z8sML1*+6=SfH)=)BK(r1-_xvw4EiY;SdJ=)i0pikIw>3OG9H_^Xl$3;a$HX&a zt?HM;zkM^C%oc@&gp5f{y#C?M2S8|P{pt`_5v`x`tN@Vt>?;s zs`}zBA(!j(uibwzigxjI6@AANdXMXzP~)It@B(*y6u`ANZXo4P;|- zX6C=}0%Y&E^3ty5Tnyke^Hrt@`d{wJ>08dg)3{t7M%!*1zQfuzIJzGag0^R=diKk! zs&Ml@Z7zu#UNBd+*90UsYAeD&Tpvj3$Q(BR0k-p&@tfUF?XLNJ0ZTWYG#xI=3};PR z@MLrE?gC5)Fy_Yd?b>eboZeOlo?VAob>)|5PqXp#(e1%_I3%RMmD5svboVITslVoRS zS7?<2`#%GUB1W5e24H7zQW_fbROc)A_xGPW?{_z@e>RpB z;K=r=mHXmhVf6yQFCi;SzFv^Y$-ppC|8r?$t)$n;u)`0m%^2WXPN%K67dK1xmpjS& zzpKsV0pwX&SQs5*Pm#GgoEyJY*gic4Xs?eqZ6q-M(FRZ;k#VgPpk!F?U9?fwtm z)6)|JZj_GC^$bv`US7}XUjm#E9VkKG2sY66m}EivG1~W?(b)a4wEhn0g-A$Clai4I zd7U(d0%DSAG~b966%`f04(`UX0Jkz^z>#}^s4Dx!!_V7*7X|&b|L}{NP}o#z|CZ`_ z%UxZ>P@8D$O}U5EoJ%6`YjP3$ui{wqyA;>Ysj}^R?t10wtw6C(O+_V1{_!K>Z95nQ zbRm!+(_>xA51SS%3$Oe;3YWhCjGGc@H%9Zn6aq#1jCqF7pQSIW zEgsa&%*w~}mBLhc(``PF(^K;Nr9hLT1R%>rWsQGuYb_>8cFx@s$_@_z7T?^o^^IFa zSvg)wst5>N)-O-)i3th06f)m4m+k7Q>FCq|*i_eTa#jQ|K^22SMgbtd%IZ3wgNw_` z)TF3XwX}-+z7doFb-~Op&FTatDb6&x>s7DQA|Me7n3|Xr9v#^v#>eMSQ&R&sSy@?& z#0h;=cDA=E0buUg)vvQj85$T+So3{t{TT+lv0k@(tXj`|k&SyfQKP1N%Ss;T6U0%< z+PJLaxis}_Nv~(vx6OZ;9=GcuYN_FFtcYV-5Btd&|CxE}%OvCB!NI`bpyAk0&VHMj z>IEB~%MoTB=SflXt2hUs-&t1wNnA3W0kNDDP~NrX&ET*|gz+~Vi1+70ws~)jQxfsr zBo~MR3-jEq2Lhyz!Ry8b=vJgcxu@pG#>I63STbH=*gbZ4?N_R19cf8&Z{2WF% zlu=L&)LGnC@2sSCC)s|C&ZW7!-!6~$^F2TDLIJ(TfU)lO;iQ0OVP9*i3T3Gc2M&!I z3p44AV=RzrjO)V#-c{QBPQc>!f@AQwO5qNCc^#Pm# z$OIJthSdQL1fcw@tgL*)>eW^+3_?QsLr{jHv+gbc9)BX~+YA6o*>W-T$$XodLFlJv z6qp|FPncw*8qLw~(adNHT0nbiR8>V~a{D3%|6RzM{73J=oY<-eT+E2VGgR=W()NRS zfW8B~IxaTWf9Y6^DtOZ3Di0OSJinrX0jPDlfXd}#X9j8kZ2X`^MeDVtIq=|MlSN%k zF{%vH{91~FVcnp9z3fToh2smfUG$i>a^LTA^W@he#K6u8BP*!Se*orjb-bibEfl6K zW9fl4tZpkrC0cHmCUG($2Rx%#tlF`z14G3^3)nB{e36=?qAt%{Eq(nXsTGVW^mKER zsNyirY`=AV(DFQD`_}hOqRN|BSNbNd-cuWSL+*!o?&*Ed@)w$RP_6 zIqA1LG|34J|BU;oyg08W8@r%v@8{2TyyQ7zz7TGE{QD`1h$#QU|t9rmz<&2S#~g%X+R(pnvP`u)VWEO$FA`Zmq6w4LrOFQw{~5 zyGUx1Q^KMkkj#HMx~?GiPX=^~T5{c*!TPL7-1fc$Bo`Wg+om&om{FcpS0)G;;&Y#} zlp;_Y7#kb^c=B$Bk7(Q++ikQts{S>$;<!!m&uboXr7Ziw*KXYfwDs5DYr__C^A5)c%~!^=!o;(twSUzeZ^%Rsu#1D?hg*c zaK}f6d24EE*V`fDu^kom&$IjgAI&vlBwQ5O1 zlp=txGY~WuB@Rt1c0k7{Tq&Z`xPSB9T?6RGqaDJqd*N7E83Ea`r>DnZn6@5NVL3$s z(B{FRp{{ZH58y!@ns432;o+@YJxz8#wt%Iw=9rB14}cZ3OC1|mj!J)#4%rb?aAhy7 z-4GTUTt6IVV)}TxX6ZUNsLV^EqM`}_IY(|!xjo+!pb>X3E4a{s{yej0!SMQE z=9flgz{rRU9H>`ORZXo5fVqf>hzXXcni`e|fJhv%>#C{s0iAa$TH0Q#+TQ>@1F9N; zgBbt~BO2|xuRsV_0gXK1`9&i@k%7{BduON8aYyRl-~bi@AqSwJK$d>|G6$dw&MW80w*P2->?R+W5jR4NVMu&oTmYbc&B|&Xzj6qe zf`x@e)!oytLIGcU@JH(I{{DUfAqYE-K@xAEs{Xm6$I?z_<}B-0Q9Nm2G7_SHFo5iV*Pns_{q`L$4{ zq`bVRTX&29a*%Gt9}W0>8IM!gNlJ=soA~vg<@t^yd;$Vf*&MsJY|=h^R!vj$`j6~4 zq496t__wzkiCecE*VKG8ZmW_I1VAJ0Gf0?3SOHv!4zByQs-yi`Q*c|`-d^8TYzW0 z_uxUoRaP>6d2c^9v0~xp>+3vGx>>)_`A|?$5ZF_~t}z`j@z=(wp)qlvR9^j?B$ol6 zdw66-OFhGV;igT|j4llgjgPPIJ_(8NHrtXIeDQftMZ6Lb;2%kq1bX0B!Suq9xHKR^ zDKB*7JGR?ZvJ=(e^XC(~sRk7Qc(rIs2FtRJj*f(G#UM=2#x}YnJ6<@w%_eurXDlTp zg%EhJQ&OgjetiF4Ua~rKpi9dB*N1f+p7R$WIw^rM0$J92Esn7c%LhMXxd|2Jz^F+_U zT0H#!yZ|P9d3iU3cW$z}4DPHDz*CYfpw~0DV3u+EbDy5e{A<1QMHiz8v8)T2mf#Tc z>hl?mm$A3ztTvw4c{$wy29))sYy(2of|2gWVABn*WU9jwT%{UOoeT^jm+4NO#blj? zCv4<4mW`+TJQVV4=7rMrBE|D&kYxzPxNhA#!Z~7^?3r=JZRv?!TTZgov`lZVzDK=d zm$U;PPJD8*03jcr=$TY;uFb1rU>Jz?ItCu?>(fKt%qGsIb26NVEw<L}8E|zUF@m#nJOuTNe z{`rQ}aw}p0QhRxLUh2%;oIhd@Qqa0J^FD~T*z$6vu7R$%7dH$%a}xoC7jMh8Rc&^x zJ+@>G!Wm60+{E=^srTl?xFdM_1JU-|wjcdV7wfeub*tTOGsWuaDmlw0MXne?`1tuR z;=+-6(8ztVf-e!%SN|i4&bY$D<-9TtR<=j(e`_{5q=(bi{ow^PxE`eKyP;o)FV0j& zl*xWtq5 z33~ka_|>cYXJ2Y`V=C=`o%C#~i1{|S*JsW>)T;}1UYVeKSEs^Dzy;e$$KbVW$ZaFE z#Y2!VP-XEuC&1+#y!dfrmmS)K^Wsnvp+YeyZebC$ zRfD7JRH9um2dP0M0EK3Of+oqf4OQn=dV139*VK?jz#x_3i4Bf~9l?BPSFv*ohwQGA z(^Uie_w75OrZ&0tNK28M1TI0e;}8AfG;{n7gxw+c4S&jj z#zvQ+#BleJ1XO-~AZns*96cHXR-Q*Q(&77qpG2WDzkHdVnR%ei0u7A_won$9lcjzA z{goQUFl&AUr1!z)!DGP1#1P^x{OdtUQcsT=5hw9~56O= z9v*=$y>&JpVU@{rb&~4t*Y#Qw_OpFYS<{lk`}Cf}$fw&$&lYtApOsfsfc>NDaxTRA zJ9O=b5Zkr~2PnwMJ=9eq2W*ZDvS}OJXQ)UZ##*d%m;&8ODVgiv+h3u;<#>;8N^U#^ zIMb{QugI4d#iI^IV7bkvuNH>^F`zo4Eqr}YDcwgD#{3HSK>D9pMeO#VU-R!tmZ1eetrkD;=XSOLdGAf^hrBysU;sO(uCAU{vaqxi5*bNTpKS9zcH~Ro2nst+PQ$4C53xrOK@v_ek+O(d-ADAA(#@P)(E9+FZnj$&82J8SJ!4 zVO~vhI=>j>j9_I>gvLt?i9HDo&PperSD0OWmfKLbo$#>w_a1b$9MMbwmjEOIN+2Mw zA?L-*mz#3i#&+NH9F)YkxY>JY*s4pTH+C~U2oN5A{)dok>oYE?l8XTTI-_kYsc%lt z_-xG*XH7+G%V#OYO^tE|oEVsuPp&GKJ}crXue4if(z_@c(URk_*)L3}VsxO=QO{J_ zsNg(Wob!0ud$IRM(MS7)Hkn^}J|b-@y!hY8cryktw7-+9GtLWHcV&d6GaZoMV8dyD zIEbFU#BCw$M7Y-JukG`yZ132;qL|;68MFL`Y`|gA~*qZ7$mQG4wYJ&aajoa zAAsAOr>b~ee%;wj^qMI4HcK&vUAqW8%THUXl{ap_YHhu&vm-lH8^r*k*I;WFFBk{w zuHqPcw5)5*B19)++F&CmC%1mXh6q`gDf-k!=u(c_Va+4lP+rixDkVIpzzp?+sp$v# zc+KfgPPyg53t2g<_Udg#bV<*Hrv$9nHFt@nR)};OFSzAdk20!sE^dj+9S@_qmau)@ zgRam(w+uOTz0|ak%9zg=bK9gK8|s5tB=XLI1A(KXqmA*N-|K7!g%f`@IImYzb>F)jsKkIH3H5iCT`$f9^ADB-=&L-Qc|+|sGy)9IDB!#qn99Of%o*9)ci63 z9vI^nZpP2-YaS)SXyy?3PN=KzJ9g|D?mg%#qP}LdT9eicTgn#W=2q0{ty{Osg2Wa& z|CR!xpS!zk*@Nx8GBQy$Q4+nA&H;Q9_`3jx!JxROUxzWouJ_ZCC8Gyk$3OsBFAWb{ zv3eRT8Sz(uvMN7$py*!P*ldkC93p-Tkbyng*pmwsL9hCNK$ehbo;!Y7JnHqUS8-4X zUv*WY={!AnaXoA`gu{OJtQIV1EqIV9%|7YKZ&L!t^z;1R#~#>kTX*d0I>vb6pSdMl zR1^FL>yHZwzxn&z&C$2o3f85`=npTFHhFmoJ$zXIsnSFL?%h-Gs}AFf72h5|bF369 zBR)Yu>s`AO=g;o~_+eyZL@nCf)kRA~LkOSWyZF6J(N;DPA{>M(2Q@V{Izen^m+9k< z+RwDAznY4al-Wjqh_gQ0GTas0dDQJfmVw7QyPMh!;ie2e7WGurTPG2?ox|J`KMAphGEG=8S)SD*V!n;@_Up8RGBk{f@Hz2H_jZOn`GeQ2}r=^h{jtfBK{neTvuq z_t)p~@gMb6!GV8`mfCR}WmwD5aOC8UOSx?zhA?dt_6;3M1GFqGWWR8O%^|vjr-#-G z8F~QFlQ%)-QBP*Ih>X=QBM2`e||i>&9rIhzk8deTT+?hLrz5QL95Q`b)C7cd$iru?K>FMZxophT(=qajjqb?$a_);c0i{Hv+=eK*1dtS!IVc5YJu6;GGXD8v_HwKhK(v&xP)f_rFFQ z-i#>~JOGR2jXi)I3=9e&3Zk;VK6vl|M0MTU8{G=WmPQXd81q87YqKdBd%E5AL9^TK zCjYdN)W~RV!sb1HvfGKn`sfLtPgcin%BqcRk=H*C6Z&cp88z1?em1Gz;i2@MjS6B8Z~394c8 z`0zPszYBgP(UpOQ4+F+wT-*^@=?&@T`ztLXniTK;)R6DJva$kifIShD;8P1ZP`veE zgvJ(j=}^ooOY5m1&~%lQq*EF-iUGK|VC0YLPnLb58pweOkd6MvQw^TQxpBPjob>+1 zfz;uP7cUyw*BrrlP1av{@U+H)P`GILhC&70zy=_hS2t9Jz7PbNa2Ey@uw_0zRG|4j+}Qx5LHyN7+fSC3 zmalC8d#>&K?VGj+Pe{6;9>4PC%iMr;j~~-@sjr8=hrbbaD!d{v-ln%A(?)Q+-${C( z<*&dj`HB34naQj9$m#oZyua2RPd@I`c+$f=WGY#j%|zLCpq$COfZgT(*ZJmwL3O(& zN9M4V6lI5%JlO7X1m(8nIPB;a$aO)JY-ef(b1zwz0Jmj=~-1> z;4$MJ6RtB%SEy+l3~=Mv*uLV#mc_|?d(QaMDENd_r;LoIyi%NVopcR|U6ChH_i)>^ z--N59Hp4zD+N)9&8k#nBQD-?fe&DzeqQ0Xf65R``c(^ZJ4(_FbZE1ViIGKgX zI9>DXqsO2+Ju9pGcNRN~EY5BVxz|E_?@20hz4Pn)F>=6WX7(SgKj}IX8|Li&Y^ds~ zzwqYU+?Suc>B!rW$QZ%$x?JVHT0iw(rQI(>KQ5hR<@L7saH0NRH+YqD>#ddj-c6eO z_sRCX8ZuU&<@}YyYm!hpcDdXCfu|#d2SN&a#i2|5@|15>CpEEdjA_jQ{;T+1WFjd7T_iTG?&=rN~yxBam`Ui{_)E_e5^h zm#qp^4Pgrr{`WTJu9ljTU%rDQFnrwpR{T2lHq}d_EP?rBY0F33CtFhTilo<`I_&mv za|)tiRPYfWJ+6F2u=%<&zw%rfyPCSszY}zvzv5GjGT$EA<(4d0$MjR4YCC6a*aMpd zpYYzJyKZEsCUr}8fhWJY+OV#jhrDrR$LmLR9JeuU)?1Ve`}KGaN3qLBb^d+(6%wcJ z(ZxS%lzf_a^4jHO5n|QWWMm509=Jh2YRf$#SzW-*Q+~7SX*I>c6P?Fk{GSe%DQEw> z8n=f>+6Z6dr|;t8CL@mR8wzeo{@HRMaa$Ve`Z$(H!3Fw6C31^n zUwpYId2~6?Lqc8N(sIJC(pl`gjI;eJjmc`CTk^G$7ymwgTXum@${){Xf|bXrliO4A z>WL_~HLrssIeFyjH^=;!4##CW_jP&lEIQacXim8#rBY0yJJ-D{Q_ecaZAwoA%qFK- zxW!ag&BTry+#7U|0Erjr_Ua7d%PU$G*1Brzh4DL#ozEW(T%A-1{r2!0GwF2K?=*J5 zc=JR4=8KpQA8z;Bj9(G$xfMOh*(0&|C;Ai(Ep1g@-4)P@kYGXQ5TC)meK3IXJ>fd# zrp}Mr3f~1`co>N5y~wkE{ASMHQTqM67DTEd^> zXe9l96*?xSAH(g&3emnLGe@rdAlR^Y>5mM^smPTd-goa3BtROE+Ue7k7ak97=H;eR z?Ve@RShf{qImj^(xsP=BJE+EdiB!}Xoc7dtinHONQSWPRS4lBX09DJg@Qj`S}%Hu25uQ z4&M(F9ixsNtbM-*crS&Vez$yd$$6~9DBThwRBfo+N%W<)28XLL{-y8Zfz z@qfBp<8O|=hIkr=sA2q}zojIz;Nnt}ej6C2NN_X29LWs4QmGCb8CAe1ark`m} z4aiCOa*Su3GeuBqh=XupeT7=mh%~s)q~zq`r)^Kd!ls}WWWvGXU@Z5?Zf>--4CDmS z)|pM+5Aigvaoh#0wz_uhP*e?kJ)mPEU&aJ&KkK;lRHuI4rjC*R(K|&PO1Ry>RUpkZk#AslDZxDL~pTZm6 z5o-Qw7?Uw=Ou(;qq+su-%F4s=AY<%&P}WUU1$VGjnD8lx)?r_Fv{F-|LkT*Z!RWq_ z$+JDV=2@))QX!DMQwfiUVNA^JDA>5QrINM%Qc^4+G4UXX^s(*1hTFgZFEt_*EG_xG zH*a5!-H?sR1H#Phwy{sv;+QgE$poFVv7qA*Elu4<3%MPw#=Z59?AHW&)~*iMC%mHT z2|cH;Q+7LrGoh-rJeql&x8PRfxi5B@r6JqEF!&O{0}uiKf-i_s5gfU@gzww8Z+D2& zEAm$~n|jrhZI{#V@K`COee)7*r{0aFv0Nzi;|28aaTKr28p2V;CnWTjeLqM`=ppG` z-0TrGYZ}*^=t{c08yg7gKmd4qd%MMUJ~HfpmVKf4U>opTs5Y6h@E1G=|DR@D;NF&$ zn0V;=PccxTYXkNx^&2{#KPbr0m&WGCe40-&&j}o_{l& zEvu{JA~z(f@UGeF_HM@_2Wi-I zp1*q+3jPb{1w{G1`}fITfW!!sUj_4-m=nYm4+wu5)~DiLQ^zJ9|J@P+WLC0$OJtln zuhqkHtMdutGbHFz$>HV?-}%C%pYCR>5}h-k9X&bRMh}IF7!SJ%!=(Ix!xe@nmHFEA z*w`qdx`5y--pqjk2C*0y@Xx0#M`oXQvtxEYr=z2#udjv^Xp_4eDiTH!Og3dUxv`Un zCmsRdM)M^-rb|jYGLn1fRs$Pi9b};W~uo$WA zojjwZB@ZbFpE@x=KeE354CqxgHMPB9&k(u*3xwy(o5-D7T>R|y*`!RUQeD?zsy4@L z3^gZb`ETk~%vF!!Ac0beT)?_*PMa}@ukmDY!{quZIr*bm#tG@j#)A{rEG^^SPW;-K z(PidCt`Mm9eNZD@vVM&dO0jUd7I7lZncU7aV;PbQfWON_krN4(6Q@t}^79YfiwObI zE5-`01{w`MrXuEas_on1+155N_ySqhy?3`TQ#CbANXi3PS3#T z{B`W|794`S{Cw9??H5U07Y^nA32iDep;1qMb<5503H_==-;682px`A;R;XP>ytc9u z(9+W4bvLV=v?=fMToMK-y+57}K>nv>&C~4Cr9ii=;f?|cSi}wzZRJ$b4)9ADH}Hv* zFhKCmcuGH<11x3 zM=g&Bii{Z+y)iuVHpVWYPQH03{l&f4Q%)6{fadyKU7e7ej0$iNw9M(2^Tnpa7&t(0 zWVQNt$^6Ol_V@SK%{>oKgTGdS%H$72+l7FIbgvb^&``!vrzJI)F6d#Qp-Q-<@avO6 z5!g43xgKcwmRtd9%US12TW_h?d_7f*{9|;Q7^U?j{_$J1i;IjoUo&Avv04riKF`y zcOsOzr0c${nvHK4SQ;Lsj`Sla>~nS@K3!0EU*m5|E`OzgN5Hc9iNw2nN1n}BWo;d@`rdJ8u!cmfTP)#xZo$c z%TE7%q=gWPf&x5XgqMc75;@4$f?EgR4&5g%o>Sux81tuOiF`$e$fW)aXCBO3cDkEuV1-DMW=3QPM(1Q9;JJ9gdxiywcVjnQgR{2vbPj`1Qf|+fAr&fEKiHXQF{;!Cvws)le1Vov7Z#9HJd9cmybT zFJVZ4Eo5&m@4U|s}apE=2JpBV?P@$hRfhB0iOpx)N@Xa_Cc`Zz`($g39Jgcpf0cJ2s=f-JY-qF zXVX^JKDX;&EZkRSnp4#?-Qw4mqOcQP(87WTLp36sxb3z3gAM#bQcyABHF%3S30^$x z>G9B~OVn#gCO?UZVR^x!bM-g1t;ccHo~+I z`B3V*VbSg=BgXJ$Ikzhu96BzuYjqJG!Bys&!H@0<-Q)gqaqE%)^8#F?remVlSGMyO zV4`f$H5&9gKNRnHHG6hvwPDIW^=uf?8rCZdo|mU%qz~oJRNO<`I(Io(BUryyszmNv zH0Q-23Vn-T?rGI2F&9Pce@6^NPka0sC@#6heLwMum}KO+b+6)ks=qfkH}>6ZloMeL z$yhNIeiWdh>#-<2zU;=F?YLF1>8bO{I|?o?QV0a=+4vizh7l&nui|FwI19oA0HIID zc-4aEn@d)eVHybU+JbM-0-_bV++Iikc@>H9WN_gSkSUF`T@exFW@G5EF3cVbGS-0aFWK#BG(rF2jXW1)cE8Kw8Nv@tCL0 z7peO1Dn-uaN#%p>oE8Yu7&B4I?kF-jjq*#9A@O`9(S*uU(0@LS(ny3EDk+<^!-*=p zu{6tEE;V;Z%_bAR{=GJp={eM72mmY=S5Ny32FtfNhw%Z{MNa4;CqZcDc{6l0rv@% z!Ca<&FeFa^)9~NbNN=7FiCunCwy2f+^W(ckW}3T1BY{OqkGJeHgEj3h3Av(&NdxT~ z=gKRlAM23wka!|kLq|v0MvX`6^#J$v_q(>bepFmfy`9=R*U?{nNy_!FWz-*b;$=8` zw5Tj+5DxcUGEQ%%Byn|7>m08g`VSFkJRfL!By9~x0Mz?o^Fa!XL8v7Z;I8&6{zu2m z+?*Mz9QTKmDD^YmBWDNH+=vj*XNeGfZ`@Sa|vD!5peJVE~!r?V&v+3{2 zGn8?@zUkUpI@LqLR$O~{M3;lhm9f{s&}npFI(-(!FJYU-0~-5>ka%+Gm9r?2(8=t?NH74s|Jit_-MMix<(Ct z26HOqFnA`{YwZV<6Hs*G>(>aDZGo;XeMp4xi%GZ~z;jg41K zwe}u%9R9wo%Jyj2T{Gk<)w@IYP{C>}VU^KvIXFh|YY1)lWXhUHc+uv=|K4_1(4C*s ztQ{QMZuc2DT(358vslia5OaR9c1-&{10D#fof%*h2?-;J)Ze8N$f1cM_`u5o9~)&* zCtkj$rUph6W-$o~w~D7N*5a`0`0A$U*tUc}gmW5UF!x1VF3Ba!*lT45 z?lVF0gWv%!K^*`4r=v~qQ>9r3B=Wa5bLM|_T>lQrBZZY484+7lua8jg)~&)nwC?V? zQOSO*9x=XC#wQ3ELM7WETyYSU1A>%J%${(c(zr_}Zi)qST@*EL=QAQT$wXZeqW)!`vKw>l2l4j!zZ*D?cN(< zPC~j{+1~!JNchRu(M=;WgEOv3y&=x?(OeYHo?80#uu`=n-$;}a3UC@k=S9aUQW1NV z+9Sd#PgnS=_~eUQ?pp*`m;J&jBDyM=6Ne*G;(P9k9Vz(y zm7g-sbbQx4gBtENkCb%|kDKmRy>MM;A^>QzygFA>Vkww|IN)1EoIR(by7s6spgpij z-Bh}I5RS8evhEN4H~Bln{<mR*Ry_%U$E+@ui8>CS!&teqK@Yq;5=>AT`XSdK<#yJ{ zNCO~UB%Bu7BcJb}gEU|^E;EKC%qO9~U5H)d6g2QyJ$w4}1f)E;CKbXiLs*xz>)D8y zA?SG5Cnshtwz#rC53fI@{_kD;AizKVP~opZ&1J_h$tN+Dy(OmqsfIeQ+}i%S;X`#E z3qtWr;NsJ7TVUY=q%8qKL0E9hx^M95IN#k9*I-Gvab3)*2SU|8@jhkUaex`HyP!T- z0zP5xC&~q(O;9F+;gwojU132%a+@7p_X{s*02mDeipt9KbJG5}LQ@L^v4Vk$3JQ5+ zIc;n&&rch&hy9SsQXmin$c6SjFGZT$~wbHER z?M019v4?Q&Lgqui!Mv<>?%c-X7%T&iE%L$aNk&?Y2+{j+FX>R3-1D`PS=t_hBeuvp zw@*a+-z_Ls$!b)7-68K2`>f@u&&gFcHO4BTH!nJcyJz>6nLtI-O_^Dwb%EFurQSu` zATXt*)t8c9tosNTw1U)VuFFi>n`rYKl2fy9BOCJ?m%7z91i#kMI_%K-rziuwHDC!5eVuH zGqizW^8u`_g0wvPVIW+7W1hQ&&rcSdBt3KWh5grcC0j9=OP1qwuEPZZf!DvfyNdm| z)RxD*ICV)cJ8)AVm#%8R+1AblKu=y70y99~^9 zxdO=krhSXoiTUi#w+3ssFujvA;<>U&zhejFxl&899G991uLEifWI;@Gv;E@VtAGn1 zF>zGEZFpKujhYN$NbaLSn;qO0O7n{-r?D{HDygPW9uv^3MZ~*JX$`SRoSNmu<`N!3 zL0bK=2CMA9<6W^J4GDtA<06%*t}b1Z{!Gg4YcT_$F&>o3D=Sl026A4(_a`n%Y#qsf zC(?dPZ5@+yrV#0?(-3Z_2ISUSuhGPbD8b=`#WFD1lc+_rBrZ}fH zsbFO_`Z-uhp^js4CfqZUr(Ah*Bz9%juV91Ej=z&7!C-=Oj6E^xBpu@u@7x*HuwZj8 zQwZx0=9|(zo6^=l`ccwkh4?xXRBz0Qz)sT%oGU(PreN4UKzWB5J+ZKmO+PH?GK)MN zIIceUCXy)%Zy%If%9Vuf?2=D>}pf#?P`_L0_ zbK{Wb4cR)Q320*Q%K|gNUO`fX7B!I-n3G6TNlZ)}@cA@dG>4~4^0y_6P3g7#>XST} z5mB3?quC(7wk1{=JhantpRGOn`LmL$N#V|D0ScXSg%dnZ`ES`+b{*oQ&zk&}%V2I` z)NQ!tb*pQU)D)25a8MlEOHpHSSUM(6^U@+G12Y9ym!NE!G*Fr*HA0X20!!m(oTJuU zTTa4E0sX4i>RdZV9OH1*6;~&0i9v1r!jw>Y;W*t!Zt0&W5pXkuH2a^M0gE``VgZdF zC{zuE`8Yg$^ShP-d}ERblh}r!=kBW>ktg0K=Grxh7|d znV9GHwDs$Jz)u10@ea)0TO~TD5pz7Y{8`7W2QZGL)95bnIe3pt<+i}3swYnPXs>h6 znU^u;x&f{RPtob~0PWq|uw~mfJe?GC60PIn}#G)9*AY|GFkKbr7FGihQVfk6D7q$Whke z-SgEy*~Rjdc>>vgq?(DN*2vSrxiJ+%MK~~GKUkZuloR1wtt~vnvSkx-2yHvP%(U?i z+!bIG{AhCnSCI%1^<$zUmB&{F- z7ER*lS5etS5{*AQ;Oi%=1sLe*ONp%+U&Ab8kMBP5D9r`gm{Y0-2CQVN-Md%*btcEb z3ly|WLT7|d#3lMwfF8Rh#=2EaZA}gvC?+m|4%;PW`FJYYB%N1U+JL`h9r#l-P%l8q z_D~N5X(Nft2$vq@h$6m0(B%k1Ie08N5vvOMI>(Pw;FCtnx&-5Ug3k!`^;8Qk{IucV z-o1BVl0Fq9O?kY;bH#ZyqcRV(lk^dTE>J|DZY)|i+$t8nsKp5DP{A+pj9lQ16B-&X zzzLHYGdJGF-CTV3{r#^?V{Ipb%l&BoT>Lnr_-`0E$;ha8rm_BBTm#*1b|?Mu=S^2x zc5w#q`F0raBaTgiOmLAM%htJia919(sMw-)b~opT>4$QURLY3q;`L5n*P>?t4}?)e z*ayQRA0|AkX+me?|!UPT1HCSao1=IoG*AkGRw<#aLkzs(ZXw5wYfb_p`q)!Bm%p%n>XSqF$KI zhs#bR-`mmb1x)}`d*Pp=*N0J6os+I_vuCzNg8-KY%0hx>}y+LV5gP=e$L&a7` zC?>cU`BC$guQPCx)b5sYk zi2PV;kp-e-d+g#?a2D8s6pznWvvtKisDxa1u+Z-sb6pHl{2#zgL%gLBc+fP6^-d+J z(GC=t>7;H9mm0=dR4!0F7!;1JE!$(?6Q(G}OO*i?Lk?um3HgseRaFqY?%`x(!a#Px zb!Iqmmr3QPPq6AQQ%2Ri>{E!);357~dm8Fmy^gD5tOY{XkJH_=mzCInc?Jaez^7w? zu{jdjF#+&h-CSFl10MB9IY;--HgLg01(biSVlPOQB;Etd7H_P3Fy=@E>-2N1S)eD9 zEDOtFi@4^It2Q>eG>1g=e&zl?L~}RJ#}ef5oP6)QS)yuP( zU3~%r^`^w@WOHl3Zje2@@xS}`7rtk6p;nR&S2u5B=)aMatFdJp%`fIG-u)*JiXcY+M;}Svh7~qv#pl0&B4;?NB7Vhb(>H}mO&tcHePRcgs z`Zm3KJXGrmq(X@T4n1hwDT|p8lnS{pz;~BKBM9sTh=q&%AVFp!Ay4X}#I7>n{wP8W zH$&bIJCr7-RlL%8Hp=77PDHcSjeuLogxEn+ zJW}>N6eMawSZR-?+5S75Irczh53E!KHum)N^j(-*u(YwUKoKKE13n^D5V9f!64ndA zcG&)&*cLCS=$Dh!ld)BuIf_Srm?5gc=3uUv!_NkG+`;&QyuyzwzwhHzp}t|A%rh9G zPBEuvXmtxYzvA{yZ7?z_Pg#FPxuUwoZGtg#%f-?=gO1_6(b(`Q73spt5)sRcm4?2O7_DKgSxfO{wJ<2vMAH(_&zb&>LrUq*2~Acw`xe+w zB&46IG#RjQ9{bVeN3-f+EyeD)t*N@z_yY=zma_wD^6Yw_%DRZcmo1HoU`%hF)#{$c zAcLSJbRgVw3|oJ`R|GD1T{~Yre^rFFN{0+4;aa*T_xY;JXZ@AxjXHHTwCwojj%J6d zRY4b^z`-;p$9`zj1{eYeq892YX(9dFFVB|pKl2H*FXiox9sNQOD*M=k1gLNruW$I zQoYq@&PoK#n)Y{v$-V%VOyWPk9`2h<;`&Y zWiU9q^^I-{gU9`_>-ApP6oDlk0xlu=^dxr%K^#2~&skb^IcA}_zURq&R_uxff8G#b zloqfN<}(IdvIq(HnEHuQty!bUwLR_5Wzp%J4;8apCiq0>TsIf55XW{ntBo{%v)g-$DM=%$7`_J>8f?o=4^Dad_;LO9)jO#=6?%poaYEG)9*_r-J~Dh=G@^E41!7MXFbauC zTZ?D8O#hzd=!#HgB9S_1#U_WGfC$LxYj&&Yxa0>qSH>gWKzNWZb(MHx^^>& ziBmoBZFN@|HEqVBiw*|4?HeHl!Z~Ve=2lM+?Q;p#{!a@T^@5WXX%G)@N}m? z?++xC5%gOU`vu`fx(qPBYg2}jyJC~@CDUIe0ocJsXQO691KrM@j`CX4I6Z*=Wbp%nmLyR$fSkiz#Pqu+(@do9 zK79Caie;(z;Zc|Inyz<3j6e5Mq!$;93kV$hnsL_UM6i?cq?C$};#{*!214_~ZWU}}p zsmZeg=@xbQnkEJC3mkz-)%nMasBqw{tcIm}#x+X82KF3o$T~bwb3M1?6aM*+OYIGG z6F3ukqG`-*6Pqjx-@MVt2p_g|kQTnPZgu0P`AcF(?skbpnn}-pcy52Ss8-NLJ+3&> ztkd>$Ys*2LM>8Mqk9cqFvh2dTSq(d>Ul2ThM_O0xFj?^_?gN=l&1nVP>DDg*dnb@zU9$CbyN+HmY z?l#fh-rnSFyEal3@G|pdzyT+Vw=*LvjEv#`x}n|;Hzi+n zLy;}sixs9hlv{51(M#!^sp?*)sR+%@3gUW*O{-W_(CYTy_02x&!x{YKXAqvhw zqb?6%1I!@UaiyfBWnL3`1X~inrvzxBu(GhIxwyPSX6-ebq z^x@r5`tDu3KDWQO$4<;JJ!XlO`h7`&5b9n7nEye03>=>R3=>mUE0zO}hJL<$(N0Rv zV>VrO;;#&wjEliP5l`Xl*~2p1f5$aZwX9En<0`)A!^c9-!2YU;UaA~NP3|-}r(eGO zbS2&k{K@~;R?1_HdXMSDLtuPdfo$+aYy@8s)5&i@a>STxQvx!MsHSCRejBJX47&`5 z1nUG$F75dK^T%}{L0{%>@TO!Elv`V;l6n0VJ2QD?0oy!!=nX# z^9YeY>APtQQw|Z0K_de?v|}l0hwjcc7KsQ9NF>>^hl)^y2)McGq@BCQ)%W#Sb+Ip( z8m=cA#juXDFj558o$Wo;5^$f9i3&u5J7jxt@UkSN4EGB76)b_-?#`3+-6CtRns$=V z7qbMnx9;6WtFx7BdlPNr34P>#zwoZ8k;rykxeYE$f7Z?HBTc@c4bE?%1(jl1!p6&~U;R3e`J6Z=P=CDEs?1#)i>tQ7`#tzM<%&7{fin+J9KbJq`7vhwPBTaMlGyd4HX*ew=acKr5;0mJ*} z{Q$>117YlMy9`MS-Cz>ooChfUb_f$41TH7f7;Xp<2qfoN`E3Fm_U)u}|P*NAF7g7E=l1AKo8IXOQ@0u57|z5%u*8lHY2 zqGDw8Mc^7=>Z|7&Lp_FH|24z)<}3m!RzY{Pyh9G|PXBtlMGGBsG2P|T*fy)tnAkOL z96=js{%P2Y*Y8$ltIni&IZJ9;(#I#%Gbom?Vzf^kmaCw zoS;(A4#W99AUaRUw26=jTfDWO(7Z9ygVVzCt&b;SBvPr{3p1FZ#z? z-_G*S0uZkm-~3-F2b@TEHSaBd)82h3BvRjkp2Y2gQY?UY)R>qjcPrlM!eq#Tx!I} zig4jI*XM1W_UHbQm3vRI<;ilW%#1&5y4l}wFTRJtbLzWc`*byTU$lts=3Vg85vd1P z14lVsz|h|hTMa&7$%N;b@*xLlVhIAH@;^eANyO+g?40TZyOw*!QS$h%90R7i8KrwDk%Jw2@tj=Y_ERX1e26m+_J7n-1I`Eo6AM z)Y#=>(LgiH{-tnm#1UoJL54*&Gw8Cu28r;f-K!x!VV=84e> z!O@GTI?d$kZDCi;Jt>YVqz;y$SXJB^52p=k&iSI!+VL%rl zTn;2`RNf3oaL|{C{S=*y0vi~Vw8|~TAV<{-s$kYY9*sBkg1P=nY-9+ja*$ugS1lUM z^}NXnbr(JaNCMbp4$#X`WKsv}&!zi5GuF@aV!ihzFqGiku=E7ngnB~&?3S?W|4&K} z9dx`#e-;8Fae&_4LnbGjX?ozJeE^|vUCqNNyQ=d`a0v;|=$<1~6an2WgE+})Rt%&bt# z6Z{QX+Uo~%ZR3zV0hcFK1!CK>Z(4)!Wdy$kd5B0^hhPqY%#r^3 zQ2mJGi*nUH4;lV*dcp7-5Gpas&Q0ly;I-ok&uz6&i$w~Stov`HKFbjy9rpG$9Ax0H zO(!VHjVNX8pOw~dJ4BH6dL4k3M?57Qr z8V>;|VuKc9A^k*zhA7zlRb2A;O@%EfCQIBD>%#nQnUnskE^*ed`MCW17@y;E);R(6 zJg1VP^8ZsYH(xKjy6aJM8uNvbSzGXzcm&9DzB}nFw~h1IR}2b2XAI=&c8Ob`Pjc97 zS#jauL9G7h^jh;^Wo4y;v8O%HE_}x1O6NIv4A6){7i7O@k;5`+vZ_%1`Nnro<#6@J zfN=RJX~4DFmaO2g=kTpORo3dm7M_0_tiHWaBe@AY@#57*?AkZ+ud(P&3^zf}p99%h zM2RUrkoBafxMb5jJQmnA55eUl_7vS!N$AFr!)jt0c{*o=iczrkLMJAP@W9G4OtW?1 zU5IgmEONllN5CE$QmKGp5tR9bP00Jj#6t1f_WAAuMF$>Sh{-SWNow;5nNfiO;CkTh zac$I;umjhbOW$UZwcy*v8x|T$er^Q*6vAXmO6D~V1u5lHZ1G%j^2@@CCdb7LY^I^#xl=P(sgqn3WUQke2f2+fh8O(?J zlhno`^ssOB^>Kw)K=l$1I8z9`G*#T?lMa~L$xqRMc1YG@#U);=#6$zv3D7k8i8Q(? ziC7JWC`;nc)(Z#eApYR3z|v9<@m!1*d&n+huP@1Bu(4^t0sw?bwkU%O>z4sb3d7IK z>D5~HM?%%n(vH5^af5v~gqIJuUi&%bL^jUD3DS|)+yxN_JOAU)QpN$zLPWX*lNTsiBb(GXbpGvyb?_Hg zzyswK8y5BnWgbrt6CGLQKz{56tWUld;9h`kp_lRc>dF#{li-JMg?r3KT}HHAW*ezSS=9Akr&8yzJ$C zg5aA@uW!10sOXp*H^ih}%Ha`S$MpMD$vU+#>Ky&_){G~YBcK>!I>2fU_4}9gV5}h9 zwYs~znG1uQl+C}Hi;`W!#})_oBir%0re;igo%8dk*#+r4(frTq*ebIq3tO#U!U{S- zRr6!4FN^X<$_eWVOR;Bj*{PI=24vEHyyx~cOHz6FQxU~x^LCDNG#<69p2m*PG_lVL zx6tI^fQYPYVPoA48}5Y{MCd zkr%G=a#r4tzR4=}0sl$3d7{<;K(3OgK|e+CrEK3#V*x@O)%`bb zgkT>0zN0}ERTtyf7X2_#pj-k1!;zdj&?mLE8Gt+rI!<|dt{!RJSw3|0tggPIzVg;b zn#|)5-q@^5dF8Nw)^+m}$44zf79SNh$c%c7jLsC!cIvXW@00Lnqnd0!rAP8GfRbg1 zATe@E&aZLYh|zlJ(m ziCH=#LRh#2+EzaITKW@!PYhn3ohRaIEJn2LSn28I5ws#sMEESov~=>1t)9I=t`D#0 znh4AyZ40*!d;X>SHyR2i_BVYF)-bEP;s0NN->Iwb3>GUk_Dg$bB z;$SPWO-FSoxxNXuw8LJj%hSJADK~8*uH0|kVv~T?O?$8577pgw23mM#I3sAXoR=ElQi*2bUK5 zPsHD=cC?$@Og^o{0A*o*BBfF6{0V>dyrZp2w+{R$ToIyJ$5e97Oh{SFoJi~lq4~tO zShVpTI+RhpyyiJLU(1+y~#&K*XvJw99 zn5*iVuZw|T!DW47NLwD(E9rrUWB^@rBuC+G+6N}fi=FRM$H^r`dn^EN2~)+A;m(Mqu;&17Q>cxwDp-}$%^~JV`Gt$dDNO>Ye{n)F zegME@&;4g0h2z@V-*lvST`T_ndL3JHeABzJ^IHgom)Iuq>&BD=_1(C=0`Zrw(^aw*rs1L+5iN4^hEO199;W+^9;LM^pM+g~3 zh+KxBl`^VbHcG2?{yf&{joyfgoLyaSweu~oTDQY{;+RQlWMHTN_I%v<%=wT0rb68T zm8QHS4q8bj^V8GQZ5`W^4`Ukbg{J@V-Me!x7_@>gkHOxEWj**|BQ|rqGFgW|x2`!J zLHz>a-A8qI9|g`L#&1+_3ha9+inDXns~zWz9O%dxls47+N`5NHxaXV11)?T}t(>kdz{+}zi(>+tVgQI7^_oT$F zHC@18p-!7CL6%V)ir!t8D~zYia9JivIPd8ahL}>o&(lc@36u&!zx4 zFR=e_?P7)RPWArhd#FgZ+|agYr+yf}fK}^a&i|w7yW_F!`@a$8N@SIgJ(H0g*%@gl z6(OrAdxbbV@6Bj7-jo`Jh?cj5@m$_K9dHpsg zVH?}Ey@n!`2PYL+qU(`oFjyS_J~-^`+->4Pq}Kolwc-=|jm)_#NU0%0M=#uCx(bDy zckv=K$;L;fS>H@7zu}JD*{Mla*7+qERoio!oFbY}-LeRtaQ2I5zB4>2-?^Jjz7|5> zul(=UiCi{P*?i7DaD8=V8+b?2zD z^TXo@VHUm%{fxrCP#cVN4oP!Xt`L2r-KbcU!4D@Al-u}|d3gi?fW)H5S4ut=juI+4 zG^Pyxo$L}A^*gXiK1*BGj+UR>jO#+!D^{hG&%OU-!?1%sx8KDs^d zHBwRWYr93DkaH}O)GO{lexWZ{R<3en@C)O04-UO@lfoQ?a-J~JOLKTXV3RvwEp|sV z*Fi17SoHlqQgjWDEKXc6D|6Z<*5vD3m`9E7lWv=qE$FF4I#(Tbz3gOgm z2yMx4>gR(rXo8H}H8X z82>=q+N)M;#=%pNLLWVPM`9NA=PBF?2QR#VGFE7!M3@$VZ?>U7F`MmltWJvhBSZjH$b=}2ehr^*V_W9cmUgggg-QRuzS^D6|G zfN-X_uB8Ss2S|{DR5q~f3u~*j)N%KM0Y|5&r_)9Tj)mPFaMYqD2gswxFiSNwHuk_Y zyB>gu%*Qe457SJ0%kL&9AycLXwQDC{{YkH6!n!J%oA?T~0XhjzwiPUv*7{aLEukj4_lQQ%k@uOmZ8Gd9@*a#+x$F+K}h{+0}}w zx=Z9Hp2D5gRA1y}l+R~nwp#yV%#?jAC3ajfyoy5{oL5~+o;RVTT4?>^S@AJ@>$0Pz^GBJdhO|1d#*!Y0F*5!rV*?JkVGPQ7fdPyg~K2Z zYO&sd6eE(CanL}cQwuKl&_29VO=Mbo{Kn!3?VD84kCjnB*+%?BN zzp?ZgRCu{ZQ!TalEKB0C6!mgd%9pEXDuJvTPHQ@HRl4RR!FeQeApltN9~EuRCqCzYdO` z9KMKyABY;E90ZPd2{BW6=pYWR1-x7WxCLGhi0RHCo&bqjK+0au6Yf9EFeaxRqPSiV6MP)&lGY4 zHYUFL6#b$&4v6spnEK_Jh*FY)9JZE#@fZNACH&kF9=|y3lGJwnL>O;;sA+gage#sD%ziJx$^BnX-~;6iLJB~5 zJ`X!5aQ_5kiWI?edgd4z2NoDDp~w>IYXqFL0myQD0;XIN2(JlEEp!_gQRW}j_vM>Da1G328 zX2>riQQZF4D#LcN;iIU^^Tg95On7gQDFn2cZJe!z&MA*wByngw1fA3Kv&qTF3dVn1*k z?MuhqM!m_vV8=;bkY@QLC(;1soB-GWi#WVhuSbY2q{XL!-683KoD->;&_&|nsR1t2 z2xJy;1+XIsxj{ae(y`h9WrzC*(w;ob-Y_FJM~Dd^auPhz9JEY?F7K7lz~x*bdB)?b zIMy;Zmy$Dy0Zm(C+uNb@ z3@f=cf9(Ft<$nu_Y}RqA;~A~iZ3(-op9qIaTc6km!D`0%2> z-})gWZ=D{+*zmQr_Fc59G(+e@VxmLe**bJX!C86@jtH=n+Y0PcK1a*$MtB9#=J)6h z1Wp%WY|usrmgOk~wD8Hn3Z|9O2_lS0xdi%pT+a*GNDI>3BiJuyken~_^L-)7;}?SKUzRq5}*j;^O>N;m2H&46hw=I)BeuW(?&;P#`KuE}> zlsjB7t00+9YLSw9vY;g}@X>d(Y{f^y&AiJ&%W2~1(DugT6?7QP4rJ2CUlwM)LA66H zjQtpGmyUF_m9%U&4gz~=X}|oq`W|b~$rp$G;Y~VNgE*{?!hMM?tqwNJH890^eWvyAxPTs6EOCJG$3yv>T?kNMeB)rg z0$;q{0iysIN#e~y@Xq!G;FHiQ!2I;9F!sWtyhw$G+GF1TDuzeae*8nj)qX9}M8%3` zl3pbf{;9JblS9jDp+&viC@v2pIj*Gh?CAP%Mo5KemIg+?vC%QJ7p5tIQfXjF9cKNtNX#oni2)BODWPP}E=iJ%u4RlU(4 zfzuX88F973N4snP;V%cPoMu<|=~vC!J?1(zG@{r1@Ao@P+7r;nL&ppi&Sbfe3HGU@ z7R`IZ>slVZ`{J46l@aM&zrQFL@&&;@I}ny&4f&jYo#p1uVt0U$6DNQkNnBmzdoEty zTDx8OEgw(aeQrHd?zzxY>V6Qt)@rom|1+&|AtMI5CnVPA?q2uMBoVt0 z>>NfJ$eiyYl7>`7=_XMqfE-govKFxsm-YH1d+3fV{S%g!ytw}eq51Kb4VDs~S*r}> zs@krYS<*=qh`MCNZSk4SU-LPE+Y#{H0KXTM(V7tT9QiJb{aqPX7u(*(H*dQamf~u> z{|;OVYEJ*>!Z`Kpd>1Eime^B9eQwrXC|0zL5gv(VxOcd3n9`RIU=EET^@*_BM_cvZ zA|J@=PW!ILM!wXJnz?Cxg2^c77nw){H)X2eHC-Pe(EwDR3Izy~?F?|q7%v^WY5T4UgnH@d&56n4Ux(cYUw-Hwd8^A(ECUN4t)+0`JQ2+x<83E78&Ub5a60 z^~k$(e0uIpW~Mqcs?5w2dfE~MFUg@41F1fdB$x2|d_C|;Lj8mL|8IOv-GnD%xQRA; zIC_%-5~Kz)Q&Ukbq>ICR0{;VTM6-sjZtLK3X@xOL2_TN(p(F$6#S~M30T+{vxyXfS z7|)KXs`}U8veM8^&5=7$)R`sqm}OgPQroffefwV=O#j_#OG#tj^DRYW1hOT^8zGO| zj+u%pfyQuSD!Rv#fiR9HioYU2l4xk4XE=jMB>YFW7`rNBbQ$l#YyznqbSSviJg>Z7 zoH*Ijo}>(A9EQkn3`Dz91818-Ltr(A4(kEbl}tU#Zu-nl zLQ0AeOtiauVc(vY^Yu5ze*R1n+=&lx)mCc%#;Qe9nTG(U=;wn~=P+48P(K8gYG#I& zh*|@%?OJ~%PIUN5RMcd}$iNS7t5Hqi@No6J50V9UmXwsB?1o?D)Tj-d!@B=K-xnue z2VX1vgQ`flAj&8pbo-7JX`%pW+%2yCnj~*SJiE>G(6C0uS8MrJBEDQu{uu%c(i077;+=JOVHI{b(S%z|e zQG-jK`*!j{{Tzhj_exl77mfa8R~4a?!gJujf55AdLkpE3I0qCpoCf?N_8*mD z^W(|CUP%4NC&}Okm5MaocQJBvJlsZEZ}s)p?y;w$4HZ|Ud(|>72Co>_o*Cz}#zs0W zHgbBMV~=j?i-4gCQFpPS0QAZ7EA+MhK;BOYNwJCrkv%k#Z(`3L3v&9|YC%lpU=RA0 zJ;uKbm!GKG=uA_@@s0-yn)AD#u9gYPetCsv910k#Ng8(S4qIC4-bYVwE$4kWEaG`H zo;~=HFdJ}SHYK2KBCH3h9J~c6%({u!R9Tq=->$QB&V{`@cAq@Sd#RR^=48~}!7zBcXM8!5DU`P@~<*gZNl?~D`D)jyqJi{4?JYGo{#G`e$VZXiz^{F zeD1mYWGngf%E6XDKAmKEhYSSH=2Pg>2JE6zvmNpYOX6+gmUt|q>u-8#33pdU+4*2j zN?>bo9>ZPA7?lUa??UBno7*pW*mIs2^bMt-_z~9lA@ep<-`Jiw#djx;yoQK~pdyLR zB8Wa9!{CQ60OM%n0}h{kutP#cgVFw9c{^Sq(_VgEi$l&octRgz_MWH0 z`%@ot>~z#YS`Gi-Lw?(f6beoTjkOoW?cfxw9&fdPsSVQbqMHkC6K;-npXw4iZMBab zQ~9S(0V%W?MbANf3Zo;K`(r`3wKMqem1!5x$Y(S7;(>%;9g8p|#6$`SG^RkDhrTUR zs5-a20+9p|4vdjEBzx#R=sh^_-bh(lUU`oEp8i3zYy;ImPG|E$B`}jO-zvQ1C;blk zlmty`4Ew$39Aqg}6JSdQ`BU0FW8Ys)7hE?Y-l*xnlB9O<;p#MNWnV3^-9)>jW zx#oQg;te9-u_nDbHsP+Me(&akgDq&#jfn(7)(< zNva^ajqTrEDq^5C{@dakCgsd|d)$O35r{uwr$qg3B(_Hguz1A9=Q7=S@In$YP$HKc z;t=&PUhMLO&jHe^%s8J3YyI={JG-IMIDvLs<{Gh>DX9~yEw%~{tmO)dEeCAICUY0|4J zd-gYe+@_JJ;Vs3b8h4TE(2*l$`p+HlwohGARW#X5ggh3X)DuuP=L;XjaFJ0YICQ@$ zU_DH$J9_J)D!3`EHd>4tV9kL^>u4Xv2~Qy6ibOq>CG;_bfB+if{*268RbAah{J%ww z;07U~%QJS_o>^2?Tt9DM7J^G-N#EWO3}@bz6GbGjFmWSf0?xu4wH|w`*-Xzz$mjq2 zV#q)4(KpUJnNTGrAAf(gBq}ntIqUStCw3oClsVc{2EyW zY9~+b!V&NtgE(~;&1Xj$S?iyfGMpr*6vJ0?A|for#CE7wlk7Sac}T`(_YfX2BoqL? zAMagJiyjS?<7mfY&> z5Fxse(Eh|!*Ppu?=G#^xDqQBjt^6ESRtCphmEqnA<>B7f} zIYQ|MXJmy|<|{+bd)}L$wp(fpe>F9+9+cN5zQ0qaN?yGlRWZo%P2O|$xrwM{#6yAl zdq-k*(1!cuO0UUQHoCZ$uBJWZ4aDI{xE!So{5F;;s2Y4$2JXwXuCIQ%(#9LLH2$vc zTf@k$^&SL-ERS5iJX?Gxtm0-GBK!yV8BE}0v*+eAKvo{SNib*34u12{&?RJL#N~#a zjj*%fEkYkbOE9aM>JU*ezPYgm*HCM@r)$D%lbGymF*K?>Wj6wU!z%d|Ep(P-U&3NP z%`i)jms;$&bD!o_UV>j+yf1%}-G$PJ9HFPH>pWQ*4X=*DnYlLWEBo+DZeG}o>rdL& z(n~a{n1J?$EU|85!<2-$t;uJCpB40i>KOzNWSKAfRvx|HSm3~%Lg*DwCuH^qaZ=u; zSeHHi#naOAFxBgaD!QDaU9KiZI9#x;mdP4s>0cD%WBm*XX4tc59p;0>>duEcsh?dE zM#qJ$oo2s=sW0BZ{Wn%jZZFRY4EI`1$X_B8*uCEz;z4o&J}#+C+;@`%0g*1(JQU7{ zI-S5jh^FC8eY>nEd!`eh@UShaoVve=Dks9bMM$kgM5Z&lzdc(;szgT~AK0y!g8vv& zMGp+8)Uzj#w4YA1?tb*y;zL3OCF#osi8?N>^Rc#(7iL%3142Xiz6O^rLP0b{J4U6(FVCLLR9d|LeL z`a}Mw^~Pnr_L%9QWg?7t_%aqD-xld&A=3`CMgtFeoutV)Ml2B`}!Kk5jXB*289yS_*uJov4sbtj$`csjirFEBG zBF_7J#0=ZsW8>h&1L^ zpj8q0i2*~k4aKuDGS=dTnSg-_BzzWK>z+NB;32Y&mU?pR`r!tHvgZ!%uUqi|X(Ptr ztD~tZXZfw0r7e*)_jQwdlszR_%*?);TKhYxR(GT^D7lWs{dG`TPS<e5?Nv7P+?QEMK^Ak}0^;)?L6a=9@RQ>D4T2_x0(5^1sXZv#vBdsw!5K zE|Me(7C_o|`R0n!3cGhA_wna)Z?94d>=onR_fa&1g}Bc!k6O8&5*$g9=l(4O{k zIYl$CH0^xtgF-?tWS!V?*dnkv6e4KN!W>|=9#uo_6t9(`;EqF9E=KAu%ffA00y;Ss zf82gWM)rLCS@n==54nG8$N4v2)6z1E8;5pW{mlFNriYps=Vu*Sa{BGNI4@QEx$dlM znx9uDPY?`q>vNErZBNnRZjXM@2@Z&+sF-Dsp&W%}3 z4^97(?Ipsxyq;e;e=Yocg8V5TtH7*|2lv}hJ#Oh6EmN>jwY5!EMK1hB`wP|rM0ADm z68Q_`i4Te=(=&?Kenv-kRQ$YF0@w*kv~ND^4quC$2FJUTi;XG6?#4H&k3~x6hCdHe zxbb`NgX7MmW4}5tv^#8i8(%;2j_C=X$=Lc<%8K-Izm2fEZYCee^!2iO0}{zRs(tc~ zN}>@TkF;yicM6>PcNYZK8HHpDlCLteydvM_m)%-DAnT_3+dX5yCtuEKSrn~A3m%d9OS@;_~wn{vzBa}T|@Ifc)#7?A$4)7U7Dr} zy7u|~z-?YS-|0d})zq_QV~UCTx9=qhvUk$Z7-~NLA;X;9wDV5Sc2ePr&8T zfavEUBR77O==#RgDl%&5_EUu?37)F#H49_y@(d_y-}@@4-}o&MkmV$9d)J>|Cg1k4 zoL7emHV>vB!Z8cANt9HYK2_0c0P;lF?n(=w_$$DsFjJR~lCzRsv^h}qDMtHef60sb zN3Xhn^-5nZe>9r3v+91EL1BKEVx1kG!%nN=j&)teVs1Ipf1htiNfNy-E#-fQWG3%- z8N|CARhu-7#U3EhQ`n*WG;sMTq^c!jw*B4ICy`wOTN@OiGK7Ja{gyR^%7h)0@Fjt@ zDfO6rl$I!wqCpoipff)7uE2AMH2YW2wX{UR<028W@gldGxOu0hhFIC@8>%ba#k{jV z^Y01Y4oTUithb3zc*!d?GXv`_UA@sr64~gaDBw^BeDRY1jOea6f8_BdL-5|%d90T z@u*zob&()p3(DOW>f(1$sU)`sv{1YqfM-4>k3HC)L;m@vfzuy_QJAmy=3q z7pVdAl;yAN>|#5T+R%_XF`Y4DXjl5_e(y$o;@6gz77H5D>kpoqXf5=*^JeRNW>p<^ zhqO?N^LdjkVvGh;oeJ2iNkr(Q7aDJ;=nj?dydxu1Sy?&$*_zx8dNw`1@NR?KqD3}esfCd%8 zB}ACS;{~^;WzFSMcAD!c@gE#>o$DNm(!_n)k6}_4p)v>fot1a!RA5zW#LXSA69oZT zjaBlyUr$SwdP!2C&$W}xf3q^=Iq5EQsd4cSH!1^m0+~8|xMx5=ErBRs4)O}kIGgrB z4m$3lv3M<74Ms!$o1>aSR8-pRQj`<>Z<`?B7WD%lVOlW9!-|%Ow~Yi7r{_{J|);l_Luim(EAlb&)3PvXCEsS2*xPaZtn6k*ACSa2uwr8>t*0s*q`RY_D4h4 zT6AO`KfD5puYg8QXNqTaZFtKdF=rEhaIozaXR|cLd%d}_C(uElvh=g08p2H!Gn(7h zItKrNCDd;X1PwCmk0k|E<+}7mU%5JVZRKgU1wC^Tl`X++9gY1SXN#_25$a z4J;AhX>gTy_RDUb2{-it500z{)Z6q{J*A+%LM-B@%NB2Aa##Ap7>3N%d2E1}s-@H1 ztOwNo9i4@A=k@!ZsFV6uec0m{lyt_(rv8_+r<;Bj41)*^(PbRq{tb;BkUp(x%8_?? z=Ftzt z^na$Fi&KNKdV0^;YKlBKrcpslw11&-JqVT-q+W z{WIQhk1w>e*41{@t{*r)uA^*%-lX5i+VHPED8Nnr>?0pFe)Md~cxB zBk`hRx#NEj0*0;P!)iu_+?nonrZF)U2x|+7Hav5xNI7ZpZCy9@at=M z!1ZZ-L>frg2Qct`uP=fpFr|2%-?~=u`GLW?8w2qdm)@qQO6_{y6h%&}oSfJ?+S?X- zRpQF$2gR0=HmASUg*!Y|ydDE*9&YQOfXSR!di$|)!%9$PZ+t(3>_>RGz3_qI`_(Gs zoJP7mRrbsRH8uZfYp?ZL0lW&$OX`4L=l9Z*;?#ckUi<#-}QZL54ssWUu$ z|HYE94ZagSzZ-ZATwS-8J$QI{CcYMCbo2ei^M=D4@$!GCWCeFJ+jY;c*X%yGG2p?w zgQ67#0xdZa4Tq==ng>T?6-@mA?}F;?nfA?mMdZB+HslBWva)1yZdsKrzS%$Z>zl`F z%nRq|pmh^w`0g|=n<*O8Oul#U*%Aa?El4z_Vew967nbzMU;t$ z%SV=5-pS0&e2Flney^#l@es|k@wfKI|8{mGC7n4r+|DMpDg3g$lWa9Y(R@#xNrPPa z38s^9gS}VYRQ2B4R0%og0@{)w?-1{cIF`poe{=K{LWw5mOv8oxKemUyz;zzFa7Hjl z%`luT;)Ld#qf0y7yKwc8$dqj}B#jMyt35IsMt?a{ZrF#!yC81s#SRJz7kJrop%f)o zC0JRweIjA*ad%xbhgJwr7Mw!-Ix)x4J%_J&n+gZL8nW7Lzt(BfU(b)+)*SKl#^0sY z`Z|-aQLZDg-~awOD3c#q%j#6SZ%A7gzH+x~$;e`1Wow-84F#pp7??ZeT{TIjuWR!-B=g@;f|d3cY7(^ zj6~$K_UiuLs5ho1M|Q7&e0==+7=${HfIGQMcnX5*C1U>Y_CNy-?7?x)gQc;4hjz*~ zjp6Yq>0d00QSQl_x+8TJzFYc&4H6HO)*n*WJjh>~ND=2yrt#})$=1(%AQ(in$wJ!@ zO^Azt0~?E8$eN)SibMbNPe{|m-kck7gdP{C_e^2aQ%WkDp(ys)@xFY?+)vyDaoEOq zUayaig4FEJ8{L~E@%#r@$eqO2qhys=gGPJ5aV25gLs4hO`WW0Da|XaQ=@IpkGli2KL!Pwu%#n9op7zhVamDejwkp6u>nH(h zpS^|sl{#1TD_cO4Uu%M0*wAuYn8a&QBkg-fUt2`)<&|042ou7TNtk@`4|!x|L2`8s zPtV_52^GhmI?I!COG-Y4&X}H-*7@_`T=1jU>(36H-@A8&gDr%+`TO5_DlA8<^|d#y zXfyUsymYRoSxihM=i{gEE)siZ=A&(X`Eu;~+EsLM_-=X=rehi!!bD`tw0}3|n3&y4 zs|j6Pi^zcD<>r3RlfCjgcRznc9!_P?$#>BcxAf}sE6oatvK+xPLP z`}ffDG+z3knXP(5+->@6_`x^D@Bc19^tA>|U+-YT0}vu;X-0+(MCQ=WfA%bV-^LO` z&d*D7=Gt#gR;`fBf0IM6U9P9eW~GYw^kMT#vw^bxzKdp_6k1pKlJrlUIeRv?j-%rl z1K~%8i_=+1q!kuBHfKeuB&%yDoELKdM zlizLCfYQQ5@DiU8R2&TZ_dhiC9p-!F_U@fJ^*)u)Q`r{Gic!bJSa;V=yu7jHL!R=q zA>)l&d9@{-63{Ps;3hBV)fT+B)jCb zrsZD7Gd>$PP6bPy_I^8kJ;-DF{gt9*ah8esS_WfCiVE0dc1>{8+)NTggf%o$P@zdc zBZchiSD)ATFV>h4sdTXR5BxR4P>fkF(__l)R?tSR0fX4Xs)&hEtuJW~CkU~!l+5)9 z47#*mY^1HDQgzN7mfVY7f0XAsNZ0i7`S!n=(0It#`E`bau!Zd{$7o~}`7yiUJ;I02 zt#dIAd08J0W|ynk+uK)cm}JFsh*x-VO}HJ-Nbjk1=CYeD3w=0Sr8Sq6X>iey`3RH9 z<>{@z9FbF9odG@L*4)|U^S-vMrh-99Ind$}Bvzc~Pi92NbToF86J{m86VHpYe3JyP zAqc9|&dg4g7Ec(Io!wKUMj21O*uIkI;~?UtUXhX~aPHio@Pq2ZJ*2|pTE+14+f^1z%*8^@rS+hyOz#-?5M)&ZQFO5Lu-h}vk(w5?({Me z$T~#wY?qK~XT?nqJhKL~qHC+GH{kS`oSyyhooW83Z{_#F6I;!dN5_;D{yB2uz{E@M zRf&B&arp+8umRP=0e@MqC-^J>gb8fisb!7I;1OrV`MGIw&CNp zIj#IjFWy@%rJh5pZOWy0`Wa+5=C`L}EY9ev_9h-BAuqI6Ekf#A6jq?RYJckGNF^mD z*hg;@XBAAV!p*R6WiaH?0jnY|60yqF_kW|_nGb<0T`Yd<l zNE=u#cpNxvEIsGz7601KX%8LUhjQ&2PuHdjsnAEiOI;9*K#127F|lF?jG74U$9$f_ zkVQuzsCZrNorgX6!*sNQNw-nz94FJ@!Zx`&^R};N;oHrggF-AzBzo7sQ!1a1e1H11 zQXro!lWJJNYPzMed*tCOf7y)H>?&CS}JoIx>jl{>~~6#BwFL1OJ8+Hg_kfUQ)anqya>8> zaq@u{K^ii!AK*=vij`s_i1aY{m?%~`S<+4h zB?($?ZAkXQ3GCf|s;8+LH-O`!(LI^y5F)A~^J38>cqKu?r+i-Dj)a`o-a6rCI>%^1~r6_$p1yjVUlxy-_< zx@z$Ct?a+L9(R;6PMFY#9Jd&`)>-UpM{eFOvY)2xj@io9`I7+1p`TMlXoT zL7sW+5ay6L+d6wIqRgTW)Gn$_XmLSVOR<0FlrQ|RPh{`+rsLO`M7S;f{_)CS8qYE4 zDYK^Q`V^feD)c9rJYv`?Z@8oP{>3f1&4 zh%i&Ikf=<1snZ`!2q=imTabV&cDQee+%bH9+3QL{NkeX>h&6G~qbCBdUa`BB8V4kO z`A(LjcXt26>(J{LY0KH5pEU6psKcQ`>?>z1a#5_c7ga%6{L&rrMIVDx2Y7T0stsV) zxSm7VPYnKc{tCE)k}L?h-uW#(EA!0-K9dK|&J>UK2XY6gO+4ZGWn2*O-hFC(rB&;0 zq0OBGA|dB?Kdkpzf!uZ;VUt8y!N%l~?eh{fAcNqT3&vDkYSupCMo3o+?7AWKd3r$N zVYdLamM&x1#h9`yv0nE2x@q<85lJ145?xX*ZFLhpBD#!X%$FDu;DLS6rguJcuNDM9 zFgcu?e&Os-ps|3jiBuFgv?mpJ+;5M3pZ9R+8luJaLpI>7uh%)z-Ta6{0QuSCwY5VE zY?_>u>>`^9uQi8=COO1r1_lMmUzyVlPL3CYhLDI9K!#psSJWEd#T$iMToS?o7q>5( zH&82T+dKXX!m!|KmhKH>(N?z|q2T2?5`S;@Zv@5co9_l!H~Az#h!_=^qhJBIY?)bK ziK_tKMC2NriM>142nQwMJb)?#B&6rSQZNg(1FrbWgBRM|yM(=KYIH3l%guZexh31# zcm(^Vzi%zG;*jB_tVPFIx5wbC!LnKU&a`$7wm&SaFkiJ=!_`6PDv8uXqU$Ge3Y^6d zP?HfPR#dyER~K_q_FrojK~k)uDbtDvGCQd7n*Izr{%hH_4+wIMo01G*x9H2 zek9Mrqt?dy%;x&5D!;3{OyIY<&G{wY>NJA0LtB_#jEE8ly!p^sr7_GYjDv0iiY$St zmzRqxQTq+inh9foSA;z9Y~=nyG5dWy|JZcVaOfbi;Bc1y+t1PUyAiqg zNF(@htd3M=B`@;YKQuH@z5OG%pN3d_ZEV^V%phzb8fZr_Xpg~Us3&=6s#p`%I&m1Y z&${0)JPeVVK-`V@Qx|91WU%q6)4{()o~|Ah;8m$p~MOC21QuG-S~f(e zj#mXZ5cgs;0>OqqB&|@hz;Pf7269>khS8VcZgD9isVWpZv3SW@PIA8@t4x)V>bg+V)$L z<(P!&S296prjWHw4|yz377_&Hlp_xiu|s&nl7p(1QSA5$KQU2%0gp!Z56vn@pdCle zyx+Zb8Kt$1MAmh{WPjwwr|3rG;>TeoWyNsG+j&u&ks)<#=Df@NcWs~)HFyqAquE}* z_jJpD8kg_`obrAD zo`+v-_$cR}q~dMQt4bPiwJ`u+75}Lyb>I^a+PDQ*!)i^E%KiH^bljRDEE<;; zdc{SuhXUg_G*aqW&xgKSdNa@;W0wwk{E`>KH#{e4!a_+BJlm?y#VY>#@#C11(lK^} z+27t!(T6H;zUVf+83H8{TrZ=Yjk}f(Z2J6Nx`6-e`4b!P`xE^`2t#*oG(1_iK%1YQ zWuWoO=Q#^Gsk-jr>>W9Y4GkZEJQDaRVYz7E7HVnM#>0V>HdqM$?f=q{Swgsd13E4{ zikoI{U|_{Teufc&zT`wI@4+5GP+iLc~HJSHxi1mNqXI zH>86f@M)Lryl`hjkauIKFVtU{L$f<2dmM{!l`VX@Dtaj@XOx*yQ~Luj$ZFeR|InxOoHB}-KF_3yFx#wf`L1GD9K zyi1?QF$tWNa{3lSd=a=sy{>4-|A|{5UP=c3lbo`$-G56F1cMcjC@P5SoXm+6JRmX_ zzM?-jAEx*HM|_#^^GUMhYj1xkG`u!@%T38GOEXSDxAz2^SHB0(=JeSYIC)U~eWQcG z`?)n)<*?|d4}8r@jyjdl_$K>1l2^ zK_o}WFp0?$9bq0$|01do*>2mBYP7UXj0x^^PdExdp#tfh{nq0kbDV}u6LLAr z=0?RewYqt4bhIXovhLA{*9boBH5#IRedZzHe*2=Q6)rr97mWQ|E$5popR{KU1KWm3 znomk?5_-o+C$+P80&)5oei<&f_MqFh2O`mGBV z8n}8M_U2o4=lywr;BCDBsG9t9LVts_;8?)bHP%s5N^1RlKQTGsE}^}ZRZ&4gtR_c_ zULB3zE9|>OM@v4E#AEB|{a86)fJW%6xECEu`_D86cst-^#e%Sf^`2?!}R6DHCsM9%|p?z&y(LZA}%q_DhndJ@L z&Pk7Nje%R6Ow(zr$LfB(zbcbVMYEiqYX`0h{bE-KO5OW0%>zzdYa2wnGdi=IP#XfJw%h9;zT@>B%H+`c@sPceA@_z|;8=_g3v&Vd5rh+lC`wAMyQ1AAGIQ^(HnWT3NB<; z?$V@aqC7Te8u3Z9G4beKQx^(=g~Kxg_CCWDVfShHT&hX%XKf9mk^G}V6dec6m%FcG zV!=E41*vOB3&y(7w$tUarkoz@=}3!_cWGZ)pADRDPx-d#gBuT14aPXa5CGu?d=ub1 zFkcuV!W%+o*CLN?ut8W%cBCPKpk}l-K1q;BK10$G1T0fO;$9pSl8cI@+F2__CBQ9p ztdPX?_>1>PS8W>^&oFNMeK_fNgM=ldc5!Y+{M2*teG17h@76e4)qGAi*f07)Pu4yK zRSWlj`5QjNGD9R10`w%BSYlGh{(7K*74Hm@!$v5=z#>3Q3WF>%W{#p7KqAt*E0Y=I zJiF6c8l3QGq(XKVw>ENw0trtltb))Awd7o?Q7|Ie^gIVkf`)Fx>hKO4rG;IU@aDyZ zYZ&ysU6sjMH*K4sbn1Td)5tRN_NV9reL4OPs5)D9s-k0|9g+^@20xCt3^MdS>wt!V zFrLWxLK!jw@L{7~S-r~%VihYgK~^HbF#)Aux{Oe_CICo)WG2sZ;VPb(b5jWsxH^ek z8Mp@(mygKrr-9d+gIGgXo-R0-SnfT^_RhVc{XFT716Rc_Fd4b6^C>2|-A z9WVJ2MbnV?%cZ;P1rc0*={-4s3A>W}P^)@QrlstYyt)g&JA9@@Y&7g4|4IVkAGJU| z0ubv?i>V(FK|dsJKWV$JVvS}&C*-3Q-uqVOy0$boDckWtCt*@IBE+_pOV`4R>sb1g?@PQL{;T1{T$lzp1n9W zCJ<*$d%-DocfXfnZiN?JU%mh(S>C|scc+zxS3gFQFVBW9Z>}qP8JmbQncZ62gOw>= zq<9Z1e|HfT2=s&Ha(F%}jui@TWbdnNSeu6NJ=a?fM#B$=io2{fqd6&wxIcK>+c4TS zJ7xuo-^+LVa7R$k_{n}m2%HERp_feN7ppb8GFH=F&%nfxMiaC{I4^s1ok3~cM$Alv z<@DF^1E+jWv1qHc1AUDE={ga!tbox$6^y*{*?QCl(M2hrzF6cAKn-sV!+cu$qm zBmrC9boXKAfE}TOJ$chw^DJA|)LiWGmm8j}=2&j|S{!60%z0UpmYJ08L4 zg1+|6qAgS09|DqBzX(b1nXY@(lBT0Dvj%3}e$eNV{#n(b7j^G<40@j%`;Bb9;<31! z`xLzvuk`H{Q;-TEy;atAEB;K8)2x~n!VoN6&1Zg4GyG@^ z`!+Tgh<-!SQkT&wQ%p%b5GUjcrDYX+O9WOo$Jl^L4#vd>T-d$ye@qTQfy*!tZp>S$ zF3Z9mH1{EBkK4y)o#0bE%a{jRd#XHI)M|Bhi4gt_KQ}Yc6_t5TGASKHyH4=d=m1*nXNekEurIi zc~pD-4pc|34KwjIlKYq1cVi5CExHJwKoXh}ypxj--Mv4;KyIxkI{O75p zfNwQ*gOLG7BBhTXD+`NF_noWsM9*#Wz{O%IMYgO~gLCIg1Ibt8M}Kba%;!u97|{s* zyT>PDWYb1&X0ahVLJ@ zx-*k+Ux1J^WV>VOa(eS*Tr6@S2-zVHRD3WnSHHTDZAv^sNMq4VcCn(_d3)$Bt^WD* z=+*p)d)yP*ivZ!=Cfe>1oti8xMo#+B=M?8T)IGP{q}h+_8G^MOa?k?hLj@6z=O zZf<&hrD440J06w^j=;3k&19M&A^G%W z*-TOmPpFi(6%Vc!?wvU}T-m6>kkPa7TJm%NKlo?VA}EHe%aEL3%0CKYen&z0_PLx@CRk zW32ozi!yu24#x7mei;%H){)W8;4?Po6)|3*Eht}{NdPnaGpnmfR5TyeoLp;xCHWiBL%4G-TJEn8o1b1vl7^7*jZ#%()(&#lzsZ}m_v z2tw{fP}rC2f~w@ogZejX8TM`8y(~DDVO=!pl>bhPBer|?Ui@1@v)8L@EX7${;evT5 z&wRP^^*^MdVsfehj>BYR45^V6Y-{K5$kvOn`@K>GhIHK2(iI`u`T4~<7<8E zaM9?keIP^%T7j8K^pg2ZK6h(|zem>3BpH5x#WV}NifF2WFOZ*~|32cB(X;9M?)ffV zM!d@c2#|*F3o)L}hzLa3@^%1S2O%cu)Ns#zKxbV3|Fr5`Jjfo^tN`*5B2bokw!f zIOVnJxnDr%v6T1WY0Zb$&UDtW(kgmM3FyQS^?rrrW?@OrzS*Y6-P!T=15Db|Q*qL87;j16J5QoC4=D*e+HIbDavTRr3$@s`!(0c^weYQV z2mNoJ0#)G=qo{Q5EbPA4opY%G@5DO=<{;s7x8`{TR%Yw>v7K^0OOGu|SSvKi?%V#x zA7mP;v>NY$2y~pvIY5)?djNUjlmu#i=d#`&(%jsbo+=JzTcf^42{~37NTqdDjQ4-t zKHkd;Pzk7U6X3g5Xs!-?Y!R3r*WJuc4Y0Fhj@_~RVUNZW&{swU*1BWPA^KTHgaRr% zN)~*G_SuS0zPgO9u|n&55z3z0lqwJz5OuZxYt1yqibmu;(9@qyIV`3fhNOlp{b1lN z*u#l*GX$Y5-~pZoxJPtc-c(n`_c0PBDuS}QRco=VKaPl0CKmLfK4RJheNFvVJZ3K` zz|PV979}F12V&;Q+s2eYs!MK3JV_)a-+n{WX{xE8pLmt#$S)|a?7z*+b!0zf)E}xjC{}(FaR~@d zKOgyNwQ`mFV=PtuBUMA@7{2K8H0y8Wa=R55X^B3!($YVfv(yNV0D*4$gY5Yg=7?s! zZ1K_(in>hGDrOD+@yM>{5YUn>dXXCF>b}F6*N8=>1l0mSUXDQ6#I!Vo%3L5EU?*U% zx(`R!0;*hcJ!VZkL~>ut=W5>FKDW`%W4CwfL_;j1kv{^!MF}#LV_d82vO4!&k%)>8 zFLOw92~8c5#?!E1FZ=2V?@X0zf|a2JBZXZ!b#TqSOey>5x9wzKqQ3@3qu~+3(S$}p zcyF`epxvQ;H$b;2<_#Vsk&}BI9ZbV{U?S`Iy3*X8N-g!lGm=jLE2VXOTuFI-@F z{33u;TM%>EbCILEj8X10Ck@zyQ$Z51ZKrrQ@xG^MKmcwrxI(SL=J2&Z&dDPuWq=_i^NWP&ZGXkSb|t=CRg-F>b|XBTj+J#v zdT(`mRt^l4us=@?K5wRMv-Q0Co_sqsd;iPc0;?bSE#{p3RuCDd}#I=A#9qySt^kI|Zbqq)SS=Q@Xpm z^K8zX^UrY{hj^d;-1}Z@T?;G-TXOw$d!r};tf?TkDGdh@*b!iW2RlQRE>6zn%*d!z z)%Aq0s65D`B9N~9wD0x{FngDzd~h$*6ce;&G;SfL{DdYI_gZ5aL}2|Ym1%oj{lmrX zUBUv&IJng=k(pl!eY3+8uv`qvmg{s<)0GOp-K~zUs1FMQSNw}tEfI)}EViqHkI&gH z7bwxczAW6He38w(T*ef3hj|x((d3IIq^Pdp7+ae=d!?)@HeSm_ioy*7)p_QTSqX*`2a)USwTl?R6Oj;Hebg#cSYin!ZA#5JpOUMGf#B^Z( z2?De);N&s^>CUg^d~E4r(@#zQ^Yh%|NF<^^R`La8AKV-5CL>B1=c&BN-z?6MbG|BS zpql|4Pp|48K&zm^L6ZpSdCI(>w6qMtV}|)pKEe9~l4Nhx_i=>fWdy$1a&rrCmKxOt z0w%7Q{g9Ov4I4giWp4MOUo&V34+kMbyicJ!Fsb!-)`a?CQS~;Cqrj5n+~XaLs*nEP zCE_b4#5ZYj&oV|v-KR!_H1m}rs?z9iqIt1=GD!;Y84)vGp-67$QVICTx&3f)j?cq@ znKITUK*$9HkJ5g*H-_o(ryS*@fG#6;NQf^nl+k|B+g#^E($dCMt(RvPT9eU&Zd2f? zeV zD=VI^Vu^?kc8Yn#k@q+{FS`=>>BvYC$On^93ULrHSG{&5#7Yo18m?BbBD^l#G(d4R zKt~v_cZGh1xy^-~Pue`F*HT8ZKRsx`L9wL{*VOe#;;Cw~|I&fv{#UF5fD!!gQ1YJF zVCRR4i`)CkSu86PD^^%-^5T(mSql8ss8Jq|h;sbBdm*Gj4|-yIn8y1V51^Xf`wXAk z_w~itpyI>rD9X&lBujj=XJLm&L34R|+I@UfC{md^S_q#1hi%}+Cy7BzK=2j_>wf!T z*6rP&@>RoURy$mg@dKt>3q>Z74X^CXEgw z2caZFua0Ee6a8p@2t3)Fn@b5sf{uJ^WcE>5e#)7c3ubuO{xjppcQYv|gZdfrglQfa zZR%$1w{9*^dUHFfjv$K-OiGO49byDvu(*5-z}5kb7Oyp9K=ej}hldBZ4kjIl0u%uq z^4QH}`>UA`SmAhq?#Ri-rO{Z<-p3xE$jtqjsDJ7@_}NB z$%p@RvL0dW;eJ=Mnnh1RvjLQc$0f}b7gxZ`RRs+@zIha}(Ti1m4nSiT%87xC7$d1~ zWwuvPOFf6CL~lHPgIfDacl~t`0aRina$YiHzT28`T}{rl;h$!{~vgv2WZC{Z-Q94PqUEUAy- zfkAlgM3@^N9F_{#q+R%&3i>uTJ?yS>1+QE`??UM zEa?XuF<@H)uijqZ1nvTJPE`F(cPx~HgR|b<#f=|iZEt(ggu0C;>@_k1hNf)CCLDdR z+ywiy_*d}@sMHzN7h3r$=g|)~J*F%hret5+gFeHiUz3Q~uwAs5m9?N`O_{TUvJl)d zw?dBLsR_U30mShR=$$6+*?Rf%)cqXpOyb(k;G9Zy?XP6yFz-zJ`h|2=gBokGU+gvn z<2b8~k%MzAZ)|Qt|e<+mLHGd(ePfq{Hj(_;{B!5p9 z=-04d-AP9VZ6Nbr)59YMBJF%)JUYygS5>*T@AY6C9@0KGE4emZHtXh=b8(Z*o{WjP zb-YqQ)rbe7>N($siWFC`mun@$euJ}3$JmvYmIkgneE85qA8EdAKiPmQo!d#ORw}3Q z=@u*$hxKBJc-}Ygo=yI+4()9|g81MTaB*^Ki5EY~T0gCP4v=Z>0?G76s1|xM)lR}M~ zLbi_TKYBhn5f;dHdh9BweE!@J6tvFa!++cv>@t-;=k9^orq_XO_)kq1%@zrzr_w>? zOPuXHRO*X6sjM9n zfzzU z4Cej~{Dy%|v~XF^M|z~Q<7T_?$fF{%3j)@+D~fpvG>Ja=>`?-AG?yPfLET(es?`+6 z{L^Gu3&&N?j`#QSs2lh>8T(6h@@;_Sd;k!px5Q?ZlyiQC8LuXz3W%nsg&lwuB=QGe z2T6p_#KbfU1S$7%sl&$L6ZgBe_Gla`q_FvY1)nn};6`C=y0}5LPfx49R^JuKXGc|3 zRET+f1|JQ;r2b!f4Y;h^IXWKxyD2I9wUZRAQ&`#EKHx%3JvNg!dZai!Jp9_r2y7}# zxn?4-hHGHK|42(qPD8U>8tyh1ymIk0%{EQ%6VUY?J^8Wvz28_#BuOFc5FoO7!9eZH z$n*nwB@grnc7|R~n3alQnSmz{TdYyR`!8Ih^8m(|xG`fBOd1>E1~CbWVig3$H_Y{m ze&buGG5M2-qXdk8`QEY!jQ z@4nS!T|q1}C0a91XQaJdMcUR!451uBBa3kBDH`6wFC7l;P#O1Eozuf*@`Scv8l{Ra z?v*j-UCL;%o8M&=Xp@I(2MwbjH4cjMswCUdKw&9xO1yf40l2W`7>ZKLQeaNT%iduk zggm|{YOAb%SvX$_be!qM{^$UoEP#UdB{D4`^OOnOsJP%(06bl?q`G>?67Fi-9k zmV#(-e_C1?#2L>l+nEgh(b_*>kjyJ7k5zq35$l;Q`)%}IMb$5#P%u(l zkJ`gsr#sH@`xIWM8E48(8S~eL& zxGzo3YTu{t)McF*M(K6CUs~>nz=MnXhF*&nif#9bP`lEPq$ir%p~G*|Pe3UDuk!@t zZ!)9N-;vBAUe6S}ik6^*!#S4UV4MRdSlGPOH!{n4h=hZ9be$w+Fx@o#&%rzp-g20Rw|4*nkmq+Wwi;zSf}P>1RbOixx#U)LBsDehXYkAu&QZmm~mNLyR?cG zPF`_B@un$v5k)g>)k)}@s7d#5W!s#gw*yBZXf7Mb;BuhnZd%>m4r*@Z0d7n{6l|SY z?p+=UDiNo?UPA6Q4X|1mV`FD7{{i(N74K@&jR?pGK%@xj9uEP94xnsQ2m}jsOl+$V z1KWQYZsU89+pk77UcVNeqGWPy6J4FM*CP)gRC(N8H<#P;+q9!9rPpki*eJ>lc&Fvt1h z$WX%0L;iKGmDTwUb2=Gw?5xq?u8EPDfg6|8-JJ>{r{Hj_*Die%RY$)u=6)hg*|uba{qtxjD?)4Jz};sx$3e|Xfo4_OVYsj4MLx2J0m zYHCoUworn_PR*wF072FJFL9`{&Xsw9#GBOaAFX4x@!55q6@ZPMf@ayLKSs0eE*Gf(tK~2M_Wy-kU1f3@rClF>o4MS>61b-k0dTtXEQOUyz3SRJ{hnP@QAN?2K%^Y8 z;J4s}`9ImjOW1&omNpDvhAz$V8~*%?YR+~IUm*6%T(A1o${{j1U|2TsgB0uluvm@J z&gM)W4W?+M&oA5n$`c4487KJ)G^ZCAdFS-S=z0A^e{r9O8#JP;UdGVFZx^qfKL-Tg zqK}V~WG-!qWR7i_Iq#xr*)$)au8w-28;Y0fj@Bg7g*IGkT55kCB|aK6XV&$q{bHS- z^w#5A`#wR*x$dwCno7Q)D%Wp9o?mEVJBabqDdLYt{T&l%Xxo4Popaw_YtejctjU&$ z+l&jJP)aR4{Z%3t+4LR;u@>KggJaRaAhdA{hw9G-N_?FqnfV;cVNbMx7@YB@*NAxDV+&)s4Ry~ne6P>;m571ZqPtfZYCb5@p@|INtqGBJ25{qnGjOZ{S8 z6@?q`{u3?l&Gc~QBrRP>r$~88Rc&C~Gxl1R$Enwg7xC#uC;lr}+l_h(nXwYAv67Q< z6B84O6k8_`)!Fv7`e=(gE$fiDYJz&GSgJ0hMn?);D^JcZoO(464(9GICsV4b&JFuwQrUVog0wlwyM^-KVdxZFUj+&aj*!rL#nVT(9kO`xqiRmy?!q5N) zk+-nlT$V$pG5UX1q!^_qVt+}eDw#4g60$$f=i6lC=%mi>tH;DJ?2fCpnJBWfv<(lZ z0AF~@{Z=x>`vUnIlR69Lb=1>asWJ)?-!S4y0NS<+tpY9f*8y=2N5qDoKjGBW)CdU) z@4LFyidBF@qo}ItJW@V>oTga@VI)WM?+7TsHTQx@?cbt{NgZ=0K}4m5F(|>^S~1~7 z1_Q)@KBqIMZ`L`-&(W`Nq{}yYt+%R~)ADC!(QwOP$fm-`$u+c{Bi2XbcmFD)0mif; z;68cx{(bYN*?$re5-4DKD86P5@be)D(ZMCKC^)%rap}5U84^hbpHlBU`@N7Vq0H05 zvHALR>Z5|#E#$K7`FKB^4RgRzQD$P`ah9O|0x)Qc}xVQi;{K zsI6=(6~7RtOJgV7fbTRBqS)llew`<=Az(g*9o0rR%}2mbcz=^jkO^wt3gi;E78wJH zcoCYN`|C}HO=K=qP8aAX(~^GS0_kkz=s^sOt!2%$OUyD-+6#2udMA zFa|n?6oCfoyjX+`0SqwG`50h!-0!kU#EAZ7&h_L$`zsKgqP_p!k_;0w4=-WxPe_*6 zG1qbPjSc_>*-P!Tzl-tc5&Nmaa>5iJ8>65pS?mXqR^ecqG)>s~o82A3z+lLv>pfrq z3nJm|u@udoF)@(Ph?Ca5AMqQKWfi^3Xts2;K-eSue7(-$FBwOeIoC>*AU%{P;ovyK zIMm$@CvY)jq`TtS?LNM^v{vC0SeWIv;vLUp+Z)va_kI>Z*9Y01kCUepU{@zsao`UB zwBXg*lEsn6+&o^8N=cTL{q%WcZWRgAPI8p`kKO6!E!yc9;m}ZK|#S; zIRrfLzLAmF=rk$tL9~sgOXTUSKog2qhiI@Fd=3vGYTN1+t)3M^G~-1VVofz{cZTsz z{gTp+2{jx62~81uH*P78MS15W`Yr}dZp_me#&`hbQ-NTyic?dCXt7eRN?%)9Sxu2j z-I1Pbpme@yeu58OA}to;8^k~uBcA>ur5wQ=-n$gxV(|A^2!6Q~AIK2==q*ubXz9?n z!{b~6%&^dikO3%r9zgaqmHakt&;Ee6Ghmeu2A(HfmbD|r#o!VfK4V=<_7G7&|VtYJ=g))}XFND~!|9HB$ zxE<8p4C(J?YtfO5#Ebl7OM1o6kJWlZJPiwv!E3jkxVwUV(E1Sz^kx4xd^h#4UvZmE zWRr0%+$=Tqw|lMUY~z(`HWO_o_#Wp4(nJ`B=_b2*ux6 zM>(gA#+2ByaI11VGh@_#iH1CK?6`|Kxce6G0Z&CJsBQgIBpyQ#Bg=r{nJ z4ODt7H-ITvLKM^gLnctQq(eMk_#etxf;6S_DInNm z$th$+bbW+_7E<`3;P~u?k>JG7o_XahpCU(%ii4Eowg#j z@L--2o>}*pR801zN5o_X{x*GYxCwV5~*C~09Y+B z8=7E(mbPo0f*8l{`zX9CcTHM4v$C@8qZ1zq^(K|$_NRrFP5eLMMpT%Or~ZqPmKN`4 zbQUP)yPUJK;D*vAt~*g-NmGYa@(Xp7pguvy(koWn;ojN0aB(S zkD2plM7OP|G)yaTWCSHBUu{2?StuPHiDta%wWdW~~gtnQT~o8;_Fn#SLv+lU~8F*T29%!)4|A?p9#OC~w)rk`5< z?txW*nm%L7T&264g+ouY>rMi?nWs0J$lql-)@C##^aF9!80JKrpRb1_+g#?2qYU|< zV<9jbk+T&Y*n8t3Ls?l_f#Q{_4_@QoR{Gkc3RK*WbWA4p`sAIDPiM2OM2X`F9E(ua z*6LOZLCJ+C6=LuaRIFvZ(nMZ1}$gvk+kIr6*|e)hrV-v4|A@h8K0zSLvza?Luj+xLJ9}8XAtYHmcW? zru?6L=^_*T6A_Qc=dEUE#k;lODjV2qD8`2ygJxsoMIWCT3+P(S04@i^tv4qZybuU= z=cvG7_F4}?fB#?}J1b_eV&17WbymgbaK0^YR|Fx)zsq4_PhKFg{VodNS)eQzv>^@J zKTE~EwjwIhCW0-awtbtCwS`EI5*bZmjf$%Mtv_lJ5HeS!;y(bVDS|X5K0G`d3d-12 zR|Qk6q+cR-jyMIqE~CU+5b}Y$+xPJIf3&jP6-+*?WQ#_+*U-Fv6PuJ|DqlaxD?0lm}{dMJy@5smqR!yNUV}5N-O$;#e zfnP;&Ntx09=^E0-MW@pwRRXCCEiws;wY5D#i}<9)6=zntT&efV#~279(c!}~($(4b zFhnjyS4K1wgGuOLUOHZhZ)U#sCclLRVX{}gF~z4(zh^kq6|uNLQ-Q?YxOEx_Mu zxz1bmj0khyAX!;iE;_)qj1RTc*PNSFu9WD7n8cnQgcTnFBZDp30ccu@A(NqFhxQPS z9nba-Ti-9)3W_OD$s`KXvf+C{RaAq|_C~C&1v~rU&`?5;3)!jTVn2ao^v z0+^UU6d^7f;wT^in##-^@o;aUO-{}&tw6s91^R3OhKUTadCnhEq(Teu=VzCfT_eZq z{Z7s(32ZnxaW{iZQ^rQ<{3a;Juy21T6w`pHq|*xj<)k^?r*Jl!bJ|g~m$!FqtDmxmwa0+>W$kkoR z!8ppUMbC>j>{d0kSxxY?|NR=YKi=9*{m4@fpz^1}vycRRdrq2}l26t%QG#P1`Q z>p)W-K#t#n+zI-yF%>1`)0An~RWOMHC->jOx%0igfB!M&zA36m{w~WD`0^hur8Q%e zmrKz6{D5F%?)oAWn&BrtYr@%ujmrVL#kiREv_8o!V00t)zFpIyem8S)1;F;1wK)Hw zwU2jHIi}XCY8D_xchQH<&TBtoND>`vxLkQN7#ZPuqaDpee`jjx%9^W=)iiX=7hW~h z#Q&D<2@{U%GAHD`0SEK)kgXk0i6B{R60i1E_M-gjt-v{gwW19Z#-p; z9pLk0TYm-sa#_*f0J;6Kwk0p0S#c@kDwH~Af8SR2OP5zW6dN~@2o9s@!EVUN46cz! zz{o(i*s}T2;i=c9BBHKWq5(INqLr0BzU#SRqtMU#>$z=Xt}87izn}l&jM(C?&j%%a zRn&TOnveeu^oO3}u{IH@7x(vbZM7b={2Rd$i^cb{kjUHPx{;B2W?^Jx#KOk@#*)fN z3uS3)`ik0lr4d7Yi3~STaA0M$n8~%Z1O4y;U80S$PdDM@OsFuh9t<#`rG}=Y6g1NC zE@q6I-=`cGY9dQX+3vcd7YgWURs3iAZ8RdUeN9IC!_)&V zGYm>pe#tc%rhbE{MYQ$n>jh3!5)@YB%P9Y${_j3dGRKdyUw%3beTZs#=9X4dy9Wu> zezpqIReYjI8AAwoxwAPtOXf;;Y!4H9?~+xu{7E?-WCH7TveYjhuH2`%m&8hNL3b4R zalF#&#U0#6CBO|2c(qUwp@{-X6eJgPJ^_2pQO$y)^A z}o*O}rnu_iix-&0_zzch2}%qRPxi_T2;)w(&lg#1@nw z+1)Ii8}ph?6f3rk6ke5Xwui?_Bq;=#RiwD5`2q;zsvp*gSB$ODzjcYNph(0_v!JmOTJy>;Y^9ZYKZH}0a_jF5Q>^|f83`wu zV4y`@;c_swwBBxrkI(oHZY=z_f?3fmcI|F!Z%i%nRC4sxoY)KGR!7};6~w{2{f$$j znvuz5LY)0Mdv9dtGt1V{rLDvIyc9*F^?4B^JB212R84IyB@Io{%mLKF{=Pcsk_UVg zQUV~A1PS@86JmAUR&0ps8>O2T`8|92xg4-v)q6p;CD|5K~9>wL?9y9#^B_ebbIRn@rER4G?i*BL=S z$hVJ~Tw?i&o|X4%&&~U4h|;vrY*1tQJ}=5e;pVL`S<~+mtS!pQj7F=B4qLZy?qX*8 zX?;6+oZFjE20#ka$hi7T=-If$d2Tibst8y#==wwomryo54*N(7ypCtkFziXcI!>4g>R{$`t(x$U)mM=~-Cj?1~&q0TZ46^#0!qo}ae7T>3F?_o&@;t`peV z`^UTaJc^*}q%f>94d>ZFuG{m$N}KUVJPGMdvMw4Ad$3z1L2zRAg%Q`uka6sGl4_ck zCUe>dpXvZ;v0$oO)Qc4~FrWYxRiIAs(lxE3pdjd#8Uw0_lz?e%2pTqp5<&F&67w@Y z^53KSPFW5i!=LohUgcw_sCmR80qAoAzikR`RDQ+#t%Qc|j9ywB zz*bfwh*MYtxX$HIDa-yr3g9RNyC~u{M9{;q{Yx@HoQsaB9dykK&nfydMKOukKqKfAzDK>cV@Ypnb|0B=eakO7De)m9u zk3{4vnxo=eQqlkpF2JhF$jAV$zn0QHT{+x#)6%khhyaN^35g0Vwi6fECP>yS&)0Io z!RL+d6^-_<%^Z~H?N*Qe#^c7S_ztTGrcqV3jg*9dmwBIDuNU-$Ix{FMO=wZ_W5KwQ&L>2olS{H-N0 zuu}JNIpjpOl$S>Vmc<#6oY%M3I;;$OF*38GkJD|?a`V28lQ(X6 zEVmwDE?EXKXn|VTW2qU(aYyIR+5%20@Ta@+R0vg<3pXo+Lnn52OATn;DXj1v-GS{} zpbEZ+;I5%2!RPrRoAMi6<70nZD*jx4UovKm z$6@Lj=$AUyZi|teiKR$j(C#abK>Ax+ir{rB#1Ck}Co~)! z5{BLm#l>%It0n1w1BogoMs|zcfg!i9=Fvn3E5jVXEWvNkqqlPq zo|%mM9msE)*(6!--jPayE6Di8HW>|8;jY?^^Ke09ZDLgd7UANe0z6!d*CXc>V1hhQ z${0f3PALPPygiqk%S|F?r0giKh>R9Nzo3b+dSE=}JDH?aAL8>!lZa=qMVFyABHbxg zwu=sHvb8H|El0 zsa)=c8(SeyPfH3s1#lWl-f#}8(7Khv!2EtX70G?L%KO_NiVaQ!;QB5vFJEfn2Q`3T zqlgFi&q2;-aPx~3;^`f;IhXdu!y_X}2UIBEjw6`i9z1d?eT{R#98OC|S6N?w^3ScL zs%l-GnorM55&fIPj`K%-V{@ym+nz|v#-q=)0uM;Vjdxf(2M@O!5pEZxV+fuKFJIKuB@*WBf=2geY|Vv z?#`*J6*DsmJejR@rGn@k?9HvYz~!Ik#<>&V6U-&Zs;)w3bqE}ug%QGfi|r< zWB(FY(zJ?;%es5!@hvP4h~Z)XV@Li|_4wX&*wCL4M@8r|OOtLAPc?QvuopVh+!YRB0p!R~y9(QKB+TD1~=g(N%+Y@O? zRIvB^<{9Nph=o6Xutqn}eUXwz_&;z8_?DYvu&Xlw?})uuPtGycdyQwg#+BUlk-+Nz zyaWEQ`AmF(l?9<;8$ZIY9c-iu%%0p!WvNQPYL9Vqf>ytKKbRpaE7C9`r-)miOEy@_sy4^w%s7)P6lp#(bzwc1ZDta#1DaM1C}#WHd8CBv$W5Vr*{|3 z^Ycooir;Nsp5Y=se0O+xE)=zsFB1A{$y!@8rm02egCq3Abd*?BDtF~@?lu}vtaU0I7nJ&K94%ehQ@0QU&EmKb-ocL9!*@mPdvNPL?HSnQU7ZJ2 ztKZM)Do^c^?y_0nynByx*=LbG>;s|^uMI}pU%yti^wr2jar5+0BCqa``=4H%3A#m9 zR=PqVtnTji0WRO`5yKLk0FeUd)^pI-23#d4x#)1)R8%Zwr4hc_KH>)_(Y7y7ENzN{ zf;Yap5*b{${C9A@K98^`-ef8&s+BK-wCqk!VA9dEvifHr_`5tOG@s;2P}Q1?;|p0zj@8$cX;^qI(00M6tCv`EjdK@y}@gp~+IwPE5|-?UxXGp9)>} z_ZRAe))&7lSHJO>d)zELJDT|&P;Jc#53j7KB?HQus8QK{+jOF@>sJiDt9_wtZ8@vs zvBZjg`7yNx^b*Gl{SfzG&k6qRb1tGZOq7mN zs^yW*7xy16QoL;5qvF*!P+XWF_`xVZ(!Wd$u;7n??ZrnIK0w4{>UqF0FkRm5vHiud zweeAw_PdO&2I?tm6C zpm;;@Ss^n?+~Oz0v6rrRJn<^lW@|~ z($D^E&7*HJ*YL8MWM0Fy`uSp?pirH@c-*??1%ZsV*)r0SpBSRZ#zr5 zTKSMzF)p@dJ^`z2Mn=R-gB?w+rZxpRLgTYLFFa~b&r&8%UToDUzyFwm=W#1RhiQP< z!|JV_My7aSJi*0?DuoS8|0o!bT<^`g<~32EH45E+J^c{6MZ)vjhdF3CI6t3l)PvrZ z+ah=e-tSsW2QRANMg?N2pei102yppC3KbBF{*#_E|1Wt{-~kQ_c+VS}n$A~Vo|8fN zqWWAC*q&a~-5`?zs;yB_G#MN=HW~|lA-=F%Cf`9SU42PbDfq&w^K-i8XRamjRz*`T_Px_LC+|8}n(3aNL z-#pIcSgN8vSzpo!!=nnX?bEvO^mO-+RHcu<&&VLC{ZoWyQsIhb0oRt?KQ&k&0pkl`^34pU)T4JuN8B1&b|yQlN(mtpYz<>cv@NL8uo10h>&9XM!;j zc5g%nA0rAKH8nWmv7XQ0ZwI~A#=tnmXG0h_BtP;;rEz=lg3!_VRWzdnN{cNQ$R1|% zB%hP`bh&_cVoQq|Ba_KsS$*8aadXPkBZ6hLAo1;`G7CrrQYrp?LFOQ(!NLM1y#VSp z851kCs{0ZanNE<~(VjD-+pDe_<{%6Mo<$I$(N_FEFp4^J>-q<{KPH<|P;NmF^DL2z z-pO95aGChQuH+c|%qov@1QP#3MQG15aboQiUav5ywJ|Y~@b>0^>ko~Kn=GS5t8Z?7 ztT5QG-5B>LSyy~*GXOYn^D3)FfZcC?q+Fz8Zh0X+1Hit)-l;9!rsqD*!ti&!M?L)l z=(%GlERl9HuW2rmJq{CaSK(jey(N9T#Ecv7QxqZ%oV=i%0tbMY9kVs;TfKjBCR3S3 z#^>*u6zZL=dJW27smG6ZE%;B92Uj45zrMRWOX)L7psJ)ZoOZ<{DJu|_nD|z0r}{xz zXrDqGB;a4O^FI`5Qh@26gqu%H5h5Uv4e&Onz|6hO5S-FtN^^5EsX|IIO-*=R_})a~Zke zs`KXKp_1j^s_ftfWr~t63`tL7iL$PP0{>>g~ZHhxAyiB1VQ87?8E(p=2zJslk9JnR^1=zBc54}`vPXP z>L(PmBYJv*yp;=nOqmz=59D&wy)ToahE>4D6^(!AWycKOjJ1)GL#YVV2aoRP2~u&Q zppzH$G=cmLI^YS9lZy^-ZEf1ji|!>cuu#U7G1N*#D<#H$AB`bX_i)X)u9nR0>pK!Z0*6Wb(}zv&)}5^QyzkVc0eKWiM6`v0vQ()X70R%0r77LGi53nHn6v!} z#;E`@Zzr4DcCjI<$RoMDk|yr@YKAa{wGdX1_V5U=&5c#(C~dCg8v_Fa_%!N+E^tZ7 zhTY;7OlQ&~8s%em>~Z?@JsB7Kt68#ScrbbY1XLO;;KF}xvjgU2MJxcmFaQ<0hl`Ez z-(cZcmWLx(Vc~xd3?&GyBz!#YSx|1T;0us5r!51DJ-`k3Sg#7cMF|mcNrQ0#unIRL z%HT;B8U_Xmnz1$_1a95dOuM%5fdUibDvMF?w_V}@AOH%@?+nuPjx$OAb4^kCy%x{5nn{paA(}`?9N3u-hIOW z_NOZaUxdufzP0n5pt0I4QxZ*rmUiIB@oj7Ksc?RBM)P?8SIjDIH#OzEq_gv9ppSqZ z+3McjoCT=@hS=S`B*vbu&+s#Fh6a|L= zG5DgTO@C6E?Zc@2!)g69uTc~aSI6&f2~AB^Mn{_S^Lgh`pYtSG4bSvZd~V79dwDwf z_)_8MOm!P85z>70*|M3OfL3br`JRqvdx(qjir{QJ9ZBc+YJ&BCR!v>qXQ1qU5fOm} z8PY@ay0~La^B!hv_furi>b?mvACvWzu0ePx7%VKT)2?`V`JE>^q5tvA=fi_Cs-m)TXFIfA0Nk6b z&$3o*sWeO#qzn}P6IJ$p{(d1ysGW0jdl}tn)TNchfke&9=whKiyVMCC>u~sV+`TaS zo1K+4ReN@0DNb)L_^LtMt)aWGOd^At+6>%=3!b?L2Y;H>tN6Hl^O37_zq*hhPci9 z2^8NRW49}0CG}jtJP2GKOlO{PT>}Hu*idSKTnZ@%lw)TaEv-6-3nK{Ro_Val!#HV1 z<&l?f6opX0Iv@ExdUA0uO;a6w^Kc(<;3XHH?&g;#)ibwF;*nJ=hdi$Z+abQ|n4J>s zAIWruKpc4jr!y--RpL5m(f}h91}3J1)CAB=z;Fuk!Jr=wjfg0+7cbXl$@^*Bm==|! zz;zI3eS1_QZ*p8gp}nJih01jR3ruV~mH--uTJj{LW!|`?hS;0E zz0`yxH8cz?K|@i_5xJd$=#Pvg+XWB0IhAwmE+-6-v6)GIB2P0jyf&-3u=sdPsm`F) z*+el@mVSHp!DNGo5W%KvZZ_!WB^N^~%)=E_pxjUP#gY%fHeo@2U#j&S983Qx}TNXnGy_sm}8bWJnC1q=2veL2`{$^!9lqJDxJZJlil9l zt^@s@ft`KRa$fYTK$gvNA?WWs{=uoOHn{8B^r30bzjI@n3cEf8Ss3x%e`?t}`66+K zrzW2VomBWPzse2|)0CBg^v+@=!5sfLn5Y@;&KO+XED?It;5l9$Hy6L0^~R6$xwwdXUtvQV^f(?KZBMI40k;%r)ci3^qzwBu%z1x@$_4>N?r@NgZRN?@QYCRAz@Ghl zFCm*cwEpqNRwuv?Mz4F z)hd}elK=Sd3KiubmvA|3S{&`p@)drRVzKHNWSZPQ8m{Q*@T_#AbLNJ(ZoX2*Sclg^ zJN=Y4#CtvJGFL|(exuWxEM&Kq?8(bg?Vxd5tkv z91npuV)@kRsVU(5@Cy%rKR!OL)~?GTs0R>Q0AUV>ysgKtaUFvHxpM~+aA3F{l+89Y zD1b=MNZ|Xkbly~OOaJZM=D0;tR$FW7eyK>ye_yo047R=g{I|ZR78Oq-nyM`6#RGkM zCvlW2UU!sA)MlJ+X77qbgnx&I{q5=WuWRDQzd7oRiFX*dr~#e~K+m1rH@fM&F}DIW zQ<+Uo+yHm(&KtJyb&{iAL0#!xT#CRE;z&>qg5-cE1Plj2PAe`e%Lm}6^*9WS z+`QCQFZdD05gJ~;t-q@=XpK0Nd+flBp1up@jD&JX4<1gq zfL`+K^F&t(5T70Hm6>Iwr4eCah`=#X@zbmM9gKs${psmx`*@|rA#`p(ghLzwCJ?k> z909Jks>&z*CwE~gIRM4~;@(pF^_P`-*ar?+9m^yS z1TLcTBaDxmyh#IYPk4ADXy|89rg?oRpHrzAotFoz8M%!bFIKFwzWRgWQ#*+oF7EmJ za86gw$fP73ODn5!^ID>pJQZ47yNR{^pCb89x7te7`(A)|*8w_LMnRI%%+j)Jco^Bn z#s)NWR#w(+&yMG5Z|wv({~8V3Si3A|l$ak}WJ7gS^Gd@oB2jz%=|uMoK1m#`c#r_&YB?-qr8$ z3P?m@neo6p%YA(;-?1?G-s9o;;v;AwjjYA-;5m?Cp(>0VnqpT_)s#!Ac%K*Cy|!oE zxV{6t;*)#7>+7jO2{LeDWMpPmK!sVSDdly{56dpILPFy}S=<-7g0)+_`rbR>jIWJx} zYdnrLn(**&LNSvy$sZCBd~@;xtCpJ44-6~opDX_SZC|hvpe72R7(lGwHTCR`mOw`n z>^$2@v9K7u7eI^*iZRLhHmfYZwg@Iy&lm7KgWe&~CJ0b!;A>`}J<`(D>Fh138=E)Y zY_dDMe1G2Zhuk-KauRF?^(VT{s5yw@-=UBMF}21}I8~brqH}|v&)&H-hLRS+-&hJ3 z*ShYnkrk7pD<~#3hp!&wg#R-E>3=oC_nM80obO>DxJzfJ2q9SdSz4y7IxOfeWbLtuz=tM+I2UT`HZ!u-5 z@Xyc3k`q>e%Hu~GQ)y2*chV9JZcw5t-X0a${koO!IW5D<3zBfa_X6}hF&^jNW&>D1 zr&WW>bYy{*8RRE{%ou(ck~CzDSZ7Un_xx~{!4mkhFe~mVZ`9%WGY+<5gB5{WiJEeD zQjoe%lp$NLt&`YmuJ)%?fLwNzg^Egr?Ney3BnV-H(Gu*J!D#8#U!*f)Oo`3@*u)38 zAs@Iu`8{_eqeB6OeaYi`!u-=GTC-b{%rqUQ3yh}|AN%n8)3ulc2#-&u+}k&WumN$9 znVZ@gK{qZXRUFw8)f{NHcO;ms#?6H{!m^Uz^DQN5 z%-|*#Hz3D$@nwu999nhmGnc6sPs~Xnn7C4^>^rTDy100b+k6i54?Lp}ylug#(b?@A zXTLr7Fbw&#+a_kV&fDNzd7qgRq+bLgdu$ZkBQK`M$NRN-ob7g|d7k%WIHyS~dpjvs zyrW!Dk}rB#qbv2^VtpSne*5+Sk27UE< zJ@5yaXyDz4AUJX;QPPFET7C}F)WWm0=-fF2c+?Iw?7#`V56lf&rU2lGjEtPY;}Qjc zU7(N28nNV)uSR_j%O_4zTidb3Jeaqzi}v9HN;6ZNx=l}QFBi!L>BG;D)gcHz&vU;y zcTaA3l5`tZqpAA0Vv@vVpD_q4nKvsmB0oXP05@&e)FyxiO!;{A7gp?>E+hNvO!l*PG%& zvqY&*OIr5hCiP;gC)YO~=i7@Lesez3-5BfvGd> zQCr_626goc0Rcg8`H$OcL>p*(E-oCvi^?%9;?flR5o_paKrKYK9>qff9zPFVGO(!3JUYa%%+1G`v1I9y2!rgj)^HtdU(%DdZB$##;ssnz*2R1d@<-%$cTac1?o0@L z9Bt3^UncBaIsN2<8}t0XdfddC)njt@#9Y-{2mELkOxkApi%&4v?>EWznWNhFS)07v z?pyJHv>5AUqGI9-E3-(s8TSP^<_G4V-tLu~@_TjS#?1_ZytXSKKEIX>-re2h4JhML zQBuAE=#@t4ZieCE=On?##_UIt#zmXCi!l+?ol%p$3ZF<8iY49gC+0Q2v6bkhZ`78A z|LoO77?a~uvqn4~P-EgV1HB3Ll^EmC?wY47ucj%xMq+*)jzn2MAN9|Cu=kj|3NO;2 zgn|aC2=My=HMX?0w46@+SPt7mWO{!8!_!xWRoQk;(=F27-Q6Gv64H{=-5}l49n#$m zA|L`%!lqM7x&)*_x*NU|-~0LCk3T$g@9R2at(jRfhrR7?INlI{RWRMOd*=Nhs3}LA zQ>GNdGI=pI^-E1x-qW7VJKB7PkbO+ObNkF&CW_*($5H7HqF9HD?ob#kB9fvkrGRKI zJm?LtTfN}=`=2zRMz~J+vvzlO@_{8C$d?1+&bU?8=++Dc#cnUZTf<{P1aC99vxjOE}={r3>Ll0@KN>MUOxKKy+T?7|4IJP2c? z{m!yhzFGC6NG$s;wxjt}A;nT$S2UfS{+WLNfIBBEOI>)Ppu$-|DP8GQgMCX!mo}6z zw26b87N42uqo$r`Q?E0_Ibuxm0 zZyd?e)Uv?%MWG;nb3-=P|19e~S6Jqq-tUlfs}DsT(@U}D~7Vx?uE>~xrV=tRtJ zzB0H~&h5F4dy3%W!BI4#a02C$_tg@dq>Ox_cUZn=1@QRF)wt>Rg?;1NP@h0T+E>_2 zIIDk?p#k&D-s7F7Q)=a>bEo=!B4(kS*o7b7IC8XG$Ag36m~hY#17$rsG~jd<#2xy* z-UEY#B;+!&6_jrz$10}G2pXv!`V*FWUpcdwiKc(GSZ+lyt4o^$z8sz}oq zo!bPRd(`ISYWz;p9l4fEA(I|&d7c%WN)@Mp$jNan?1uRO4Y8a@eqfQK)B>=vU?V~A%? zv6`3|xT${X0s=g}5{a*>1<1%J_{(o+n|oeh*r1uM{|)`!#+EntdC!9`L!$saZ4sD+ zzu&JD7Ic7Oa;~joU}2-AWpq-d#(2IKlg(K0xTSha_7_^>vMUu-)e^`3Xl|AcE>&F{ z5}>nCXKB-1V{{Z%O<=}V5_s~&l&!VlQ#7W{ic1ob(*rv5$*1AGPu8Rid`_f9pKivU zfw=CZuL^XgASdnqT1ITGq23mGz6D?N>pA5zuoOeAAaK5z-q>cT;)Q2g7l)_a9OA!&0A>mm0Y0lv^ee^Kq zOt_hG8%w1tZupok+Y|neB0uEW<(KN~alrHdm$=dNc+pN*_lZyrPur8|k6-VC*4F8# z0=yT#=gvmgRlk%`e)+fK^>;dKvhd)Ct0kGM@uH9q%fp$Lc~bF1$ok(S3L5yj@Y&8i zzW=fUr*X#j88Z-iMv+g_{hPOfD&XPa0o=%mIT@Vhwxq_T0V zh}bBa9s&g~DcXyR7X;_t=iabf839YHg{@yOlQ;wFhfa}r?s>7kykkJ(B#La*;UqX$ zpPqW>e#s)57Y7wgR-)>qp<-D#e+`V2N7s6zfz$SUNGJrvjR`s)QOVnIAeFaq9dH(esQ z?7^VC^6Pf4Ozv8V2YQ{IJrmHQO-!o50RK#Hh$m#(X=U9x2EkVnj1TWe{+~n#9g>kTU(M{JBT95_`8nm-1o?V-slIx zltBc7QPyk1~4yIUa8 zns0)JHC9$X4j1V=#&3#{u6I z;>+7K4;dG9_)fzYKKBB-?+t0Uq7Adv-Cw>-~&CBIXWTPYeBK4FAvAIoD@KOG%MDw6u56&h&*vp>)B*KDfk52m6hZgyrRP zl_bK)i3BOI$>5TRm=Kqy2l14|JRIa|iX_U>Aa`ZuU5=8qUF;iz zJM{jt#gK}Xb88DTAUODqRedHSZUAUZ(=n8doshxspQMbG;`|)A2b#T_flaQ{k8klg zEmvIZ4(KyYTFG+LZdbY$Lq-6zVjB|Ty&8>OvOim0EPDK+57!Wf+#mVWU=gwY)O>GS9**?LvLNC)dwNf*5Pr0{7yGIM~w;2?KwyLxAro|EY9&M_=zRc{az4cyJK7Z%*wY*lx5R`iS=8KD@9V1`@!BX5ud z=LDhDI|d6oM09Zs&?-_;Py~P=cM|mei0h-n!_txx`0Ckc)pE&->B4CnkQTY)`a?OQ zE6$*sD8{0zny_&(W^$LLZs2amP3)c&eAV#oKs`2kYU*`|AK{)7b~M$Z4+IpkU!LwN zZQ!pu1K%*Dpro?vb8VV>T%8}MH8!~Pm&PP%Vv1xE=l^&lG4$MLybU7}xjGoDb2VO0 z7ov$Mj95C%FDQ?kI7I>V%p`r>S$(x{3?Q~-7q7sibgs`|M!#A|N=jVZ;~s3&zkgP% zzDNLf>Ep?~TNhaRgfmwBxt1f}!^iU(l}(r*ugJ(At1Z3Gj07E??)O--p{xGf7j_C` zxfa#snVvAl9DJHK=+Fj1+^6WEr@8@S687 zVp}QDk1D{^sh*9y=O#b{?{gk^7qd43Uql55bIIOcOs@(rLoRe|-S~3}eB)B=PooZu zgCn;Ew@a4G8BMrQn6vvEhVMGR`G{c^6)BLwG5p}pTNqJPftsNjsaNq}yD}Gd+qGpX7|Ij^ zXi?7H8wSf?s!B8IV>x$B|9aIp@zDe^!U!F;kATF{1?e@|1WT*wSWoR0`abi7gsl)4d@mPgP6TD;k}^S_^!EF; z6->-=8}+HFnUhXXGSK!U<)p}VFgR$c;8HugT|%e09|r{>M{s8%o<8vS{&skK2(2d;~(lg?GP%&*YIOmJ?+174#+20Ex zZ?<1;@cIcb*zTLIa4Q5uJd{jSL0|srl-h3Um8)YIBU4Y9bPhrVXHMrCf^aH$mI z&UYeUD?>wLZx7bRs2?%u1E0_GUbVq+CQ?3F6`Srw;|eRf!QfP3<_^BPB&T5JChg{F zT55S^@Z-lvKw18ZH&T~_$8!_&&D6m@iBFn-O$>%a3o;k`&BLr;DwhG=0KCu6>~w7rrj3+6OJaiihq-On+oSb#hA_+2&| z|IY4E{Y+C)|4z;nNU7La9x!nSGj)olVymkhO zm{Zi$RPx?dxFSy>5_&jx*2qPqxfRI!MnJ4H*~J>oaaf(&<>uk#1wDWwP*h*Mi1}S> z!icQN?A)9Ut^<$nz!~!Y}WF}8w zHv%i1az@$Y

aNFW)=z915sOL-ixaCePg%-}}d^H?9|pJNtE*##~fXFjP4p8u67% zsBCrD$MS*BRmaoEL8g8Cmsft?F@}=fzUu1yD(@!c+*L!K%8-A}&yOr)r_gA9YGS`B z65LmEC##mg@b$T(KO?BTNvVkEa+GNaNeQn*1e1@CIl^?w)4RLp zT1Aqeg3(h{IcpypHZv%0e;Me&;G4ljZ_^~$^UAOP?^k*Cx+rtqBKoC~xdtz-xw((` zUMk`0rM{+txRg1rF2BQ%;Zmb7g#k#^v)w6aP!I#AiV8vReKTe1ASF90|1Q*PHAzD})=z#{RU&urEI;@hnq- zru`*439zuKu^UVzG(B_XJ-Nyfv)`s~_s566zI@2K8BXP;77ggGg4MSli-^mXt^$W@ zs{uJ%Bk?gl5#xrlBxW|-Yy|rN=(ag z(J-|tn~YIDFHmJl7%F=tA|CvqV8$yD|mYP?iAQc*N@C@uvdTeP0 zDHURvj?5C4i zl{PzMc|2Ac3XT9!2w4mI0kQyzi_r4ITfhq|GgG?J_|y-7xx5!i2I%3 z3z(>!YwDAzX=4O(zLw+q2lM6LPTPt+{DuB5C%EFfqjY#PB_w+<3k0=qf5XB2+BO}q z=+B=W`<$B^7zj;64~#!F`ASn&_=EJ=sOcGl;CEH1_wL`k;kzUk8Q$%pnyJ$6y>IrK zb=7{)ghSJ#tIgp+28@)|8ji?;wPlSHutAxbS<`93LnjN_I|v^`#AlcAyiRVkkBW?v zC{dr7n)2yQ3rr3H42(RV_tI1b+ttO(lgTIF6vL-Y252JM75@!;|Irn+frJ#0DH)$W zKODso2r6#-#-d3Z%PGH`vu;(dvm8>_t8)y#!B;lWEOgY$U|R3#I;bNw8h_sZm_uAV z&<^5@-PtK#^vDJzI=Z^VWO0^1QMI8?&(6F6D`z$TW7-hyv|Rb7!lycH7WLxdn@Ml- zQH4$w9ldaL;)FBS+PX^lqfX4%_#v;IHeqN?@$^iOFS*Omez!xjo{u@$aC_4}M+q%+ z&U>fUgJQ}5KB@0;)V##`jbpR^=jktmjSiI3)SzQk&#ua>y>xWW00}dUjI5^phY-Mm z)cKA4<%|@ADjFXE-66mMCY|?z@)IPKu6NI^Nanq=n3(4ltzXLnoHQhpzU|Q?@jB`GgEZa1SYT16=PE<6s9-DeqU0vZ<_<0H- za(d76>e>k*l{MJ+uEXyI_RyBaTZNGPeCv6`93^=RX(4l5+%()rPhU}V62?C{`gel< zHNL7>1w|EU^tm_G?Cl@Jj$gBi-Ojde$6mt$SaI zm4hTg_EL(LcHip=c7qE#M>MXu8$N&SgIL5E!Wj%| zmNm{AG9)H(S8WRkFvMRsY5inoV#mHi3C+gHv6)B>(A5FOPTpgz*bzHr*XM2em3xsr zdu@(28usVsMCqi4@)~qHMbxA!n3$kQ{!2_mf8TTQA&suLr-OacHS+n>Pl8tD& zX=8_z1$Z)vqa&hT8~Tf_rXpP)`lcPmvDhlnCL|=7Sz5Z-IAU-zApQKwc67-pu!A4g zxQxQxu`-IYbu^--uMc~j7B*rmZ9=8E!-L%-vgG(R#o_5%>N5K?l@Ln+`BT5xHxV)X z42sBqXK!Sd9@IjZ-Hz)5W8EA9yQVD(z-(MtS^4kv?HjWuL#6iTugIDO=PR|nPy?Z% zJzEVHgg#pD?ROp!`Xgesbc+K$pRoIZxC4h#eV-Eu+p&&>K?!=!F`75jQ+O(r`sPB9 zmZcX>)%qj~hj>RFzzqd3VWpXb=Q;PxAoFPjFOfVix+;2|-?7w~#4k3N#W)6nlO z)#Z;*N{Lk6y~?pY+TTQtyH6KBdJ@Ig>0b`)IXL&0~RPK#k~J-Ss4I4EFz<7U`Ww0nrXUBS?BC7GPRUS}kgRae00gz9Uv%jy88 z|7yR3-#UMUl46d^wl;9b&Ph;`wI&3GQ1xv1$Yw@7({a>a>Br5Mr~aBK7aA!7uhYdV zPBDHBEdPJI9J}w+5gb(%6<-T!l{7aq`e&fke#IM_SnEv1g11p*H?-;A!pOo_(DeP& zedw92yduOz?0v97_w183HYn3xcVB#@j_v^XMv3|6)YNo>Q4GERdKEBGHK1dF6F0g! z-2~G2Z@zc#hplHyJZhf9@Zv^;iL}qL55Jo~5Z5?B;H#?g$2(G4IbavFdVBjE|DF@- zEb25{F52)_8N5~4xK{ikmET&M>wov?!1&=W1uavECD{{KM)}D^k{pPvkuZ@+5PJl% zIAa^6=bj?T$*Bn#WmJ%ve6?1V_+k zIYJ#pWu9^&aw+yCBjtjx?L?P*dztp%CBVrzd`)YVwivT`AYC**ni)()LLwQ&n_3$c zWy^+q8u(xx#K4=JuT|8LbyIN6{^c*k`s%}Qr!UP8$)6y#H4mH*Qclft}G+ntq zG7Ml?Hzd1eY0i)>S~kFuVzSA+zEpmEeb8&*jKv~yad7uGDlRow>EHTJD$}sIMgQ@e z4K4#MRFAU)y%Gp_qk9$16-Vd`171NO`wM4mii+D!rjycK6KXP$slU!%0-9PQk4Y&4 z;Z>>uK#K$D-2FKSB4&aj@eH?z5}P-~PY+Wny0^5fKY|ZoC2gW@VPxONhOl zps91{r{X50Y_^wjp)ie$if`1oEkWwvXWmM^woji2B9I4{P+z>*L^ZsI>5n7dwiLS~ z1TnH8bPyLzv?*#yeF2G#z~F7$|4x_B{`Wu?F(2@hwU};3N9L<#;72xnjq1I$gJLO( zDOW*s)5-ogd^76D$1?iIu-$vs98>@Q3VT^pqX_I(UCu}V_Ni#;b)EZ;hi~-2fi=M>p!QbEoOcM1ol4N!2OdvUrDxS~_2OpdXm1nfEPNjxh6e}f7%7ca zQ-6Z`AJ9zCk<98E8Z|c4OdzgX?%lgz*M7lcGC;BgCOTT59`Bl#$c7VCd@hCzsRRV9 zG?(9A#3=56e1h_S$`D3wQgUlxh)UMrJ(&VnNn2G~Xhx05z49VQD1xjq&3`vH4E2p& z;|DFVqL0vqF@H04V#$O9JM(35q%^;3h3z6xSpk%5WkuQgMjODlZ{-vK)|S%|5FmRM z>C&>q!^cYYQ?LS@fFXfzTH4R_`jN2R2WY_rr%ayEdK27Z>GST)63#b2rq* zp*uUJMg5Pqk0XDLPxl@WJCN3Y7**&#a6g;5BrPr}j?YQ)8aaD!u+;O^)|%FE2)$L( zd%QVjPs1bd&YS38f1*Ih?T74XH4vs$k(07Ewtcqh++w|FMK8b*`C@Md2$lODe9^;$ zYonOl+dSa1x_j}(T4H*xwKmjT?fy?(1!D04Ed|8&AWvas3y|UIU0tB1qi1131N03* z7{R~k-ePTQTh!7*3~XTlHG_)BVl+5W0x0$I>BX^*4k$qN)}4~Tf=c(2j3xhjL-5yS zO7M3_b#moINdPSE=Iu($`~&`U zP?!`_?*cNWsK}JYL9JZ9P_=wuY^>jm3*5cGc3r7e+Rnf8DBg-113KX_qiO?+Cyx?Cc-0YG95+T#u2Yvk|oYdrB z3k%YKK%WSGw=uqiOCqs8g8ry2M7CpSFg6l zMyQ#%Oj23lQ3p0rc!+Ql67b}Pn7{S)#%{>mN+x{yakek29-@q+ot!kVRgXGu%R7Pn z_W96|zzQJmUq4ym&Nbc2D4Rm2*N(Ej^1Lu}V6aAqwa-!NZVtRp0oG zLXUue$XG2PZ?5qI5Wx2B2bw{_!6%-rt*6876j4;E)?W!OZhX=T-PiHCJ{*wt^h(#+ zotS`LNx<%-Td)A+JRxKxZ1g|0zp+?(2naZR2>|*ed+oMlxC%F#C|ZCE z3`XLlrHs$dhxR&OM3hc$78VpFa7)qdTnNp4HHhprk#^c`0RVT+cq-vZmcBi|QW|QG zyARCL_SyK9Pi%6rBn%AN@Zbm?olq2jblms7(!9KyK|S?3nY-my7Xxm%G(KS^IWhUQ zcCU7q;wn$JLs@<$S+jzXk~hiFmSujf`Skw3y90DUsv>0U2Gt(Fn_bkTWGw0LUXn={ z#Mil<(RF?O)yBd>5wKA#30@S^OMc(NKb=6pS5qGYgjI9RlxayRB;EJ>G|6(I=Tiy)dTw_M z*ZGqEb?5{_W`N4E<61I%eY{gDEGlgJ(0$7s)o$#Rl$$AM>cai%6(lV({P2(rolNj2 zP-$WqbJlsSR~46(`bgYEfA_dJx#`c{7_EMYkN%)Pd3(2H&(D>Cb|WBV_5M9SK#n>( z0)|B2Go}=m($wwFys+Zcx!nI4*R_VV?|wJjssu53JdC7JqRX$hT<8*9!1zb$c);|sB z2>X*o3*JXbyvKk8Vd2`fo|sNGoY_LYVSS|*c*9xpK+)5O8#w^S@e{s1|A>@EfG4~5 zZ&Ia}NL*!dllJVO^nbf-GHk?NrbJbLTFI6CS zP08py^jM*0;E4b7m&lBZa43z9j*iJ&9g_;8G=eW$k5WA*)4_w^4HigQW+x%HmaVL2M}$)axN8M&3^CibJiQ2-S|9H$M)OD z;r&`|W}M&zH)V20M&~(xnKzHr;cA;lxrl*~W3NYL=V%qt*-5ET`c35lqEu#nn5}1G zQYh$KdaRl-K!R22G?`09ku<1P@5;s(p7aP!tdtfWZv^|p990l(=JTm!r)^oef1CY& z1o?H=QmjEm7N$xrsH05#m7TwqgaQEr764gojG3aSU}1xklhf4HbY&D2aKQNqh{Cw$ zF6~wtn()wmS2Cikkyrzk$Pm4Xe5HUL$T?a+LTY-;uI#z&TgGLYh#Ke)8Mf&xiZGY#$l z!VBp%GTJ-H;vfo^fk3)f^Gm#^iO zAcyVIeo;sjt8kb6`^j>FT2nS#A=LT^l-NEZBl{({1Dpws|-WROdj9;PP zPPZ+w@jqA$Y#ALrt~cq~o0w7!7C!6iFb| z`8+-+mE-G)tqt+OknFRv!q!JT;QJ>#gu5S}w*6!qa?jzvpWhDQJophtZ0Ql&z zHMl%sS7TJF)E=ao;f;(C&0dq`#iikmierSF#8hjX_UDNV)Y3*HBcW{OJwEt1&vEzo z>f+V8isJ<-@HMv^R&2zHahk@|aG1F`e*YGBo61H8#NwkV6i7Y&{VMOY-rDL416Ae( zw#9lk$EkQOZ*;ZYj$G*OOk8XTtC~ z57&h1`0jbyu9mGH3%n(YwWxn?amYCP%S;Ivul?vOfV@R+Cf6Mt_1X;yM<@W25R*hrp}syq8P7#$=Q=Q3ZWm<}J#nX=L88D*V7)~*5_wZFYk z>bKY6*++OeH8F1!|;OriJkg1-G@w!JmG>|q|q)xz_Z0b)Ngkvei0OB0v83M8& z9j}h z!r(<`xK+GY)m`COBNYJBJHW&bxMQE($$YGY{?uo*W@7re@(UG<>&d4BE2@8RCvt~% z|E4o#6qU`zlqVDj{BXYRHg$D%t#x|PDWoon9}L-xP-n0DaFET$Qe5pH(E6Js5erND z!wXZ69WY~1@Vzi7g3!v|=T+e0#cdx+v#UT3kbB2xtnhPCKvng_ z%F%vSKju7HcNI!Nh9RoAn7FFm?1Bf!s)CjlgD#)LkHf@jv8SpyfGGVXCYDuHT1zz_ zLP8_S;sm2Vpwu|-TU^{d+y%EDpDh~+&{j*Zk=H@(9~?;GNJ+f;l=QB@XW@=_SDJ?4+2ksy1(6sxkM=An5V_%;%XwR&{ z1a?`OWe-wwV`JKjy;&CzQ|i;RZA!kGCw5`twRQ38{#9qH_Y7>hblFw_+3uw^&t_w? z=xh}M6jJq~`>1`RnzsHMS#7~pV`DqL_E<-?xh8li$9EVfPEN`1)t!e|Dk|ca zIDGz{xuN|ZQ4yc+1_-FL@!44!4GmyjMv@PKkXB3spbJJ9ggt>KtywQtkFBhxCSg0* zH+3p${rJn}AfLBpM$RAKRr{p8?b=guB)N<_H%QoQFe19En2hx2P)^x9Y=zKEL(J z7G9Civl~uk^FR#>5U;j;{4D~uHt6XGMwdPUzKabMRcc#f_}HW|5>8=Zr4|#aiQx_; z$KDSb;@tzA6iJk!$j=AK=MOZ#|I-4{SX4e=!hn(jCX%CVzIV^D;6UXLL^K7ndnyb# zc@Z|&^*WOIoD31aQ}N!u4ZvmobGcYh^j!b9L*|F)|JvZO>v1r%k+gKj zY8DZy^-S2;jV~>YtVvCt5u0-nV&ZWFNUac51E%!KDl2n6zXb);a3dA)hyZ8$UHwZO zDfPUu%<>Gv#l^2>^oIvOOopVuUKk7R;xg{|qSaz61(C zH3NfDkm9TiV8pB6E-!%_d7n)^P!odjlK0u_xG3gzP0}t4xY=#oD(Qyhl0FZ#tk-wrHqV>0sy8@BJ34) z%z^z}fQqu&Pg(pj#iRpMA4%|KvPudhNu1}d<8xDRL9bhR?WYz2i?-=A1b@1<5$m<< zDY4>>gQ8$;+#@YBIkP;PQMi_n-6@NyU5MoC`%Wvu>B@fC{}C0~Lzx*=8}68!y|$p+ z*pkr6d=dq|bJ>`f_lM`!kH`IDs)mMfLz@!Svqd1^R80K20*fThLhWxU7_l%N%Y8*6 z?EdM)Vgskg;ct~~H{_rW5SHu-?5S?fPdDMngb^wndeMPNYNPp zviM6xG%zxnIgTGA_Scr0!_jWK5?^=mo7ONkTYi5q&>F^cR%$hb08EvUfu*pfCgbMp zlq0JYJK1{F{7bRmJ=0m3~&HL zMXv7ds=&~N*r8P%_yz6FR?{;v$wi_3D~T0yp!Wa%T}ydy(7Ee+x>FQ~MJRZQ_g=FC zH?IGU+FPXg=dZZQe0*|*35WDD9FZ&lxI*5ogjf5%NM*m0k(FlD%*-6C0k^G5VWAep z86E-h80Eir;cac*+_76oW#^7~cDfah;gFLU;tQ}Fdrdrg6eZ;>{lRp&Kff@ZRg4Zm zR4Cxl7P>$Di4Yf}%J58BBZKqFz$x`gRN%Fq}kgCU@o?2=(2j);${5g_urfvG=N{qAdnoOKlQurCa-ngl+y&_>_M}{TrlMU zeoRe<PiJr6}Yvv ze=NmdWBS@@d~zbPhc-{yS91jh3vbTS#n_Lcy5w-AfYwdGZw*I^wgjN~b#_jo2?>~L zM8@NLuIic^K$(ezn$t{54P-h}y|keDCkPIfsUPY1Lji6)P&7#K2i_!MgNX;KE|WeJ zJ~iF<%An`csR{$=UJbIQO30Rl=cTrlUC7;0_(&F|(1L@9Yn4cMAhhS9APF+^{ip@? zf{po5Dl2t44j^QKM-iBAd-jd#iNxMtYQYC5_S?4+W*pBx@RXc_FpdDv-p=#SO;0Bf zeb`k7hJ_ARjwPytvA%a&xtUQvYA49&TNcci0R?=M7GUTz&JMG_UVVE70P5DOPG}+F zmgi>VL~{=}%@LRoFt9Oi1Jxmbg~6Kr1OQeZQx?bc_$11-U@)HLlsc8X5vd)PO#`j< zPD@fpjtjbohu6N@G4L`LeQRSYKfNGqmMh~ER4_ECQo$e8%1{BGMhQSv*V*7PM0ogP z$WiA+$zyWpoL2kn=EX~<{pA?XbB1tymOl^NmY%@53%NCjzJvk^WNRj-rG=}OZ-n9- zbePnD(B+cfumA1z@e!}0hc`g#{X8uIcH?5hhpc$opUKHM3p%=j4mBN-*pDW0wvc5J$Dn}f@kbcKvd>3E@jz(1whz>JbvM{ajYFHIfR}0XI4mqL&(KX} zH@{$IwjY>0k_P5FAt2k`T^LLpTkK1%pLjd9ESc&MiFtet9f*jqW_=`JeU`Zlqwy{M zAcLE$w?^g!)E)2WJL|}o_g~u|oxOh>cbNSaW!>3FaV1D1?d)EXq&H*&q ze(3jAyDlu8%sWC1ygZ-dPDD?L!EQO-^UHP8m&S!Y_l7(tn}PD|xR>4UB#hd>n;}I` zNJxkPj%#57!^GrX1+s?;28(`z^`rG2iA_p28*nBlN-nj3c;rvTDf)B}3;4Z|?QY}Bf!u#q#!N_SWE$xaBZkMc)ZEj$2_?ap771_&v zrEHp4tSJBr(RMNgJ%VNhEpUVCcnwDM&3X9qs6nX)G4QxS4Q1#mcyl~t*u~$D?B!K7 zssewH$Du45$;z98e|sAtuV4n2bdk^%D7lD;FJlS4 z#_yjl54qody&b-~Zv5!&ZKAC7N^tu#OR@M{DkNlR6I$55+4_a((33S_f~&XprE0;s zs`(?N;P9}je%{Ch|C2T$8WJT<$ZJ7cnivZnK`S1?@Z4RJ(Ps7q7+4hU3A0>f++JeE zEB{-CtD6fkk+>!MHx=Uw-UyDvW?dGI*todOf0ilQgh&akt?lN|Ie@(iiI7inbQ)8Q zRwe&qZGJtj-;MnBNgQNTuN13IgiOE_qog95yS$v|d;Q6N-I$W~QMq&xB?vt@@_)K} zCNA`TxFTOLbFWJvQT8Om01?{u2>*)N-Q@ud9i7r0RBdhT&fY-@Gv5p`RCqZ3Rj^PF zKNKI|gv$;FxldDEM1*65{j#K;!f={}l^q|k#(UfA<04pv^bwKMU%{2ykf?9Jet9)J zEgK=x33CT8+q7o}#fzizn(>zNmJh@ZKKGo!2=*#6qNzoD0z}^#c&@@500keI zPuiGN1m9%|u>*{PfJAX%7{y&%i9c)Qp6h?PA`Q{K-W9l+3^G8E1@poEZ+ z(9+fCR5Vgzzp|~xIPDzPd|1{y8@Gw%C-U-K_da#574%=Dd8oc;PcD&%9H5omK5}II zS$QJeOJ!}OPZNph~ILCRR8A|qYe=*#I%SnXglkL*d{#?y^?hraCg@G}DxOCBK-I!=r z8utKLJzHMS^@NF!Pd4}=B$c$Vpo4w$#qJ9ZV>^*Ln+a(V`FDm zHx0;;`v)nNneJ^Vvam9P@D?j^cnorKa+I?(YbzTIlP(d5KDQ#I@0}PTViO5nAbu_ne7a>{;Qz2T8;*W5AaF>&-BP#dSi++&W% zf5bsywxRa?P&Z)n3mLLSyb|5^W=1?$mw_P#;HJy@GTyy;Q&3`V^AZ>Z+nCd`%EZ-p ztU!C;-OgWk2$3-u%B!1g1iiu}Bqn|Xyx|l_SkG+q@S@!&xVs>b2T3W(;fi3s$+am) z4uV7bm6aWa`)z*{uT$CO$_mrTQbim*C5O9q;G%srd|R%@g~||uVR8!n>$#WHmNhnB ztt3f)4y?hgs+#-xvlXINraH#LfCNnLIbHAJN_s=>{5B|66O-_K^3)A;ViOCgfI#S* zPSu%-!j~^5^*YGulB93rWD4q9vWknPG*f$aLtqjA)bzJL_>^_62ZG#qr)B{xjMq;C zNYADJ_opf_G0tZ<*I}9G+cz)};WL3u8IrCCMM6pnM1o6h6^-RTK@|o1y0&5(pl0mr zD|K${ww&iml@3u!&*HAW+fmYxkPz|n^Zwe{IFpTm2Q&)qr<^NXdH%I{01^wzwZqiHP_}hgtIw0jr;UFvCO%o`ov(G1#0N8ygDc zi`@_~_h1h6t5eN-pO>K(cDH@GxsJi)5O*jn4QgPXfwGedv<7dzK+dQjdEC%J->Rz; z6IAT|qr9Z2*3O#uth#zfUkt~z`N693b=;HDT7rycML{6gT}pQoN8}T`uFqpTXo;v0ZOmd%;qCd%g(jnOQ{HuV0Jc5 z{{-Yb-}+_*uu%a0e}_fgU|9}^M1(M62WU8{sHiO5cG-YG?~etYTW+pD=evwK2z@K$ zR8&ToGoq+SNcj}(Y0T5pP4ttD<_OKd?cZtmxHVSqmNB4^=IDcpb8Ig&T8&Q>9Ts+3 zGek{A|3&))YYg!E9W8hx@^pU|5;l52Y$YiP2d3K2FE0N7{|(e#)*tTp2#t-6SwQ{| zf}!D5AheZjR+mHJ1ww~Z)2cpzYBLf#chV!<9v_=u1hDZ7<)BwxUK*keTcDbjI+>Uj z;?MSiKL7r{ob-`^C@AlVWYRS5#KN354y2737%W$!y)T=@BqnBteh2nm4(#*Lh#jA@ zP2Q~QN~LDC!ASW}IlVYhlr(nbN1kt*sN&+$&IlMC7$gez?s(I@Zk}7;D#26>MaRlh ztS)R=Soq1+6?Ko1mL9%|5fl~{o#FNTX3)w5dYr+S<>TX=9$T*GTBP=(4!{Z`Vq(mF zeDp*QLNFwJ5}FTP&(c2t50U4pzwjxN{_X7_*z1`_3K}z2v5Fsh0(xw}qj^ApF`e^8 zk}~j}%&18!YV;2@2JSHsgScsnmJbolevq7qV-7twe)}=1X0k6)enuE8@$rKYe)Z`) z+N~uI>)-X!9?SlDd5`C1+%p>6nkFVDR`&MN8q>XQM7rPsoFlvj>kIgsqlcT$AmZTT z%gD*0T-fu=Vq-f#2;tzb+#uq@-}S&*j_K!{db+9@R1))EU-~rVVZ1q>Ld8%Hjzs2W zON+j`I&3)*2oIA+LP0Y!aH8Z2N!b*aZKD;@zwU<{kgJtv z$;o^r`Ip;nD1vWuIw#=FYocG!h3^27Njkc^+rKmoF33OK&7vojM!WS_X-`Ki*y`@m_d; zTwQsLsVU3bxj%GhxbORZz0T{r&Uv15o=-7Zh1ThI zXAVOT1A_-4r}K*P8qF%Zj7c;~#FlpVMym%l2IDE>+V9s$PxG5(LRaMV{v;g$aydAUrWlIK=-!O=9 z=b`F3D_c&~vrz)$6Ap)sTQRRYTU!S|L?*{WH^bYEa%;^${$fY)Va*A@6EIi8IVNG= z(=#U7C-j7DWx-d=z|^As@|Z9tb+&FZMMRH4%9GRq6@`oR^r7cuPB}J{oN@sEHpitw zUJhqfEtTSda*u7RP62@lpl8Qo?MCUVvdLf?jvf`gxw)BQ9j@l6ORG}YU^nvI>iCeBnDyXtiKkFe=B;11De>pei|_D z>}H|1JnM2dLtUX`^Sa5`+IoL(4ksh94!`m z;p*k;Dudmuhxpz+?%}g8t_}5vxBXNk8ZlQS+Fa{4uS7*h&!XcmUc3lh&dC73h>*bj z3SrJU!|jE>ctvKQQ8M%5egpAdLjaZT(!!ToV^R$*%$`6=qp!=3oo<&`QfLR~!Olqi z)J7~jGxN9cpito309kQksCGU7{Fx3TnKUZrQ-8$SaM#t9yR@fgm-|<;#(`;Z{5)tRF+GO8a|%V?da$LYrDwE$eo4)*Oz^n1b8;~;7qoYGon9DaJ+a~ z3<^#e>D7s)$qd3yUu&jMk44v$p9Sq61t7+p%Cjxdu83;NzI?c!;ws|xiy`Cb)6m1? z0Rb=IW>f~g!M4I*_m#Cs-VITlq5NoB1=KXC?XAf8c%LqY*Ww9T_RJ;EZhze8S{je= zAPB@ZHZnjF4#1bI_3kB?;3_OP?*b~%UA#N*RfvO5bC4W|AV^hL_uKwzz0@MP46Nz; z&Spm6IHQiv$97vRh~2JriUB0@mV)xewNGh3l5Gy>S_{SB;g1mr+OCxO_rWz_DrO0%ewE7joqzlCjMy3QB}IWUHI$+oLe4QGYPQ4UUKfrmHvDh_}q*o>kcq zkGObpikPd@-iE1ivM{eT=OnOxJbcZ8?@i!WEYKlkM3Z24TuZ#ffDxW^@o*j`3J99p z7LavjuvDhw<_GtCynkKUjbFTSrOF=J;(9&X4U&}88x|H;O*W}-e@6(Jk=TDHQ$`{^ zJUpRo;$HENUaviE&FCGkr#JVd4qvbbM*jq@BGdx)NTq%A_&BDs85m&PR%>@2mz#lj z9^D27@yq@cv1C6I=Hd!p^;-2jn53x(6srW}60{T6gCZiD4S5_m1!A%q8rBXrOH5BI zPJZx0ql3bNuZyyWFl8|T*u2)76G%ZtVPvVz#@4D3ntoT#M)3?3iUca&mAxxK4Ko_3 zX%q;KDD6bMQ~QS(*|mj)ULIXqpn@*F@J=qQwUuLy1U1di=)@>r&3vPdtWZD)g25t1 zQjTd*`>RO(j)6@~^<4R&os>lbH`$t^6~!*X-{1cgkOM>2WNv=`x`c#RlTgAUN_2R5 znD$u>+a4a#!=cSLlZXMx-^Yg}3c$&>Z_;WST>3?sb#Eyk--FD5wsB)r&)_~IBYN8d z{%}j|w(~HCrgEeqtL*`#gA|7ktjpJfDT;IpjT9^?o<9#=JXr$m(Y56uEYXGQ=~L3T z6TGd(adXV#>ws3Ea?VX4NUinUfl`Kol2S^v1Pnho;J=Wby(->Pq*oIZ9{yTI2u>W1 zh6IMbAutAkOvj(!=sJM}3562C!GA$}=Cq3(5A@r-?zf)X_JE>P_I7EZAbsDz6)~~YQ%A9D zqkW?d;Lx)g@6BCqEr5$5#0Rs%NLW( z&r{B6ke`)BKBIzq70!e9sWIBOI)GV|LvN$P!8xlsv84Ol_gRZy)}kLq?L0j8g`HQ# z!#X%KbFxc3`Y2)8XKfQVzOe%>zeGZ35WtRDUv~u6YO|Tp7ci#|+QsOt9{IF-`CA9X zKqdC;) z%D-#2&!dP@SYO{i1j2qRD3z65ivX;Zw7jyzs(gJVwYEU7He~BvuchY?VtbjlOT5$} zW0zN6XBuvPa(QRWd^=>u#4MBh$HeS94-ZdE->?oDd0=MH47?D<&B)j5;JpYlEP+2(9z6@_7^FU7fe>_0N_ zpdt$l0GD;l#m3XOyW4-@c<0nQkAT28cry|0yxZGg)Y-Y;60J{I=;#R0l3Mj)yzzSS)YJ=(1~36Qi7A$){bL%z(-u|oU`YEeD? z{Q<2e#KIbG9-cNas6f)vUCDa?J{-Ilv7@`CiwT`r=a7qi@Z<@-=gtbOY^nEe4@yc(B50of`*}z@ z4+iGX_~}|L_%~R4zQMuhs9Ly@vxyY zn)y3N%+ZxIshSVHoKIi8>VGLh{N(4)6N{ngJq~lY23XNDr@b=L(u29*zI<}FUMB{` zMDHsrWCxJZlmj)^BceW|< z(){9zKKck=-pE(aGjf9@o>3JHeGJZ=o_5D9H#I5t{wvV!u`EilE(h0RP{_;VSULen z8lb!kda6Wg866GNFJ=)HP3-Ols#F=Um(zY%#~U1l zk`hqWI?PaJW_{k6iAfLy21*a#|V zrKP+u7&` zcC<2c2%tLc2fcouKyR(zd2jFOTS8ARAbz#V?fkE$=Xj&R>Pu~H*92Xx@Jec*%w(6B z?mp6{AU`YZEh&B|Y+|m0eb}x@UKkuqk*K4SXK!Xt@HDV3(4HZKax!mIBPT(! z5uD$Plb=K;U25oP8Pc%?_T`k6%v&sKn!1W8RBtke$a`0m)7G40YO7+yQN@7a5Z_?k zmGq2NiCr%VFZZ1bD`Ql8dTSf)k*SiuyPQKO%qxbg`upXS^dt@s4`Zk=MY_>!v-mO{dh6ELu7wMkIODeq28Z0Fvt8$RwJjC-6u#52BmV>oPn9N2sY zM#OTfbwcG%-18>|P~zgmETYUGvSHW|;Q=_WHl^LYKV*Q;Qk0SLbxdqjY9b%M?Fu!i za*FSOzF+-b(vWt@wwocELFWmuwFo;NXSznx9?Cu0(#68ZZl&`}R+Ql^kgUSp0LS5x zM!brL4*M|>mv$p=0z5-XyHK-8&pwA>MdecC7d0sZbD+GmzB#K3?6>ilBYXSZq~}AG z+zIhMivw@dkB2iHE2pzopwN@MiG*5UQldjXJ9qs7UtV6G>u&+&oaoLXI|y=0hnA?P zXQL8Q1-Yx6;6djukThlr!#Am^{-Cbc0YD*ienGT$ii+Yxr8K|rDJjDFrD4*1O{Jr< zVys7;TTKnbVDL7Hi4L6FG8h*@q%w>7$gsuoLV9NA3m6dN6BLvK5em#Y4d#x+TCZ;r zG{M#61Y+|m6cyvyTH3Gk^ZQM_xklmr*Vz19VX6f;(j2>x57TtSSVqlT^89)Hqt%Ct zE)6h@XgdpX^f=FnhWV|4_I#~celNgLAF0!}wu89a1WJoWD=G25f`Sn+3_t{U{^CVH z2z%@*H$x2$e3zDNfSQpnZye?haRUP?5Mjv4$wP#3Lr9F?@A_lkG_b|%#~d7?!}|>M z#8ni9TLZ}wSiE>&(WPh4*2>e|5&B;nNB7@|U!}dWEx9s}1DNB14aZbtqX0RXlOrm| znTqN~pud{FzOsS>1q|}-j%WU>ucCs$9PMDb9&*>-)zs{_H3&R>?p@U1+ao1>-^Hxy zBU=$CnCX2IYJM3tYWPZdh50#e^Ah6cEMCXFhK7r~t~D3r8vx9!~1_ zBXs?D&aV(Y@CbkHOC*L5E%#M2t_j7Jlyv8Hy&&E!a9(6GvFzFFjtlgOxz-lfSXm=Y zO-*kxF;C9AMrVyyi@I$iSMdlxqlLF!W`5ykSB=6O0*x$Ad0MhbP*7-C3nW|FWMV9W zpoO6nx;31foryt+x^VfB&B2VpArsLMAw^0fugAYS53?Whb4xdX(9ib(Gz)Ir+9jUZ z3ncX)?sUVU`tCs-okG9Uc@P>3vB%9dISRT6^25EfS}!jlyW|5uF$S30*DCtdlcA~= zm|qh4yntijolYmp<$HI(9FS{4wQzc726Wck_Y+#gh#4BhGUA{s7q2+g+dtr3TkDtk z^(5Fh@p6kUV*6u<(!AV$Z#wLt?ZgkHESAoaGu`u_HZebMQkk*W6EVSfbpFOo`y=VA zT{M9r%E>+KdxjC=|8mf5tEE=zNxVFu95}^h{AUFZWTB(+H|`NVo82<<3_T@rvC) zmZ-c~RMJn98gX%Db20~<&d5kEE|y=Nh04-s^TtfOg0gbzs~dd~_%I&rHgo9J`99kj zkKpC{m1;&!^t9KHtvaB?ZYC0Su+I4=FgBdyi9$MM8=NRxB@EF035xnG-}{B;!XLM%RcQ92vIgK zW&3=7%EeLDT&b@9crP)6QQp?N0jcv~oUpCoE}m>_iT8L4SOb&z{tsu!LqXeI(0YFb zviF391l^BruK?U?xr6v)g>T~dD(O4A&%F%${Mm0Tp)TK)YRQo#-uDGBY9%p z$?&E6B@TF`IJlTaMLjxS>u02=)6&vPt5N>}#$TM2<~4<|O}e?AJ0mlTS5sB`p^G3* zKtOI4Iw5Gy0odi-e?=U{@9ypsWz83Y2tU6Z4~u0T~WAp-H*JQeR@atr=V zSW7GL36hPQd$xJx{j20;MMJ}hj|=JNX=#JfS;1}k`ua})Lp(y@Mm1itQXZLG1a)GG z1BPu!P)Y#*BQxu`C{U;ws+r%o?9xsO;PLfaBq4caBgJNV|hLh5cLTE29$W;O6B;_}YYxl=uAyfT8 zEDI3d9tq>5pOR3&vN-~=5eNj*Qbe~|x#RqICTP=OBKhy_ zNBRBUdUm_NWF1cnG~wuqY`sjx+X5J%N6tY(-djK4k-1H|4{5L`B<(-VR32g8}tn`p+KX?V-6^R#vumU;udi>A*5UB$x@hFd$Wh z?0aozr+Hw2296#~o1oDQ0I5J;2_hEIQ3=>!1Mp2ihuuv90S!?!EI084qg|g;RMyw0 z6%}#80$SSIHrfbc^hIHY{tYW7abSp?oG3E`a4F<+cje^T)QP#x^<%0WCL!s7yg<7s z>^ZQUgruV->2n7bfzdNspPhID;b;=qn)smq*I%Wo2N*Y31d3~8a+U;s6z(bCEs`(ty=Kk2 z&NXW&CuykhlipU_O#Fw|PUYgYHEVHHa7Rb%5D?Nkgc34byCq& z-B)fro1I&U{*cvCwdMuMiEk2H zbrVzjMViQQ)!tLMX@BOjVUg;b@(N9-n(JMA`pmwfPPrxeS>3bSAI71jRl@4t(smG$Do)%D9Arf*zRrjHk? zeqam_Z7V1;?Y(twj=6Q$+>2}CO4WZh1)F$R^jF`uBVF0b`Dk~9=Z~V@Wx0G_W%!w+ zPOQ%(a%gy{!cT3tf}UF76jp-?ujK5135slVC#9j{cs zbvEj6Ukxk4Y-cgrw3eR=Kq^^(eM3Nj27^$hP|L}#!`08x|SEea}NCz&7%>k zvAX4AdB6S~Uua@j@SZfEG?v5TTz6hBM7-|u3=bN7-13ria5bR+70iNMl1`M%eUcX) z>_t5Wx9bHh&dN+p?tTlk0u0x<-9LtYvhqil?W{uV26J-M{bi^{aYQ>u>Wf?-SmF)|PjU}!0i9Ka}zD-}msc!G{S{oaifY4C#h_L7BySy?%#l=U(B_xcehU-<-)J8{ySw~ine?fQCkG#pEmyJR` zd1h@6ot_VGhCkURne;v?FgR`l7SVH1M@MI3e%kVNe7xZP{mds%o+KC4$}P`Pu3fv9 zg=(!s4!4+1=iJVPKPmGg@sYiwqjd5ty<~D|d3pK&yykT$7pPb4BKFdD?htMdeD-!m zz~qx~#0>u~%IfeAA{!5`5dqox>?U?yCDe3t6^P5heK7H@y z%e%R`lD-Q+?-m!NE&XJ4JJD;PqZ2eW<@oyb>#6w{LXm>2OZ3+KFz1|xc2b(rsEb_0 z?WGUvBv+QjhU~&~Uf$S#`I@H7-~8`ZcVAGscVvWCo`s)=!ue;LPf!qD#JI3Qet^6$ zwLA+|TYG!|%y^B}Cce90WTvLyWJ-YlZU5YGIdII)OMrD6}(k2 z8|Y=t0x2U7cHA~{zhKH1t}LnR%eA+!EY<|-UkgXv3rF1xSN^^ZrHHl zgA3UJdtx-%U-4Ap+V;V(&wOJ~JTWQrXB2mx;K%B2rrEGX%ijLLru_yCQc_ZPI7R6+ zUrN{KMd&0c;e=XPT54Umus*gSTQE*iA@+1sX6E^yzB)6t59+Oi_`lv$NC4#AGYAIgjYIYu6aK#aVt2R+lB|W{LMl z4D)1UW^O%jfc55(bQDd(cwIJ=+NY7^PatV4h zZ+$~Oy}gC&fBpU~^-}?B7Zen9FCtH(qw3>8j=!o04S|=_E2^=z+Wch~wPACabD1(GJ`ae4zzZ??=+#EpAQE zoLOXNz*}mkU17{GD9B?^FY5a4Ac2ofvF#~j+Fu-~QZzbh!7XmLW}q^p3^B&&-$umD z9rD*_hbAT`efVi6CMJpt+-DhVbT3@EZQdAH($vI$@EL=0D6jRbc~M)Nwz#oJ|d{G(Al}UCcnOa61VTCqNAs;Z)k{~-OMok`=o8l^vq1<(!#9MsE)3# zOQOw%gl3C}k01B9XIN@uE!pYT{rvgU$i{{V0m`uDAk~*A`>Sx&PMtr0#qO1gvQM5) zQe{)(nTl&EZqpX|ZqskN3X=?rcr!CI-Fhf(PbZ$;xpQZ6AlnWR_Zh3Xxw%)Gk+S!` z{IIjLE3S)DNU><%T~IYKH)%RK|0*Wad0Z#oYe~nJ@6Fq{lM{Uk<&~9Ng@mYPW@b#5 zjLZCur$?JnVU#aljxE{sqi|)}U0g~^fraW0kJKh+Ug@KHdfd^`(IQ60YwW#UNS)@h z`JNX46mK7;7$5SjW=W27T+S>0L8GBA<^D=B@&*RHgEbNKQc`&?Ozk~ZSb7qP6c7?} z{M@;7ntWTek}Lj(4Qir@+tk&`=Y!urJ)l+=kn@;hk(Zb6AL{L|2)-W~ne5Vm^QWk! z6hz5oVrr_TqqBRt^VB_kL&MN-X=Y{h^{jXA-u;l7>7SUG*d}LbX*p@u7*E8>^X%Fz z%2{NRjbklIz7HO-QOVyxqWSvuEB}K}LcTlBC+Ya*=Svp|*5q+!=jG=1&rJ@H^|R8j zRren}@Esn$Iyva?yz=<*V-YbijQ`5k7&VE*R!(WIUw^aAtdy#5;SU<%nh>4fzd3GN=ki8TJ7!(~{oy-QDQ3U8@G2zE zi^tu${sNz)rNxRAY;10B{_w+6bxW45A*zT9ul4qWnS+B@4j(z9wu$sEIr;YKL@O7I z82spyrKH>Ih3avvtdxhL<-)lO7j`5zwzakO4Gdaj=$sy_jz9iTEq0Fl>C-2ZI#Wx_ z;HOVFe;RA&+Llm%_0{RbI()^-zG=3wU+C{Q;g)tiwdmblRkfaoxkAb3{_;uZ6_DWy z3k@1>&(FIhoPDFQuXuijtQAua7<@GGtlG@C&dzs8QD4u9+X~Zl)JtrO?vBdI*@DFE zo0D_>w%`r##YyD@_cl_k^gsja6RLIVj7OUiiOQ}N%FBpTp{=bQP}G5?W#6=kVhu92U4J?4r00PvUpF7fc5!i0 zc63aiOPiZ>jTq7U{N+oEO_!v7w+r&h+@C+jNKQ}1YlC01u_&A6vWZ)%yZGS73pqk3rI7o4I+DTadEx7m{w_Y zw5P7_2HOq|6{Yf|i)nFXUdNS`N*f#55SJg)({IJc?}*ckyn7~IBkIkY&qf7z?l2rs zA8AeIW8#sddS$KAi4x#Ex*~%m>de1>#;m7ZL{dtM%YEi&3F5tPaFBY>o;?W5(l1|5 z{4_m&+)raT0>E`GCAFirq3{#a&kuLGg=zx7L`AKweJO*G=3-%Ir$YQbeeog&#fXN9 zsWR^5i+c|rHjzT^#l>yc%eIq$H!?JI`$DpTz@bBD!nb}YEu{c}7k43Xzt_*(es`~v zgF`705F?4}>Wj+0iN3P_Wf>V6RzAKSl4U@GOIx1H{`pxlvpmbhk0*vmgB+3_J0Gd3 ziX`*McwqesBK2)G&K*o^#ZzS4S7`Bqt`8 z)W;~Zvas-bX=sFtYuRq@Y%cE7c9M#D|DI{jh4<`~)*KuhC>7J9g~& zcVx|>A8;LZF!uso1sixeLP|p2^&dxj8+2ZQY534dX zjQ{*;*H^l(KeV-=6U%XjSl{i-1$P1i<*!_cb7d0cWDI-o;DGnChrNxfnVFeh zuA^%F@(Z85nYf^1QN@GRFYJGO-YAUyrB>V)4y$8K}*&`tvpFgcSH6U zk2t|?V*}v^^0BA;dP{u!D?D68pQ*R>EygSA$DU4{Xf^aUo}1_kn|LcpVp4+S+=7fe|?)$|VwMB9vF=*ww2E z-&ZKv*x2m746XUuHf*@Lo|$);v8#i=bC%r0oTJB-qbGd*wXUx6!Xadf2o|MPkelZ` zzM;sq=v$FkZA4Cvgg-Oi-KtQ&6US!5!?_ta539U0y>eyyA0Di*g7A~F_IA$3xRZ_U zvW5k2eokX8sxRNwx30(OdS_6;i3M=8Z7<--c6WCl01lX#ntB-SjlIyzaafm=lQS_p z%VA4%>-Oy|si5WQu~wvuxV9qXTj!xG+oQV&YUNhS0R$@eCz10cBNd30+arKPe!vwU zm(k5S$t7mPUiK*=VdwWBKUBSz1t?q$4Gr}QJuZ@~uZAf30*eHBd(Y2|2V<8b#=E!K zi79o}WZU)KbhQCspD1INdlemhjGT#*uAT3i;<`^7`AFJ(SugdZCKc(=pFf+WoZn^F zT6bhd<>%{>3t!55?#|hyQ{*Ls4Ca_Qrq=uN;lo?^?y=C^Tmv9w^)2-{S(JGVpbp*r z`}h0Zy+4I*+qv@|(-F5rc27QC!n^I|m2qn#oe5|XU2TzCgY;6?uM9|>+mM}iNBibi z>7`KqSs`5e&6^Yvf7tTgK70NgZTZbJU+!rooZXEaz{bnVYrd#6=ijG2J{IZ?D~#PjkRh@ z*8pw>%5@ZaN&(4lTi7QoTnPZXEh-oN#Lb&GS$KKxvI;5%XwqG+9ls}_AoP3flP6CG z7RW`!8=Zfz7YM``w2+pSRfW{R%Eso)$aSQ*EyYxFNLo(LaD&FvXV1_Wt)=s$Fs-^< zfp;)M%jk8zm3m;l^lcWU3;LSu?CgLQYjg8JSe+zWJBfS$JZ798RW8e$Fh7% zDcHAf-%05rqPNPwo>pQVnBbE5?p--BTE&YSx0(4`{w&yi|H$fk{dx(2&$Xc%0uNKk zAH8~YXINO6P{)zOhmG3P&57k&kv3WbLm_uVi(&A++Fg<#>y)yROjuM7q3Sc zrN8ybOBr>3jiRolrPW{EIkQQ~GwuDcC>Go2MArT#ma~ImmSev`z!_%Rn>S*VLpk&P zTdp1^(4>(OKQ%M&9pHI;oo8ZBN9-=VZ4UGEobI~i+5z-lVVUSdxxT-z>~>gWkxcAY z)LqGNozPtWf1py-A=AHoh|fZTL{C(&Q%AtV0S>as$|o+#eNsgcSe4}0olaY3K(A*v~kbW3;`Gx8{T_5E>Dd#hOyRXWMrV1xb^)? z38L4j^pb+lLPu`uRSQqgf=h1fsOftzrczzJcrk38sPv{)Oh97+f>Z!E$u769U*I_D zxiILLl(Y}C(j#ObLCmk=bm6yI1|VB>Xht3^+)(^$EYBPv1|e;S%U zq8)nlXd^cdkNtSNsJ+`3)KtBESFO~+GN7-D`yZF)ryHeY&bh27trAREXP=%qb7q?{ z8AsW%wEI0Zsq#(7eW39>TMj98Rx!&h*4cbyPG8a|T28b{__pcF-S($oTCvvvNQjng zdw|%`6Jh-z+?ns#-K(v4%&n|$sl_%d%;u)~xTB7LSDHuGW0VzmHQir9KUrXHV{;e% z)rpt9?uYD{>F7$)88nlY6UP4GEky15IaS*TR_R^4J@=1u*1@ujFY}o|%Q&_Fkn;AN zIDYQ!n>XbWigITU9XeEobSyV)f0}&e{Q2#7>yC(u9>>W?Cp~SWd+}mm^$W3JL+z!d zrD-o(;oZAS^RNE~?83K*>x9vy{cvZep2wdbPfQAs`U(V-_UzvM!MKcia)~rBU@8)h zOI7ml$e*idMRz0RLV9S`2*L_S3jmG=g$L!~>vPdBy)(Dz#Ug|lak&?K9PcNckkhs%2Eq*izMQvV>`+Wcn-(@x%!2y_=cM+t458-~*Dwl>?~s#}!%z*+rx0?M zZ;wkon@^te!<-q(l7@y2I3`tCwEKWwVPPAZnwy-Cy!F+HH}!eEfV_Hm_Jg8MH6{-^I)cuULq&LVHagXCYgEtr^?+CCUl7B0=`W*T&6 z+V;Hvy|dr|x_0U7zZAnQo12?An$^Cvo)z7)WlR562S6BZ2?s^8SEQV`u#K6isqdpb z7oy+1p_5yhdN8-_p`88v zS#9yxm;G(IPJ7S;#;|ebdunW8W2-O~J6z;>fnpXb@;7=bQPhNtAIh#t9+$6N2@3rvB`$7Mb(d$H^n~GUVq(RE_}YnH zmT>UF(JzS!h#dHm>+--iz(G{-s~oVL{vb0Bp}*jp45?ZLZu44@2ITPKJrekrOM zb*8wchUq4MZyveu!QLB*(<#&>Tg}+tQ53UTW6s}ad%QVp?}1jy|1CXXI~rKbb9G^% z(5Qq0Ty>z>%j&ORSy)(Z91q?^T&s$@x}v=NTJVrk`6+eZikDCW`*n7Z+h<5!d!AL2 zuQ7HecbzPKC%V9ra_PzIq@`u{HD2%n;rQ#%0$dxExQca<$s)Ojh5#- zL3HITTwDt!WzO^wa^E$%jz;41jJtBVJH0&CGF1e_^|R=1+M-H+6W#O4vnyjkQ`85a`@ z1DenER@TvIJaeiH0GA`((5eB$`S)gu81t+$zGVBN4Fl+<%#}zak|y8pSwsyLj(Om z@+Gd=(}82H$tOl-um5^owjAaqas7H*rlr{V{x43nUs|DRL;9F zJFc7n?fx&?N3H-76F@sXGc!6Rh4qkG&8=t82xiZIY2FEky{WZz;B9i@P2`BZ`}Wz7 zG;I5nz73Rg&we{Or_qOV?D8wiOZH$Yg$oQKU($8@WLiFrkaF27F1}e9P7$(ImHCajWQ<;WbaMy*};=3ci78p~+g`}5KiL$DttJ`7orM9+eetJxRW`$G0`Xg2k>I#EB9p`w!!SSnB3i1x; z&TY)J`nHv~=vb61dEL!CDZAFIhfgJ*O-M{6_$-^A!Vp~cz{mT7;*P^CXfcJJ-K`>a zl#?NXvGc`?7pxo{J8XtXq`TmDoZp}WOT>LLgLw)L4*q_nCXb4=W&+$TF#Cya4%=?^ zU3>PFJr}j)r?D2KLz~d^qhev$aC3H=li65JG0z&P6}QnwfrkUB4wA0HoTN@Z#inIpSs%cfcXV*NdGa(p{9!i#UNqi5mfX0T-& zu()Og1Qy&**ws#~{i5nNkBQc`nXs0(c;IFZUwzED4U4(CMuA}{@e0njP_ z23@qvL8&Wp%eF^fe>eGjea__4;KslX5A1`!ewVx4?)mp2J_|$jxqIwtvCvqgo*YAL zHt;p|Z1VZH_a8nKqTbU!I5_B!c72P7zPb6X$HMw_@>l6?cc?#|=&ovy@X1q)J*J_- zbi}${NY<@K%e|+#psH7!lbNf_kx0TfcCERR`RjqzXai7VhCK<1=V zcXxMKvEYs!>lOSNeE8EtZuF#?X~xg1%^$GCnznTLEPx~uaU4EHQ(9D7ifsytJOP4G zK}+lYrG;0o_)*3_J=h^AD!Orp=1cbY1fA4Nfh8Hro3o1yd%b{eCOKP?RkCclMjOVa z|De!`p(+S~!6{mv-vc6m8WP4NEdvVT;$#({TfFwDRj=3d=($PmnUTiz5ZCJRXe=*? z*qQxpYo|1nYP#^jwG~!qFPi8TPRH!oyzhoUvdzY`L zlju4D;VW3qvb0k;o;lMfoDrpPJ9D8T1u6#e)qU<0moB~TR$j>n3JxZEZJJ}c2_n|* z>9evecO3Cq4raM-rd>f6hn9WoOt;_^gxCG;x;gS+74BmDBE=sHC?Lxk)M zGc20j*ONj*LK5D-Rj{_+2V$~hY||q(KQt)D6TKzxe)OlHF*9yT z&>HtI+qP|+cD9`WRo?(pXU6YJ%XqW}gQy+aC7kWq={FzbpbJ6~c?84%u$`GzOP%o2>nsNfNvfaIh56sVSY}(|H_GQef z^;>ZPUIEV-&iff@xjPd(;%#IDG3WCJidYD2JFR@U~)A@*#_Vq}=|-#nW) z2e{9Yws@$WOgcY+hBIted4GSuP>17oA_g7_O?b^uC6+7~cr9@v)o$c4Z{^5FgI@w7 z@+QC0;@qU`@?uU&i3HkM^tB4OVqDoV1%+wh&gH?AuK?MzI;zl8PjZ7S9l&mm-*rG= z4e_IVpehs^%$sWkQ#sV6+J;|ty;-_#?mwTuj(`~Nzx{HR)bOf3t7)u!M_lOv*ZV?N zD|y$%U&cBKtIyX#Sl$*IpVO? zEB2RzbdfYH&9Jbr_+Z&8JUMrpVM{||RdTb1=tH$_2=E#~awStIAll?`z2K+Gbg``) zL~MGy(e*-aKEseDb%yWiLV>jB{Mme3lXu6@WPo+)BaxU;c611xOKAJ{plNClr{Uq@ z8syNafA1L-*Ug8n-1%-B@eGX0$PqN#+XRy`KxSF*+`qr|Ow>s;%Gr)A+hBndASI2L z(&lz4q}qLUn(FH1D1H^JL+Fc-J2<4)^jt&=diQSc*Ki3oXvg?Wmw##}yX!>nS}^s*vY$tO znbPo$KAmXyd+_7|bzTvp8{NC8yPMkEgTRvhY)he(a{gHiH;2&gN=_*|TMLWQKfi}6 zuC+d69juL%6VvHsN)I_Z3!Qu+7s@V^?b9Zpdc;@%vZsf~z3}k867OeeJHLGXT)ykp z*Xrs6R&64agMp}amo8n3pFQsXw^GdrP|TwF+pCv-ia|6ZavD^f*xYl1ND|8DrvZ#D z{qf}qqks6(A<9|M43mM|AOmSD2zTVijg9kT& z_CLNVpx;Ml_4Y!tNyBSZlQz=GNFe?)O7%N}w(|j4a4@Blws8Ra1js{IDIh3F2~J7e zds!OmB&>1rwe>v3EI4@+m^%omgFn5C#URCG9gGmc=&mO>+jQp#qQ49xAA(o{WsSwj z$w|^PAM~s^<9!^-^T`Gw<>iX7`oy5(IWR`oU!C|}D@W9){sWA#HXyrKKG>mo4{|5g z9YYKPn}{B*2^}Unzgxh?GS|Ziux+3OJEYO<85Wl>< zytzwH(2{j_bw!=p+1uAA&@FvHOzbwquDje4H=jS}jPOL_X!T!2atw>-MEh9})sRq^ z#eSfpB>s|8ScnD!Z27H#02+cIOwRc5;YMDb)Z)?-A!hpL*7YFw+`2_I8Jsc`cl6Ae2bZS2EiL!J(_{bZyXvQp>K86t2$%CVAg2)R|Ay~e z^IN-6VL*fj{q7`yJqRpisAV;5G!_}0$B!S^F7hhKwnZ-xQMckr>2fr8GxwHNb>~hM?xP

!qc?FDssi9qCr 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

+FUIML62yNQbu<})xkZk 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 diff --git a/pynest/examples/EI_clustered_network/README.rst b/pynest/examples/EI_clustered_network/README.rst index 1b14d49c32..f5dd752b00 100644 --- a/pynest/examples/EI_clustered_network/README.rst +++ b/pynest/examples/EI_clustered_network/README.rst @@ -3,8 +3,7 @@ EI-clustered circuit model This is PyNEST implementation of the EI-clustered circuit model described by Rostami et al. [1]_. -.. figure:: Network_Schematic.png - :scale: 50 % +.. figure:: /static/img/pynest/EI_clustered_network_schematic.png :alt: EI-clustered circuit model Schematic of the EI-clustered circuit model. The network consists of Q clusters with one excitatory and one inhibitory population each. @@ -16,11 +15,12 @@ If you use this code, we ask you to cite the paper by Rostami et al. [1]_ and th File structure -------------- -* `run_simulation.py`: an example script to try out the EI-clustered circuit model -* `network.py`: the main Network class with functions to build and simulate the network -* `helper.py`: helper functions for calculation of synaptic weights and currents -* `general_helper.py`: helper functions to merge dictionaries and plot function for raster plots -* `default_parameters.py`: default parameters for the network and simulation + +* :doc:`run_simulation.py `: an example script to try out the EI-clustered circuit model +* :doc:`network.py `: the main Network class with functions to build and simulate the network +* :doc:`helper.py `: helper functions for calculation of synaptic weights and currents +* :doc:`general_helper.py `: helper functions to merge dictionaries and plot function for raster plots +* :doc:`default_parameters.py `: default parameters for the network and simulation Running the simulation ---------------------- @@ -64,4 +64,3 @@ References .. [2] Schmitt FJ, Rostami V and Nawrot MP. 2023. Efficient parameter calibration and real-time simulation of large-scale spiking neural networks with GeNN and NEST. Front. Neuroinform. 17:941696. DOI: `10.3389/fninf.2023.941696 `__. - From 1e7671fbf7292b5ca6b9964fbb080a14acb8fe5d Mon Sep 17 00:00:00 2001 From: schmitfe Date: Mon, 29 Jan 2024 15:29:51 +0100 Subject: [PATCH 07/23] Adjust underline length to match title --- pynest/examples/EI_clustered_network/default_parameters.py | 2 +- pynest/examples/EI_clustered_network/general_helper.py | 2 +- pynest/examples/EI_clustered_network/helper.py | 2 +- pynest/examples/EI_clustered_network/network.py | 2 +- pynest/examples/EI_clustered_network/run_simulation.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pynest/examples/EI_clustered_network/default_parameters.py b/pynest/examples/EI_clustered_network/default_parameters.py index 9a9affa487..fae7085ac5 100644 --- a/pynest/examples/EI_clustered_network/default_parameters.py +++ b/pynest/examples/EI_clustered_network/default_parameters.py @@ -20,7 +20,7 @@ # along with NEST. If not, see . """PyNEST EI-clustered network: default parameters for EI-clustered network -------------------------------------------- +---------------------------------------------------------------------------- default parameters for EI-clustered network simulation """ diff --git a/pynest/examples/EI_clustered_network/general_helper.py b/pynest/examples/EI_clustered_network/general_helper.py index 4215c04756..06e86522d3 100644 --- a/pynest/examples/EI_clustered_network/general_helper.py +++ b/pynest/examples/EI_clustered_network/general_helper.py @@ -20,7 +20,7 @@ # along with NEST. If not, see . """PyNEST EI-clustered network: general helper functions -------------------------------------------- +-------------------------------------------------------- Helper functions for merging dictionaries and some plotting functions. """ diff --git a/pynest/examples/EI_clustered_network/helper.py b/pynest/examples/EI_clustered_network/helper.py index 2d7cbcc46b..b7877e7c4e 100644 --- a/pynest/examples/EI_clustered_network/helper.py +++ b/pynest/examples/EI_clustered_network/helper.py @@ -20,7 +20,7 @@ # along with NEST. If not, see . """PyNEST EI-clustered network: Helper Functions -------------------------------------------- +------------------------------------------------ Helper functions to calculate synaptic weights and first passage times for exponential synapses to construct random balanced networks. diff --git a/pynest/examples/EI_clustered_network/network.py b/pynest/examples/EI_clustered_network/network.py index 8ea0adbb9d..287b223c29 100644 --- a/pynest/examples/EI_clustered_network/network.py +++ b/pynest/examples/EI_clustered_network/network.py @@ -20,7 +20,7 @@ # along with NEST. If not, see . """PyNEST EI-clustered network: Network Class ----------------------------------------- +---------------------------------------------- Main file of the EI-clustered network defining the ``ClusteredNetwork`` class with functions to build and simulate the network. diff --git a/pynest/examples/EI_clustered_network/run_simulation.py b/pynest/examples/EI_clustered_network/run_simulation.py index 1c8479e2c0..9cc1519704 100644 --- a/pynest/examples/EI_clustered_network/run_simulation.py +++ b/pynest/examples/EI_clustered_network/run_simulation.py @@ -20,7 +20,7 @@ # along with NEST. If not, see . """PyNEST EI-clustered network: Run Simulation ----------------------------------------- +----------------------------------------------- This is an example script for running the EI-clustered model with two stimulations and generating a raster plot. From 3a3f444f56179316ba17e892f2936333293ea5df Mon Sep 17 00:00:00 2001 From: schmitfe Date: Tue, 30 Jan 2024 14:48:11 +0100 Subject: [PATCH 08/23] Change docstring style to numpy docstring --- .../default_parameters.py | 2 +- .../EI_clustered_network/general_helper.py | 83 ++++++-- .../examples/EI_clustered_network/helper.py | 102 ++++++--- .../examples/EI_clustered_network/network.py | 198 +++++++++++------- 4 files changed, 261 insertions(+), 124 deletions(-) diff --git a/pynest/examples/EI_clustered_network/default_parameters.py b/pynest/examples/EI_clustered_network/default_parameters.py index fae7085ac5..5901aa50d5 100644 --- a/pynest/examples/EI_clustered_network/default_parameters.py +++ b/pynest/examples/EI_clustered_network/default_parameters.py @@ -20,7 +20,7 @@ # along with NEST. If not, see . """PyNEST EI-clustered network: default parameters for EI-clustered network ----------------------------------------------------------------------------- +--------------------------------------------------------------------------- default parameters for EI-clustered network simulation """ diff --git a/pynest/examples/EI_clustered_network/general_helper.py b/pynest/examples/EI_clustered_network/general_helper.py index 06e86522d3..151bf36064 100644 --- a/pynest/examples/EI_clustered_network/general_helper.py +++ b/pynest/examples/EI_clustered_network/general_helper.py @@ -32,21 +32,40 @@ def merge_params(params, default_values): - """ + """Merge default values with params dictionary. + Updates default Values defined in a module with params-dictionary. - :param params: dictionary of parameters - :param default_values: module with default values - :return: updated dictionary + + Parameters + ---------- + params: dict + Override parameters. + default_values: module + Parameters with default values. + + Returns + ------- + dict + Dictionary with default values updated by params. """ return nested_update(module_to_dict(default_values), params) def module_to_dict(module): - """ + """Create dict of module variables. + Creates dict of explicit variables in module which are not imported modules. Generates for each variable name an entry in the dictionary. - :param module: module - :return: dict of explicit variables + + Parameters + ---------- + module: module + Module to be converted to dict. + + Returns + ------- + dict + Dictionary with module variables. """ module_dict = {} if module: @@ -63,11 +82,21 @@ def module_to_dict(module): def nested_update(d, d2): - """ - Updates values in d with values of d2. Adds new keys if they are not present. - :param d: dictionary to be updated - :param d2: dictionary with update values - :return: updated dictionary + """Update nested dictionary. + + Update values in one dictionary with values of second dictionary. Adds new keys if they are not present. + + Parameters + ---------- + d: dict + Dictionary to be updated. + d2: dict + Dictionary with update values. + + Returns + ------- + dict + Updated dictionary. """ d_local = copy.deepcopy(d) for key in d2: @@ -79,14 +108,28 @@ def nested_update(d, d2): def raster_plot(spiketimes, tlim=None, colorgroups=None, ax=None, markersize=0.5): - """ - Plots raster plot of spiketimes. - :param spiketimes: spiketimes (np.array): Row 0: spiketimes, Row 1: neuron ID. - :param tlim: time limits of plot (list): [tmin, tmax], if None: [min(spiketimes), max(spiketimes)] - :param colorgroups: list of tuples (color, start_neuron_ID, stop_neuron_ID]) for coloring neurons, if None: black - :param ax: axis object, if None: new figure - :param markersize: size of markers - :return: axis object + """Raster plot of spiketimes. + + Plots raster plot of spiketimes withing given time limits and colors neurons according to colorgroups. + + Parameters + ---------- + spiketimes: ndarray + 2D array [2xN_Spikes] of spiketimes with spiketimes in row 0 and neuron IDs in row 1. + tlim: list of floats (optional) + Time limits of plot: [tmin, tmax], if None: [min(spiketimes), max(spiketimes)] + colorgroups: list of tuples (optional) + Each element is a tuple in the format (color, start_neuron_ID, stop_neuron_ID]) for coloring neurons in + given range, if None is given all neurons are black. + ax: axis object (optional) + If None a new figure is created, else the plot is added to the given axis. + markersize: float (optional) + Size of markers. (default: 0.5) + + Returns + ------- + axis object + Axis object with raster plot. """ if ax is None: fig, ax = plt.subplots() diff --git a/pynest/examples/EI_clustered_network/helper.py b/pynest/examples/EI_clustered_network/helper.py index b7877e7c4e..184567eaa8 100644 --- a/pynest/examples/EI_clustered_network/helper.py +++ b/pynest/examples/EI_clustered_network/helper.py @@ -32,13 +32,23 @@ def max_psp_exp(tau_m, tau_syn, c_m=1.0, e_l=0.0): - """ - Calculates the maximum psp amplitude for exponential synapses and unit J. - :param tau_m: Membrane time constant [ms] - :param tau_syn: Synapse time constant [ms] - :param c_m: Membrane capacity [pF] - :param e_l: Resting potential [mV] - :return: maximum psp amplitude + """Maximum psp amplitude for exponential synapses and unit J. + + Parameters + ---------- + tau_m: float + Membrane time constant [ms] + tau_syn: float + Synapse time constant [ms] + c_m: float (optional) + Membrane capacity [pF] (default: 1.0) + e_l: float (optional) + Resting potential [mV] (default: 0.0) + + Returns + ------- + float + maximum psp amplitude [mV] """ tmax = np.log(tau_syn / tau_m) / (1 / tau_m - 1 / tau_syn) B = tau_m * tau_syn / c_m / (tau_syn - tau_m) @@ -46,10 +56,17 @@ def max_psp_exp(tau_m, tau_syn, c_m=1.0, e_l=0.0): def calc_js(params): - """ - calculates the synaptic weights for exponential synapses before clustering - :param params: dictionary of network parameters - :return: synaptic weights 2x2 matrix + """Calculate synaptic weights for exponential synapses before clustering. + + Parameters + ---------- + params: dict + Dictionary of network parameters + + Returns + ------- + ndarray + synaptic weights 2x2 matrix [[EE, EI], [IE, II]] """ N_E = params.get("N_E") # excitatory units N_I = params.get("N_I") # inhibitory units @@ -88,15 +105,27 @@ def calc_js(params): def fpt(tau_m, e_l, i_e, c_m, vtarget, vstart): - """ - calculate first pasage time between Vstart and Vtarget. - :param tau_m: Membrane time constant [ms] - :param e_l: Resting potential [mV] - :param i_e: external current [pA] - :param c_m: Membrane capacity [pF] - :param vtarget: target voltage [mV] - :param vstart: start voltage [mV] - :return: first passage time [ms] + """Calculate first pasage time between Vstart and Vtarget. + + Parameters + ---------- + tau_m: float + Membrane time constant [ms] + e_l: float + Resting potential [mV] + i_e: float + external current [pA] + c_m: float + Membrane capacity [pF] + vtarget: float + target voltage [mV] + vstart: float + start voltage [mV] + + Returns + ------- + float + first passage time [ms] """ inner = (vtarget - e_l - tau_m * i_e / c_m) / ( vstart - e_l - tau_m * i_e / c_m + small @@ -108,16 +137,29 @@ def fpt(tau_m, e_l, i_e, c_m, vtarget, vstart): def v_fpt(tau_m, e_l, i_e, c_m, ttarget, vtarget, t_ref): - """ - Calculate the initial voltage required to obtain a certain first passage time. - :param tau_m: Membrane time constant [ms] - :param e_l: Resting potential [mV] - :param i_e: external current [pA] - :param c_m: Membrane capacity [pF] - :param ttarget: target first passage time [ms] - :param vtarget: target voltage [mV] - :param t_ref: refractory period [ms] - :return: initial voltage [mV] + """Initial voltage to obtain a certain first passage time. + + Parameters + ---------- + tau_m: float + Membrane time constant [ms] + e_l: float + Resting potential [mV] + i_e: float + external current [pA] + c_m: float + Membrane capacity [pF] + ttarget: float + target first passage time [ms] + vtarget: float + target voltage [mV] + t_ref: float + refractory period [ms] + + Returns + ------- + float + initial voltage [mV] """ return ( (vtarget - e_l - tau_m * i_e / c_m) * np.exp(ttarget / tau_m) diff --git a/pynest/examples/EI_clustered_network/network.py b/pynest/examples/EI_clustered_network/network.py index 287b223c29..7e96eea08a 100644 --- a/pynest/examples/EI_clustered_network/network.py +++ b/pynest/examples/EI_clustered_network/network.py @@ -20,11 +20,10 @@ # along with NEST. If not, see . """PyNEST EI-clustered network: Network Class ----------------------------------------------- +--------------------------------------------- Main file of the EI-clustered network defining the ``ClusteredNetwork`` class with functions to build and simulate the network. - """ import pickle @@ -37,21 +36,35 @@ class ClusteredNetwork(object): - """Provides functions to create neuron populations, stimulation devices and recording devices for an - EI-clustered network and setups the simulation in NEST (v3.x). + """EI-clustered network objeect to build and simulate the network. - Creates an object with functions to create neuron populations, - stimulation devices and recording devices for an EI-clustered network. - Initializes the object. Creates the attributes Populations, RecordingDevices and - Currentsources to be filled during network construction. - Attribute params contains all parameters used to construct network. + Provides functions to create neuron populations, stimulation devices and recording devices for an + EI-clustered network and setups the simulation in NEST (v3.x). - Parameters: - defaultValues (module): A Module which contains the default configuration - parameters (dict): Dictionary with parameters which should be modified from their default values + Attributes + ---------- + params: dict + Dictionary with parameters used to construct network. + Populations: list + List of neuron population groups. + RecordingDevices: list + List of recording devices. + Currentsources: list + List of current sources. + ModelBuildPipeline: list + List of functions to build the network. """ def __init__(self, defaultValues, parameters): + """Initialize the ClusteredNetwork object. + + Parameters + ---------- + defaultValues : module + A Module which contains the default configuration + parameters : dict + Dictionary with parameters which should be modified from their default values + """ self.params = general_helper.merge_params(parameters, defaultValues) self.Populations = [] self.RecordingDevices = [] @@ -66,18 +79,30 @@ def __init__(self, defaultValues, parameters): @classmethod def Clustered_Network_from_Rj_Rep(cls, Rj, Rep, defaultValues, parameters): - """Creates a ClusteredNetwork object with parameters Rj and Rep + """Creates a ClusteredNetwork object from parameters Rj and Rep Rj and Rep are used to calculate the parameters jplus (weight clustering) or pplus (probability clustering) - Parameters: - Rj (float): Ratio excitatory to inhibitory clustering strength - Rep (float): Excitatory clustering strength - defaultValues (module): A Module which contains the default configuration - parameters (dict): Dictionary with parameters which should be modified from their default values - - Returns: - object: ClusteredNetwork object with parameters + Parameters + ---------- + Rj : float + Ratio excitatory to inhibitory clustering strength + Rep : float + Excitatory clustering strength + defaultValues : module + A Module which contains the default configuration + parameters : dict + Dictionary with parameters which should be modified from their default values + + Returns + ------- + ClusteredNetwork + ClusteredNetwork object + + Raises + ---------- + ValueError + If the clustering type is not recognized """ params = general_helper.merge_params(parameters, defaultValues) if params["clustering"] == "weight": @@ -93,10 +118,7 @@ def Clustered_Network_from_Rj_Rep(cls, Rj, Rep, defaultValues, parameters): return cls(defaultValues, params) def clean_network(self): - """Creates clean network - - Creates empty attributes of a network. - """ + """Clears the object of all attributes.""" self.Populations = [] self.RecordingDevices = [] self.Currentsources = [] @@ -121,7 +143,6 @@ def create_populations(self): """Create all neuron populations. Q excitatory and inhibitory neuron populations with the parameters of the network are created. - """ # make sure number of clusters and units are compatible assert ( @@ -317,8 +338,12 @@ def create_populations(self): self.Populations = [E_pops, I_pops] def connect(self): - """ - Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme + """Connect the excitatory and inhibitory populations with each other in the EI-clustered scheme + + Raises + ------ + ValueError + If the clustering method is not recognized """ # if CLustering is set to "Weight" or is not set at all or is not in dictionary, use the connect_weight function try: @@ -334,7 +359,9 @@ def connect(self): self.connect_weight() def connect_probabilities(self): - """Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme + """Connect the clusters with a probability EI-clustered scheme + + Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme by increasing the probabilies of the connections within the clusters and decreasing the probabilites of the connections between the clusters. The weights are calculated so that the total input to a neuron is balanced. @@ -559,7 +586,9 @@ def connect_probabilities(self): nest.Connect(pre, post, conn_params_II_minus, "II") def connect_weight(self): - """Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme + """Connect the clusters with a weight EI-clustered scheme + + Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme by increasing the weights of the connections within the clusters and decreasing the weights of the connections between the clusters. The weights are calculated so that the total input to a neuron is balanced. @@ -744,9 +773,7 @@ def connect_weight(self): # print('Js: ', js / np.sqrt(N)) def create_stimulation(self): - """ - Creates a current source and connects it to the specified cluster/s. - """ + """Create a current source and connect it to clusters.""" if self.params["stim_clusters"] is not None: stim_amp = self.params[ "stim_amp" @@ -772,8 +799,9 @@ def create_stimulation(self): ) def create_recording_devices(self): - """ - Creates a spike recorder connected to all neuron populations created by create_populations + """Creates a spike recorder + + Create and connect a spike recorder to all neuron populations in self.Populations. """ self.RecordingDevices = [nest.Create("spike_recorder")] self.RecordingDevices[0].record_to = "memory" @@ -786,15 +814,18 @@ def create_recording_devices(self): nest.Connect(all_units, self.RecordingDevices[0], "all_to_all") # Spikerecorder def set_model_build_pipeline(self, Pipeline): - """ - Sets the ModelBuildPipeline. - Parameters: - Pipeline (list of functions): ordered list of functions executed to build the network model + """Set ModelBuildPipeline + + Parameters + ---------- + Pipeline: list + ordered list of functions executed to build the network model """ self.ModelBuildPipeline = Pipeline def setup_network(self): - """ + """Setup network in NEST + Initializes NEST and creates the network in NEST, ready to be simulated. Functions saved in ModelBuildPipeline are executed. nest.Prepare is executed in this function. @@ -804,22 +835,23 @@ def setup_network(self): nest.Prepare() def simulate(self): - """ - Simulates network for a period of warmup+simtime - """ + """Simulates network for a period of warmup+simtime""" if self.params["warmup"] + self.params["simtime"] <= 0.1: pass else: nest.Run(self.params["warmup"] + self.params["simtime"]) def get_recordings(self): - """ - Extracts spikes form the Spikerecorder connected to all populations created in create_populations. + """Extract spikes from Spikerecorder + + Extract spikes form the Spikerecorder connected to all populations created in create_populations. Cuts the warmup period away and sets time relative to end of warmup. Ids 1:N_E correspond to excitatory neurons, N_E+1:N_E+N_I correspond to inhibitory neurons. - Returns: - spiketimes (np.array): Row 0: spiketimes, Row 1: neuron ID. + Returns + ------- + spiketimes: ndarray + 2D array [2xN_Spikes] of spiketimes with spiketimes in row 0 and neuron IDs in row 1. """ events = nest.GetStatus(self.RecordingDevices[0], "events")[0] # convert them to the format accepted by spiketools @@ -833,34 +865,40 @@ def get_recordings(self): return spiketimes def get_parameter(self): - """ - Returns all parameters used to create the network. - Return: - parameters (dict): Dictionary with all parameters for the simulation / network creation. + """Get all parameters used to create the network. + Returns + ------- + dict + Dictionary with all parameters of the network and the simulation. """ return self.params def create_and_simulate(self): - """ - Creates the EI-clustered network and simulates it with the parameters supplied in the object creation. + """Create and simulate the EI-clustered network. - Returns: - spiketimes (np.array): Row 0: spiketimes, Row 1: neuron ID. - Ids 1:N_E correspond to excitatory neurons, - N_E+1:N_E+N_I correspond to inhibitory neurons. + Returns + ------- + spiketimes: ndarray + 2D array [2xN_Spikes] of spiketimes with spiketimes in row 0 and neuron IDs in row 1. """ self.setup_network() self.simulate() return self.get_recordings() def get_firing_rates(self, spiketimes=None): - """ + """Calculates the firing rates of all excitatory neurons and the firing rates of all inhibitory neurons. + Calculates the firing rates of all excitatory neurons and the firing rates of all inhibitory neurons created by self.create_populations. If spiketimes are not supplied, they get extracted. - Parameters: - spiketimes: (optional, np.array 2xT) spiketimes of simulation - Returns: - (e_rate, i_rate) average firing rate of excitatory/inhibitory neurons (spikes/s) + Parameters + ---------- + spiketimes: ndarray + 2D array [2xN_Spikes] of spiketimes with spiketimes in row 0 and neuron IDs in row 1. + + Returns + ------- + tuple[float, float] + average firing rates of excitatory (0) and inhibitory (1) neurons (spikes/s) """ if spiketimes is None: spiketimes = self.get_recordings() @@ -875,9 +913,16 @@ def get_firing_rates(self, spiketimes=None): return e_rate, i_rate def set_I_x(self, I_XE, I_XI): - """ - Adds DC currents for the excitatory and inhibitory neurons. Allows also the usage of a baseline defined by the - model setup. + """Set DC currents for excitatory and inhibitory neurons + Adds DC currents for the excitatory and inhibitory neurons. The DC currents are added to the currents already + present in the populations. + + Parameters + ---------- + I_XE: float + extra DC current for excitatory neurons [pA] + I_XI: float + extra DC current for inhibitory neurons [pA] """ for E_pop in self.Populations[0]: I_e_loc = E_pop.get("I_e") @@ -887,14 +932,21 @@ def set_I_x(self, I_XE, I_XI): I_pop.set({"I_e": I_e_loc + I_XI}) def get_simulation(self, PathSpikes=None): - """ - Creates the network, simulates it and extracts the firing rates. If PathSpikes is supplied the spikes get saved - to a pickle file. If a timeout is supplied, a timeout handler is created which stops the execution. - Parameters: - PathSpikes: (optional) Path of file for spiketimes - timeout: (optional) Time of timeout in seconds - Returns: - Dictionary with firing rates, timing information (dict) and parameters (dict) + """Create network, simulate and return results + + Creates the EI-clustered network and simulates it with the parameters supplied in the object creation. + Returns a dictionary with firing rates, timing information (dict) and parameters (dict). If PathSpikes is + supplied the spikes get saved to a pickle file. + + Parameters + ---------- + PathSpikes: str (optional) + Path of file for spiketimes, if None, no file is saved + + Returns + ------- + dict + Dictionary with firing rates, spiketimes (ndarray) and parameters (dict) """ self.setup_network() From 3fb03d1b7900f0a259eccca61752bfe4efa1cbd4 Mon Sep 17 00:00:00 2001 From: schmitfe Date: Wed, 31 Jan 2024 13:53:31 +0100 Subject: [PATCH 09/23] Fixed Acknowledgments --- pynest/examples/EI_clustered_network/README.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pynest/examples/EI_clustered_network/README.rst b/pynest/examples/EI_clustered_network/README.rst index f5dd752b00..a6d6d81439 100644 --- a/pynest/examples/EI_clustered_network/README.rst +++ b/pynest/examples/EI_clustered_network/README.rst @@ -4,7 +4,7 @@ EI-clustered circuit model This is PyNEST implementation of the EI-clustered circuit model described by Rostami et al. [1]_. .. figure:: /static/img/pynest/EI_clustered_network_schematic.png - :alt: EI-clustered circuit model + :alt: EI-clustered circuit model. Schematic of the EI-clustered circuit model. The network consists of Q clusters with one excitatory and one inhibitory population each. @@ -47,6 +47,7 @@ in parts through the Collaborative Research Center ’Motor Control in Health an German Excellence Initiative (DFG-ZUK 81/1) and in parts through the DFG graduate school ’Neural Circuit Analysis’ (DFG-RTG 1960, ID 365082554) and through the European Union’s Horizon 2020 Framework Programme for Research and Innovation under grant agreement number 945539 (Human Brain Project SGA3). +The figure is created with BioRender.com. Other implementations of the EI-clustered model ----------------------------------------------- From 21e1f77420ba56c9ee3487155c0e590ea4e43b18 Mon Sep 17 00:00:00 2001 From: Felix Schmitt Date: Thu, 7 Mar 2024 13:19:49 +0100 Subject: [PATCH 10/23] Apply suggestions from code review Co-authored-by: Hans Ekkehard Plesser --- pynest/examples/EI_clustered_network/README.rst | 4 ++-- pynest/examples/EI_clustered_network/default_parameters.py | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pynest/examples/EI_clustered_network/README.rst b/pynest/examples/EI_clustered_network/README.rst index a6d6d81439..9368b868c4 100644 --- a/pynest/examples/EI_clustered_network/README.rst +++ b/pynest/examples/EI_clustered_network/README.rst @@ -1,5 +1,5 @@ EI-clustered circuit model -=========================== +========================== This is PyNEST implementation of the EI-clustered circuit model described by Rostami et al. [1]_. @@ -27,7 +27,7 @@ Running the simulation .. code-block:: bash - python3 run_simulation.py + python run_simulation.py A raster plot of the network activity is saved as ``Rasterplot.png``. diff --git a/pynest/examples/EI_clustered_network/default_parameters.py b/pynest/examples/EI_clustered_network/default_parameters.py index 5901aa50d5..28640b9352 100644 --- a/pynest/examples/EI_clustered_network/default_parameters.py +++ b/pynest/examples/EI_clustered_network/default_parameters.py @@ -24,6 +24,7 @@ default parameters for EI-clustered network simulation """ + import numpy as np ############################################ From d6c35df5a72b6fd8ca022921ae464ef760e0d4c5 Mon Sep 17 00:00:00 2001 From: schmitfe Date: Fri, 15 Mar 2024 10:52:08 +0100 Subject: [PATCH 11/23] Adapt structure of parameters from Potjans 2014 example --- .../default_parameters.py | 111 ------------------ .../EI_clustered_network/network_params.py | 97 +++++++++++++++ .../EI_clustered_network/sim_params.py | 41 +++++++ .../EI_clustered_network/stimulus_params.py | 38 ++++++ 4 files changed, 176 insertions(+), 111 deletions(-) delete mode 100644 pynest/examples/EI_clustered_network/default_parameters.py create mode 100644 pynest/examples/EI_clustered_network/network_params.py create mode 100644 pynest/examples/EI_clustered_network/sim_params.py create mode 100644 pynest/examples/EI_clustered_network/stimulus_params.py diff --git a/pynest/examples/EI_clustered_network/default_parameters.py b/pynest/examples/EI_clustered_network/default_parameters.py deleted file mode 100644 index 28640b9352..0000000000 --- a/pynest/examples/EI_clustered_network/default_parameters.py +++ /dev/null @@ -1,111 +0,0 @@ -# -*- coding: utf-8 -*- -# -# default_parameters.py -# -# This file is part of NEST. -# -# Copyright (C) 2004 The NEST Initiative -# -# NEST 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 2 of the License, or -# (at your option) any later version. -# -# NEST 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 NEST. If not, see . - -"""PyNEST EI-clustered network: default parameters for EI-clustered network ---------------------------------------------------------------------------- - -default parameters for EI-clustered network simulation -""" - -import numpy as np - -############################################ -# general parameters -############################################ -eps = np.finfo(float).eps -n_jobs = 1 - -dt = 0.1 -simtime = 1000.0 -warmup = 0.0 -record_voltage = False -record_from = "all" -recording_interval = dt -return_weights = False - -############################################ -# neuron parameters -############################################ -neuron_type = "iaf_psc_exp" # 'gif_psc_exp' -E_L = 0.0 -C_m = 1.0 -tau_E = 20.0 -tau_I = 10.0 -t_ref = 5.0 -V_th_E = 20.0 -V_th_I = 20.0 -V_r = 0.0 -I_xE = 1.0 -I_xI = 2.0 -delta_I_xE = 0.0 -delta_I_xI = 0.0 -I_th_E = 1.25 -I_th_I = 0.78 -V_m = "rand" - -# synapse parameters -tau_syn_ex = 3.0 -tau_syn_in = 2.0 -delay = 0.1 # synaptic delay - -# Distribution of synaptic weights -# available distributions= https://nest-simulator.readthedocs.io/en/stable/guides/connection_management.html#dist-params - -DistParams = {"distribution": "normal", "sigma": 0.0, "fraction": False} - -syn_params = {"U": 0.2, "u": 0.0, "tau_rec": 120.0, "tau_fac": 0.0} - -############################################ -# network parameters -############################################ - -# number of units -N_E = 1200 -N_I = 300 - -# cluster number -Q = 6 -# cluster weight ratios -jplus = np.ones((2, 2)) - -# connection probabilities -ps = np.array([[0.2, 0.5], [0.5, 0.5]]) - -# connections strengths -# weights are js/sqrt(N) -# nan means they are calculated -js = np.ones((2, 2)) * np.nan -# factors for inhibitory weights -ge = 1.2 -gi = 1.0 -gie = 1.0 - -# factor multiplied with weights -s = 1.0 -fixed_indegree = False - -############################################ -# stimulation parameters -############################################ -stim_clusters = None # clusters to be stimulated -stim_amp = 0.0 # amplitude of the stimulation current in pA -stim_starts = [] # list of stimulation start times -stim_ends = [] # list of stimulation end times diff --git a/pynest/examples/EI_clustered_network/network_params.py b/pynest/examples/EI_clustered_network/network_params.py new file mode 100644 index 0000000000..7122e13b51 --- /dev/null +++ b/pynest/examples/EI_clustered_network/network_params.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +# +# sim_params.py +# +# This file is part of NEST. +# +# Copyright (C) 2004 The NEST Initiative +# +# NEST 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 2 of the License, or +# (at your option) any later version. +# +# NEST 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 NEST. If not, see . + +"""PyNEST EI-clustered network: Network Parameters +------------------------------------------------ + +A dictionary with parameters defining the network and neuron parameters. + +""" + +import numpy as np + +net_dict = { + ############################################ + # neuron parameters + ############################################ + # neuron model + "neuron_type": "iaf_psc_exp", + # Resting potential [mV] + "E_L": 0.0, + # Membrane capacitance [pF] + "C_m": 1.0, + # Membrane time constant for excitatory neurons [ms] + "tau_E": 20.0, + # Membrane time constant for inhibitory neurons [ms] + "tau_I": 10.0, + # Refractory period [ms] + "t_ref": 5.0, + # Threshold for excitatory neurons [mV] + "V_th_E": 20.0, + # Threshold for inhibitory neurons [mV] + "V_th_I": 20.0, + # Reset potential [mV] + "V_r": 0.0, + # synaptic time constant for excitatory synapses [ms] + "tau_syn_ex": 5.0, + # synaptic time constant for inhibitory synapses [ms] + "tau_syn_in": 5.0, + # synaptic delay [ms] + "delay": 0.1, + # Feed forward excitatory input [rheobase current] + "I_th_E": 1.25, + # Feed forward inhibitory input [rheobase current] + "I_th_I": 0.78, + # distribution of feed forward input, uniform around I_th with half width I_width + "delta_I_xE": 0.0, # excitatory + "delta_I_xI": 0.0, # inhibitory + # initial membrane potential + "V_m": "rand", + ############################################ + # network parameters + ############################################ + # number of excitatory neurons in the network + # Neurons per cluster N_E/n_clusters + "N_E": 4000, + # number of inhibitory neurons in the network + "N_I": 1000, + # Number of clusters + "n_clusters": 20, + # connection probabilities + # baseline_conn_prob[0, 0] E to E, baseline_conn_prob[0, 1] I to E, + # baseline_conn_prob[1, 0] E to I, baseline_conn_prob[1, 1] I to I + "baseline_conn_prob": np.array([[0.2, 0.5], [0.5, 0.5]]), + # inhibitory weight ratios - scaling like random balanced network + "gei": 1.2, # I to E + "gie": 1.0, # E to I + "gii": 1.0, # I to I + # additional scaling factor for all weights - can be used to scale weights with network size + "s": 1.0, + # fixed indegree - if false the synapses are established with probability ps + "fixed_indegree": False, + # cluster network by weight or connection probability - "weight" or "probabilities" + "clustering": "weight", + # ratio excitatory to inhibitory clustering, rj = 0 means no clustering, which resembles a clustered network + # with a blanket of inhibition + "rj": 0.82, + # excitatory clustering factor, rep = 1 means no clustering, reselmbles a balanced random network + "rep": 6.0, +} diff --git a/pynest/examples/EI_clustered_network/sim_params.py b/pynest/examples/EI_clustered_network/sim_params.py new file mode 100644 index 0000000000..30ac2cd330 --- /dev/null +++ b/pynest/examples/EI_clustered_network/sim_params.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# sim_params.py +# +# This file is part of NEST. +# +# Copyright (C) 2004 The NEST Initiative +# +# NEST 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 2 of the License, or +# (at your option) any later version. +# +# NEST 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 NEST. If not, see . + +"""PyNEST EI-clustered network: Simulation Parameters +------------------------------------------------ + +A dictionary with parameters defining the simulation. + +""" + +sim_dict = { + # The full simulation time is the sum of a presimulation time and the main + # simulation time. + # presimulation time (in ms) + "warmup": 1000.0, + # simulation time (in ms) + "simtime": 10000.0, + # resolution of the simulation (in ms) + "dt": 0.1, + "randseed": 55, + # Number of virtual processes + "n_vp": 4, +} diff --git a/pynest/examples/EI_clustered_network/stimulus_params.py b/pynest/examples/EI_clustered_network/stimulus_params.py new file mode 100644 index 0000000000..a78f430be4 --- /dev/null +++ b/pynest/examples/EI_clustered_network/stimulus_params.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# +# stimulus_params.py +# +# This file is part of NEST. +# +# Copyright (C) 2004 The NEST Initiative +# +# NEST 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 2 of the License, or +# (at your option) any later version. +# +# NEST 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 NEST. If not, see . + +""" PyNEST EI-clustered network: Stimulus Parameters +----------------------------------------------- + +A dictionary with parameters for an optinal stimulation of clusters. + +""" + +stim_dict = { + # list of clusters to be stimulated (None for no stimulation, 0-n_clusters-1) + "stim_clusters": [2, 3, 4], + # stimulus amplitude (in pA) + "stim_amp": 0.15, + # stimulus start times in ms: list (warmup time is added automatically) + "stim_starts": [2000, 6000], + # list of stimulus end times in ms (warmup time is added automatically) + "stim_ends": [3500, 7500], +} From 0b1923d1d9bc8924047ae2ab59687340657e4410 Mon Sep 17 00:00:00 2001 From: schmitfe Date: Fri, 15 Mar 2024 10:55:30 +0100 Subject: [PATCH 12/23] Only one helper module with less functions needed --- .../EI_clustered_network/general_helper.py | 153 ------------------ .../examples/EI_clustered_network/helper.py | 134 ++++++++------- 2 files changed, 66 insertions(+), 221 deletions(-) delete mode 100644 pynest/examples/EI_clustered_network/general_helper.py diff --git a/pynest/examples/EI_clustered_network/general_helper.py b/pynest/examples/EI_clustered_network/general_helper.py deleted file mode 100644 index 151bf36064..0000000000 --- a/pynest/examples/EI_clustered_network/general_helper.py +++ /dev/null @@ -1,153 +0,0 @@ -# -*- coding: utf-8 -*- -# -# general_helper.py -# -# This file is part of NEST. -# -# Copyright (C) 2004 The NEST Initiative -# -# NEST 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 2 of the License, or -# (at your option) any later version. -# -# NEST 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 NEST. If not, see . - -"""PyNEST EI-clustered network: general helper functions --------------------------------------------------------- - -Helper functions for merging dictionaries and some plotting functions. -""" -import copy -from types import ModuleType - -import matplotlib.pyplot as plt -import numpy as np - - -def merge_params(params, default_values): - """Merge default values with params dictionary. - - Updates default Values defined in a module with params-dictionary. - - Parameters - ---------- - params: dict - Override parameters. - default_values: module - Parameters with default values. - - Returns - ------- - dict - Dictionary with default values updated by params. - """ - return nested_update(module_to_dict(default_values), params) - - -def module_to_dict(module): - """Create dict of module variables. - - Creates dict of explicit variables in module which are not imported modules. - Generates for each variable name an entry in the dictionary. - - Parameters - ---------- - module: module - Module to be converted to dict. - - Returns - ------- - dict - Dictionary with module variables. - """ - module_dict = {} - if module: - module_dict = { - key: value - for key, value in module.__dict__.items() - if not ( - key.startswith("__") - or key.startswith("_") - or isinstance(value, ModuleType) - ) - } - return module_dict - - -def nested_update(d, d2): - """Update nested dictionary. - - Update values in one dictionary with values of second dictionary. Adds new keys if they are not present. - - Parameters - ---------- - d: dict - Dictionary to be updated. - d2: dict - Dictionary with update values. - - Returns - ------- - dict - Updated dictionary. - """ - d_local = copy.deepcopy(d) - for key in d2: - if isinstance(d2[key], dict) and key in d_local: - d_local[key] = nested_update(d_local[key], d2[key]) - else: - d_local[key] = d2[key] - return d_local - - -def raster_plot(spiketimes, tlim=None, colorgroups=None, ax=None, markersize=0.5): - """Raster plot of spiketimes. - - Plots raster plot of spiketimes withing given time limits and colors neurons according to colorgroups. - - Parameters - ---------- - spiketimes: ndarray - 2D array [2xN_Spikes] of spiketimes with spiketimes in row 0 and neuron IDs in row 1. - tlim: list of floats (optional) - Time limits of plot: [tmin, tmax], if None: [min(spiketimes), max(spiketimes)] - colorgroups: list of tuples (optional) - Each element is a tuple in the format (color, start_neuron_ID, stop_neuron_ID]) for coloring neurons in - given range, if None is given all neurons are black. - ax: axis object (optional) - If None a new figure is created, else the plot is added to the given axis. - markersize: float (optional) - Size of markers. (default: 0.5) - - Returns - ------- - axis object - Axis object with raster plot. - """ - if ax is None: - fig, ax = plt.subplots() - if tlim is None: - tlim = [min(spiketimes[0]), max(spiketimes[0])] - if colorgroups is None: - colorgroups = [("k", 0, max(spiketimes[1]))] - for color, start, stop in colorgroups: - ax.plot( - spiketimes[0][np.logical_and(spiketimes[1] >= start, spiketimes[1] < stop)], - spiketimes[1][np.logical_and(spiketimes[1] >= start, spiketimes[1] < stop)], - color=color, - marker=".", - linestyle="None", - markersize=markersize, - ) - ax.set_xlim(tlim) - ax.set_ylim([0, max(spiketimes[1])]) - ax.set_xlabel("Time [ms]") - ax.set_ylabel("Neuron ID") - return ax diff --git a/pynest/examples/EI_clustered_network/helper.py b/pynest/examples/EI_clustered_network/helper.py index 184567eaa8..bf9e05e608 100644 --- a/pynest/examples/EI_clustered_network/helper.py +++ b/pynest/examples/EI_clustered_network/helper.py @@ -23,16 +23,17 @@ ------------------------------------------------ Helper functions to calculate synaptic weights and first passage times for exponential synapses to construct -random balanced networks. +random balanced networks and plot raster plot with color groups. """ +import matplotlib.pyplot as plt import numpy as np small = 1e-10 -def max_psp_exp(tau_m, tau_syn, c_m=1.0, e_l=0.0): - """Maximum psp amplitude for exponential synapses and unit J. +def postsynaptic_current_to_potential(tau_m, tau_syn, c_m=1.0, e_l=0.0): + """Maximum post-synaptic potential amplitude for exponential synapses and a synaptic efficacy J of 1 pA. Parameters ---------- @@ -48,15 +49,15 @@ def max_psp_exp(tau_m, tau_syn, c_m=1.0, e_l=0.0): Returns ------- float - maximum psp amplitude [mV] + maximum psp amplitude (for a 1 pA current spike) [mV] """ - tmax = np.log(tau_syn / tau_m) / (1 / tau_m - 1 / tau_syn) - B = tau_m * tau_syn / c_m / (tau_syn - tau_m) - return (e_l - B) * np.exp(-tmax / tau_m) + B * np.exp(-tmax / tau_syn) + tmax = np.log(tau_syn / tau_m) / (1 / tau_m - 1 / tau_syn) # time of maximum deflection of the psp [ms] + pre = tau_m * tau_syn / c_m / (tau_syn - tau_m) # we assume here the current spike is 1 pA, otherwise [mV/pA] + return (e_l - pre) * np.exp(-tmax / tau_m) + pre * np.exp(-tmax / tau_syn) -def calc_js(params): - """Calculate synaptic weights for exponential synapses before clustering. +def calculate_RBN_weights(params): + """Calculate synaptic weights for exponential synapses before clustering, for a random balanced network. Parameters ---------- @@ -71,41 +72,34 @@ def calc_js(params): N_E = params.get("N_E") # excitatory units N_I = params.get("N_I") # inhibitory units N = N_E + N_I # total units - ps = params.get("ps") # connection probs - ge = params.get("ge") - gi = params.get("gi") + baseline_conn_prob = params.get("baseline_conn_prob") # connection probs + gei = params.get("gei") + gii = params.get("gii") gie = params.get("gie") V_th_E = params.get("V_th_E") # threshold voltage V_th_I = params.get("V_th_I") tau_E = params.get("tau_E") tau_I = params.get("tau_I") E_L = params.get("E_L") - neuron_type = params.get("neuron_type") - if ("iaf_psc_exp" in neuron_type) or ("gif_psc_exp" in neuron_type): - tau_syn_ex = params.get("tau_syn_ex") - tau_syn_in = params.get("tau_syn_in") - amp_EE = max_psp_exp(tau_E, tau_syn_ex) - amp_EI = max_psp_exp(tau_E, tau_syn_in) - amp_IE = max_psp_exp(tau_I, tau_syn_ex) - amp_II = max_psp_exp(tau_I, tau_syn_in) - else: - amp_EE = 1.0 - amp_EI = 1.0 - amp_IE = 1.0 - amp_II = 1.0 + tau_syn_ex = params.get("tau_syn_ex") + tau_syn_in = params.get("tau_syn_in") + amp_EE = postsynaptic_current_to_potential(tau_E, tau_syn_ex) + amp_EI = postsynaptic_current_to_potential(tau_E, tau_syn_in) + amp_IE = postsynaptic_current_to_potential(tau_I, tau_syn_ex) + amp_II = postsynaptic_current_to_potential(tau_I, tau_syn_in) js = np.zeros((2, 2)) - K_EE = N_E * ps[0, 0] + K_EE = N_E * baseline_conn_prob[0, 0] js[0, 0] = (V_th_E - E_L) * (K_EE**-0.5) * N**0.5 / amp_EE - js[0, 1] = -ge * js[0, 0] * ps[0, 0] * N_E * amp_EE / (ps[0, 1] * N_I * amp_EI) - K_IE = N_E * ps[1, 0] + js[0, 1] = -gei * js[0, 0] * baseline_conn_prob[0, 0] * N_E * amp_EE / (baseline_conn_prob[0, 1] * N_I * amp_EI) + K_IE = N_E * baseline_conn_prob[1, 0] js[1, 0] = gie * (V_th_I - E_L) * (K_IE**-0.5) * N**0.5 / amp_IE - js[1, 1] = -gi * js[1, 0] * ps[1, 0] * N_E * amp_IE / (ps[1, 1] * N_I * amp_II) + js[1, 1] = -gii * js[1, 0] * baseline_conn_prob[1, 0] * N_E * amp_IE / (baseline_conn_prob[1, 1] * N_I * amp_II) return js -def fpt(tau_m, e_l, i_e, c_m, vtarget, vstart): - """Calculate first pasage time between Vstart and Vtarget. +def rheobase_current(tau_m, e_l, v_th, c_m): + """Rheobase current for a given membrane time constant and resting potential. Parameters ---------- @@ -113,56 +107,60 @@ def fpt(tau_m, e_l, i_e, c_m, vtarget, vstart): Membrane time constant [ms] e_l: float Resting potential [mV] - i_e: float - external current [pA] + v_th: float + Threshold potential [mV] c_m: float Membrane capacity [pF] - vtarget: float - target voltage [mV] - vstart: float - start voltage [mV] Returns ------- float - first passage time [ms] + rheobase current [pA] """ - inner = (vtarget - e_l - tau_m * i_e / c_m) / ( - vstart - e_l - tau_m * i_e / c_m + small - ) - if inner < 0: - return np.nan - else: - return -tau_m * np.log(inner) + return (v_th - e_l) * c_m / tau_m -def v_fpt(tau_m, e_l, i_e, c_m, ttarget, vtarget, t_ref): - """Initial voltage to obtain a certain first passage time. +def raster_plot(spiketimes, tlim=None, colorgroups=None, ax=None, markersize=0.5): + """Raster plot of spiketimes. + + Plots raster plot of spiketimes withing given time limits and colors neurons according to colorgroups. Parameters ---------- - tau_m: float - Membrane time constant [ms] - e_l: float - Resting potential [mV] - i_e: float - external current [pA] - c_m: float - Membrane capacity [pF] - ttarget: float - target first passage time [ms] - vtarget: float - target voltage [mV] - t_ref: float - refractory period [ms] + spiketimes: ndarray + 2D array [2xN_Spikes] of spiketimes with spiketimes in row 0 and neuron IDs in row 1. + tlim: list of floats (optional) + Time limits of plot: [tmin, tmax], if None: [min(spiketimes), max(spiketimes)] + colorgroups: list of tuples (optional) + Each element is a tuple in the format (color, start_neuron_ID, stop_neuron_ID]) for coloring neurons in + given range, if None is given all neurons are black. + ax: axis object (optional) + If None a new figure is created, else the plot is added to the given axis. + markersize: float (optional) + Size of markers. (default: 0.5) Returns ------- - float - initial voltage [mV] + axis object + Axis object with raster plot. """ - return ( - (vtarget - e_l - tau_m * i_e / c_m) * np.exp(ttarget / tau_m) - + e_l - + tau_m * i_e / c_m - ) + if ax is None: + fig, ax = plt.subplots() + if tlim is None: + tlim = [min(spiketimes[0]), max(spiketimes[0])] + if colorgroups is None: + colorgroups = [("k", 0, max(spiketimes[1]))] + for color, start, stop in colorgroups: + ax.plot( + spiketimes[0][np.logical_and(spiketimes[1] >= start, spiketimes[1] < stop)], + spiketimes[1][np.logical_and(spiketimes[1] >= start, spiketimes[1] < stop)], + color=color, + marker=".", + linestyle="None", + markersize=markersize, + ) + ax.set_xlim(tlim) + ax.set_ylim([0, max(spiketimes[1])]) + ax.set_xlabel("Time [ms]") + ax.set_ylabel("Neuron ID") + return ax From ac537fad7efac9e68c096157056f94660f35bca6 Mon Sep 17 00:00:00 2001 From: schmitfe Date: Fri, 15 Mar 2024 11:12:01 +0100 Subject: [PATCH 13/23] Change of attributes to private and entirely use Nest.random for initialization --- .../examples/EI_clustered_network/network.py | 622 ++++++------------ 1 file changed, 218 insertions(+), 404 deletions(-) diff --git a/pynest/examples/EI_clustered_network/network.py b/pynest/examples/EI_clustered_network/network.py index 7e96eea08a..905b48ae58 100644 --- a/pynest/examples/EI_clustered_network/network.py +++ b/pynest/examples/EI_clustered_network/network.py @@ -22,20 +22,17 @@ """PyNEST EI-clustered network: Network Class --------------------------------------------- -Main file of the EI-clustered network defining the ``ClusteredNetwork`` class with functions to -build and simulate the network. +``ClusteredNetwork`` class with functions to build and simulate the EI-clustered network. """ import pickle -import numpy as np - -import general_helper import helper import nest +import numpy as np -class ClusteredNetwork(object): +class ClusteredNetwork: """EI-clustered network objeect to build and simulate the network. Provides functions to create neuron populations, stimulation devices and recording devices for an @@ -43,33 +40,38 @@ class ClusteredNetwork(object): Attributes ---------- - params: dict + _params: dict Dictionary with parameters used to construct network. - Populations: list + _populations: list List of neuron population groups. - RecordingDevices: list + _recording_devices: list List of recording devices. - Currentsources: list + _currentsources: list List of current sources. - ModelBuildPipeline: list + _model_build_pipeline: list List of functions to build the network. """ - def __init__(self, defaultValues, parameters): + def __init__(self, sim_dict, net_dict, stim_dict): """Initialize the ClusteredNetwork object. + Parameters are given and explained in the files network_params.py, sim_params.py and stimulus_params.py. + Parameters ---------- - defaultValues : module - A Module which contains the default configuration - parameters : dict - Dictionary with parameters which should be modified from their default values + sim_dict: dict + Dictionary with simulation parameters. + net_dict: dict + Dictionary with network parameters. + stim_dict: dict + Dictionary with stimulus parameters. """ - self.params = general_helper.merge_params(parameters, defaultValues) - self.Populations = [] - self.RecordingDevices = [] - self.Currentsources = [] - self.ModelBuildPipeline = [ + # merge dictionaries of simulation, network and stimulus parameters + self._params = {**sim_dict, **net_dict, **stim_dict} # loo + self._populations = [] # list of neuron population groups [E_pops, I_pops] + self._recording_devices = [] + self._currentsources = [] + self._model_build_pipeline = [ self.setup_nest, self.create_populations, self.create_stimulation, @@ -77,51 +79,16 @@ def __init__(self, defaultValues, parameters): self.connect, ] - @classmethod - def Clustered_Network_from_Rj_Rep(cls, Rj, Rep, defaultValues, parameters): - """Creates a ClusteredNetwork object from parameters Rj and Rep - - Rj and Rep are used to calculate the parameters jplus (weight clustering) or pplus (probability clustering) - - Parameters - ---------- - Rj : float - Ratio excitatory to inhibitory clustering strength - Rep : float - Excitatory clustering strength - defaultValues : module - A Module which contains the default configuration - parameters : dict - Dictionary with parameters which should be modified from their default values - - Returns - ------- - ClusteredNetwork - ClusteredNetwork object - - Raises - ---------- - ValueError - If the clustering type is not recognized - """ - params = general_helper.merge_params(parameters, defaultValues) - if params["clustering"] == "weight": - jep = Rep - jip = 1.0 + (jep - 1) * Rj - params["jplus"] = np.array([[jep, jip], [jip, jip]]) - elif params["clustering"] == "probabilities": - pep = Rep - pip = 1.0 + (pep - 1) * Rj - params["pplus"] = np.array([[pep, pip], [pip, pip]]) + if self._params["clustering"] == "weight": + jep = self._params["rep"] + jip = 1.0 + (jep - 1) * self._params["rj"] + self._params["jplus"] = np.array([[jep, jip], [jip, jip]]) + elif self._params["clustering"] == "probabilities": + pep = self._params["rep"] + pip = 1.0 + (pep - 1) ** self._params["rj"] + self._params["pplus"] = np.array([[pep, pip], [pip, pip]]) else: raise ValueError("Clustering type not recognized") - return cls(defaultValues, params) - - def clean_network(self): - """Clears the object of all attributes.""" - self.Populations = [] - self.RecordingDevices = [] - self.Currentsources = [] def setup_nest(self): """Initializes the NEST kernel. @@ -131,211 +98,91 @@ def setup_nest(self): """ nest.ResetKernel() nest.set_verbosity("M_WARNING") - nest.local_num_threads = self.params.get("n_jobs", 1) - nest.resolution = self.params.get("dt") - self.params["randseed"] = self.params.get( - "randseed", np.random.randint(1000000) - ) - nest.rng_seed = self.params.get("randseed") - # nest.print_time = True + nest.local_num_threads = self._params.get("n_vp", 4) + nest.resolution = self._params.get("dt") + self._params["randseed"] = self._params.get("randseed") + nest.rng_seed = self._params.get("randseed") def create_populations(self): """Create all neuron populations. - Q excitatory and inhibitory neuron populations with the parameters of the network are created. + n_clusters excitatory and inhibitory neuron populations with the parameters of the network are created. """ # make sure number of clusters and units are compatible - assert ( - self.params["N_E"] % self.params["Q"] == 0 - ), "N_E needs to be evenly divisible by Q" - assert ( - self.params["N_I"] % self.params["Q"] == 0 - ), "N_I needs to be evenly divisible by Q" - - N = self.params["N_E"] + self.params["N_I"] # total units - try: - DistParams = self.params["DistParams"] - except AttributeError: - DistParams = {"distribution": "normal", "sigma": 0.0, "fraction": False} - - if self.params["I_th_E"] is None: - I_xE = self.params["I_xE"] + if self._params["N_E"] % self._params["n_clusters"] != 0: + raise ValueError("N_E must be a multiple of Q") + if self._params["N_I"] % self._params["n_clusters"] != 0: + raise ValueError("N_E must be a multiple of Q") + if self._params["neuron_type"] != "iaf_psc_exp": + raise ValueError("Model only implemented for iaf_psc_exp neuron model") + + if self._params["I_th_E"] is None: + I_xE = self._params["I_xE"] # I_xE is the feed forward excitatory input in pA else: - I_xE = ( - self.params["I_th_E"] - * (self.params["V_th_E"] - self.params["E_L"]) - / self.params["tau_E"] - * self.params["C_m"] + I_xE = self._params["I_th_E"] * helper.rheobase_current( + self._params["tau_E"], self._params["E_L"], self._params["V_th_E"], self._params["C_m"] ) - if self.params["I_th_I"] is None: - I_xI = self.params["I_xI"] + if self._params["I_th_I"] is None: + I_xI = self._params["I_xI"] else: - I_xI = ( - self.params["I_th_I"] - * (self.params["V_th_I"] - self.params["E_L"]) - / self.params["tau_I"] - * self.params["C_m"] + I_xI = self._params["I_th_I"] * helper.rheobase_current( + self._params["tau_I"], self._params["E_L"], self._params["V_th_I"], self._params["C_m"] ) E_neuron_params = { - "E_L": self.params["E_L"], - "C_m": self.params["C_m"], - "tau_m": self.params["tau_E"], - "t_ref": self.params["t_ref"], - "V_th": self.params["V_th_E"], - "V_reset": self.params["V_r"], - "I_e": I_xE, + "E_L": self._params["E_L"], + "C_m": self._params["C_m"], + "tau_m": self._params["tau_E"], + "t_ref": self._params["t_ref"], + "V_th": self._params["V_th_E"], + "V_reset": self._params["V_r"], + "I_e": I_xE + if self._params["delta_I_xE"] == 0 + else I_xE * nest.random.uniform(1 - self._params["delta_I_xE"] / 2, 1 + self._params["delta_I_xE"] / 2), + "tau_syn_ex": self._params["tau_syn_ex"], + "tau_syn_in": self._params["tau_syn_in"], + "V_m": self._params["V_m"] + if not self._params["V_m"] == "rand" + else self._params["V_th_E"] - 20 * nest.random.lognormal(0, 1), } I_neuron_params = { - "E_L": self.params["E_L"], - "C_m": self.params["C_m"], - "tau_m": self.params["tau_I"], - "t_ref": self.params["t_ref"], - "V_th": self.params["V_th_I"], - "V_reset": self.params["V_r"], - "I_e": I_xI, + "E_L": self._params["E_L"], + "C_m": self._params["C_m"], + "tau_m": self._params["tau_I"], + "t_ref": self._params["t_ref"], + "V_th": self._params["V_th_I"], + "V_reset": self._params["V_r"], + "I_e": I_xI + if self._params["delta_I_xE"] == 0 + else I_xI * nest.random.uniform(1 - self._params["delta_I_xE"] / 2, 1 + self._params["delta_I_xE"] / 2), + "tau_syn_ex": self._params["tau_syn_ex"], + "tau_syn_in": self._params["tau_syn_in"], + "V_m": self._params["V_m"] + if not self._params["V_m"] == "rand" + else self._params["V_th_I"] - 20 * nest.random.lognormal(0, 1), } - if "iaf_psc_exp" in self.params["neuron_type"]: - E_neuron_params["tau_syn_ex"] = self.params["tau_syn_ex"] - E_neuron_params["tau_syn_in"] = self.params["tau_syn_in"] - I_neuron_params["tau_syn_in"] = self.params["tau_syn_in"] - I_neuron_params["tau_syn_ex"] = self.params["tau_syn_ex"] - - # iaf_psc_exp allows stochasticity, if not used - ignore - try: - if self.params["delta_"] is not None: - E_neuron_params["delta"] = self.params["delta_"] - I_neuron_params["delta"] = self.params["delta_"] - if self.params["rho"] is not None: - E_neuron_params["rho"] = self.params["rho"] - I_neuron_params["rho"] = self.params["rho"] - except KeyError: - pass - else: - assert ( - "iaf_psc_exp" in self.params["neuron_type"] - ), "iaf_psc_exp neuron model is the only implemented model" - - # create the neuron populations - E_pops = [] - I_pops = [] - for q in range(self.params["Q"]): - E_pops.append( - nest.Create( - self.params["neuron_type"], - int(self.params["N_E"] / self.params["Q"]), - ) - ) - nest.SetStatus(E_pops[-1], E_neuron_params) - for q in range(self.params["Q"]): - I_pops.append( - nest.Create( - self.params["neuron_type"], - int(self.params["N_I"] / self.params["Q"]), - ) - ) - nest.SetStatus(I_pops[-1], I_neuron_params) - - if self.params["delta_I_xE"] > 0: - for E_pop in E_pops: - I_xEs = nest.GetStatus(E_pop, "I_e") - nest.SetStatus( - E_pop, - [ - { - "I_e": ( - 1 - - 0.5 * self.params["delta_I_xE"] - + np.random.rand() * self.params["delta_I_xE"] - ) - * ixe - } - for ixe in I_xEs - ], - ) - - if self.params["delta_I_xI"] > 0: - for I_pop in I_pops: - I_xIs = nest.GetStatus(I_pop, "I_e") - nest.SetStatus( - I_pop, - [ - { - "I_e": ( - 1 - - 0.5 * self.params["delta_I_xI"] - + np.random.rand() * self.params["delta_I_xI"] - ) - * ixi - } - for ixi in I_xIs - ], - ) - if self.params["V_m"] == "rand": - T_0_E = self.params["t_ref"] + helper.fpt( - self.params["tau_E"], - self.params["E_L"], - I_xE, - self.params["C_m"], - self.params["V_th_E"], - self.params["V_r"], - ) - if np.isnan(T_0_E): - T_0_E = 10.0 - for E_pop in E_pops: - nest.SetStatus( - E_pop, - [ - { - "V_m": helper.v_fpt( - self.params["tau_E"], - self.params["E_L"], - I_xE, - self.params["C_m"], - T_0_E * np.random.rand(), - self.params["V_th_E"], - self.params["t_ref"], - ) - } - for i in range(len(E_pop)) - ], - ) - - T_0_I = self.params["t_ref"] + helper.fpt( - self.params["tau_I"], - self.params["E_L"], - I_xI, - self.params["C_m"], - self.params["V_th_I"], - self.params["V_r"], - ) - if np.isnan(T_0_I): - T_0_I = 10.0 - for I_pop in I_pops: - nest.SetStatus( - I_pop, - [ - { - "V_m": helper.v_fpt( - self.params["tau_I"], - self.params["E_L"], - I_xI, - self.params["C_m"], - T_0_I * np.random.rand(), - self.params["V_th_E"], - self.params["t_ref"], - ) - } - for i in range(len(I_pop)) - ], - ) - else: - nest.SetStatus( - nest.NodeCollection([x for x in range(1, N + 1)]), - [{"V_m": self.params["V_m"]} for i in range(N)], - ) - self.Populations = [E_pops, I_pops] + + # iaf_psc_exp allows stochasticity, if not used - ignore + if (self._params.get("delta") is not None) and (self._params.get("rho") is not None): + E_neuron_params["delta"] = self._params["delta"] + I_neuron_params["delta"] = self._params["delta"] + E_neuron_params["rho"] = self._params["rho"] + I_neuron_params["rho"] = self._params["rho"] + + # create the neuron populations + pop_size_E = self._params["N_E"] // self._params["n_clusters"] + pop_size_I = self._params["N_I"] // self._params["n_clusters"] + E_pops = [ + nest.Create(self._params["neuron_type"], n=pop_size_E, params=E_neuron_params) + for _ in range(self._params["n_clusters"]) + ] + I_pops = [ + nest.Create(self._params["neuron_type"], n=pop_size_I, params=I_neuron_params) + for _ in range(self._params["n_clusters"]) + ] + + self._populations = [E_pops, I_pops] def connect(self): """Connect the excitatory and inhibitory populations with each other in the EI-clustered scheme @@ -345,18 +192,13 @@ def connect(self): ValueError If the clustering method is not recognized """ - # if CLustering is set to "Weight" or is not set at all or is not in dictionary, use the connect_weight function - try: - if self.params["clustering"] == "weight": - self.connect_weight() - elif self.params["clustering"] == "probabilities": - self.connect_probabilities() - else: - raise ValueError( - "Clustering method %s not implemented" % self.params["clustering"] - ) - except KeyError: + + if "clustering" not in self._params or self._params["clustering"] == "weight": self.connect_weight() + elif self._params["clustering"] == "probabilities": + self.connect_probabilities() + else: + raise ValueError("Clustering method %s not implemented" % self._params["clustering"]) def connect_probabilities(self): """Connect the clusters with a probability EI-clustered scheme @@ -366,25 +208,23 @@ def connect_probabilities(self): connections between the clusters. The weights are calculated so that the total input to a neuron is balanced. """ - # self.Populations[0] -> Excitatory population - # self.Populations[1] -> Inhibitory population + # self._populations[0] -> Excitatory population + # self._populations[1] -> Inhibitory population # connectivity parameters - js = self.params["js"] # connection weights - N = self.params["N_E"] + self.params["N_I"] # total units + js = self._params["js"] # connection weights + N = self._params["N_E"] + self._params["N_I"] # total units if np.isnan(js).any(): - js = helper.calc_js(self.params) - js *= self.params["s"] + js = helper.calculate_RBN_weights(self._params) + js *= self._params["s"] - if self.params["Q"] > 1: - pminus = (self.params["Q"] - self.params["pplus"]) / float( - self.params["Q"] - 1 - ) + if self._params["n_clusters"] > 1: + pminus = (self._params["n_clusters"] - self._params["pplus"]) / float(self._params["n_clusters"] - 1) else: - self.params["pplus"] = np.ones((2, 2)) + self._params["pplus"] = np.ones((2, 2)) pminus = np.ones((2, 2)) - p_plus = self.params["pplus"] * self.params["ps"] - p_minus = pminus * self.params["ps"] + p_plus = self._params["pplus"] * self._params["baseline_conn_prob"] + p_minus = pminus * self._params["baseline_conn_prob"] iterations = np.ones((2, 2), dtype=int) # test if any of the probabilities is larger than 1 @@ -403,14 +243,12 @@ def connect_probabilities(self): # define the synapses and connect the populations # EE j_ee = js[0, 0] / np.sqrt(N) - nest.CopyModel( - "static_synapse", "EE", {"weight": j_ee, "delay": self.params["delay"]} - ) + nest.CopyModel("static_synapse", "EE", {"weight": j_ee, "delay": self._params["delay"]}) - if self.params["fixed_indegree"]: - K_EE_plus = int(p_plus[0, 0] * self.params["N_E"] / self.params["Q"]) + if self._params["fixed_indegree"]: + K_EE_plus = int(p_plus[0, 0] * self._params["N_E"] / self._params["n_clusters"]) print("K_EE+: ", K_EE_plus) - K_EE_minus = int(p_minus[0, 0] * self.params["N_E"] / self.params["Q"]) + K_EE_minus = int(p_minus[0, 0] * self._params["N_E"] / self._params["n_clusters"]) print("K_EE-: ", K_EE_minus) conn_params_EE_plus = { "rule": "fixed_indegree", @@ -438,8 +276,8 @@ def connect_probabilities(self): "allow_autapses": False, "allow_multapses": True, } - for i, pre in enumerate(self.Populations[0]): - for j, post in enumerate(self.Populations[0]): + for i, pre in enumerate(self._populations[0]): + for j, post in enumerate(self._populations[0]): if i == j: # same cluster for n in range(iterations[0, 0]): @@ -449,14 +287,12 @@ def connect_probabilities(self): # EI j_ei = js[0, 1] / np.sqrt(N) - nest.CopyModel( - "static_synapse", "EI", {"weight": j_ei, "delay": self.params["delay"]} - ) + nest.CopyModel("static_synapse", "EI", {"weight": j_ei, "delay": self._params["delay"]}) - if self.params["fixed_indegree"]: - K_EI_plus = int(p_plus[0, 1] * self.params["N_I"] / self.params["Q"]) + if self._params["fixed_indegree"]: + K_EI_plus = int(p_plus[0, 1] * self._params["N_I"] / self._params["n_clusters"]) print("K_EI+: ", K_EI_plus) - K_EI_minus = int(p_minus[0, 1] * self.params["N_I"] / self.params["Q"]) + K_EI_minus = int(p_minus[0, 1] * self._params["N_I"] / self._params["n_clusters"]) print("K_EI-: ", K_EI_minus) conn_params_EI_plus = { "rule": "fixed_indegree", @@ -484,8 +320,8 @@ def connect_probabilities(self): "allow_autapses": False, "allow_multapses": True, } - for i, pre in enumerate(self.Populations[1]): - for j, post in enumerate(self.Populations[0]): + for i, pre in enumerate(self._populations[1]): + for j, post in enumerate(self._populations[0]): if i == j: # same cluster for n in range(iterations[0, 1]): @@ -495,14 +331,12 @@ def connect_probabilities(self): # IE j_ie = js[1, 0] / np.sqrt(N) - nest.CopyModel( - "static_synapse", "IE", {"weight": j_ie, "delay": self.params["delay"]} - ) + nest.CopyModel("static_synapse", "IE", {"weight": j_ie, "delay": self._params["delay"]}) - if self.params["fixed_indegree"]: - K_IE_plus = int(p_plus[1, 0] * self.params["N_E"] / self.params["Q"]) + if self._params["fixed_indegree"]: + K_IE_plus = int(p_plus[1, 0] * self._params["N_E"] / self._params["n_clusters"]) print("K_IE+: ", K_IE_plus) - K_IE_minus = int(p_minus[1, 0] * self.params["N_E"] / self.params["Q"]) + K_IE_minus = int(p_minus[1, 0] * self._params["N_E"] / self._params["n_clusters"]) print("K_IE-: ", K_IE_minus) conn_params_IE_plus = { "rule": "fixed_indegree", @@ -530,8 +364,8 @@ def connect_probabilities(self): "allow_autapses": False, "allow_multapses": True, } - for i, pre in enumerate(self.Populations[0]): - for j, post in enumerate(self.Populations[1]): + for i, pre in enumerate(self._populations[0]): + for j, post in enumerate(self._populations[1]): if i == j: # same cluster for n in range(iterations[1, 0]): @@ -541,14 +375,12 @@ def connect_probabilities(self): # II j_ii = js[1, 1] / np.sqrt(N) - nest.CopyModel( - "static_synapse", "II", {"weight": j_ii, "delay": self.params["delay"]} - ) + nest.CopyModel("static_synapse", "II", {"weight": j_ii, "delay": self._params["delay"]}) - if self.params["fixed_indegree"]: - K_II_plus = int(p_plus[1, 1] * self.params["N_I"] / self.params["Q"]) + if self._params["fixed_indegree"]: + K_II_plus = int(p_plus[1, 1] * self._params["N_I"] / self._params["n_clusters"]) print("K_II+: ", K_II_plus) - K_II_minus = int(p_minus[1, 1] * self.params["N_I"] / self.params["Q"]) + K_II_minus = int(p_minus[1, 1] * self._params["N_I"] / self._params["n_clusters"]) print("K_II-: ", K_II_minus) conn_params_II_plus = { "rule": "fixed_indegree", @@ -576,8 +408,8 @@ def connect_probabilities(self): "allow_autapses": False, "allow_multapses": True, } - for i, pre in enumerate(self.Populations[1]): - for j, post in enumerate(self.Populations[1]): + for i, pre in enumerate(self._populations[1]): + for j, post in enumerate(self._populations[1]): if i == j: # same cluster for n in range(iterations[1, 1]): @@ -593,24 +425,22 @@ def connect_weight(self): connections between the clusters. The weights are calculated so that the total input to a neuron is balanced. """ - # self.Populations[0] -> Excitatory population - # self.Populations[1] -> Inhibitory population - # connectivity parameters - js = self.params["js"] # connection weights - N = self.params["N_E"] + self.params["N_I"] # total units + # self._populations[0] -> Excitatory population + # self._populations[1] -> Inhibitory population + + N = self._params["N_E"] + self._params["N_I"] # total units # if js are not given compute them so that sqrt(K) spikes equal v_thr-E_L and rows are balanced - if np.isnan(js).any(): - js = helper.calc_js(self.params) - js *= self.params["s"] + # if any of the js is nan or not given + if self._params.get("js") is None or np.isnan(self._params.get("js")).any(): + js = helper.calculate_RBN_weights(self._params) + js *= self._params["s"] # jminus is calculated so that row sums remain constant - if self.params["Q"] > 1: - jminus = (self.params["Q"] - self.params["jplus"]) / float( - self.params["Q"] - 1 - ) + if self._params["n_clusters"] > 1: + jminus = (self._params["n_clusters"] - self._params["jplus"]) / float(self._params["n_clusters"] - 1) else: - self.params["jplus"] = np.ones((2, 2)) + self._params["jplus"] = np.ones((2, 2)) jminus = np.ones((2, 2)) # define the synapses and connect the populations @@ -620,17 +450,17 @@ def connect_weight(self): "static_synapse", "EE_plus", { - "weight": self.params["jplus"][0, 0] * j_ee, - "delay": self.params["delay"], + "weight": self._params["jplus"][0, 0] * j_ee, + "delay": self._params["delay"], }, ) nest.CopyModel( "static_synapse", "EE_minus", - {"weight": jminus[0, 0] * j_ee, "delay": self.params["delay"]}, + {"weight": jminus[0, 0] * j_ee, "delay": self._params["delay"]}, ) - if self.params["fixed_indegree"]: - K_EE = int(self.params["ps"][0, 0] * self.params["N_E"] / self.params["Q"]) + if self._params["fixed_indegree"]: + K_EE = int(self._params["baseline_conn_prob"][0, 0] * self._params["N_E"] / self._params["n_clusters"]) print("K_EE: ", K_EE) conn_params_EE = { "rule": "fixed_indegree", @@ -642,12 +472,12 @@ def connect_weight(self): else: conn_params_EE = { "rule": "pairwise_bernoulli", - "p": self.params["ps"][0, 0], + "p": self._params["baseline_conn_prob"][0, 0], "allow_autapses": False, "allow_multapses": False, } - for i, pre in enumerate(self.Populations[0]): - for j, post in enumerate(self.Populations[0]): + for i, pre in enumerate(self._populations[0]): + for j, post in enumerate(self._populations[0]): if i == j: # same cluster nest.Connect(pre, post, conn_params_EE, "EE_plus") @@ -660,17 +490,17 @@ def connect_weight(self): "static_synapse", "EI_plus", { - "weight": j_ei * self.params["jplus"][0, 1], - "delay": self.params["delay"], + "weight": j_ei * self._params["jplus"][0, 1], + "delay": self._params["delay"], }, ) nest.CopyModel( "static_synapse", "EI_minus", - {"weight": j_ei * jminus[0, 1], "delay": self.params["delay"]}, + {"weight": j_ei * jminus[0, 1], "delay": self._params["delay"]}, ) - if self.params["fixed_indegree"]: - K_EI = int(self.params["ps"][0, 1] * self.params["N_I"] / self.params["Q"]) + if self._params["fixed_indegree"]: + K_EI = int(self._params["baseline_conn_prob"][0, 1] * self._params["N_I"] / self._params["n_clusters"]) print("K_EI: ", K_EI) conn_params_EI = { "rule": "fixed_indegree", @@ -681,12 +511,12 @@ def connect_weight(self): else: conn_params_EI = { "rule": "pairwise_bernoulli", - "p": self.params["ps"][0, 1], + "p": self._params["baseline_conn_prob"][0, 1], "allow_autapses": False, "allow_multapses": False, } - for i, pre in enumerate(self.Populations[1]): - for j, post in enumerate(self.Populations[0]): + for i, pre in enumerate(self._populations[1]): + for j, post in enumerate(self._populations[0]): if i == j: # same cluster nest.Connect(pre, post, conn_params_EI, "EI_plus") @@ -698,18 +528,18 @@ def connect_weight(self): "static_synapse", "IE_plus", { - "weight": j_ie * self.params["jplus"][1, 0], - "delay": self.params["delay"], + "weight": j_ie * self._params["jplus"][1, 0], + "delay": self._params["delay"], }, ) nest.CopyModel( "static_synapse", "IE_minus", - {"weight": j_ie * jminus[1, 0], "delay": self.params["delay"]}, + {"weight": j_ie * jminus[1, 0], "delay": self._params["delay"]}, ) - if self.params["fixed_indegree"]: - K_IE = int(self.params["ps"][1, 0] * self.params["N_E"] / self.params["Q"]) + if self._params["fixed_indegree"]: + K_IE = int(self._params["baseline_conn_prob"][1, 0] * self._params["N_E"] / self._params["n_clusters"]) print("K_IE: ", K_IE) conn_params_IE = { "rule": "fixed_indegree", @@ -720,12 +550,12 @@ def connect_weight(self): else: conn_params_IE = { "rule": "pairwise_bernoulli", - "p": self.params["ps"][1, 0], + "p": self._params["baseline_conn_prob"][1, 0], "allow_autapses": False, "allow_multapses": False, } - for i, pre in enumerate(self.Populations[0]): - for j, post in enumerate(self.Populations[1]): + for i, pre in enumerate(self._populations[0]): + for j, post in enumerate(self._populations[1]): if i == j: # same cluster nest.Connect(pre, post, conn_params_IE, "IE_plus") @@ -738,17 +568,17 @@ def connect_weight(self): "static_synapse", "II_plus", { - "weight": j_ii * self.params["jplus"][1, 1], - "delay": self.params["delay"], + "weight": j_ii * self._params["jplus"][1, 1], + "delay": self._params["delay"], }, ) nest.CopyModel( "static_synapse", "II_minus", - {"weight": j_ii * jminus[1, 1], "delay": self.params["delay"]}, + {"weight": j_ii * jminus[1, 1], "delay": self._params["delay"]}, ) - if self.params["fixed_indegree"]: - K_II = int(self.params["ps"][1, 1] * self.params["N_I"] / self.params["Q"]) + if self._params["fixed_indegree"]: + K_II = int(self._params["baseline_conn_prob"][1, 1] * self._params["N_I"] / self._params["n_clusters"]) print("K_II: ", K_II) conn_params_II = { "rule": "fixed_indegree", @@ -759,39 +589,36 @@ def connect_weight(self): else: conn_params_II = { "rule": "pairwise_bernoulli", - "p": self.params["ps"][1, 1], + "p": self._params["baseline_conn_prob"][1, 1], "allow_autapses": False, "allow_multapses": False, } - for i, pre in enumerate(self.Populations[1]): - for j, post in enumerate(self.Populations[1]): + for i, pre in enumerate(self._populations[1]): + for j, post in enumerate(self._populations[1]): if i == j: # same cluster nest.Connect(pre, post, conn_params_II, "II_plus") else: nest.Connect(pre, post, conn_params_II, "II_minus") - # print('Js: ', js / np.sqrt(N)) def create_stimulation(self): """Create a current source and connect it to clusters.""" - if self.params["stim_clusters"] is not None: - stim_amp = self.params[ - "stim_amp" - ] # amplitude of the stimulation current in pA - stim_starts = self.params["stim_starts"] # list of stimulation start times - stim_ends = self.params["stim_ends"] # list of stimulation end times + if self._params["stim_clusters"] is not None: + stim_amp = self._params["stim_amp"] # amplitude of the stimulation current in pA + stim_starts = self._params["stim_starts"] # list of stimulation start times + stim_ends = self._params["stim_ends"] # list of stimulation end times amplitude_values = [] amplitude_times = [] for start, end in zip(stim_starts, stim_ends): - amplitude_times.append(start + self.params["warmup"]) + amplitude_times.append(start + self._params["warmup"]) amplitude_values.append(stim_amp) - amplitude_times.append(end + self.params["warmup"]) + amplitude_times.append(end + self._params["warmup"]) amplitude_values.append(0.0) - self.Currentsources = [nest.Create("step_current_generator")] - for stim_cluster in self.params["stim_clusters"]: - nest.Connect(self.Currentsources[0], self.Populations[0][stim_cluster]) + self._currentsources = [nest.Create("step_current_generator")] + for stim_cluster in self._params["stim_clusters"]: + nest.Connect(self._currentsources[0], self._populations[0][stim_cluster]) nest.SetStatus( - self.Currentsources[0], + self._currentsources[0], { "amplitude_times": amplitude_times, "amplitude_values": amplitude_values, @@ -801,45 +628,40 @@ def create_stimulation(self): def create_recording_devices(self): """Creates a spike recorder - Create and connect a spike recorder to all neuron populations in self.Populations. + Create and connect a spike recorder to all neuron populations in self._populations. """ - self.RecordingDevices = [nest.Create("spike_recorder")] - self.RecordingDevices[0].record_to = "memory" + self._recording_devices = [nest.Create("spike_recorder")] + self._recording_devices[0].record_to = "memory" - all_units = self.Populations[0][0] - for E_pop in self.Populations[0][1:]: + all_units = self._populations[0][0] + for E_pop in self._populations[0][1:]: all_units += E_pop - for I_pop in self.Populations[1]: + for I_pop in self._populations[1]: all_units += I_pop - nest.Connect(all_units, self.RecordingDevices[0], "all_to_all") # Spikerecorder + nest.Connect(all_units, self._recording_devices[0], "all_to_all") # Spikerecorder def set_model_build_pipeline(self, Pipeline): - """Set ModelBuildPipeline + """Set _model_build_pipeline Parameters ---------- Pipeline: list ordered list of functions executed to build the network model """ - self.ModelBuildPipeline = Pipeline + self._model_build_pipeline = Pipeline def setup_network(self): """Setup network in NEST Initializes NEST and creates the network in NEST, ready to be simulated. - Functions saved in ModelBuildPipeline are executed. - nest.Prepare is executed in this function. + Functions saved in _model_build_pipeline are executed. """ - for func in self.ModelBuildPipeline: + for func in self._model_build_pipeline: func() - nest.Prepare() def simulate(self): """Simulates network for a period of warmup+simtime""" - if self.params["warmup"] + self.params["simtime"] <= 0.1: - pass - else: - nest.Run(self.params["warmup"] + self.params["simtime"]) + nest.Simulate(self._params["warmup"] + self._params["simtime"]) def get_recordings(self): """Extract spikes from Spikerecorder @@ -853,15 +675,13 @@ def get_recordings(self): spiketimes: ndarray 2D array [2xN_Spikes] of spiketimes with spiketimes in row 0 and neuron IDs in row 1. """ - events = nest.GetStatus(self.RecordingDevices[0], "events")[0] + events = nest.GetStatus(self._recording_devices[0], "events")[0] # convert them to the format accepted by spiketools - spiketimes = np.append( - events["times"][None, :], events["senders"][None, :], axis=0 - ) + spiketimes = np.append(events["times"][None, :], events["senders"][None, :], axis=0) spiketimes[1] -= 1 # remove the pre warmup spikes - spiketimes = spiketimes[:, spiketimes[0] >= self.params["warmup"]] - spiketimes[0] -= self.params["warmup"] + spiketimes = spiketimes[:, spiketimes[0] >= self._params["warmup"]] + spiketimes[0] -= self._params["warmup"] return spiketimes def get_parameter(self): @@ -871,7 +691,7 @@ def get_parameter(self): dict Dictionary with all parameters of the network and the simulation. """ - return self.params + return self._params def create_and_simulate(self): """Create and simulate the EI-clustered network. @@ -902,14 +722,10 @@ def get_firing_rates(self, spiketimes=None): """ if spiketimes is None: spiketimes = self.get_recordings() - e_count = spiketimes[:, spiketimes[1] < self.params["N_E"]].shape[1] - i_count = spiketimes[:, spiketimes[1] >= self.params["N_E"]].shape[1] - e_rate = ( - e_count / float(self.params["N_E"]) / float(self.params["simtime"]) * 1000.0 - ) - i_rate = ( - i_count / float(self.params["N_I"]) / float(self.params["simtime"]) * 1000.0 - ) + e_count = spiketimes[:, spiketimes[1] < self._params["N_E"]].shape[1] + i_count = spiketimes[:, spiketimes[1] >= self._params["N_E"]].shape[1] + e_rate = e_count / float(self._params["N_E"]) / float(self._params["simtime"]) * 1000.0 + i_rate = i_count / float(self._params["N_I"]) / float(self._params["simtime"]) * 1000.0 return e_rate, i_rate def set_I_x(self, I_XE, I_XI): @@ -924,10 +740,10 @@ def set_I_x(self, I_XE, I_XI): I_XI: float extra DC current for inhibitory neurons [pA] """ - for E_pop in self.Populations[0]: + for E_pop in self._populations[0]: I_e_loc = E_pop.get("I_e") E_pop.set({"I_e": I_e_loc + I_XE}) - for I_pop in self.Populations[1]: + for I_pop in self._populations[1]: I_e_loc = I_pop.get("I_e") I_pop.set({"I_e": I_e_loc + I_XI}) @@ -957,11 +773,9 @@ def get_simulation(self, PathSpikes=None): if PathSpikes is not None: with open(PathSpikes, "wb") as outfile: pickle.dump(spiketimes, outfile) - - nest.Cleanup() return { "e_rate": e_rate, "i_rate": i_rate, - "params": self.get_parameter(), + "_params": self.get_parameter(), "spiketimes": spiketimes, } From 1f7173c279a82f59d63dd2e58a8012f4d40dea13 Mon Sep 17 00:00:00 2001 From: schmitfe Date: Fri, 15 Mar 2024 11:12:28 +0100 Subject: [PATCH 14/23] Removed parameters --- .../EI_clustered_network/run_simulation.py | 55 ++++--------------- 1 file changed, 10 insertions(+), 45 deletions(-) diff --git a/pynest/examples/EI_clustered_network/run_simulation.py b/pynest/examples/EI_clustered_network/run_simulation.py index 9cc1519704..2d046400a4 100644 --- a/pynest/examples/EI_clustered_network/run_simulation.py +++ b/pynest/examples/EI_clustered_network/run_simulation.py @@ -27,63 +27,28 @@ """ import matplotlib.pyplot as plt -import numpy as np - -import default_parameters as default -import general_helper import network +from helper import raster_plot +from network_params import net_dict +from sim_params import sim_dict +from stimulus_params import stim_dict if __name__ == "__main__": - # set the parameters for the simulation - params = { - "n_jobs": 12, # number of threads used for parallelization in NEST - "N_E": 4000, # number of excitatory neurons - "N_I": 1000, # number of inhibitory neurons - "E_L": 0.0, # leak potential - "V_th_E": 20.0, # threshold potential for excitatory neurons - "V_th_I": 20.0, # threshold potential for inhibitory neurons - "V_r": 0.0, # reset potential - "C_m": 1.0, # membrane capacity - "tau_E": 20.0, # membrane time constant for excitatory neurons - "tau_I": 10.0, # membrane time constant for inhibitory neurons - "t_ref": 5.0, # refractory period - "ps": np.array([[0.2, 0.5], [0.5, 0.5]]), # connection probabilities - "ge": 1.2, # excitatory synaptic weight factor - "I_th_E": 1.25, # Background current for excitatory neurons in multiples of I_rheobase - "I_th_I": 0.78, # Background current for inhibitory neurons in multiples of I_rheobase - "dt": 0.1, # simulation time step - "neuron_type": "iaf_psc_exp", # neuron model used in NEST iaf and gif are available - "simtime": 10000, # simulation time in ms - "warmup": 1000, # warmup time in ms (time before recording starts) - "Q": 20, # number of clusters - "clustering": "weight", # type of clustering used 'weight' or - "stim_clusters": [2, 3, 4], # list of clusters which are stimulated - "stim_starts": [2000, 6000], # list of stimulation start times - "stim_ends": [3500, 7500], # list of stimulation end times - "stim_amp": 0.15, # amplitude of the stimulation current in pA - # 'probabilities' - } - - Rj = 0.82 # ration excitatory to inhibitory clustering - Rep = 6.0 # excitatory clustering strength - # Creates object which creates the EI clustered network in NEST - EI_Network = network.ClusteredNetwork.Clustered_Network_from_Rj_Rep( - Rj, Rep, default, params - ) + EI_Network = network.ClusteredNetwork(sim_dict, net_dict, stim_dict) # Runs the simulation and returns the spiketimes # get simulation initializes the network in NEST and runs the simulation # it returns a dict with the average rates, the spiketimes and the used parameters Result = EI_Network.get_simulation() - ax = general_helper.raster_plot( + ax = raster_plot( Result["spiketimes"], - tlim=(0, params["simtime"]), + tlim=(0, sim_dict["simtime"]), colorgroups=[ - ("k", 0, params["N_E"]), - ("darkred", params["N_E"], params["N_E"] + params["N_I"]), + ("k", 0, net_dict["N_E"]), + ("darkred", net_dict["N_E"], net_dict["N_E"] + net_dict["N_I"]), ], ) - plt.savefig("Rasterplot.png") + plt.savefig("clustered_ei_raster.png") print("Firing rate of excitatory neurons: " + str(Result["e_rate"]) + " Spikes/s") print("Firing rate of inhibitory neurons: " + str(Result["i_rate"]) + " Spikes/s") From ffb332321c62ae329ef58063f5f9b7e726cbaae6 Mon Sep 17 00:00:00 2001 From: schmitfe Date: Fri, 15 Mar 2024 11:13:03 +0100 Subject: [PATCH 15/23] Update to fit new structure --- pynest/examples/EI_clustered_network/README.rst | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/pynest/examples/EI_clustered_network/README.rst b/pynest/examples/EI_clustered_network/README.rst index 9368b868c4..ca6111f334 100644 --- a/pynest/examples/EI_clustered_network/README.rst +++ b/pynest/examples/EI_clustered_network/README.rst @@ -6,7 +6,7 @@ This is PyNEST implementation of the EI-clustered circuit model described by Ros .. figure:: /static/img/pynest/EI_clustered_network_schematic.png :alt: EI-clustered circuit model. - Schematic of the EI-clustered circuit model. The network consists of Q clusters with one excitatory and one inhibitory population each. + Schematic of the EI-clustered circuit model. The network consists of n_clusters clusters with one excitatory and one inhibitory population each. Citing this code ---------------- @@ -18,9 +18,10 @@ File structure * :doc:`run_simulation.py `: an example script to try out the EI-clustered circuit model * :doc:`network.py `: the main Network class with functions to build and simulate the network -* :doc:`helper.py `: helper functions for calculation of synaptic weights and currents -* :doc:`general_helper.py `: helper functions to merge dictionaries and plot function for raster plots -* :doc:`default_parameters.py `: default parameters for the network and simulation +* :doc:`helper.py `: helper functions for calculation of synaptic weights and currents and plot function for raster plots +* :doc:`network_params.py `: network and neuron parameters +* :doc:`stimulus_params.py `: parameters for optional external stimulation +* :doc:`sim_params.py `: simulation parameters Running the simulation ---------------------- @@ -29,13 +30,14 @@ Running the simulation python run_simulation.py -A raster plot of the network activity is saved as ``Rasterplot.png``. +A raster plot of the network activity is saved as ``clustered_ei_raster.png``. The code can be parallelized by using multiple threads during the NEST simulation. -This can be done by setting the parameter ``n_jobs`` in the ``run_simulation.py`` script. +This can be done by setting the parameter ``n_vp`` in the ``run_simulation.py`` script. Contributions to this PyNEST model implementation --------------------------------------------------------------- +------------------------------------------------- + 2023: inital bersion of code and documentation by Felix J. Schmitt, Vahid Rostami and Martin Nawrot. Acknowledgments From 61d37756f21fb72cf4a6aa787d5595bda81e1d7a Mon Sep 17 00:00:00 2001 From: schmitfe Date: Fri, 15 Mar 2024 13:07:17 +0100 Subject: [PATCH 16/23] Corrected typo --- pynest/examples/EI_clustered_network/README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pynest/examples/EI_clustered_network/README.rst b/pynest/examples/EI_clustered_network/README.rst index ca6111f334..63e0949f5c 100644 --- a/pynest/examples/EI_clustered_network/README.rst +++ b/pynest/examples/EI_clustered_network/README.rst @@ -38,7 +38,7 @@ This can be done by setting the parameter ``n_vp`` in the ``run_simulation.py`` Contributions to this PyNEST model implementation ------------------------------------------------- -2023: inital bersion of code and documentation by Felix J. Schmitt, Vahid Rostami and Martin Nawrot. +2023: initial version of code and documentation by Felix J. Schmitt, Vahid Rostami and Martin Nawrot. Acknowledgments --------------- From 998daf67b613cf129b1bf12c2700d91282ae2c8e Mon Sep 17 00:00:00 2001 From: schmitfe Date: Fri, 15 Mar 2024 13:08:31 +0100 Subject: [PATCH 17/23] Limit line length to pep8 in comments --- .../examples/EI_clustered_network/helper.py | 41 ++++++--- .../examples/EI_clustered_network/network.py | 92 ++++++++++++------- .../EI_clustered_network/network_params.py | 16 ++-- .../EI_clustered_network/run_simulation.py | 10 +- .../EI_clustered_network/stimulus_params.py | 2 +- 5 files changed, 106 insertions(+), 55 deletions(-) diff --git a/pynest/examples/EI_clustered_network/helper.py b/pynest/examples/EI_clustered_network/helper.py index bf9e05e608..ab78ce7cb6 100644 --- a/pynest/examples/EI_clustered_network/helper.py +++ b/pynest/examples/EI_clustered_network/helper.py @@ -22,7 +22,7 @@ """PyNEST EI-clustered network: Helper Functions ------------------------------------------------ -Helper functions to calculate synaptic weights and first passage times for exponential synapses to construct +Helper functions to calculate synaptic weights to construct random balanced networks and plot raster plot with color groups. """ @@ -33,7 +33,8 @@ def postsynaptic_current_to_potential(tau_m, tau_syn, c_m=1.0, e_l=0.0): - """Maximum post-synaptic potential amplitude for exponential synapses and a synaptic efficacy J of 1 pA. + """Maximum post-synaptic potential amplitude + for exponential synapses and a synaptic efficacy J of 1 pA. Parameters ---------- @@ -51,13 +52,26 @@ def postsynaptic_current_to_potential(tau_m, tau_syn, c_m=1.0, e_l=0.0): float maximum psp amplitude (for a 1 pA current spike) [mV] """ - tmax = np.log(tau_syn / tau_m) / (1 / tau_m - 1 / tau_syn) # time of maximum deflection of the psp [ms] - pre = tau_m * tau_syn / c_m / (tau_syn - tau_m) # we assume here the current spike is 1 pA, otherwise [mV/pA] + # time of maximum deflection of the psp [ms] + tmax = np.log(tau_syn / tau_m) / (1 / tau_m - 1 / tau_syn) + # we assume here the current spike is 1 pA, otherwise [mV/pA] + pre = tau_m * tau_syn / c_m / (tau_syn - tau_m) return (e_l - pre) * np.exp(-tmax / tau_m) + pre * np.exp(-tmax / tau_syn) def calculate_RBN_weights(params): - """Calculate synaptic weights for exponential synapses before clustering, for a random balanced network. + """Calculate synaptic weights for a random balanced network. + + The synaptic weights are calculated according to the method + described in Eqs. 7-10 [1]_. + + References + ---------- + .. [1] Rostami V, Rost T, Riehle A, van Albada SJ and Nawrot MP. 2020. + Excitatory and inhibitory motor cortical clusters account for balance, + variability, and task performance. bioRxiv 2020.02.27.968339. + DOI: `10.1101/2020.02.27.968339 + `__. Parameters ---------- @@ -99,7 +113,7 @@ def calculate_RBN_weights(params): def rheobase_current(tau_m, e_l, v_th, c_m): - """Rheobase current for a given membrane time constant and resting potential. + """Rheobase current for membrane time constant and resting potential. Parameters ---------- @@ -123,19 +137,24 @@ def rheobase_current(tau_m, e_l, v_th, c_m): def raster_plot(spiketimes, tlim=None, colorgroups=None, ax=None, markersize=0.5): """Raster plot of spiketimes. - Plots raster plot of spiketimes withing given time limits and colors neurons according to colorgroups. + Plots raster plot of spiketimes withing given time limits and + colors neurons according to colorgroups. Parameters ---------- spiketimes: ndarray - 2D array [2xN_Spikes] of spiketimes with spiketimes in row 0 and neuron IDs in row 1. + 2D array [2xN_Spikes] + of spiketimes with spiketimes in row 0 and neuron IDs in row 1. tlim: list of floats (optional) - Time limits of plot: [tmin, tmax], if None: [min(spiketimes), max(spiketimes)] + Time limits of plot: [tmin, tmax], + if None: [min(spiketimes), max(spiketimes)] colorgroups: list of tuples (optional) - Each element is a tuple in the format (color, start_neuron_ID, stop_neuron_ID]) for coloring neurons in + Each element is a tuple in the format + (color, start_neuron_ID, stop_neuron_ID]) for coloring neurons in given range, if None is given all neurons are black. ax: axis object (optional) - If None a new figure is created, else the plot is added to the given axis. + If None a new figure is created, + else the plot is added to the given axis. markersize: float (optional) Size of markers. (default: 0.5) diff --git a/pynest/examples/EI_clustered_network/network.py b/pynest/examples/EI_clustered_network/network.py index 905b48ae58..ac27a8a4f2 100644 --- a/pynest/examples/EI_clustered_network/network.py +++ b/pynest/examples/EI_clustered_network/network.py @@ -22,7 +22,8 @@ """PyNEST EI-clustered network: Network Class --------------------------------------------- -``ClusteredNetwork`` class with functions to build and simulate the EI-clustered network. +``ClusteredNetwork`` class with functions to build and simulate +the EI-clustered network. """ import pickle @@ -35,8 +36,10 @@ class ClusteredNetwork: """EI-clustered network objeect to build and simulate the network. - Provides functions to create neuron populations, stimulation devices and recording devices for an - EI-clustered network and setups the simulation in NEST (v3.x). + Provides functions to create neuron populations, + stimulation devices and recording devices for an + EI-clustered network and setups the simulation in + NEST (v3.x). Attributes ---------- @@ -55,7 +58,8 @@ class ClusteredNetwork: def __init__(self, sim_dict, net_dict, stim_dict): """Initialize the ClusteredNetwork object. - Parameters are given and explained in the files network_params.py, sim_params.py and stimulus_params.py. + Parameters are given and explained in the files network_params.py, + sim_params.py and stimulus_params.py. Parameters ---------- @@ -67,8 +71,9 @@ def __init__(self, sim_dict, net_dict, stim_dict): Dictionary with stimulus parameters. """ # merge dictionaries of simulation, network and stimulus parameters - self._params = {**sim_dict, **net_dict, **stim_dict} # loo - self._populations = [] # list of neuron population groups [E_pops, I_pops] + self._params = {**sim_dict, **net_dict, **stim_dict} + # list of neuron population groups [E_pops, I_pops] + self._populations = [] self._recording_devices = [] self._currentsources = [] self._model_build_pipeline = [ @@ -94,7 +99,8 @@ def setup_nest(self): """Initializes the NEST kernel. Reset the NEST kernel and pass parameters to it. - Updates randseed of parameters to the actual used one if none is supplied. + Updates randseed of parameters to the actual + used one if none is supplied. """ nest.ResetKernel() nest.set_verbosity("M_WARNING") @@ -106,7 +112,8 @@ def setup_nest(self): def create_populations(self): """Create all neuron populations. - n_clusters excitatory and inhibitory neuron populations with the parameters of the network are created. + n_clusters excitatory and inhibitory neuron populations + with the parameters of the network are created. """ # make sure number of clusters and units are compatible if self._params["N_E"] % self._params["n_clusters"] != 0: @@ -185,7 +192,8 @@ def create_populations(self): self._populations = [E_pops, I_pops] def connect(self): - """Connect the excitatory and inhibitory populations with each other in the EI-clustered scheme + """Connect the excitatory and inhibitory populations with each other + in the EI-clustered scheme Raises ------ @@ -203,10 +211,11 @@ def connect(self): def connect_probabilities(self): """Connect the clusters with a probability EI-clustered scheme - Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme - by increasing the probabilies of the connections within the clusters and decreasing the probabilites of the - connections between the clusters. The weights are calculated so that the total input to a neuron - is balanced. + Connects the excitatory and inhibitory populations with each other + in the EI-clustered scheme by increasing the probabilities of the + connections within the clusters and decreasing the probabilities of the + connections between the clusters. The weights are calculated so that + the total input to a neuron is balanced. """ # self._populations[0] -> Excitatory population # self._populations[1] -> Inhibitory population @@ -420,10 +429,11 @@ def connect_probabilities(self): def connect_weight(self): """Connect the clusters with a weight EI-clustered scheme - Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme - by increasing the weights of the connections within the clusters and decreasing the weights of the - connections between the clusters. The weights are calculated so that the total input to a neuron - is balanced. + Connects the excitatory and inhibitory populations with + each other in the EI-clustered scheme by increasing the weights + of the connections within the clusters and decreasing the weights + of the connections between the clusters. The weights are calculated + so that the total input to a neuron is balanced. """ # self._populations[0] -> Excitatory population # self._populations[1] -> Inhibitory population @@ -628,7 +638,8 @@ def create_stimulation(self): def create_recording_devices(self): """Creates a spike recorder - Create and connect a spike recorder to all neuron populations in self._populations. + Create and connect a spike recorder to all neuron populations + in self._populations. """ self._recording_devices = [nest.Create("spike_recorder")] self._recording_devices[0].record_to = "memory" @@ -653,7 +664,8 @@ def set_model_build_pipeline(self, Pipeline): def setup_network(self): """Setup network in NEST - Initializes NEST and creates the network in NEST, ready to be simulated. + Initializes NEST and creates + the network in NEST, ready to be simulated. Functions saved in _model_build_pipeline are executed. """ for func in self._model_build_pipeline: @@ -666,14 +678,17 @@ def simulate(self): def get_recordings(self): """Extract spikes from Spikerecorder - Extract spikes form the Spikerecorder connected to all populations created in create_populations. + Extract spikes form the Spikerecorder connected + to all populations created in create_populations. Cuts the warmup period away and sets time relative to end of warmup. - Ids 1:N_E correspond to excitatory neurons, N_E+1:N_E+N_I correspond to inhibitory neurons. + Ids 1:N_E correspond to excitatory neurons, + N_E+1:N_E+N_I correspond to inhibitory neurons. Returns ------- spiketimes: ndarray - 2D array [2xN_Spikes] of spiketimes with spiketimes in row 0 and neuron IDs in row 1. + 2D array [2xN_Spikes] + of spiketimes with spiketimes in row 0 and neuron IDs in row 1. """ events = nest.GetStatus(self._recording_devices[0], "events")[0] # convert them to the format accepted by spiketools @@ -699,26 +714,33 @@ def create_and_simulate(self): Returns ------- spiketimes: ndarray - 2D array [2xN_Spikes] of spiketimes with spiketimes in row 0 and neuron IDs in row 1. + 2D array [2xN_Spikes] + of spiketimes with spiketimes in row 0 and neuron IDs in row 1. """ self.setup_network() self.simulate() return self.get_recordings() def get_firing_rates(self, spiketimes=None): - """Calculates the firing rates of all excitatory neurons and the firing rates of all inhibitory neurons. + """Calculates the average firing rates of + all excitatory and inhibitory neurons. + + Calculates the firing rates of all excitatory neurons + and the firing rates of all inhibitory neurons + created by self.create_populations. + If spiketimes are not supplied, they get extracted. - Calculates the firing rates of all excitatory neurons and the firing rates of all inhibitory neurons - created by self.create_populations. If spiketimes are not supplied, they get extracted. Parameters ---------- spiketimes: ndarray - 2D array [2xN_Spikes] of spiketimes with spiketimes in row 0 and neuron IDs in row 1. + 2D array [2xN_Spikes] of spiketimes + with spiketimes in row 0 and neuron IDs in row 1. Returns ------- tuple[float, float] - average firing rates of excitatory (0) and inhibitory (1) neurons (spikes/s) + average firing rates of excitatory (0) + and inhibitory (1) neurons (spikes/s) """ if spiketimes is None: spiketimes = self.get_recordings() @@ -730,7 +752,8 @@ def get_firing_rates(self, spiketimes=None): def set_I_x(self, I_XE, I_XI): """Set DC currents for excitatory and inhibitory neurons - Adds DC currents for the excitatory and inhibitory neurons. The DC currents are added to the currents already + Adds DC currents for the excitatory and inhibitory neurons. + The DC currents are added to the currents already present in the populations. Parameters @@ -750,9 +773,11 @@ def set_I_x(self, I_XE, I_XI): def get_simulation(self, PathSpikes=None): """Create network, simulate and return results - Creates the EI-clustered network and simulates it with the parameters supplied in the object creation. - Returns a dictionary with firing rates, timing information (dict) and parameters (dict). If PathSpikes is - supplied the spikes get saved to a pickle file. + Creates the EI-clustered network and simulates it with + the parameters supplied in the object creation. + Returns a dictionary with firing rates, + timing information (dict) and parameters (dict). + If PathSpikes is supplied the spikes get saved to a pickle file. Parameters ---------- @@ -762,7 +787,8 @@ def get_simulation(self, PathSpikes=None): Returns ------- dict - Dictionary with firing rates, spiketimes (ndarray) and parameters (dict) + Dictionary with firing rates, + spiketimes (ndarray) and parameters (dict) """ self.setup_network() diff --git a/pynest/examples/EI_clustered_network/network_params.py b/pynest/examples/EI_clustered_network/network_params.py index 7122e13b51..0521cddc2a 100644 --- a/pynest/examples/EI_clustered_network/network_params.py +++ b/pynest/examples/EI_clustered_network/network_params.py @@ -60,7 +60,8 @@ "I_th_E": 1.25, # Feed forward inhibitory input [rheobase current] "I_th_I": 0.78, - # distribution of feed forward input, uniform around I_th with half width I_width + # distribution of feed forward input, + # I_th*[1-delta_I_../2, 1+delta_I_../2] "delta_I_xE": 0.0, # excitatory "delta_I_xI": 0.0, # inhibitory # initial membrane potential @@ -83,15 +84,18 @@ "gei": 1.2, # I to E "gie": 1.0, # E to I "gii": 1.0, # I to I - # additional scaling factor for all weights - can be used to scale weights with network size + # additional scaling factor for all weights + # - can be used to scale weights with network size "s": 1.0, - # fixed indegree - if false the synapses are established with probability ps + # fixed indegree - otherwise established with probability ps "fixed_indegree": False, - # cluster network by weight or connection probability - "weight" or "probabilities" + # cluster network by "weight" or "probabilities" "clustering": "weight", - # ratio excitatory to inhibitory clustering, rj = 0 means no clustering, which resembles a clustered network + # ratio excitatory to inhibitory clustering, + # rj = 0 means no clustering, which resembles a clustered network # with a blanket of inhibition "rj": 0.82, - # excitatory clustering factor, rep = 1 means no clustering, reselmbles a balanced random network + # excitatory clustering factor, + # rep = 1 means no clustering, reselmbles a balanced random network "rep": 6.0, } diff --git a/pynest/examples/EI_clustered_network/run_simulation.py b/pynest/examples/EI_clustered_network/run_simulation.py index 2d046400a4..7fd7bf9ba2 100644 --- a/pynest/examples/EI_clustered_network/run_simulation.py +++ b/pynest/examples/EI_clustered_network/run_simulation.py @@ -22,8 +22,8 @@ """PyNEST EI-clustered network: Run Simulation ----------------------------------------------- -This is an example script for running the EI-clustered model with two stimulations -and generating a raster plot. +This is an example script for running the EI-clustered model +with two stimulations and generating a raster plot. """ import matplotlib.pyplot as plt @@ -38,8 +38,10 @@ EI_Network = network.ClusteredNetwork(sim_dict, net_dict, stim_dict) # Runs the simulation and returns the spiketimes - # get simulation initializes the network in NEST and runs the simulation - # it returns a dict with the average rates, the spiketimes and the used parameters + # get simulation initializes the network in NEST + # and runs the simulation + # it returns a dict with the average rates, + # the spiketimes and the used parameters Result = EI_Network.get_simulation() ax = raster_plot( Result["spiketimes"], diff --git a/pynest/examples/EI_clustered_network/stimulus_params.py b/pynest/examples/EI_clustered_network/stimulus_params.py index a78f430be4..f5110a11e5 100644 --- a/pynest/examples/EI_clustered_network/stimulus_params.py +++ b/pynest/examples/EI_clustered_network/stimulus_params.py @@ -27,7 +27,7 @@ """ stim_dict = { - # list of clusters to be stimulated (None for no stimulation, 0-n_clusters-1) + # list of clusters to be stimulated (None: no stimulation, 0-n_clusters-1) "stim_clusters": [2, 3, 4], # stimulus amplitude (in pA) "stim_amp": 0.15, From 8011d4877f6d7d3a51b40cda6084c3b937615044 Mon Sep 17 00:00:00 2001 From: Felix Schmitt Date: Mon, 8 Apr 2024 16:03:01 +0200 Subject: [PATCH 18/23] Apply suggestions from code review Co-authored-by: Hans Ekkehard Plesser --- .../examples/EI_clustered_network/README.rst | 2 +- .../examples/EI_clustered_network/helper.py | 19 +++++++++++++------ .../EI_clustered_network/network_params.py | 1 + .../EI_clustered_network/run_simulation.py | 8 ++++---- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/pynest/examples/EI_clustered_network/README.rst b/pynest/examples/EI_clustered_network/README.rst index 63e0949f5c..cfa485fd96 100644 --- a/pynest/examples/EI_clustered_network/README.rst +++ b/pynest/examples/EI_clustered_network/README.rst @@ -17,7 +17,7 @@ File structure -------------- * :doc:`run_simulation.py `: an example script to try out the EI-clustered circuit model -* :doc:`network.py `: the main Network class with functions to build and simulate the network +* :doc:`network.py `: the main ``Network`` class with functions to build and simulate the network * :doc:`helper.py `: helper functions for calculation of synaptic weights and currents and plot function for raster plots * :doc:`network_params.py `: network and neuron parameters * :doc:`stimulus_params.py `: parameters for optional external stimulation diff --git a/pynest/examples/EI_clustered_network/helper.py b/pynest/examples/EI_clustered_network/helper.py index ab78ce7cb6..9205b02af0 100644 --- a/pynest/examples/EI_clustered_network/helper.py +++ b/pynest/examples/EI_clustered_network/helper.py @@ -83,24 +83,31 @@ def calculate_RBN_weights(params): ndarray synaptic weights 2x2 matrix [[EE, EI], [IE, II]] """ + N_E = params.get("N_E") # excitatory units N_I = params.get("N_I") # inhibitory units N = N_E + N_I # total units - baseline_conn_prob = params.get("baseline_conn_prob") # connection probs - gei = params.get("gei") - gii = params.get("gii") - gie = params.get("gie") + + E_L = params.get("E_L") V_th_E = params.get("V_th_E") # threshold voltage V_th_I = params.get("V_th_I") + tau_E = params.get("tau_E") tau_I = params.get("tau_I") - E_L = params.get("E_L") + tau_syn_ex = params.get("tau_syn_ex") tau_syn_in = params.get("tau_syn_in") + + gei = params.get("gei") + gii = params.get("gii") + gie = params.get("gie") + amp_EE = postsynaptic_current_to_potential(tau_E, tau_syn_ex) amp_EI = postsynaptic_current_to_potential(tau_E, tau_syn_in) amp_IE = postsynaptic_current_to_potential(tau_I, tau_syn_ex) - amp_II = postsynaptic_current_to_potential(tau_I, tau_syn_in) + amp_II = postsynaptic_current_to_potential(tau_I, tau_syn_in) + + baseline_conn_prob = params.get("baseline_conn_prob") # connection probs js = np.zeros((2, 2)) K_EE = N_E * baseline_conn_prob[0, 0] diff --git a/pynest/examples/EI_clustered_network/network_params.py b/pynest/examples/EI_clustered_network/network_params.py index 0521cddc2a..1daa143ebb 100644 --- a/pynest/examples/EI_clustered_network/network_params.py +++ b/pynest/examples/EI_clustered_network/network_params.py @@ -66,6 +66,7 @@ "delta_I_xI": 0.0, # inhibitory # initial membrane potential "V_m": "rand", + ############################################ # network parameters ############################################ diff --git a/pynest/examples/EI_clustered_network/run_simulation.py b/pynest/examples/EI_clustered_network/run_simulation.py index 7fd7bf9ba2..81568c7b5f 100644 --- a/pynest/examples/EI_clustered_network/run_simulation.py +++ b/pynest/examples/EI_clustered_network/run_simulation.py @@ -35,14 +35,14 @@ if __name__ == "__main__": # Creates object which creates the EI clustered network in NEST - EI_Network = network.ClusteredNetwork(sim_dict, net_dict, stim_dict) + ei_network = network.ClusteredNetwork(sim_dict, net_dict, stim_dict) # Runs the simulation and returns the spiketimes # get simulation initializes the network in NEST # and runs the simulation # it returns a dict with the average rates, # the spiketimes and the used parameters - Result = EI_Network.get_simulation() + result = ei_network.get_simulation() ax = raster_plot( Result["spiketimes"], tlim=(0, sim_dict["simtime"]), @@ -52,5 +52,5 @@ ], ) plt.savefig("clustered_ei_raster.png") - print("Firing rate of excitatory neurons: " + str(Result["e_rate"]) + " Spikes/s") - print("Firing rate of inhibitory neurons: " + str(Result["i_rate"]) + " Spikes/s") + print(f"Firing rate of excitatory neurons: {result['e_rate']:6.2f} spikes/s") + print(f"Firing rate of inhibitory neurons: {result['i_rate']:6.2f} spikes/s") From c340d594ee933142cd1807b9fe15de8a2387f497 Mon Sep 17 00:00:00 2001 From: Felix Schmitt Date: Mon, 8 Apr 2024 16:08:01 +0200 Subject: [PATCH 19/23] Apply suggestions from code review Co-authored-by: Hans Ekkehard Plesser --- doc/htmldoc/examples/index.rst | 2 +- pynest/examples/EI_clustered_network/network.py | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/doc/htmldoc/examples/index.rst b/doc/htmldoc/examples/index.rst index 7b8a0fb6aa..4ae21f495d 100644 --- a/doc/htmldoc/examples/index.rst +++ b/doc/htmldoc/examples/index.rst @@ -82,7 +82,7 @@ PyNEST examples - .. grid-item-card:: EI clustered network (Rostami) + .. grid-item-card:: EI clustered network (Rostami et al) :img-top: ../static/img/pynest/EI_clustered_network_schematic.png :doc:`../auto_examples/EI_clustered_network/index` diff --git a/pynest/examples/EI_clustered_network/network.py b/pynest/examples/EI_clustered_network/network.py index ac27a8a4f2..0449df488c 100644 --- a/pynest/examples/EI_clustered_network/network.py +++ b/pynest/examples/EI_clustered_network/network.py @@ -70,6 +70,7 @@ def __init__(self, sim_dict, net_dict, stim_dict): stim_dict: dict Dictionary with stimulus parameters. """ + # merge dictionaries of simulation, network and stimulus parameters self._params = {**sim_dict, **net_dict, **stim_dict} # list of neuron population groups [E_pops, I_pops] @@ -102,6 +103,7 @@ def setup_nest(self): Updates randseed of parameters to the actual used one if none is supplied. """ + nest.ResetKernel() nest.set_verbosity("M_WARNING") nest.local_num_threads = self._params.get("n_vp", 4) @@ -115,6 +117,7 @@ def create_populations(self): n_clusters excitatory and inhibitory neuron populations with the parameters of the network are created. """ + # make sure number of clusters and units are compatible if self._params["N_E"] % self._params["n_clusters"] != 0: raise ValueError("N_E must be a multiple of Q") @@ -651,15 +654,15 @@ def create_recording_devices(self): all_units += I_pop nest.Connect(all_units, self._recording_devices[0], "all_to_all") # Spikerecorder - def set_model_build_pipeline(self, Pipeline): + def set_model_build_pipeline(self, pipeline): """Set _model_build_pipeline Parameters ---------- - Pipeline: list + pipeline: list ordered list of functions executed to build the network model """ - self._model_build_pipeline = Pipeline + self._model_build_pipeline = pipeline def setup_network(self): """Setup network in NEST From 6a0c95c2c10ae0b43b0ce7191e2affb50dc4adab Mon Sep 17 00:00:00 2001 From: Felix Schmitt Date: Mon, 8 Apr 2024 16:20:18 +0200 Subject: [PATCH 20/23] Apply suggestions from code review Co-authored-by: Hans Ekkehard Plesser --- pynest/examples/EI_clustered_network/network_params.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pynest/examples/EI_clustered_network/network_params.py b/pynest/examples/EI_clustered_network/network_params.py index 1daa143ebb..1ee398c5e1 100644 --- a/pynest/examples/EI_clustered_network/network_params.py +++ b/pynest/examples/EI_clustered_network/network_params.py @@ -64,7 +64,7 @@ # I_th*[1-delta_I_../2, 1+delta_I_../2] "delta_I_xE": 0.0, # excitatory "delta_I_xI": 0.0, # inhibitory - # initial membrane potential + # initial membrane potential: either a float (in mV) to initialize all neurons to a fixed value or "rand" for randomized values "V_m": "rand", ############################################ From dbe76ed3efbc850f8a97950dbedd5433f94580fc Mon Sep 17 00:00:00 2001 From: schmitfe Date: Mon, 8 Apr 2024 16:56:06 +0200 Subject: [PATCH 21/23] Requested changes from code review --- .../examples/EI_clustered_network/helper.py | 14 +++-- .../examples/EI_clustered_network/network.py | 52 ++++++++++++------- .../EI_clustered_network/network_params.py | 4 +- .../EI_clustered_network/run_simulation.py | 2 +- 4 files changed, 42 insertions(+), 30 deletions(-) diff --git a/pynest/examples/EI_clustered_network/helper.py b/pynest/examples/EI_clustered_network/helper.py index 9205b02af0..902535849e 100644 --- a/pynest/examples/EI_clustered_network/helper.py +++ b/pynest/examples/EI_clustered_network/helper.py @@ -29,8 +29,6 @@ import matplotlib.pyplot as plt import numpy as np -small = 1e-10 - def postsynaptic_current_to_potential(tau_m, tau_syn, c_m=1.0, e_l=0.0): """Maximum post-synaptic potential amplitude @@ -91,22 +89,22 @@ def calculate_RBN_weights(params): E_L = params.get("E_L") V_th_E = params.get("V_th_E") # threshold voltage V_th_I = params.get("V_th_I") - + tau_E = params.get("tau_E") tau_I = params.get("tau_I") - + tau_syn_ex = params.get("tau_syn_ex") tau_syn_in = params.get("tau_syn_in") - + gei = params.get("gei") gii = params.get("gii") gie = params.get("gie") - + amp_EE = postsynaptic_current_to_potential(tau_E, tau_syn_ex) amp_EI = postsynaptic_current_to_potential(tau_E, tau_syn_in) amp_IE = postsynaptic_current_to_potential(tau_I, tau_syn_ex) - amp_II = postsynaptic_current_to_potential(tau_I, tau_syn_in) - + amp_II = postsynaptic_current_to_potential(tau_I, tau_syn_in) + baseline_conn_prob = params.get("baseline_conn_prob") # connection probs js = np.zeros((2, 2)) diff --git a/pynest/examples/EI_clustered_network/network.py b/pynest/examples/EI_clustered_network/network.py index 0449df488c..306014db17 100644 --- a/pynest/examples/EI_clustered_network/network.py +++ b/pynest/examples/EI_clustered_network/network.py @@ -173,7 +173,8 @@ def create_populations(self): else self._params["V_th_I"] - 20 * nest.random.lognormal(0, 1), } - # iaf_psc_exp allows stochasticity, if not used - ignore + # iaf_psc_exp allows stochasticity, if not used - don't supply the parameters and use + # iaf_psc_exp as deterministic model if (self._params.get("delta") is not None) and (self._params.get("rho") is not None): E_neuron_params["delta"] = self._params["delta"] I_neuron_params["delta"] = self._params["delta"] @@ -212,7 +213,7 @@ def connect(self): raise ValueError("Clustering method %s not implemented" % self._params["clustering"]) def connect_probabilities(self): - """Connect the clusters with a probability EI-clustered scheme + """Connect the clusters with a probability EI-cluster scheme Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme by increasing the probabilities of the @@ -220,12 +221,14 @@ def connect_probabilities(self): connections between the clusters. The weights are calculated so that the total input to a neuron is balanced. """ + # self._populations[0] -> Excitatory population # self._populations[1] -> Inhibitory population - # connectivity parameters - js = self._params["js"] # connection weights + N = self._params["N_E"] + self._params["N_I"] # total units - if np.isnan(js).any(): + # if js are not given compute them so that sqrt(K) spikes equal v_thr-E_L and rows are balanced + # if any of the js is nan or not given + if self._params.get("js") is None or np.isnan(self._params.get("js")).any(): js = helper.calculate_RBN_weights(self._params) js *= self._params["s"] @@ -238,22 +241,30 @@ def connect_probabilities(self): p_plus = self._params["pplus"] * self._params["baseline_conn_prob"] p_minus = pminus * self._params["baseline_conn_prob"] + # Connection probabilities within clusters can exceed 1. In this case, we iteratively split + # the connections in multiple synapse populations with probabilities < 1. iterations = np.ones((2, 2), dtype=int) # test if any of the probabilities is larger than 1 if np.any(p_plus > 1): - print("The probability of connection is larger than 1") - print("p_plus: ", p_plus) - print("p_minus: ", p_minus) + print("The probability of some connections is larger than 1.") + print("Pre-splitting the connections in multiple synapse populations:") + printoptions = np.get_printoptions() + np.set_printoptions(precision=2, floatmode="fixed") + print("p_plus:\n", p_plus) + print("p_minus:\n", p_minus) for i in range(2): for j in range(2): if p_plus[i, j] > 1: iterations[i, j] = int(np.ceil(p_plus[i, j])) p_plus[i, j] /= iterations[i, j] - print("p_plus: ", p_plus) - print(iterations) + print("\nPost-splitting the connections in multiple synapse populations:") + print("p_plus:\n", p_plus) + print("Number of synapse populations:\n", iterations) + np.set_printoptions(**printoptions) # define the synapses and connect the populations - # EE + + # Excitatory to excitatory neuron connections j_ee = js[0, 0] / np.sqrt(N) nest.CopyModel("static_synapse", "EE", {"weight": j_ee, "delay": self._params["delay"]}) @@ -297,7 +308,7 @@ def connect_probabilities(self): else: nest.Connect(pre, post, conn_params_EE_minus, "EE") - # EI + # Inhibitory to excitatory neuron connections j_ei = js[0, 1] / np.sqrt(N) nest.CopyModel("static_synapse", "EI", {"weight": j_ei, "delay": self._params["delay"]}) @@ -341,7 +352,7 @@ def connect_probabilities(self): else: nest.Connect(pre, post, conn_params_EI_minus, "EI") - # IE + # Excitatory to inhibitory neuron connections j_ie = js[1, 0] / np.sqrt(N) nest.CopyModel("static_synapse", "IE", {"weight": j_ie, "delay": self._params["delay"]}) @@ -385,7 +396,7 @@ def connect_probabilities(self): else: nest.Connect(pre, post, conn_params_IE_minus, "IE") - # II + # Inhibitory to inhibitory neuron connections j_ii = js[1, 1] / np.sqrt(N) nest.CopyModel("static_synapse", "II", {"weight": j_ii, "delay": self._params["delay"]}) @@ -430,7 +441,7 @@ def connect_probabilities(self): nest.Connect(pre, post, conn_params_II_minus, "II") def connect_weight(self): - """Connect the clusters with a weight EI-clustered scheme + """Connect the clusters with a weight EI-cluster scheme Connects the excitatory and inhibitory populations with each other in the EI-clustered scheme by increasing the weights @@ -438,6 +449,7 @@ def connect_weight(self): of the connections between the clusters. The weights are calculated so that the total input to a neuron is balanced. """ + # self._populations[0] -> Excitatory population # self._populations[1] -> Inhibitory population @@ -457,7 +469,8 @@ def connect_weight(self): jminus = np.ones((2, 2)) # define the synapses and connect the populations - # EE + + # Excitatory to excitatory neuron connections j_ee = js[0, 0] / np.sqrt(N) nest.CopyModel( "static_synapse", @@ -497,7 +510,7 @@ def connect_weight(self): else: nest.Connect(pre, post, conn_params_EE, "EE_minus") - # EI + # Inhibitory to excitatory neuron connections j_ei = js[0, 1] / np.sqrt(N) nest.CopyModel( "static_synapse", @@ -535,7 +548,8 @@ def connect_weight(self): nest.Connect(pre, post, conn_params_EI, "EI_plus") else: nest.Connect(pre, post, conn_params_EI, "EI_minus") - # IE + + # Excitatory to inhibitory neuron connections j_ie = js[1, 0] / np.sqrt(N) nest.CopyModel( "static_synapse", @@ -575,7 +589,7 @@ def connect_weight(self): else: nest.Connect(pre, post, conn_params_IE, "IE_minus") - # II + # Inhibitory to inhibitory neuron connections j_ii = js[1, 1] / np.sqrt(N) nest.CopyModel( "static_synapse", diff --git a/pynest/examples/EI_clustered_network/network_params.py b/pynest/examples/EI_clustered_network/network_params.py index 1ee398c5e1..0612c2bb0c 100644 --- a/pynest/examples/EI_clustered_network/network_params.py +++ b/pynest/examples/EI_clustered_network/network_params.py @@ -64,9 +64,9 @@ # I_th*[1-delta_I_../2, 1+delta_I_../2] "delta_I_xE": 0.0, # excitatory "delta_I_xI": 0.0, # inhibitory - # initial membrane potential: either a float (in mV) to initialize all neurons to a fixed value or "rand" for randomized values + # initial membrane potential: either a float (in mV) to initialize all neurons to a fixed value + # or "rand" for randomized values: "V_th_{E,I}" - 20 * nest.random.lognormal(0, 1) "V_m": "rand", - ############################################ # network parameters ############################################ diff --git a/pynest/examples/EI_clustered_network/run_simulation.py b/pynest/examples/EI_clustered_network/run_simulation.py index 81568c7b5f..ecafa112df 100644 --- a/pynest/examples/EI_clustered_network/run_simulation.py +++ b/pynest/examples/EI_clustered_network/run_simulation.py @@ -44,7 +44,7 @@ # the spiketimes and the used parameters result = ei_network.get_simulation() ax = raster_plot( - Result["spiketimes"], + result["spiketimes"], tlim=(0, sim_dict["simtime"]), colorgroups=[ ("k", 0, net_dict["N_E"]), From 34b9ce03e659d719de22445230a8762cba4facf7 Mon Sep 17 00:00:00 2001 From: Felix Schmitt Date: Tue, 9 Apr 2024 10:27:03 +0200 Subject: [PATCH 22/23] Apply suggestions from code review Co-authored-by: jessica-mitchell --- pynest/examples/EI_clustered_network/README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pynest/examples/EI_clustered_network/README.rst b/pynest/examples/EI_clustered_network/README.rst index cfa485fd96..4f7d5a43d7 100644 --- a/pynest/examples/EI_clustered_network/README.rst +++ b/pynest/examples/EI_clustered_network/README.rst @@ -6,7 +6,7 @@ This is PyNEST implementation of the EI-clustered circuit model described by Ros .. figure:: /static/img/pynest/EI_clustered_network_schematic.png :alt: EI-clustered circuit model. - Schematic of the EI-clustered circuit model. The network consists of n_clusters clusters with one excitatory and one inhibitory population each. + Schematic of the EI-clustered circuit model. The network consists of `n_clusters` with one excitatory and one inhibitory population each. Citing this code ---------------- From 196784f9756472f14a81628726b4a18308165202 Mon Sep 17 00:00:00 2001 From: schmitfe Date: Tue, 9 Apr 2024 10:38:00 +0200 Subject: [PATCH 23/23] Corrected copyright header --- pynest/examples/EI_clustered_network/network_params.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pynest/examples/EI_clustered_network/network_params.py b/pynest/examples/EI_clustered_network/network_params.py index 0612c2bb0c..c40eb9cb48 100644 --- a/pynest/examples/EI_clustered_network/network_params.py +++ b/pynest/examples/EI_clustered_network/network_params.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# sim_params.py +# network_params.py # # This file is part of NEST. #