Source code for tvb.core.services.burst_config_serialization
# -*- coding: utf-8 -*-
#
#
# TheVirtualBrain-Framework Package. This package holds all Data Management, and
# Web-UI helpful to run brain-simulations. To use it, you also need to download
# TheVirtualBrain-Scientific Package (for simulators). See content of the
# documentation-folder for more details. See also http://www.thevirtualbrain.org
#
# (c) 2012-2023, Baycrest Centre for Geriatric Care ("Baycrest") and others
#
# This program is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software Foundation,
# either version 3 of the License, or (at your option) any later version.
# This program 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 this
# program. If not, see <http://www.gnu.org/licenses/>.
#
#
# CITATION:
# When using The Virtual Brain for scientific publications, please cite it as explained here:
# https://www.thevirtualbrain.org/tvb/zwei/neuroscience-publications
#
#
"""
Service for serializing a Burst (Simulator) configuration.
.. moduleauthor:: Mihai Andrei <mihai.andrei@codemart.ro>
"""
import numpy
from tvb.basic.logger.builder import get_logger
from tvb.simulator import models
[docs]class SerializationManager(object):
"""
Constructs data types based on a burst configuration.
Updates the burst configuration.
"""
def __init__(self, conf):
"""
:param conf: burst configuration entity
"""
self.logger = get_logger(__name__)
self.conf = conf
[docs] @staticmethod
def group_parameter_values_by_name(model_parameters_list):
"""
@:param model_parameters_list: Given a list of model parameters like this:
[{"a": 2.0, 'b': 1.0},
{"a": 3.0, 'b': 7.0}])
@:return: This method will group them by param name to get:
{'a': [2.0, 3.0], 'b': [1.0, 7.0]}
"""
ret = {}
for model_parameters in model_parameters_list:
for param_name, param_val in model_parameters.items():
if param_name not in ret:
ret[param_name] = []
ret[param_name].append(param_val)
return ret
[docs] def write_model_parameters(self, model_name, model_parameters_list):
"""
Update model parameters in burst config.
:param model_name: This model will be selected in burst
:param model_parameters_list: A list of model parameter configurations. One for each connectivity node.
Ex. [{'a': 1, 'b': 2}, ...]
"""
def format_param_vals(vals):
# contract constant array
if len(set(vals)) == 1:
vals = [vals[0]]
return numpy.array(vals)
model_parameters = self.group_parameter_values_by_name(model_parameters_list)
# change selected model in burst config
model_class = getattr(models, model_name)
self.conf.model = model_class()
for param_name, param_vals in model_parameters.items():
setattr(self.conf.model, param_name, format_param_vals(param_vals))
[docs] def write_noise_parameters(self, noise_dispersions):
"""
Set noise dispersions in burst config.
It will set all nsig fields it can find in the config (at least 1 per stochastic integrator).
:param noise_dispersions: A list of noise dispersions. One for each connectivity node. Ex [{'V': 1, 'W':2}, ...]
"""
noise_dispersions = self.group_parameter_values_by_name(noise_dispersions)
# Flatten the dict to an array of shape (state_vars, nodes)
state_vars = self.conf.model.state_variables
noise_arr = [noise_dispersions[sv] for sv in state_vars]
self.conf.integrator.noise.nsig = numpy.array(noise_arr)