diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000..40510102 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,71 @@ +defaults: &defaults + working_directory: ~/markovmodel/PyEMMA + docker: + - image: continuumio/miniconda3 + +inst_conda_bld: &inst_conda_bld + - run: conda config --add channels conda-forge + - run: conda config --set always_yes true + - run: conda config --set quiet true + - run: conda install conda-build + +version: 2 + +jobs: + build: + <<: *defaults + parallelism: 1 + steps: + - checkout + - run: git fetch --unshallow || true + - run: apt-get update + - run: sh reduced_cell_install.sh + #- run: apt-get install -y gcc + #- run: apt-get install -y libx11-6 python-dev git build-essential + #- run: apt-get install -y autoconf automake gcc g++ make gfortran + #- run: apt-get install -y python-tables + #- run: apt-get install -y libhdf5-serial-dev + + #- run: conda config --add channels conda-forge + #- run: conda config --set always_yes true + #- run: conda config --set quiet true + #- run: conda install conda-build + #- run: conda install scipy; + #- run: conda install numpy; + #- run: conda install numba; + #- run: conda install dask; + - run: pip install tables + - run: pip install pip --upgrade; pip install -r requirements.txt; + - run: pip install -e .[extra] + - run: pip install jithub==0.1.0 + - run: pip install git+https://github.com/russelljjarvis/jit_hub.git@neuronunit + - run: git clone -b neuronunit https://github.com/russelljjarvis/jit_hub.git + - run: cd jit_hub; pip install -e .; cd ..; + - run: git clone -b optimization https://github.com/russelljjarvis/neuronunit + - run: cd neuronunit; pip install -e .; cd ..; + - run: pip install neuronunitopt==0.19 + - run: git clone https://github.com/russelljjarvis/eFEL + - run: cd eFEL; pip install -e .; cd ..; + - run: pip install cython + - run: pip install streamlit; + - run: pip install seaborn; + - run: pip install sklearn + - run: pip install allensdk==0.16.3 + - run: pip install frozendict + - run: pip install nose + - run: pip install pynwb + #- run: rm -rf /opt/conda/lib/python3.8/site-packages/sciunit + - run: git clone -b dev https://github.com/russelljjarvis/sciunit.git + - run: cd sciunit; pip install -e .; cd ..; + - run: cd bluepyopt/tests; nosetests test_numba_models.py + - run: cd bluepyopt/tests; nosetests test_evaluators.py + - run: cd bluepyopt/tests; nosetests test_rheobase_model.py + - run: pip install --no-binary=h5py h5py + - run: pip install allensdk==0.16.3 + - run: pip install tox && tox + - run: cd bluepyopt/tests; nosetests test_adexp_opt.py + - run: cd bluepyopt/tests; nosetests test_scores_unit.py + #- run: cd bluepyopt/tests; nosetests test_izhi_opt.py + + # causes time out + #- run: cd bluepyopt/tests; python izhi_opt.py diff --git a/.circleci/config.yml.orig b/.circleci/config.yml.orig new file mode 100644 index 00000000..4a79f456 --- /dev/null +++ b/.circleci/config.yml.orig @@ -0,0 +1,69 @@ +defaults: &defaults + working_directory: ~/markovmodel/PyEMMA + docker: + - image: continuumio/miniconda3 + +inst_conda_bld: &inst_conda_bld + - run: conda config --add channels conda-forge + - run: conda config --set always_yes true + - run: conda config --set quiet true + - run: conda install conda-build + +version: 2 + +jobs: + build: + <<: *defaults + parallelism: 1 + steps: + - checkout + - run: git fetch --unshallow || true + - run: apt-get install -y cpp gcc + - run: apt-get install -y libx11-6 python-dev git build-essential + - run: apt-get install -y autoconf automake gcc g++ make gfortran + - run: apt-get install -y python-tables + - run: apt-get install -y libhdf5-serial-dev + + - run: conda config --add channels conda-forge + - run: conda config --set always_yes true + - run: conda config --set quiet true + - run: conda install conda-build + - run: conda install scipy; + - run: conda install numpy; + - run: conda install numba; + - run: conda install dask; + - run: pip install tables + - run: pip install pip --upgrade; pip install -r requirements.txt; + - run: pip install -e . + - run: git clone -b neuronunit https://github.com/russelljjarvis/jit_hub.git + + - run: cd jit_hub; pip install -e .; cd ..; + - run: git clone -b optimization https://github.com/russelljjarvis/neuronunit +<<<<<<< HEAD + - run: cd neuronunit; pip install -e .; cd ..; + + #- run: pip install ipfx + - run: pip install efel + #- run: git clone https://github.com/russelljjarvis/eFEL + #- run: cd eFEL; python + +======= + - run: cd jit_hub; pip install -e .; cd ..; + - run: pip install efel +>>>>>>> 938c5c225d1efef3357ef78b0071a29ea77a0f3c + - run: pip install cython + - run: pip install streamlit; + - run: pip install seaborn; + - run: pip install sklearn + - run: pip install allensdk==0.16.3 + - run: pip install frozendict + - run: pip install nose + - run: rm -rf /opt/conda/lib/python3.8/site-packages/sciunit + - run: git clone -b dev https://github.com/russelljjarvis/sciunit.git + - run: cd sciunit; pip install -e .; cd ..; + - run: cd bluepyopt/tests; python rheobase_dtc_test.py + - run: cd bluepyopt/tests; python adexp_opt.py + - run: cd bluepyopt/tests; python test_evaluators.py + + # causes time out + #- run: cd bluepyopt/tests; python izhi_opt.py diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2d2f6fcc..3eb98f47 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -6,7 +6,7 @@ on: - cron: '0 3 * * SUN' push: branches: - - master + - neuronunit_reduced_cells tags: - '[0-9]+.[0-9]+.[0-9]+' pull_request: @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [2.7, 3.6, 3.7, 3.8, 3.9] + python-version: [3.6, 3.7, 3.8, 3.9] steps: - uses: actions/checkout@v2 diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 00000000..77ea544e --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,16 @@ +# .readthedocs.yml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +sphinx: + configuration: docs/source/conf.py + fail_on_warning: true + +python: + install: + - method: pip + path: . + - requirements: requirements_docs.txt diff --git a/README.rst b/README.rst new file mode 100644 index 00000000..99bf65a2 --- /dev/null +++ b/README.rst @@ -0,0 +1,273 @@ +<<<<<<< HEAD:README.rst +|banner| + +BluePyOpt +========= + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + +
Latest Release + + latest release + +
Documentation + + latest documentation + +
License + + license + +
Build Status + + Actions build status + +
Coverage + + coverage + +
Gitter + + +
+ + + +======= + + +----------------- +# BluePyOpt: Blue Brain Python Optimisation Library + + + + + + + + + + + + + + + + + + + + + + + + + + +
Latest Release + + latest release + +
Documentation + + latest documentation + +
License + + license + +
Build Status + + Actions build status + +
Coverage + + coverage + +
Gitter + + +
+>>>>>>> neuronunit_reduced_cells:README.md +Introduction +============ + +The Blue Brain Python Optimisation Library (BluePyOpt) is an extensible +framework for data-driven model parameter optimisation that wraps and +standardises several existing open-source tools. + +It simplifies the task of creating and sharing these optimisations, +and the associated techniques and knowledge. +This is achieved by abstracting the optimisation and evaluation tasks +into various reusable and flexible discrete elements according to established +best-practices. + +Further, BluePyOpt provides methods for setting up both small- and large-scale +optimisations on a variety of platforms, +ranging from laptops to Linux clusters and cloud-based compute infrastructures. + +Citation +======== + +When you use the BluePyOpt software or method for your research, we ask you to cite the following publication (**this includes poster presentations**): + +`Van Geit W, Gevaert M, Chindemi G, Rössert C, Courcol J, Muller EB, Schürmann F, Segev I and Markram H (2016). BluePyOpt: Leveraging open source software and cloud infrastructure to optimise model parameters in neuroscience. Front. Neuroinform. 10:17. doi: 10.3389/fninf.2016.00017 `_. + +.. code-block:: + + @ARTICLE{bluepyopt, + AUTHOR={Van Geit, Werner and Gevaert, Michael and Chindemi, Giuseppe and Rössert, Christian and Courcol, Jean-Denis and Muller, Eilif Benjamin and Schürmann, Felix and Segev, Idan and Markram, Henry}, + TITLE={BluePyOpt: Leveraging open source software and cloud infrastructure to optimise model parameters in neuroscience}, + JOURNAL={Frontiers in Neuroinformatics}, + VOLUME={10}, + YEAR={2016}, + NUMBER={17}, + URL={http://www.frontiersin.org/neuroinformatics/10.3389/fninf.2016.00017/abstract}, + DOI={10.3389/fninf.2016.00017}, + ISSN={1662-5196} + } + + +Support +======= +We are providing support using a chat channel on `Gitter `_, or the `Github discussion page `_. + +News +==== +- 2017/01/04: BluePyOpt is now considered compatible with Python 3.6+. +- 2016/11/10: BluePyOpt now supports NEURON point processes. This means we can fit parameters of Adex/GIF/Izhikevich models, and also synapse models. +- 2016/06/14: Started a wiki: https://github.com/BlueBrain/BluePyOpt/wiki +- 2016/06/07: The BluePyOpt paper was published in Frontiers in Neuroinformatics (for link, see above) +- 2016/05/03: The API documentation was moved to `ReadTheDocs `_ +- 2016/04/20: BluePyOpt now contains the code of the IBEA selector, no need to install a BBP-specific version of DEAP anymore +- 2016/03/24: Released version 1.0 + +Requirements +============ + +* `Python 2.7+ `_ or `Python 3.6+ `_ +* `Pip `_ (installed by default in newer versions of Python) +* `Neuron 7.4+ `_ (compiled with Python support) +* `eFEL eFeature Extraction Library` `_ (automatically installed by pip) +* `Numpy `_ (automatically installed by pip) +* `Pandas `_ (automatically installed by pip) +* The instruction below are written assuming you have access to a command shell on Linux / UNIX / MacOSX / Cygwin + +Installation +============ + +If you want to use the ephys module of BluePyOpt, you first need to install NEURON with Python support on your machine. + +And then bluepyopt itself: + + +.. code-block:: bash + + pip install bluepyopt + + +Cloud infrastructure +==================== + +We provide instructions on how to set up an optimisation environment on cloud +infrastructure or cluster computers +`here `_ + +Quick Start +=========== + +Single compartmental model +-------------------------- + +An iPython notebook with an introductory optimisation of a one compartmental +model with 2 HH channels can be found at + +https://github.com/BlueBrain/BluePyOpt/blob/master/examples/simplecell/simplecell.ipynb + + +.. image:: examples/simplecell/figures/landscape_example.png + + +**Figure**: The solution space of a single compartmental model with two parameters: the maximal conductance of Na and K ion channels. The color represents how well the model fits two objectives: when injected with two different currents, the model has to fire 1 and 4 action potential respectively during the stimuli. Dark blue is the best fitness. The blue circles represent solutions with a perfect score. + +Neocortical Layer 5 Pyramidal Cell +---------------------------------- +Scripts for a more complex neocortical L5PC are in +`this directory `__ + +With a notebook: + +https://github.com/BlueBrain/BluePyOpt/blob/master/examples/l5pc/L5PC.ipynb + +Thalamocortical Cells +--------------------- +Scripts for 2 thalamocortical cell types are in +`this directory `__ + +With a notebook: + +https://github.com/BlueBrain/BluePyOpt/blob/master/examples/thalamocortical-cell/thalamocortical-cell_opt.ipynb + + +Tsodyks-Markram Model of Short-Term Plasticity +---------------------------------------------- +Scripts for 2 version of fitting the Tsodyks-Markram model to synaptic traces are in +`this directory `__ + +With 2 notebooks: + +https://github.com/BlueBrain/BluePyOpt/blob/master/examples/tsodyksmarkramstp/tsodyksmarkramstp.ipynb +https://github.com/BlueBrain/BluePyOpt/blob/master/examples/tsodyksmarkramstp/tsodyksmarkramstp_multiplefreqs.ipynb + +API documentation +================= +The API documentation can be found on `ReadTheDocs `_. + +Funding +======= +This work has been partially funded by the European Union Seventh Framework Program (FP7/2007­2013) under grant agreement no. 604102 (HBP), the European Union’s Horizon 2020 Framework Programme for Research and Innovation under the Specific Grant Agreement No. 720270, 785907 (Human Brain Project SGA1/SGA2) and by the EBRAINS research infrastructure, funded from the European Union’s Horizon 2020 Framework Programme for Research and Innovation under the Specific Grant Agreement No. 945539 (Human Brain Project SGA3). +<<<<<<< HEAD:README.rst +This project/research was supported by funding to the Blue Brain Project, a research center of the École polytechnique fédérale de Lausanne (EPFL), from the Swiss government’s ETH Board of the Swiss Federal Institutes of Technology. + +© 2016-2021, Blue Brain Project/EPFL + +.. + The following image is also defined in the index.rst file, as the relative path is + different, depending from where it is sourced. + The following location is used for the github README + The index.rst location is used for the docs README; index.rst also defined an end-marker, + to skip content after the marker 'substitutions'. + +.. substitutions +.. |banner| image:: docs/source/logo/BluePyOptBanner.png +.. |landscape_example| image:: examples/simplecell/figures/landscape_example.png +======= +- This project/research was supported by funding to the Blue Brain Project, a research center of the École polytechnique fédérale de Lausanne (EPFL), from the Swiss government’s ETH Board of the Swiss Federal Institutes of Technology. +>>>>>>> neuronunit_reduced_cells:README.md diff --git a/bluepyopt/broken/test_simplecell.py b/bluepyopt/broken/test_simplecell.py new file mode 100644 index 00000000..01f240ba --- /dev/null +++ b/bluepyopt/broken/test_simplecell.py @@ -0,0 +1,47 @@ +"""Simple cell example test class""" + +import sys +import os + +SIMPLECELL_PATH = os.path.abspath(os.path.join( + os.path.dirname(__file__), + '../../examples/simplecell')) + +# sys.path.insert(0, SIMPLECELL_PATH) + + +class TestSimpleCellClass(object): + + """Simple cell example test class""" + + def __init__(self): + """Constructor""" + + self.old_cwd = None + self.old_stdout = None + + def setup(self): + """Setup""" + self.old_cwd = os.getcwd() + self.old_stdout = sys.stdout + + os.chdir(SIMPLECELL_PATH) + sys.stdout = open(os.devnull, 'w') + + @staticmethod + def test_exec(): + """Simplecell: test execution""" + # When using import instead of execfile this doesn't work + # Probably because multiprocessing doesn't work correctly during + # import + if sys.version_info[0] < 3: + execfile('simplecell.py') # NOQA + else: + with open('simplecell.py') as sc_file: + exec(compile(sc_file.read(), 'simplecell.py', 'exec')) # NOQA + + def teardown(self): + """Tear down""" + + sys.stdout = self.old_stdout + os.chdir(self.old_cwd) diff --git a/bluepyopt/deapext/optimisations.py b/bluepyopt/deapext/optimisations.py index 9af98860..f9bcac2a 100644 --- a/bluepyopt/deapext/optimisations.py +++ b/bluepyopt/deapext/optimisations.py @@ -101,7 +101,9 @@ def __init__(self, evaluator=None, cxpb=1.0, map_function=None, hof=None, - selector_name=None): + selector_name=None, + neuronunit=False, + ): """Constructor Args: @@ -110,7 +112,7 @@ def __init__(self, evaluator=None, offspring_size (int): Number of offspring individuals in each generation eta (float): Parameter that controls how far the crossover and - mutation operator disturbe the original individuals + mutation operator perturb the original individuals mutpb (float): Mutation probability cxpb (float): Crossover probability map_function (function): Function used to map (parallelise) the @@ -129,7 +131,7 @@ def __init__(self, evaluator=None, self.cxpb = cxpb self.mutpb = mutpb self.map_function = map_function - + self.neuronunit = neuronunit self.selector_name = selector_name if self.selector_name is None: self.selector_name = 'IBEA' @@ -302,7 +304,12 @@ def run(self, stats.register("std", numpy.std) stats.register("min", numpy.min) stats.register("max", numpy.max) - + if self.neuronunit: + # if neuronunit overwrite path of optimization algorithms + # to get some reduced model relevant customizations. + from neuronunit.optimization import algorithms + else: + from bluepyopt.deapext import algorithms pop, hof, log, history = algorithms.eaAlphaMuPlusLambdaCheckpoint( pop, self.toolbox, diff --git a/bluepyopt/ephys/evaluators.py b/bluepyopt/ephys/evaluators.py index 7db58279..51b7f101 100644 --- a/bluepyopt/ephys/evaluators.py +++ b/bluepyopt/ephys/evaluators.py @@ -182,9 +182,13 @@ def run_protocols(self, protocols, param_values): return responses - def evaluate_with_dicts(self, param_dict=None): + def evaluate_with_dicts(self, param_dict=None, target='scores'): """Run evaluation with dict as input and output""" + if target not in ['scores', 'values']: + raise Exception( + 'CellEvaluator: target has to be "scores" or "values".') + if self.fitness_calculator is None: raise Exception( 'CellEvaluator: need fitness_calculator to evaluate') @@ -195,21 +199,27 @@ def evaluate_with_dicts(self, param_dict=None): self.fitness_protocols.values(), param_dict) - return self.fitness_calculator.calculate_scores(responses) + if target == 'scores': + return self.fitness_calculator.calculate_scores(responses) + + elif target == 'values': + return self.fitness_calculator.calculate_values(responses) - def evaluate_with_lists(self, param_list=None): + def evaluate_with_lists(self, param_list=None, target='scores'): """Run evaluation with lists as input and outputs""" param_dict = self.param_dict(param_list) - obj_dict = self.evaluate_with_dicts(param_dict=param_dict) + obj_dict = self.evaluate_with_dicts( + param_dict=param_dict, target=target + ) return self.objective_list(obj_dict) - def evaluate(self, param_list=None): + def evaluate(self, param_list=None, target='scores'): """Run evaluation with lists as input and outputs""" - return self.evaluate_with_lists(param_list) + return self.evaluate_with_lists(param_list, target=target) def __str__(self): diff --git a/bluepyopt/ephys/models.py b/bluepyopt/ephys/models.py index 7864d0c9..db405279 100644 --- a/bluepyopt/ephys/models.py +++ b/bluepyopt/ephys/models.py @@ -448,7 +448,7 @@ def __str__(self): def get_template_name(hoc_string): """Find the template name from hoc_string - Note: this will fail if there is a begintemplate in a /* */ style + Note: this will fail if there is a begintemplate in a `/* */` style comment before the real begintemplate """ for i, line in enumerate(hoc_string.split('\n')): diff --git a/bluepyopt/ephys/objectives.py b/bluepyopt/ephys/objectives.py index eb1833a6..5031c223 100644 --- a/bluepyopt/ephys/objectives.py +++ b/bluepyopt/ephys/objectives.py @@ -47,6 +47,15 @@ def calculate_feature_scores(self, responses): return scores + def calculate_feature_values(self, responses): + """Calculate the value of an individual features""" + + values = [] + for feature in self.features: + values.append(feature.calculate_feature(responses)) + + return values + class SingletonObjective(EFeatureObjective): @@ -67,6 +76,11 @@ def calculate_score(self, responses): return self.calculate_feature_scores(responses)[0] + def calculate_value(self, responses): + """Objective value""" + + return self.calculate_feature_values(responses)[0] + def __str__(self): """String representation""" diff --git a/bluepyopt/ephys/objectivescalculators.py b/bluepyopt/ephys/objectivescalculators.py index 177d092d..0465e32d 100644 --- a/bluepyopt/ephys/objectivescalculators.py +++ b/bluepyopt/ephys/objectivescalculators.py @@ -41,6 +41,12 @@ def calculate_scores(self, responses): return {objective.name: objective.calculate_score(responses) for objective in self.objectives} + def calculate_values(self, responses): + """Calculator the value of each objective""" + + return {objective.name: objective.calculate_value(responses) + for objective in self.objectives} + def __str__(self): return 'objectives:\n %s' % '\n '.join( [str(obj) for obj in self.objectives]) \ diff --git a/bluepyopt/ephys/protocols.py b/bluepyopt/ephys/protocols.py index 43752aff..7300c623 100644 --- a/bluepyopt/ephys/protocols.py +++ b/bluepyopt/ephys/protocols.py @@ -25,6 +25,7 @@ # TODO: maybe find a better name ? -> sweep ? import logging + logger = logging.getLogger(__name__) from . import locations @@ -39,7 +40,7 @@ def __init__(self, name=None): """Constructor Args: - name (str): name of the feature + name (str): name of the feature """ self.name = name @@ -53,20 +54,14 @@ def __init__(self, name=None, protocols=None): """Constructor Args: - name (str): name of this object - protocols (list of Protocols): subprotocols this protocol - consists of + name (str): name of this object + protocols (list of Protocols): subprotocols this protocol + consists of """ super(SequenceProtocol, self).__init__(name) self.protocols = protocols - def run( - self, - cell_model, - param_values, - sim=None, - isolate=None, - timeout=None): + def run(self, cell_model, param_values, sim=None, isolate=None, timeout=None): """Instantiate protocol""" responses = collections.OrderedDict({}) @@ -80,24 +75,26 @@ def run( param_values=param_values, sim=sim, isolate=isolate, - timeout=timeout) + timeout=timeout, + ) except TypeError as e: if "unexpected keyword" in str(e): response = protocol.run( cell_model=cell_model, param_values=param_values, sim=sim, - isolate=isolate) + isolate=isolate, + ) else: raise - key_intersect = set( - response.keys()).intersection(set(responses.keys())) + key_intersect = set(response.keys()).intersection(set(responses.keys())) if len(key_intersect) != 0: raise Exception( - 'SequenceProtocol: one of the protocols (%s) is trying to ' - 'add already existing keys to the response: %s' % - (protocol.name, key_intersect)) + "SequenceProtocol: one of the protocols (%s) is trying to " + "add already existing keys to the response: %s" + % (protocol.name, key_intersect) + ) responses.update(response) @@ -116,11 +113,11 @@ def subprotocols(self): def __str__(self): """String representation""" - content = 'Sequence protocol %s:\n' % self.name + content = "Sequence protocol %s:\n" % self.name - content += '%d subprotocols:\n' % len(self.protocols) + content += "%d subprotocols:\n" % len(self.protocols) for protocol in self.protocols: - content += '%s\n' % str(protocol) + content += "%s\n" % str(protocol) return content @@ -129,20 +126,15 @@ class SweepProtocol(Protocol): """Sweep protocol""" - def __init__( - self, - name=None, - stimuli=None, - recordings=None, - cvode_active=None): + def __init__(self, name=None, stimuli=None, recordings=None, cvode_active=None): """Constructor Args: - name (str): name of this object - stimuli (list of Stimuli): Stimulus objects used in the protocol - recordings (list of Recordings): Recording objects used in the - protocol - cvode_active (bool): whether to use variable time step + name (str): name of this object + stimuli (list of Stimuli): Stimulus objects used in the protocol + recordings (list of Recordings): Recording objects used in the + protocol + cvode_active (bool): whether to use variable time step """ super(SweepProtocol, self).__init__(name) @@ -174,15 +166,15 @@ def _run_func(self, cell_model, param_values, sim=None): sim.run(self.total_duration, cvode_active=self.cvode_active) except (RuntimeError, simulators.NrnSimulatorException): logger.debug( - 'SweepProtocol: Running of parameter set {%s} generated ' - 'an exception, returning None in responses', - str(param_values)) - responses = {recording.name: - None for recording in self.recordings} + "SweepProtocol: Running of parameter set {%s} generated " + "an exception, returning None in responses", + str(param_values), + ) + responses = {recording.name: None for recording in self.recordings} else: responses = { - recording.name: recording.response - for recording in self.recordings} + recording.name: recording.response for recording in self.recordings + } self.destroy(sim=sim) @@ -194,29 +186,24 @@ def _run_func(self, cell_model, param_values, sim=None): except BaseException: import sys import traceback - raise Exception( - "".join( - traceback.format_exception(*sys.exc_info()))) - - def run( - self, - cell_model, - param_values, - sim=None, - isolate=None, - timeout=None): + + raise Exception("".join(traceback.format_exception(*sys.exc_info()))) + + def run(self, cell_model, param_values, sim=None, isolate=None, timeout=None): """Instantiate protocol""" if isolate is None: isolate = True if isolate: + def _reduce_method(meth): """Overwrite reduce""" return (getattr, (meth.__self__, meth.__func__.__name__)) import copyreg import types + copyreg.pickle(types.MethodType, _reduce_method) import pebble from concurrent.futures import TimeoutError @@ -226,23 +213,30 @@ def _reduce_method(meth): raise ValueError("timeout should be > 0") with pebble.ProcessPool(max_workers=1, max_tasks=1) as pool: - tasks = pool.schedule(self._run_func, kwargs={ - 'cell_model': cell_model, - 'param_values': param_values, - 'sim': sim}, - timeout=timeout) + tasks = pool.schedule( + self._run_func, + kwargs={ + "cell_model": cell_model, + "param_values": param_values, + "sim": sim, + }, + timeout=timeout, + ) try: responses = tasks.result() except TimeoutError: - logger.debug('SweepProtocol: task took longer than ' - 'timeout, will return empty response ' - 'for this recording') - responses = {recording.name: - None for recording in self.recordings} + logger.debug( + "SweepProtocol: task took longer than " + "timeout, will return empty response " + "for this recording" + ) + responses = self._run_func( + cell_model=cell_model, param_values=param_values, sim=sim + ) else: - responses = self._run_func(cell_model=cell_model, - param_values=param_values, - sim=sim) + responses = self._run_func( + cell_model=cell_model, param_values=param_values, sim=sim + ) return responses def instantiate(self, sim=None, icell=None): @@ -256,9 +250,10 @@ def instantiate(self, sim=None, icell=None): recording.instantiate(sim=sim, icell=icell) except locations.EPhysLocInstantiateException: logger.debug( - 'SweepProtocol: Instantiating recording generated ' - 'location exception, will return empty response for ' - 'this recording') + "SweepProtocol: Instantiating recording generated " + "location exception, will return empty response for " + "this recording" + ) def destroy(self, sim=None): """Destroy protocol""" @@ -272,15 +267,15 @@ def destroy(self, sim=None): def __str__(self): """String representation""" - content = '%s:\n' % self.name + content = "%s:\n" % self.name - content += ' stimuli:\n' + content += " stimuli:\n" for stimulus in self.stimuli: - content += ' %s\n' % str(stimulus) + content += " %s\n" % str(stimulus) - content += ' recordings:\n' + content += " recordings:\n" for recording in self.recordings: - content += ' %s\n' % str(recording) + content += " %s\n" % str(recording) return content @@ -290,30 +285,31 @@ class StepProtocol(SweepProtocol): """Protocol consisting of step and holding current""" def __init__( - self, - name=None, - step_stimulus=None, - holding_stimulus=None, - recordings=None, - cvode_active=None): + self, + name=None, + step_stimulus=None, + holding_stimulus=None, + recordings=None, + cvode_active=None, + ): """Constructor Args: - name (str): name of this object - step_stimulus (list of Stimuli): Stimulus objects used in protocol - recordings (list of Recordings): Recording objects used in the - protocol - cvode_active (bool): whether to use variable time step + name (str): name of this object + step_stimulus (list of Stimuli): Stimulus objects used in protocol + recordings (list of Recordings): Recording objects used in the + protocol + cvode_active (bool): whether to use variable time step """ super(StepProtocol, self).__init__( name, - stimuli=[ - step_stimulus, - holding_stimulus] - if holding_stimulus is not None else [step_stimulus], + stimuli=[step_stimulus, holding_stimulus] + if holding_stimulus is not None + else [step_stimulus], recordings=recordings, - cvode_active=cvode_active) + cvode_active=cvode_active, + ) self.step_stimulus = step_stimulus self.holding_stimulus = holding_stimulus @@ -327,3 +323,158 @@ def step_delay(self): def step_duration(self): """Time stimulus starts""" return self.step_stimulus.step_duration + + +class NeuronUnitAllenStepProtocol(SweepProtocol): + + """Protocol consisting of step and holding current""" + + def __init__( + self, + name=None, + step_stimulus=None, + holding_stimulus=None, + recordings=None, + cvode_active=None, + ): + """Constructor + + Args: + name (str): name of this object + step_stimulus (list of Stimuli): Stimulus objects used in protocol + recordings (list of Recordings): Recording objects used in the + protocol + cvode_active (bool): whether to use variable time step + """ + + super(NeuronUnitAllenStepProtocol, self).__init__( + name, + stimuli=[step_stimulus, holding_stimulus] + if holding_stimulus is not None + else [step_stimulus], + recordings=recordings, + cvode_active=cvode_active, + ) + + self.step_stimulus = step_stimulus + self.holding_stimulus = holding_stimulus + + @property + def step_delay(self): + """Time stimulus starts""" + return self.step_stimulus.step_delay + + @property + def step_duration(self): + """Time stimulus starts""" + return self.step_stimulus.step_duration + + def neuronunit_model_instantiate(self, cell_model, param_values): + """ + -- Synopsis + # first populate the cell_model by frozen default attributes + # then update with dynamic gene attributes as appropriate. + """ + # cell_model = cell_model.model_to_cell_model(attrs=param_values) + # assert cell_model.backend == cell_model.backend + # cell_model._backend = cell_model._backend + return cell_model, cell_model + + def neuronunit_model_evaluate(self, cell_model, param_values): + from neuronunit.optimization.optimization_management import model_to_rheo + from neuronunit.optimization.optimization_management import ( + multi_spiking_feature_extraction, + ) + + def neuronunit_model_evaluate(self, cell_model, param_values): + from neuronunit.optimization.optimization_management import model_to_rheo + from neuronunit.optimization.optimization_management import ( + multi_spiking_feature_extraction, + ) + + if hasattr(cell_model, "allen"): + if hasattr(cell_model, "seeded_current"): + # cell_model.seeded_current = cell_model.seeded_current + # cell_model.spk_count = cell_model.spk_count + cell_model.attrs = param_values + ########################################## + # Not syntactically necessary but facilitates tighter BPO integration + self.step_stimulus = {} + self.step_stimulus["amplitude"] = cell_model.seeded_current + ########################################### + if hasattr(cell_model, "efel_filter_iterable"): + temp_efel_iter = cell_model.efel_filter_iterable + else: + temp_efel_iter = None + cell_model = multi_spiking_feature_extraction( + cell_model, + solve_for_current=cell_model.seeded_current, + efel_filter_iterable=temp_efel_iter, + ) + if hasattr(cell_model, "efel"): + responses = { + "features": cell_model.efel, + "cell_model": cell_model, + "model": cell_model, + "params": param_values, + } + else: + responses = { + "model": cell_model, + "rheobase": cell_model.rheobase, + "params": param_values, + } + + else: + cell_model = multi_spiking_feature_extraction(cell_model) + + if hasattr(cell_model, "efel"): + responses = { + "features": cell_model.efel, + "cell_model": cell_model, + "model": cell_model, + "params": param_values, + } + else: + responses = { + "model": cell_model, + "rheobase": cell_model.rheobase, + "params": param_values, + } + else: + cell_model.attrs = param_values + cell_model = model_to_rheo(cell_model, bind_vm=True) + responses = { + "response": cell_model.vmrh, + "model": cell_model, # .cell_model_to_model(), + "dtc": cell_model, + "rheobase": cell_model.rheobase, + "params": param_values, + } + return responses + + def _run_func(self, cell_model, param_values, sim=None): + """Run protocols""" + # try: + cell_model.unfreeze(param_values.keys()) + cell_model.freeze(param_values) + cell_model, cell_model = self.neuronunit_model_instantiate( + cell_model, param_values + ) + responses = self.neuronunit_model_evaluate(cell_model, param_values) + cell_model.unfreeze(param_values.keys()) + return responses + # except BaseException: + # import sys + # import traceback + # raise Exception( + # "".join( + # traceback.format_exception(*sys.exc_info()))) + + def run(self, cell_model, param_values, sim=None, isolate=None, timeout=None): + """Instantiate protocol""" + + responses = self._run_func( + cell_model=cell_model, param_values=param_values, sim=sim + ) + return responses diff --git a/bluepyopt/tests/disable_simplecell_scoop.py b/bluepyopt/tests/disable_simplecell_scoop.py index 508822e1..e0e98e79 100644 --- a/bluepyopt/tests/disable_simplecell_scoop.py +++ b/bluepyopt/tests/disable_simplecell_scoop.py @@ -1,4 +1,4 @@ -''' +""" Note: this is a bizarre test due to the fact that scoop can't be started from within python: https://github.com/soravux/scoop/issues/29 @@ -8,7 +8,7 @@ It then captures the output, and looks for the BEST: magic string which should match the precomputed output -''' +""" import os import nose.tools as nt @@ -17,8 +17,9 @@ import bluepyopt as nrp import bluepyopt.ephys as nrpel -SIMPLE_SWC = os.path.join(os.path.abspath(os.path.dirname(__file__)), - '../../examples/simplecell/simple.swc') +SIMPLE_SWC = os.path.join( + os.path.abspath(os.path.dirname(__file__)), "../../examples/simplecell/simple.swc" +) # Disabled this test. Doesn't work on a mac for some reason @@ -26,112 +27,113 @@ # TODO Renable once this is fixed def disabled_scoop(): """Simplecell: test scoop""" - cmd = ['python', '-m', 'scoop', '-n', '2', __file__] + cmd = ["python", "-m", "scoop", "-n", "2", __file__] output = subprocess.check_output(cmd) - for line in output.split('\n'): - if line.startswith('BEST'): + for line in output.split("\n"): + if line.startswith("BEST"): break - nt.eq_(line, 'BEST: [0.11268238279399023, 0.038129859413828474]') + nt.eq_(line, "BEST: [0.11268238279399023, 0.038129859413828474]") # The rest defines the optimization we run with scoop morph = nrpel.morphologies.NrnFileMorphology(SIMPLE_SWC) -somatic_loc = nrpel.locations.NrnSeclistLocation('somatic', - seclist_name='somatic') - -hh_mech = nrpel.mechanisms.NrnMODMechanism(name='hh', - suffix='hh', - locations=[somatic_loc]) - -cm_param = nrpel.parameters.NrnSectionParameter(name='cm', - param_name='cm', - value=1.0, - locations=[somatic_loc], - frozen=True) - - -gnabar_param = nrpel.parameters.NrnSectionParameter(name='gnabar_hh', - param_name='gnabar_hh', - locations=[somatic_loc], - bounds=[0.05, 0.125], - frozen=False) - -gkbar_param = nrpel.parameters.NrnSectionParameter(name='gkbar_hh', - param_name='gkbar_hh', - bounds=[0.01, 0.075], - locations=[somatic_loc], - frozen=False) - -simple_cell = nrpel.celltemplate.CellTemplate(name='simple_cell', - morph=morph, - mechs=[hh_mech], - params=[cm_param, - gnabar_param, - gkbar_param]) - -soma_loc = nrpel.locations.NrnSeclistCompLocation(name='soma', - seclist_name='somatic', - sec_index=0, - comp_x=0.5) +somatic_loc = nrpel.locations.NrnSeclistLocation("somatic", seclist_name="somatic") + +hh_mech = nrpel.mechanisms.NrnMODMechanism( + name="hh", suffix="hh", locations=[somatic_loc] +) + +cm_param = nrpel.parameters.NrnSectionParameter( + name="cm", param_name="cm", value=1.0, locations=[somatic_loc], frozen=True +) + + +gnabar_param = nrpel.parameters.NrnSectionParameter( + name="gnabar_hh", + param_name="gnabar_hh", + locations=[somatic_loc], + bounds=[0.05, 0.125], + frozen=False, +) + +gkbar_param = nrpel.parameters.NrnSectionParameter( + name="gkbar_hh", + param_name="gkbar_hh", + bounds=[0.01, 0.075], + locations=[somatic_loc], + frozen=False, +) + +simple_cell = nrpel.celltemplate.CellTemplate( + name="simple_cell", + morph=morph, + mechs=[hh_mech], + params=[cm_param, gnabar_param, gkbar_param], +) + +soma_loc = nrpel.locations.NrnSeclistCompLocation( + name="soma", seclist_name="somatic", sec_index=0, comp_x=0.5 +) protocols = {} -for protocol_name, amplitude in [('step1', 0.01), ('step2', 0.05)]: - stim = nrpel.stimuli.NrnSquarePulse(step_amplitude=amplitude, - step_delay=100, - step_duration=50, - location=soma_loc, - total_duration=200) - rec = nrpel.recordings.CompRecording(name='%s.soma.v' % protocol_name, - location=soma_loc, - variable='v') +for protocol_name, amplitude in [("step1", 0.01), ("step2", 0.05)]: + stim = nrpel.stimuli.NrnSquarePulse( + step_amplitude=amplitude, + step_delay=100, + step_duration=50, + location=soma_loc, + total_duration=200, + ) + rec = nrpel.recordings.CompRecording( + name="%s.soma.v" % protocol_name, location=soma_loc, variable="v" + ) protocol = nrpel.protocols.Protocol(protocol_name, [stim], [rec]) protocols[protocol.name] = protocol -default_params = {'gnabar_hh': 0.1, 'gkbar_hh': 0.03} -responses = simple_cell.run_protocols(protocols, - param_values=default_params) +default_params = {"gnabar_hh": 0.1, "gkbar_hh": 0.03} +responses = simple_cell.run_protocols(protocols, param_values=default_params) -efel_feature_means = {'step1': {'Spikecount': 1}, 'step2': {'Spikecount': 5}} +efel_feature_means = {"step1": {"Spikecount": 1}, "step2": {"Spikecount": 5}} objectives = [] for protocol_name, protocol in protocols.items(): stim_start = protocol.stimuli[0].step_delay stim_end = stim_start + protocol.stimuli[0].step_duration - for efel_feature_name, mean in \ - efel_feature_means[protocol_name].items(): - feature_name = '%s.%s' % (protocol_name, efel_feature_name) + for efel_feature_name, mean in efel_feature_means[protocol_name].items(): + feature_name = "%s.%s" % (protocol_name, efel_feature_name) feature = nrpel.efeatures.eFELFeature( feature_name, efel_feature_name=efel_feature_name, - recording_names={'': '%s.soma.v' % protocol_name}, + recording_names={"": "%s.soma.v" % protocol_name}, stim_start=stim_start, stim_end=stim_end, exp_mean=mean, - exp_std=0.05 * mean) + exp_std=0.05 * mean, + ) objective = objective = nrpel.objectives.SingletonObjective( - feature_name, - feature) + feature_name, feature + ) objectives.append(objective) score_calc = nrpel.scorecalculators.ObjectivesScoreCalculator(objectives) cell_evaluator = nrpel.cellevaluator.CellEvaluator( cell_template=simple_cell, - param_names=[ - 'gnabar_hh', - 'gkbar_hh'], + param_names=["gnabar_hh", "gkbar_hh"], fitness_protocols=protocols, - fitness_calculator=score_calc) + fitness_calculator=score_calc, +) optimisation = nrp.Optimisation( evaluator=cell_evaluator, eval_function=cell_evaluator.evaluate_with_lists, offspring_size=10, - use_scoop=True) + use_scoop=True, +) -if __name__ == '__main__': +if __name__ == "__main__": final_pop, hall_of_fame, logs, hist = optimisation.run(max_ngen=2) - print('BEST:', hall_of_fame[0]) + print("BEST:", hall_of_fame[0]) diff --git a/bluepyopt/tests/opt_nose_test.sh b/bluepyopt/tests/opt_nose_test.sh new file mode 100644 index 00000000..bc142785 --- /dev/null +++ b/bluepyopt/tests/opt_nose_test.sh @@ -0,0 +1,4 @@ +nosetests test_scores_unit.py +nosetests test_adexp_opt.py +nosetests test_izhi_opt.py +nosetests test_rheobase_model.py diff --git a/bluepyopt/tests/test_adexp_opt.py b/bluepyopt/tests/test_adexp_opt.py new file mode 100644 index 00000000..84e5155d --- /dev/null +++ b/bluepyopt/tests/test_adexp_opt.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python +# coding: utf-8 +SILENT = True +import warnings + +if SILENT: + warnings.filterwarnings("ignore") +import logging.config + +logging.config.dictConfig( + { + "version": 1, + # Other configs ... + "disable_existing_loggers": True, + } +) + +import logging +import sys + +import numpy as np +import efel +import quantities as qt + +from neuronunit.allenapi.allen_data_efel_features_opt import ( + opt_to_model, + opt_setup, + opt_exec, +) +from neuronunit.allenapi.allen_data_efel_features_opt import opt_to_model +from neuronunit.allenapi.utils import dask_map_function + +from neuronunit.optimization.model_parameters import ( + MODEL_PARAMS, + BPO_PARAMS, + to_bpo_param, +) +from neuronunit.optimization.optimization_management import inject_model_soma +from neuronunit.models.optimization_model_layer import OptimizationModel +from jithub.models import model_classes +from sciunit.scores import RelativeDifferenceScore +import allensdk + +sdk_logger = logging.getLogger("allensdk") +sdk_logger.setLevel(logging.ERROR) + +from nose.plugins.attrib import attr +import unittest +import nose.tools as nt + + +def test_import(): + """bluepyopt: test importing neuronunit""" + from neuronunit.allenapi.allen_data_efel_features_opt import ( + opt_to_model, + opt_setup, + opt_exec, + ) + from neuronunit.allenapi.allen_data_efel_features_opt import opt_to_model + from neuronunit.allenapi.utils import dask_map_function + + from neuronunit.optimization.model_parameters import ( + MODEL_PARAMS, + BPO_PARAMS, + to_bpo_param, + ) + from neuronunit.optimization.optimization_management import inject_model_soma + from jithub.models import model_classes + from sciunit.scores import RelativeDifferenceScore + + +class testOptimization(unittest.TestCase): + def setUp(self): + self.ids = [ + 324257146, + 325479788, + 476053392, + 623893177, + 623960880, + 482493761, + 471819401, + ] + + # @attr("unit") + def test_opt_1(self): + specimen_id = self.ids[1] + cellmodel = "ADEXP" + + if cellmodel == "IZHI": + model = model_classes.IzhiModel() + if cellmodel == "MAT": + model = model_classes.MATModel() + if cellmodel == "ADEXP": + model = model_classes.ADEXPModel() + + target_num_spikes = 5 + + efel_filter_iterable = [ + "ISI_log_slope", + "mean_frequency", + "adaptation_index2", + "first_isi", + "ISI_CV", + "median_isi", + "Spikecount", + "all_ISI_values", + "ISI_values", + "time_to_first_spike", + "time_to_last_spike", + "time_to_second_spike", + ] + [suite, target_current, spk_count, cell_evaluator, simple_cell] = opt_setup( + specimen_id, + cellmodel, + target_num_spikes, + template_model=model, + fixed_current=False, + cached=False, + score_type=RelativeDifferenceScore, + efel_filter_iterable=efel_filter_iterable, + ) + + NGEN = 55 + MU = 35 + + mapping_funct = dask_map_function + final_pop, hall_of_fame, logs, hist = opt_exec( + MU, NGEN, mapping_funct, cell_evaluator, cxpb=0.4, mutpb=0.01 + ) + opt, target, scores, obs_preds, df = opt_to_model( + hall_of_fame, cell_evaluator, suite, target_current, spk_count + ) + best_ind = hall_of_fame[0] + fitnesses = cell_evaluator.evaluate_with_lists(best_ind) + # assert np.sum(fitnesses) < 10.7 + nt.assert_greater(10.7, np.sum(fitnesses)) + self.assertGreater(10.7, np.sum(fitnesses)) + + +if __name__ == "__main__": + unittest.main() diff --git a/bluepyopt/tests/test_bluepyopt.py b/bluepyopt/tests/test_bluepyopt.py index d818bc62..4007c74b 100644 --- a/bluepyopt/tests/test_bluepyopt.py +++ b/bluepyopt/tests/test_bluepyopt.py @@ -24,7 +24,7 @@ from nose.plugins.attrib import attr -@attr('unit') +@attr("unit") def test_import(): """bluepyopt: test importing bluepyopt""" import bluepyopt # NOQA diff --git a/bluepyopt/tests/test_ephys/test_evaluators.py b/bluepyopt/tests/test_ephys/test_evaluators.py index a3f64408..16338777 100644 --- a/bluepyopt/tests/test_ephys/test_evaluators.py +++ b/bluepyopt/tests/test_ephys/test_evaluators.py @@ -110,7 +110,11 @@ def test_CellEvaluator_evaluate(): sim=sim) responses = protocol.run(cell_model, {'cm': 1.0}, sim=sim) + feature_value = efeature.calculate_feature(responses) + feature_value_eva = evaluator.evaluate_with_dicts( + {'cm': 1.0}, target='values' + ) score = evaluator.evaluate([1.0]) expected_score = abs(mean - feature_value) @@ -120,3 +124,6 @@ def test_CellEvaluator_evaluate(): score_dict = evaluator.objective_dict(score) nt.assert_almost_equal(score_dict['singleton'], expected_score) + nt.assert_almost_equal( + feature_value, feature_value_eva['singleton'] + ) diff --git a/bluepyopt/tests/test_ephys/test_objectives.py b/bluepyopt/tests/test_ephys/test_objectives.py index 7b236705..57e2dc9b 100644 --- a/bluepyopt/tests/test_ephys/test_objectives.py +++ b/bluepyopt/tests/test_ephys/test_objectives.py @@ -79,10 +79,12 @@ def test_SingletonObjective(): responses = {'square_pulse_step1.soma.v': response, } efeature_value = efeature.calculate_feature(responses) + efeature_value_obj = s_obj.calculate_value(responses) nt.assert_almost_equal( s_obj.calculate_score(responses), abs(efeature_value - mean)) + nt.assert_almost_equal(efeature_value_obj, efeature_value) @attr('unit') diff --git a/bluepyopt/tests/test_evaluators.py b/bluepyopt/tests/test_evaluators.py index ee5e5fb3..1c73d05b 100644 --- a/bluepyopt/tests/test_evaluators.py +++ b/bluepyopt/tests/test_evaluators.py @@ -26,7 +26,7 @@ import bluepyopt -@attr('unit') +@attr("unit") def test_evaluator_init(): """bluepyopt.evaluators: test Evaluator init""" diff --git a/bluepyopt/tests/test_izhi_opt.py b/bluepyopt/tests/test_izhi_opt.py new file mode 100644 index 00000000..a2f1ea3c --- /dev/null +++ b/bluepyopt/tests/test_izhi_opt.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python +# coding: utf-8 +SILENT = True +import warnings + +if SILENT: + warnings.filterwarnings("ignore") +import unittest +import numpy as np +import efel +import quantities as qt + +import unittest +import nose.tools as nt + +from neuronunit.allenapi.allen_data_efel_features_opt import ( + opt_to_model, + opt_setup, + opt_exec, +) +from neuronunit.allenapi.allen_data_efel_features_opt import opt_to_model +from neuronunit.allenapi.utils import dask_map_function + +from neuronunit.optimization.model_parameters import ( + MODEL_PARAMS, + BPO_PARAMS, + to_bpo_param, +) +from neuronunit.optimization.optimization_management import inject_model_soma +from jithub.models import model_classes + +from sciunit.scores import RelativeDifferenceScore + + +from nose.plugins.attrib import attr +import unittest +import nose.tools as nt +import allensdk +import logging + +sdk_logger = logging.getLogger("allensdk") +sdk_logger.setLevel(logging.ERROR) +import logging.config + +logging.config.dictConfig( + { + "version": 1, + # Other configs ... + "disable_existing_loggers": True, + } +) + + +class testOptimization(unittest.TestCase): + def setUp(self): + self.ids = [ + 324257146, + 325479788, + 476053392, + 623893177, + 623960880, + 482493761, + 471819401, + ] + + # @attr("unit") + def test_opt_1(self): + specimen_id = self.ids[1] + cellmodel = "IZHI" + + if cellmodel == "IZHI": + model = model_classes.IzhiModel() + if cellmodel == "MAT": + model = model_classes.MATModel() + if cellmodel == "ADEXP": + model = model_classes.ADEXPModel() + + target_num_spikes = 8 + + efel_filter_iterable = [ + "ISI_log_slope", + "mean_frequency", + "adaptation_index2", + "ISI_CV", + "Spikecount", + "all_ISI_values", + "ISI_values", + "time_to_first_spike", + "time_to_last_spike", + "time_to_second_spike", + ] + sss = efel.getFeatureNames() + + for s in efel_filter_iterable: + print(s in sss) + + [suite, target_current, spk_count, cell_evaluator, simple_cell] = opt_setup( + specimen_id, + cellmodel, + target_num_spikes, + template_model=model, + fixed_current=False, + cached=False, + score_type=RelativeDifferenceScore, + ) + + NGEN = 155 + MU = 100 + + mapping_funct = dask_map_function + final_pop, hall_of_fame, logs, hist = opt_exec( + MU, NGEN, mapping_funct, cell_evaluator, cxpb=0.4, mutpb=0.01 + ) + opt, target, scores, obs_preds, df = opt_to_model( + hall_of_fame, cell_evaluator, suite, target_current, spk_count + ) + best_ind = hall_of_fame[0] + fitnesses = cell_evaluator.evaluate_with_lists(best_ind) + assert np.sum(fitnesses) < 30.5 + self.assertGreater(30.5, np.sum(fitnesses)) + nt.assert_is_greater(30.5, np.sum(fitnesses)) + + +if __name__ == "__main__": + unittest.main() diff --git a/bluepyopt/tests/test_l5pc.py b/bluepyopt/tests/test_l5pc.py index 9102461d..ce20d7ee 100644 --- a/bluepyopt/tests/test_l5pc.py +++ b/bluepyopt/tests/test_l5pc.py @@ -5,6 +5,7 @@ import sys from contextlib import contextmanager + if sys.version_info[0] < 3: from StringIO import StringIO else: @@ -13,8 +14,9 @@ import nose.tools as nt from nose.plugins.attrib import attr -L5PC_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), - '../../examples/l5pc')) +L5PC_PATH = os.path.abspath( + os.path.join(os.path.dirname(__file__), "../../examples/l5pc") +) SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, L5PC_PATH) @@ -24,34 +26,31 @@ neuron_sim = ephys.simulators.NrnSimulator() -neuron_sim.neuron.h.nrn_load_dll( - os.path.join( - L5PC_PATH, - 'x86_64/.libs/libnrnmech.so')) +neuron_sim.neuron.h.nrn_load_dll(os.path.join(L5PC_PATH, "x86_64/.libs/libnrnmech.so")) # Parameters in release circuit model release_parameters = { - 'gNaTs2_tbar_NaTs2_t.apical': 0.026145, - 'gSKv3_1bar_SKv3_1.apical': 0.004226, - 'gImbar_Im.apical': 0.000143, - 'gNaTa_tbar_NaTa_t.axonal': 3.137968, - 'gK_Tstbar_K_Tst.axonal': 0.089259, - 'gamma_CaDynamics_E2.axonal': 0.002910, - 'gNap_Et2bar_Nap_Et2.axonal': 0.006827, - 'gSK_E2bar_SK_E2.axonal': 0.007104, - 'gCa_HVAbar_Ca_HVA.axonal': 0.000990, - 'gK_Pstbar_K_Pst.axonal': 0.973538, - 'gSKv3_1bar_SKv3_1.axonal': 1.021945, - 'decay_CaDynamics_E2.axonal': 287.198731, - 'gCa_LVAstbar_Ca_LVAst.axonal': 0.008752, - 'gamma_CaDynamics_E2.somatic': 0.000609, - 'gSKv3_1bar_SKv3_1.somatic': 0.303472, - 'gSK_E2bar_SK_E2.somatic': 0.008407, - 'gCa_HVAbar_Ca_HVA.somatic': 0.000994, - 'gNaTs2_tbar_NaTs2_t.somatic': 0.983955, - 'decay_CaDynamics_E2.somatic': 210.485284, - 'gCa_LVAstbar_Ca_LVAst.somatic': 0.000333 + "gNaTs2_tbar_NaTs2_t.apical": 0.026145, + "gSKv3_1bar_SKv3_1.apical": 0.004226, + "gImbar_Im.apical": 0.000143, + "gNaTa_tbar_NaTa_t.axonal": 3.137968, + "gK_Tstbar_K_Tst.axonal": 0.089259, + "gamma_CaDynamics_E2.axonal": 0.002910, + "gNap_Et2bar_Nap_Et2.axonal": 0.006827, + "gSK_E2bar_SK_E2.axonal": 0.007104, + "gCa_HVAbar_Ca_HVA.axonal": 0.000990, + "gK_Pstbar_K_Pst.axonal": 0.973538, + "gSKv3_1bar_SKv3_1.axonal": 1.021945, + "decay_CaDynamics_E2.axonal": 287.198731, + "gCa_LVAstbar_Ca_LVAst.axonal": 0.008752, + "gamma_CaDynamics_E2.somatic": 0.000609, + "gSKv3_1bar_SKv3_1.somatic": 0.303472, + "gSK_E2bar_SK_E2.somatic": 0.008407, + "gCa_HVAbar_Ca_HVA.somatic": 0.000994, + "gNaTs2_tbar_NaTs2_t.somatic": 0.983955, + "decay_CaDynamics_E2.somatic": 210.485284, + "gCa_LVAstbar_Ca_LVAst.somatic": 0.000333, } @@ -65,8 +64,8 @@ def load_from_json(filename): def dump_to_json(content, filename): """Dump structure to json""" - with open(filename, 'w') as json_file: - return json.dump(content, json_file, indent=4, separators=(',', ': ')) + with open(filename, "w") as json_file: + return json.dump(content, json_file, indent=4, separators=(",", ": ")) def test_import(): @@ -90,10 +89,9 @@ def setup(self): sys.path.insert(0, L5PC_PATH) import l5pc_model # NOQA + self.l5pc_cell = l5pc_model.create() - nt.assert_is_instance( - self.l5pc_cell, - bluepyopt.ephys.models.CellModel) + nt.assert_is_instance(self.l5pc_cell, bluepyopt.ephys.models.CellModel) self.nrn = ephys.simulators.NrnSimulator() def test_instantiate(self): @@ -121,18 +119,18 @@ def setup(self): self.l5pc_evaluator = l5pc_evaluator.create() nt.assert_is_instance( - self.l5pc_evaluator, - bluepyopt.ephys.evaluators.CellEvaluator) + self.l5pc_evaluator, bluepyopt.ephys.evaluators.CellEvaluator + ) - @attr('slow') + @attr("slow") def test_eval(self): """L5PC: test evaluation of l5pc evaluator""" - result = self.l5pc_evaluator.evaluate_with_dicts( - param_dict=release_parameters) + result = self.l5pc_evaluator.evaluate_with_dicts(param_dict=release_parameters) expected_results = load_from_json( - os.path.join(SCRIPT_DIR, 'expected_results.json')) + os.path.join(SCRIPT_DIR, "expected_results.json") + ) # Use two lines below to update expected result # expected_results['TestL5PCEvaluator.test_eval'] = result @@ -140,12 +138,12 @@ def test_eval(self): try: nt.assert_count_equal( - result, - expected_results['TestL5PCEvaluator.test_eval']) + result, expected_results["TestL5PCEvaluator.test_eval"] + ) except AttributeError: nt.assert_items_equal( - result, - expected_results['TestL5PCEvaluator.test_eval']) + result, expected_results["TestL5PCEvaluator.test_eval"] + ) def teardown(self): """Teardown""" @@ -164,11 +162,12 @@ def stdout_redirector(stream): sys.stdout = old_stdout -@attr('slow') +@attr("slow") def test_exec(): """L5PC Notebook: test execution""" import numpy - numpy.seterr(all='raise') + + numpy.seterr(all="raise") old_cwd = os.getcwd() output = StringIO() try: @@ -178,16 +177,15 @@ def test_exec(): # Probably because multiprocessing doesn't work correctly during # import if sys.version_info[0] < 3: - execfile('L5PC.py') # NOQA + execfile("L5PC.py") # NOQA else: - with open('L5PC.py') as l5pc_file: - exec(compile(l5pc_file.read(), 'L5PC.py', 'exec')) # NOQA + with open("L5PC.py") as l5pc_file: + exec(compile(l5pc_file.read(), "L5PC.py", "exec")) # NOQA stdout = output.getvalue() # first and last values of optimal individual - nt.assert_true('0.001017834439738432' in stdout) - nt.assert_true('202.18814057682334' in stdout) - nt.assert_true( - "'gamma_CaDynamics_E2.somatic': 0.03229357096515606" in stdout) + nt.assert_true("0.001017834439738432" in stdout) + nt.assert_true("202.18814057682334" in stdout) + nt.assert_true("'gamma_CaDynamics_E2.somatic': 0.03229357096515606" in stdout) finally: os.chdir(old_cwd) output.close() diff --git a/bluepyopt/tests/test_numba_models.py b/bluepyopt/tests/test_numba_models.py new file mode 100644 index 00000000..0781114c --- /dev/null +++ b/bluepyopt/tests/test_numba_models.py @@ -0,0 +1,127 @@ +import unittest + +# import nose as nt +import nose.tools as nt +from nose.plugins.attrib import attr +import jithub +from jithub.models import model_classes +import quantities as pq +import numpy as np + +# import matplotlib.pyplot as plt +import collections +import quantities as pq +import time + +DELAY = 0 * pq.ms +DURATION = 250 * pq.ms + + +class TestNumbaModels(object): + def setup(self): + # https://www.izhikevich.org/publications/spikes.htm + type2007 = collections.OrderedDict( + [ + # C k vr vt vpeak a b c d celltype + ("RS", (100, 0.7, -60, -40, 35, 0.03, -2, -50, 100, 1)), + ("IB", (150, 1.2, -75, -45, 50, 0.01, 5, -56, 130, 2)), + ("TC", (200, 1.6, -60, -50, 35, 0.01, 15, -60, 10, 6)), + ("LTS", (100, 1.0, -56, -42, 40, 0.03, 8, -53, 20, 4)), + ("RTN", (40, 0.25, -65, -45, 0, 0.015, 10, -55, 50, 7)), + ("FS", (20, 1, -55, -40, 25, 0.2, -2, -45, -55, 5)), + ("CH", (50, 1.5, -60, -40, 25, 0.03, 1, -40, 150, 3)), + ] + ) + + trans_dict = collections.OrderedDict( + [ + (k, []) + for k in ["C", "k", "vr", "vt", "vPeak", "a", "b", "c", "d", "celltype"] + ] + ) + for i, k in enumerate(trans_dict.keys()): + for v in type2007.values(): + trans_dict[k].append(v[i]) + + reduced_cells = collections.OrderedDict( + [(k, []) for k in ["RS", "IB", "TC", "LTS", "RTN", "FS", "CH"]] + ) + for index, key in enumerate(reduced_cells.keys()): + reduced_cells[key] = {} + for k, v in trans_dict.items(): + reduced_cells[key][k] = v[index] + self.reduced_cells = reduced_cells + + def test_models(self): + cellmodels = ["IZHI", "ADEXP"] + + for cellmodel in cellmodels: + if cellmodel == "IZHI": + model = model_classes.IzhiModel() + if cellmodel == "MAT": + model = model_classes.MATModel() + if cellmodel == "ADEXP": + model = model_classes.ADEXPModel() + ALLEN_DELAY = 1000.0 * pq.ms + ALLEN_DURATION = 2000.0 * pq.ms + uc = { + "amplitude": 25 * pq.pA, + "duration": ALLEN_DURATION, + "delay": ALLEN_DELAY, + } + model.inject_square_current(**uc) + vm = model.get_membrane_potential() + try: + assert float(int(np.round(vm.times[-1], 0))) == float( + ALLEN_DELAY + ) + float(ALLEN_DURATION) + except: + print( + float(int(np.round(vm.times[-1], 0))) + == float(ALLEN_DELAY) + float(ALLEN_DURATION) + ) + cellmodel = "IZHI" + IinRange = [60, 70, 85, 100] + + params = {} + params["amplitude"] = 500 * pq.pA + params["delay"] = DELAY + params["duration"] = 600 * pq.ms + + model = model_classes.ADEXPModel() + model.set_attrs({"b": self.reduced_cells["RS"]["b"]}) + nt.assert_equal(model.attrs["b"], self.reduced_cells["RS"]["b"]) + for i, amp in enumerate(IinRange): + model = model_classes.IzhiModel() + model.set_attrs(self.reduced_cells["RS"]) + nt.assert_equal(model.attrs["a"], self.reduced_cells["RS"]["a"]) + params["amplitude"] = amp * pq.pA + + t1 = time.time() + + model.inject_square_current(**params) + vm = model.get_membrane_potential() + nt.assert_is_not_none(vm) + t2 = time.time() + if i == 0: + print("compile time taken on block {0} ".format(t2 - t1)) + else: + print("time taken on block {0} ".format(t2 - t1)) + + IinRange = [290, 370, 500, 550] + + params = {} + params["delay"] = DELAY + params["duration"] = 600 * pq.ms + + for i, amp in enumerate(IinRange): + model = model_classes.IzhiModel() + + model.set_attrs(self.reduced_cells["IB"]) + nt.assert_equal(model.attrs["a"], self.reduced_cells["IB"]["a"]) + + params["amplitude"] = amp + + model.inject_square_current(**params) + vm = model.get_membrane_potential() + nt.assert_is_not_none(vm) diff --git a/bluepyopt/tests/test_parameters.py b/bluepyopt/tests/test_parameters.py index 4a4cbfdc..6f8097f3 100644 --- a/bluepyopt/tests/test_parameters.py +++ b/bluepyopt/tests/test_parameters.py @@ -27,20 +27,20 @@ import bluepyopt -@attr('unit') +@attr("unit") def test_parameters_init(): """bluepyopt.parameters: test Parameter init""" - param = bluepyopt.parameters.Parameter(name='test') + param = bluepyopt.parameters.Parameter(name="test") nt.assert_is_instance(param, bluepyopt.parameters.Parameter) - nt.assert_equal(param.name, 'test') + nt.assert_equal(param.name, "test") -@attr('unit') +@attr("unit") def test_parameters_fields(): """bluepyopt.parameters: test Parameter fields""" - param = bluepyopt.parameters.Parameter(name='test') + param = bluepyopt.parameters.Parameter(name="test") nt.assert_equal(param.lower_bound, None) nt.assert_equal(param.upper_bound, None) @@ -48,60 +48,62 @@ def test_parameters_fields(): param.freeze(5) nt.assert_raises(Exception, setattr, param, "value", 5) - param = bluepyopt.parameters.Parameter(name='test', bounds=[2, 5]) + param = bluepyopt.parameters.Parameter(name="test", bounds=[2, 5]) nt.assert_raises(ValueError, param.freeze, 1) -@attr('unit') +@attr("unit") def test_parameters_str(): """bluepyopt.parameters: test Parameter str conversion""" - param = bluepyopt.parameters.Parameter(name='test') + param = bluepyopt.parameters.Parameter(name="test") - nt.assert_equal(str(param), 'test: value = None') + nt.assert_equal(str(param), "test: value = None") param.freeze(5.5) - nt.assert_equal(str(param), 'test: value = 5.5') + nt.assert_equal(str(param), "test: value = 5.5") -@attr('unit') +@attr("unit") def test_MetaListEqualParameter_init(): """bluepyopt.parameters: test MetaListEqualParameter init""" sub_params = [ - bluepyopt.parameters.Parameter( - name='sub1', value=1), bluepyopt.parameters.Parameter( - name='sub2', value=2)] + bluepyopt.parameters.Parameter(name="sub1", value=1), + bluepyopt.parameters.Parameter(name="sub2", value=2), + ] nt.assert_equal(sub_params[0].value, 1) nt.assert_equal(sub_params[1].value, 2) param = bluepyopt.parameters.MetaListEqualParameter( - name='param', value=0, frozen=True, sub_parameters=sub_params) + name="param", value=0, frozen=True, sub_parameters=sub_params + ) nt.assert_is_instance(param, bluepyopt.parameters.Parameter) nt.assert_is_instance(param, bluepyopt.parameters.MetaListEqualParameter) - nt.assert_equal(param.name, 'param') - nt.assert_equal(param.sub_parameters[0].name, 'sub1') - nt.assert_equal(param.sub_parameters[1].name, 'sub2') + nt.assert_equal(param.name, "param") + nt.assert_equal(param.sub_parameters[0].name, "sub1") + nt.assert_equal(param.sub_parameters[1].name, "sub2") nt.assert_equal(param.value, 0) nt.assert_equal(sub_params[0].value, 0) nt.assert_equal(sub_params[1].value, 0) -@attr('unit') +@attr("unit") def test_MetaListEqualParameter_freeze_unfreeze(): """bluepyopt.parameters: test MetaListEqualParameter freeze and unfreeze""" sub_params = [ - bluepyopt.parameters.Parameter( - name='sub1', value=1), bluepyopt.parameters.Parameter( - name='sub2', value=2)] + bluepyopt.parameters.Parameter(name="sub1", value=1), + bluepyopt.parameters.Parameter(name="sub2", value=2), + ] param = bluepyopt.parameters.MetaListEqualParameter( - name='param', sub_parameters=sub_params) + name="param", sub_parameters=sub_params + ) nt.assert_equal(param.value, None) nt.assert_equal(sub_params[0].value, 1) @@ -119,26 +121,27 @@ def test_MetaListEqualParameter_freeze_unfreeze(): nt.assert_raises(Exception, param.freeze, 0) -@attr('unit') +@attr("unit") def test_MetaListEqualParamete_str(): """bluepyopt.parameters: test MetaListEqualParamete str conversion""" sub_params = [ - bluepyopt.parameters.Parameter( - name='sub1', value=1), bluepyopt.parameters.Parameter( - name='sub2', value=2)] + bluepyopt.parameters.Parameter(name="sub1", value=1), + bluepyopt.parameters.Parameter(name="sub2", value=2), + ] param = bluepyopt.parameters.MetaListEqualParameter( - name='param', sub_parameters=sub_params) + name="param", sub_parameters=sub_params + ) nt.assert_equal( str(param), - 'param (sub_params: sub1: value = None,sub2: value = None): ' - 'value = None') + "param (sub_params: sub1: value = None,sub2: value = None): " "value = None", + ) param.freeze(5.5) nt.assert_equal( str(param), - 'param (sub_params: sub1: value = 5.5,sub2: value = 5.5): ' - 'value = 5.5') + "param (sub_params: sub1: value = 5.5,sub2: value = 5.5): " "value = 5.5", + ) diff --git a/bluepyopt/tests/test_rheobase_model.py b/bluepyopt/tests/test_rheobase_model.py new file mode 100644 index 00000000..92c8ea27 --- /dev/null +++ b/bluepyopt/tests/test_rheobase_model.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +# coding: utf-8 +import unittest + + +# import matplotlib + +import numpy as np +from neuronunit.optimization.model_parameters import ( + MODEL_PARAMS, + BPO_PARAMS, + to_bpo_param, +) +from neuronunit.optimization.optimization_management import ( + model_to_rheo, + inject_and_plot_model, +) +from jithub.models import model_classes + +# import matplotlib.pyplot as plt +import quantities as qt +import unittest +import nose.tools as nt + + +class testOptimization(unittest.TestCase): + def setUp(self): + self = self + + # @attr('unit') + def test_opt_1(self): + model_type = "ADEXP" + + if model_type == "IZHI": + from jithub.models.model_classes import IzhiModel + + cellmodel = IzhiModel() + if model_type == "ADEXP": + from jithub.models.model_classes import ADEXPModel + + cellmodel = ADEXPModel() + + cellmodel.params = {k: np.mean(v) for k, v in MODEL_PARAMS[model_type].items()} + cellmodel = model_to_rheo(cellmodel) + # assert cellmodel.rheobase is not None + self.assertIsNotNone(cellmodel.rheobase) + vm, _, cellmodel = inject_and_plot_model(cellmodel, plotly=False) + self.assertIsNotNone(vm) + self.assertIsNotNone(cellmodel) + + +if __name__ == "__main__": + unittest.main() diff --git a/bluepyopt/tests/test_scores_unit.py b/bluepyopt/tests/test_scores_unit.py new file mode 100644 index 00000000..22e3ed87 --- /dev/null +++ b/bluepyopt/tests/test_scores_unit.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python +# coding: utf-8 + +import unittest +import matplotlib + +matplotlib.use("Agg") +SILENT = True +import warnings + +if SILENT: + warnings.filterwarnings("ignore") + +from neuronunit.allenapi.allen_data_driven import opt_setup, opt_setup_two, opt_exec +from neuronunit.allenapi.allen_data_driven import opt_to_model, wrap_setups +from neuronunit.allenapi.utils import dask_map_function +from neuronunit.optimization.model_parameters import ( + MODEL_PARAMS, + BPO_PARAMS, + to_bpo_param, +) +from neuronunit.optimization.optimization_management import inject_and_plot_model +import numpy as np +from neuronunit.models.optimization_model_layer import OptimizationModel +from jithub.models import model_classes +import matplotlib.pyplot as plt +import quantities as qt +import os + +from sciunit.scores import RelativeDifferenceScore, ZScore +from sciunit.utils import config_set, config_get + +config_set("PREVALIDATE", False) +assert config_get("PREVALIDATE") is False + + +class testOptimizationAllenMultiSpike(unittest.TestCase): + def setUp(self): + self = self + # In principle any index into data should work + # but '1' is chosen here. Robust tests would use any index. + self.ids = [ + 324257146, + 325479788, + 476053392, + 623893177, + 623960880, + 482493761, + 471819401, + ] + self.specimen_id = self.ids[1] + + def optimize_job(self, model_type, score_type=ZScore): + find_sweep_with_n_spikes = 8 + from jithub.models.model_classes import ADEXPModel + + model = ADEXPModel() + model.params = BPO_PARAMS[model_type] + fixed_current = 122 * qt.pA + if model_type == "ADEXP": + NGEN = 55 + MU = 16 + else: + NGEN = 45 + MU = 100 + + mapping_funct = dask_map_function + cell_evaluator, simple_cell, suite, target_current, spk_count = wrap_setups( + self.specimen_id, + model_type, + find_sweep_with_n_spikes, + template_model=model, + fixed_current=False, + cached=False, + score_type=score_type, + ) + final_pop, hall_of_fame, logs, hist = opt_exec( + MU, NGEN, mapping_funct, cell_evaluator + ) + opt, target, scores, obs_preds, df = opt_to_model( + hall_of_fame, cell_evaluator, suite, target_current, spk_count + ) + best_ind = hall_of_fame[0] + fitnesses = cell_evaluator.evaluate_with_lists(best_ind) + target.vm_soma = suite.traces["vm_soma"] + return np.sum(fitnesses) + + def test_opt_relative_diff(self): + model_type = "ADEXP" + sum_fit = self.optimize_job(model_type, score_type=RelativeDifferenceScore) + assert sum_fit < 42.0 + + # this is just to speed up CI tests to avoid timeout. + @unittest.skip + def test_opt_ZScore(self): + model_type = "ADEXP" + sum_fit = self.optimize_job(model_type, score_type=ZScore) + assert sum_fit < 2.1 + + @unittest.skip + def test_opt_relative_diff_izhi(self): + model_type = "IZHI" + self.optimize_job(model_type, score_type=RelativeDifferenceScore) + assert sum_fit < 32.0 + + # this is just to speed up CI tests to avoid timeout. + @unittest.skip + def test_opt_ZScore_izhi(self): + model_type = "IZHI" + self.optimize_job(model_type, score_type=ZScore) + assert sum_fit < 2.1 diff --git a/bluepyopt/tests/test_simplecell.py b/bluepyopt/tests/test_simplecell.py index 01f240ba..23e8de37 100644 --- a/bluepyopt/tests/test_simplecell.py +++ b/bluepyopt/tests/test_simplecell.py @@ -3,9 +3,9 @@ import sys import os -SIMPLECELL_PATH = os.path.abspath(os.path.join( - os.path.dirname(__file__), - '../../examples/simplecell')) +SIMPLECELL_PATH = os.path.abspath( + os.path.join(os.path.dirname(__file__), "../../examples/simplecell") +) # sys.path.insert(0, SIMPLECELL_PATH) @@ -26,7 +26,7 @@ def setup(self): self.old_stdout = sys.stdout os.chdir(SIMPLECELL_PATH) - sys.stdout = open(os.devnull, 'w') + sys.stdout = open(os.devnull, "w") @staticmethod def test_exec(): @@ -35,10 +35,10 @@ def test_exec(): # Probably because multiprocessing doesn't work correctly during # import if sys.version_info[0] < 3: - execfile('simplecell.py') # NOQA + execfile("simplecell.py") # NOQA else: - with open('simplecell.py') as sc_file: - exec(compile(sc_file.read(), 'simplecell.py', 'exec')) # NOQA + with open("simplecell.py") as sc_file: + exec(compile(sc_file.read(), "simplecell.py", "exec")) # NOQA def teardown(self): """Tear down""" diff --git a/bluepyopt/tests/test_stochkv.py b/bluepyopt/tests/test_stochkv.py index 0c68bb44..89f6b95e 100644 --- a/bluepyopt/tests/test_stochkv.py +++ b/bluepyopt/tests/test_stochkv.py @@ -5,10 +5,12 @@ import difflib import nose.tools as nt + # from nose.plugins.attrib import attr -STOCHKV_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), - '../../examples/stochkv')) +STOCHKV_PATH = os.path.abspath( + os.path.join(os.path.dirname(__file__), "../../examples/stochkv") +) sys.path.insert(0, STOCHKV_PATH) @@ -17,9 +19,8 @@ neuron_sim = ephys.simulators.NrnSimulator() neuron_sim.neuron.h.nrn_load_dll( - os.path.join( - STOCHKV_PATH, - 'x86_64/.libs/libnrnmech.so')) + os.path.join(STOCHKV_PATH, "x86_64/.libs/libnrnmech.so") +) def compare_strings(s1, s2): @@ -28,7 +29,7 @@ def compare_strings(s1, s2): diff = list(difflib.unified_diff(s1.splitlines(1), s2.splitlines(1))) if len(diff) > 0: - print(''.join(diff)) + print("".join(diff)) return False else: return True @@ -44,28 +45,41 @@ def test_run(): """StochKv example: test run""" import stochkvcell # NOQA + for deterministic in [True, False]: - py_response, hoc_response, different_seed_response, hoc_string = \ - stochkvcell.run_stochkv_model(deterministic=deterministic) + ( + py_response, + hoc_response, + different_seed_response, + hoc_string, + ) = stochkvcell.run_stochkv_model(deterministic=deterministic) nt.assert_true( - py_response['Step.soma.v']['time'].equals( - hoc_response['Step.soma.v']['time'])) + py_response["Step.soma.v"]["time"].equals( + hoc_response["Step.soma.v"]["time"] + ) + ) nt.assert_true( - py_response['Step.soma.v']['voltage'].equals( - hoc_response['Step.soma.v']['voltage'])) + py_response["Step.soma.v"]["voltage"].equals( + hoc_response["Step.soma.v"]["voltage"] + ) + ) if deterministic: nt.assert_true( - py_response['Step.soma.v']['voltage'].equals( - different_seed_response['Step.soma.v']['voltage'])) + py_response["Step.soma.v"]["voltage"].equals( + different_seed_response["Step.soma.v"]["voltage"] + ) + ) else: nt.assert_false( - py_response['Step.soma.v']['voltage'].equals( - different_seed_response['Step.soma.v']['voltage'])) + py_response["Step.soma.v"]["voltage"].equals( + different_seed_response["Step.soma.v"]["voltage"] + ) + ) expected_hoc_filename = os.path.join( - STOCHKV_PATH, - stochkvcell.stochkv_hoc_filename(deterministic=deterministic)) + STOCHKV_PATH, stochkvcell.stochkv_hoc_filename(deterministic=deterministic) + ) # with open(expected_hoc_filename, 'w') as expected_hoc_file: # expected_hoc_file.write(hoc_string) @@ -80,28 +94,42 @@ def test_run_stochkv3(): """StochKv3 example: test run""" import stochkv3cell # NOQA + for deterministic in [True, False]: - py_response, hoc_response, different_seed_response, hoc_string = \ - stochkv3cell.run_stochkv3_model(deterministic=deterministic) + ( + py_response, + hoc_response, + different_seed_response, + hoc_string, + ) = stochkv3cell.run_stochkv3_model(deterministic=deterministic) nt.assert_true( - py_response['Step.soma.v']['time'].equals( - hoc_response['Step.soma.v']['time'])) + py_response["Step.soma.v"]["time"].equals( + hoc_response["Step.soma.v"]["time"] + ) + ) nt.assert_true( - py_response['Step.soma.v']['voltage'].equals( - hoc_response['Step.soma.v']['voltage'])) + py_response["Step.soma.v"]["voltage"].equals( + hoc_response["Step.soma.v"]["voltage"] + ) + ) if deterministic: nt.assert_true( - py_response['Step.soma.v']['voltage'].equals( - different_seed_response['Step.soma.v']['voltage'])) + py_response["Step.soma.v"]["voltage"].equals( + different_seed_response["Step.soma.v"]["voltage"] + ) + ) else: nt.assert_false( - py_response['Step.soma.v']['voltage'].equals( - different_seed_response['Step.soma.v']['voltage'])) + py_response["Step.soma.v"]["voltage"].equals( + different_seed_response["Step.soma.v"]["voltage"] + ) + ) expected_hoc_filename = os.path.join( STOCHKV_PATH, - stochkv3cell.stochkv3_hoc_filename(deterministic=deterministic)) + stochkv3cell.stochkv3_hoc_filename(deterministic=deterministic), + ) # with open(expected_hoc_filename, 'w') as expected_hoc_file: # expected_hoc_file.write(hoc_string) diff --git a/bluepyopt/tests/test_tools.py b/bluepyopt/tests/test_tools.py index 2610341b..72f3d9d7 100644 --- a/bluepyopt/tests/test_tools.py +++ b/bluepyopt/tests/test_tools.py @@ -4,14 +4,14 @@ import nose.tools as nt -@attr('unit') +@attr("unit") def test_load(): """bluepyopt.tools: test import""" import bluepyopt.tools # NOQA -@attr('unit') +@attr("unit") def test_uint32_seed(): """bluepyopt.tools: test uint32_seed""" @@ -20,14 +20,15 @@ def test_uint32_seed(): nt.assert_equal(bpoptools.uint32_seed("test"), 640136438) import random + random.seed(1) hashes = [] strings = [] for _ in range(1000): - string = ''.join( - (chr(random.randint(0, 127)) for x in - range(random.randint(10, 255)))) + string = "".join( + (chr(random.randint(0, 127)) for x in range(random.randint(10, 255))) + ) strings.append(string) hashes.append(bpoptools.uint32_seed(string)) @@ -35,5 +36,6 @@ def test_uint32_seed(): nt.assert_equal(len(hashes), len(set(hashes))) import numpy + for hash_value in hashes: nt.assert_equal(hash_value, numpy.uint32(hash_value)) diff --git a/docs/source/conf.py b/docs/source/conf.py index 5ac5eebb..459e5da9 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -20,7 +20,6 @@ # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath('.')) -# sys.path.append('sphinxext') # -- General configuration ----------------------------------------------------- @@ -49,7 +48,6 @@ # General information about the project. project = u'bluepyopt' -copyright = u'2016, BBP, EPFL' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -103,8 +101,13 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'sphinx_rtd_theme' -# html_theme = 'haiku-bbp' +html_theme = 'sphinx-bluebrain-theme' +html_title = 'BluepyOpt' +html_show_sourcelink = False +html_theme_options = { + "repo_url": "https://github.com/BlueBrain/BluePyOpt/", + "repo_name": "BlueBrain/BluePyOpt" +} # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the diff --git a/docs/source/index.rst b/docs/source/index.rst index 2e141eaa..36bb0573 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -3,27 +3,16 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -BluePyOpt -========= -The Blue Brain Python Optimisation Library (BluePyOpt) is an extensible -framework for data-driven model parameter optimisation that wraps and -standardises several existing open-source tools. -It simplifies the task of creating and sharing these optimisations, -and the associated techniques and knowledge. -This is achieved by abstracting the optimisation and evaluation tasks -into various reusable and flexible discrete elements according to established -best-practices. - -Further, BluePyOpt provides methods for setting up both small- and large-scale -optimisations on a variety of platforms, -ranging from laptops to Linux clusters and cloud-based compute infrastructures. +.. include:: ../../README.rst + :end-before: .. substitutions .. toctree:: :maxdepth: 3 - api + Home + api.rst Indices and tables ================== @@ -32,3 +21,5 @@ Indices and tables * :ref:`modindex` * :ref:`search` +.. |banner| image:: /logo/BluePyOptBanner.png +.. |landscape_example| image:: ../../examples/simplecell/figures/landscape_example.png diff --git a/examples/neuronunit/OptimizationMulitSpikingIzhikevichModel.ipynb b/examples/neuronunit/OptimizationMulitSpikingIzhikevichModel.ipynb new file mode 100644 index 00000000..f83decdb --- /dev/null +++ b/examples/neuronunit/OptimizationMulitSpikingIzhikevichModel.ipynb @@ -0,0 +1,993 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# An example of using BluePyOpt/NeuronUnit Optimization\n", + "Using:\n", + "* Allen Brain Experimental data (`specimen_id=325479788`, sweep number `64`) to derive features from.\n", + "* EFEL feature extraction\n", + "* BluePyOpt Optimization.\n", + "* Numba JIT simple cell models (Izhikevich, Adaptive Exponential).\n", + "* Neuronunit model scoring" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "test\n" + ] + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "sns.set(context=\"paper\", font=\"monospace\")\n", + "%matplotlib inline\n", + "SILENT = True\n", + "import warnings\n", + "if SILENT:\n", + " warnings.filterwarnings(\"ignore\")\n", + "\n", + "from neuronunit.plotting.plot_utils import check_bin_vm_soma\n", + "from neuronunit.allenapi.allen_data_driven import opt_setup\n", + "from nb_utils import optimize_job\n", + "from sciunit.scores import RelativeDifferenceScore\n", + "import pandas as pd\n", + "import pickle\n", + "import quantities as pq\n", + "specimen_id = 325479788\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def test_opt_relative_diff(specimen_id,model_type = \"ADEXP\",efel_filter_iterable=None):\n", + " fitnesses,scores,obs_preds,opt,target,hall_of_fame,cell_evaluator = optimize_job(specimen_id,\n", + " model_type,\n", + " score_type=RelativeDifferenceScore,\n", + " efel_filter_iterable=efel_filter_iterable)\n", + " print(fitnesses)\n", + " return obs_preds,opt,target,hall_of_fame,cell_evaluator\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Below is a plot of vm trace for fitting the simple model to with neuron unit.\n", + "* It is from Allen Specimen id `325479788`, sweep number `64`.\n", + "* sweep number \n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "with open('325479788later_allen_NU_tests.p', \"rb\") as f:\n", + " suite = pickle.load(f)\n", + " \n", + "plt.plot(suite.traces[\"vm_soma\"].times,suite.traces[\"vm_soma\"])\n", + "plt.xlabel(pq.s)\n", + "plt.ylabel(suite.traces[\"vm_soma\"].dimensionality)\n", + "plt.title(\"$V_{M}$ Allen Specimen id 325479788, sweep number 64\")\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example 1\n", + "* Izhikevich model \n", + "* Allen specimen 325479788\n", + "You will notice that all the features are timinig related, and some would seem redudandant. This is because one must use brute force to get a good fit, for this particular problem." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next can use sensativity analysis on the genes to find out which genes needed varying." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "gen\tnevals\tavg \tstd \tmin \tmax \n", + "1 \t150 \t5130.89\t8238.13\t19.3253\t19000\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9ea205193f7047e7976334f444617b71", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=350.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2 \t141 \t4604.47\t7897.15\t19.3253\t19000\n", + "3 \t54 \t463.798\t2594.5 \t19.3253\t19000\n", + "4 \t56 \t565.378\t2937.53\t19.3253\t19000\n", + "5 \t54 \t841.074\t3758.13\t19.0392\t19000\n", + "6 \t57 \t1282.62\t4694.32\t19.0392\t19000\n", + "7 \t59 \t977.541\t4100.83\t17.7486\t19000\n", + "8 \t56 \t1301.89\t4691.77\t17.7486\t19000\n", + "9 \t58 \t1278.15\t4695.51\t11.3627\t19000\n", + "10 \t53 \t499.686\t2938.9 \t11.3627\t19000\n", + "11 \t53 \t800.911\t3762.21\t11.3627\t19000\n", + "12 \t53 \t1428.16\t4959.91\t10.3858\t19000\n", + "13 \t55 \t1575 \t5206.72\t7.9962 \t19000\n", + "14 \t45 \t1260.15\t4699.4 \t7.9962 \t19000\n", + "15 \t55 \t1572.34\t5207.51\t3.47145\t19000\n", + "16 \t56 \t480.662\t2940.45\t3.04489\t19000\n", + "17 \t59 \t479.213\t2940.68\t3.04489\t19000\n", + "18 \t56 \t164.862\t1712.3 \t3.04489\t19000\n", + "19 \t55 \t318.333\t2411.8 \t3.04489\t19000\n", + "20 \t52 \t161.364\t1712.61\t3.04489\t19000\n", + "21 \t55 \t162.303\t1712.53\t3.04489\t19000\n", + "22 \t57 \t6.46508\t6.2283 \t3.04489\t41.3222\n", + "23 \t57 \t7.74298\t6.21192\t3.04489\t45.5158\n", + "24 \t54 \t8.71551\t6.01824\t3.04489\t41.4118\n", + "25 \t53 \t164.993\t1712.28\t3.04489\t19000 \n", + "26 \t58 \t7.04599\t5.35405\t3.04489\t23.3618\n", + "27 \t56 \t167.732\t1712.03\t3.04489\t19000 \n", + "28 \t55 \t164.628\t1712.32\t3.04489\t19000 \n", + "29 \t57 \t163.089\t1712.46\t3.04489\t19000 \n", + "30 \t52 \t6.03574\t5.18454\t3.04489\t35.224 \n", + "31 \t56 \t9.94783\t5.55871\t2.96021\t26.3131\n", + "32 \t56 \t323.45 \t2411.14\t2.96021\t19000 \n", + "33 \t54 \t165.666\t1712.22\t2.96021\t19000 \n", + "34 \t53 \t163.668\t1712.4 \t2.96021\t19000 \n", + "35 \t54 \t7.16146\t7.06246\t2.96021\t45.3649\n", + "36 \t49 \t164.762\t1712.3 \t2.91005\t19000 \n", + "37 \t56 \t7.52153\t5.67076\t2.91005\t41.3541\n", + "38 \t53 \t165.398\t1712.25\t2.91005\t19000 \n", + "39 \t59 \t162.404\t1712.51\t2.91005\t19000 \n", + "40 \t53 \t6.51539\t6.55096\t2.91005\t41.8727\n", + "41 \t57 \t8.89694\t5.19399\t2.91005\t24.9693\n", + "42 \t55 \t12.4057\t6.18343\t2.72805\t45.2652\n", + "43 \t55 \t10.4849\t5.35966\t2.72805\t26.533 \n", + "44 \t56 \t13.4387\t5.62591\t2.72805\t44.9762\n", + "45 \t55 \t10.4254\t4.94465\t2.54541\t30.6591\n", + "46 \t55 \t166.323\t1712.16\t2.54541\t19000 \n", + "47 \t51 \t164.426\t1712.33\t2.54541\t19000 \n", + "48 \t54 \t8.25168\t5.71506\t2.54541\t25.7549\n", + "49 \t50 \t11.1846\t5.41774\t2.54541\t41.3895\n", + "50 \t57 \t9.16901\t5.3057 \t2.54541\t41.267 \n", + "51 \t52 \t164.326\t1712.34\t2.54541\t19000 \n", + "52 \t47 \t162.078\t1712.55\t2.54541\t19000 \n", + "53 \t49 \t5.06167\t5.05864\t2.54541\t41.3902\n", + "54 \t56 \t9.60532\t6.67547\t2.54541\t41.3151\n", + "55 \t44 \t9.89099\t6.50662\t2.54541\t45.4177\n", + "56 \t53 \t9.97389\t5.38442\t2.54541\t28.5856\n", + "57 \t55 \t11.0629\t4.56021\t2.54541\t30.2529\n", + "58 \t50 \t165.514\t1712.23\t2.54541\t19000 \n", + "59 \t56 \t163.751\t1712.39\t2.54541\t19000 \n", + "60 \t57 \t5.74163\t3.94406\t2.54541\t24.6696\n", + "61 \t49 \t165.22 \t1712.26\t2.52345\t19000 \n", + "62 \t49 \t162.666\t1712.49\t2.52345\t19000 \n", + "63 \t53 \t6.92351\t6.46736\t2.52345\t45.3639\n", + "64 \t50 \t319.839\t2411.6 \t2.52345\t19000 \n", + "65 \t46 \t6.07966\t4.52169\t2.52345\t26.3702\n", + "66 \t54 \t165.135\t1712.28\t2.52345\t19000 \n", + "67 \t49 \t6.34127\t5.08242\t2.52345\t25.3224\n", + "68 \t54 \t10.6747\t6.43966\t2.52345\t40.9898\n", + "69 \t49 \t7.17874\t4.32312\t2.52345\t20.0066\n", + "70 \t54 \t165.365\t1712.25\t2.52345\t19000 \n", + "71 \t50 \t163.378\t1712.43\t2.52345\t19000 \n", + "72 \t47 \t5.64083\t4.52499\t2.52345\t24.8217\n", + "73 \t52 \t10.6943\t6.59883\t2.52345\t41.4634\n", + "74 \t51 \t9.1512 \t4.51503\t2.52345\t19.8603\n", + "75 \t45 \t11.8667\t4.04568\t2.52345\t23.9455\n", + "76 \t53 \t165.134\t1712.26\t2.52345\t19000 \n", + "77 \t50 \t8.35549\t5.4092 \t2.52345\t32.6115\n", + "78 \t49 \t321.603\t2411.37\t2.52345\t19000 \n", + "79 \t50 \t8.03424\t4.63843\t2.52345\t24.5754\n", + "80 \t46 \t320.941\t2411.46\t2.52345\t19000 \n", + "81 \t49 \t7.5225 \t4.69124\t2.52345\t26.6797\n", + "82 \t48 \t10.7517\t8.75611\t2.52345\t86.8949\n", + "83 \t49 \t8.90338\t4.84685\t2.52345\t28.5849\n", + "84 \t46 \t9.18374\t5.88149\t2.52345\t45.4171\n", + "85 \t47 \t7.90111\t4.24759\t2.52345\t22.7838\n", + "86 \t48 \t10.6949\t4.861 \t2.52345\t24.6042\n", + "87 \t47 \t8.8316 \t4.39149\t2.52345\t19.7544\n", + "88 \t47 \t11.1193\t5.18495\t2.52345\t29.9559\n", + "89 \t48 \t9.07254\t5.77793\t2.52345\t41.3754\n", + "90 \t44 \t8.93536\t6.99164\t2.52345\t45.5463\n", + "91 \t53 \t162.865\t1712.47\t2.52345\t19000 \n", + "92 \t54 \t7.28456\t4.91585\t2.52345\t24.7395\n", + "93 \t48 \t9.22828\t5.15766\t1.51879\t29.6852\n", + "94 \t50 \t163.478\t1712.42\t1.51879\t19000 \n", + "95 \t50 \t6.60212\t6.24703\t1.51879\t41.4693\n", + "96 \t54 \t9.88714\t6.31216\t1.51879\t45.333 \n", + "97 \t44 \t164.689\t1712.31\t1.51879\t19000 \n", + "98 \t55 \t6.86997\t4.26902\t1.51879\t19.7733\n", + "99 \t44 \t9.6274 \t4.66175\t1.51879\t31.922 \n", + "100\t43 \t7.66164\t6.27383\t1.51879\t45.3562\n", + "101\t45 \t7.81932\t6.00991\t1.51879\t41.4711\n", + "102\t49 \t163.64 \t1712.41\t1.51879\t19000 \n", + "103\t44 \t161.119\t1712.63\t1.51879\t19000 \n", + "104\t42 \t4.02274\t5.07447\t1.51879\t27.8603\n", + "105\t43 \t8.25806\t5.37807\t1.51879\t26.4862\n", + "106\t44 \t10.0226\t3.68111\t1.51879\t17.9395\n", + "107\t53 \t165.752\t1712.21\t1.51879\t19000 \n", + "108\t41 \t8.56217\t5.48294\t1.51879\t45.3189\n", + "109\t49 \t7.68389\t5.37651\t1.51879\t27.3623\n", + "110\t37 \t7.98721\t5.18975\t1.51879\t41.485 \n", + "111\t51 \t7.22675\t3.87643\t1.51879\t15.2248\n", + "112\t50 \t10.3243\t5.28223\t1.51879\t41.0044\n", + "113\t45 \t8.46773\t5.68544\t1.51879\t41.6217\n", + "114\t50 \t8.01166\t4.16087\t1.51879\t25.7593\n", + "115\t45 \t9.10275\t5.70562\t1.51879\t45.1367\n", + "116\t55 \t7.49435\t4.14002\t1.51879\t19.9332\n", + "117\t41 \t7.42874\t5.62556\t1.51879\t46.054 \n", + "118\t43 \t7.61524\t4.23146\t1.15262\t31.2217\n", + "119\t46 \t7.01986\t5.23417\t0.721501\t40.4953\n", + "120\t40 \t7.98018\t12.933 \t0.721501\t138.842\n", + "121\t47 \t317.642\t2411.89\t0.613114\t19000 \n", + "122\t50 \t316.247\t2412.07\t0.613114\t19000 \n", + "123\t51 \t3.93794\t4.86383\t0.613114\t29.0997\n", + "124\t46 \t318.627\t2411.76\t0.613114\t19000 \n", + "125\t41 \t4.00647\t5.2896 \t0.613114\t27.9894\n", + "126\t43 \t162.287\t1712.52\t0.613114\t19000 \n", + "127\t45 \t4.75195\t4.53512\t0.613114\t18.4657\n", + "128\t45 \t9.30788\t7.04297\t0.613114\t41.5382\n", + "129\t43 \t6.19152\t6.10282\t0.613114\t45.0056\n", + "130\t40 \t162.098\t1712.54\t0.613114\t19000 \n", + "131\t45 \t160.959\t1712.65\t0.613114\t19000 \n", + "132\t36 \t157.791\t1712.93\t0.613114\t19000 \n", + "133\t35 \t157.626\t1712.95\t0.613114\t19000 \n", + "134\t36 \t1.14525\t2.67663\t0.613114\t18.3667\n", + "135\t42 \t2.42976\t4.88582\t0.613114\t31.4 \n", + "136\t44 \t6.10887\t6.19615\t0.613114\t31.5203\n", + "137\t43 \t9.47761\t4.6467 \t0.613114\t19.3769\n", + "138\t38 \t320.759\t2411.48\t0.613114\t19000 \n", + "139\t46 \t6.42955\t4.76763\t0.613114\t30.9033\n", + "140\t33 \t161.161\t1712.63\t0.613114\t19000 \n", + "141\t40 \t313.685\t2412.4 \t0.613114\t19000 \n", + "142\t42 \t1.42269\t3.32715\t0.613114\t24.05 \n", + "143\t48 \t4.50602\t6.76063\t0.613114\t25.908 \n", + "144\t45 \t164.992\t1712.3 \t0.613114\t19000 \n", + "145\t45 \t2.8819 \t5.05525\t0.613114\t31.9631\n", + "146\t44 \t6.46599\t7.16451\t0.613114\t45.2739\n", + "147\t35 \t6.99251\t6.7688 \t0.613114\t31.9167\n", + "148\t50 \t164.846\t1712.3 \t0.613114\t19000 \n", + "149\t36 \t4.98398\t3.45006\t0.613114\t21.3738\n", + "150\t39 \t7.12091\t4.46658\t0.613114\t31.8927\n", + "151\t37 \t161.406\t1712.61\t0.613114\t19000 \n", + "152\t42 \t3.47665\t3.80872\t0.613114\t15.9638\n", + "153\t43 \t7.62266\t4.27639\t0.613114\t31.2442\n", + "154\t46 \t162.085\t1712.54\t0.613114\t19000 \n", + "155\t31 \t3.98146\t3.89393\t0.613114\t22.785 \n", + "156\t46 \t162.823\t1712.48\t0.613114\t19000 \n", + "157\t41 \t160.899\t1712.65\t0.609564\t19000 \n", + "158\t34 \t3.68729\t4.26731\t0.609564\t28.1902\n", + "159\t36 \t4.23561\t4.84987\t0.609564\t41.365 \n", + "160\t41 \t5.90577\t4.73233\t0.609564\t26.173 \n", + "161\t38 \t4.90801\t5.70344\t0.609564\t41.3035\n", + "162\t38 \t6.15246\t3.89067\t0.609564\t21.997 \n", + "163\t40 \t6.99111\t4.80362\t0.609564\t28.6638\n", + "164\t34 \t162.202\t1712.54\t0.609564\t19000 \n", + "165\t39 \t4.03298\t4.37565\t0.609564\t29.1451\n", + "166\t50 \t5.85904\t3.99243\t0.609564\t18.5843\n", + "167\t35 \t160.97 \t1712.65\t0.609564\t19000 \n", + "168\t34 \t3.33749\t3.31548\t0.609564\t15.0866\n", + "169\t33 \t6.54929\t3.61228\t0.609564\t15.0866\n", + "170\t35 \t7.55648\t4.63118\t0.609564\t28.472 \n", + "171\t33 \t5.18042\t5.48683\t0.609564\t43.3978\n", + "172\t40 \t6.9509 \t3.59121\t0.609564\t23.762 \n", + "173\t42 \t5.70231\t4.10957\t0.609564\t17.0946\n", + "174\t41 \t8.67564\t3.61319\t0.609564\t21.1711\n", + "175\t37 \t162.516\t1712.51\t0.609564\t19000 \n", + "176\t32 \t159.158\t1712.81\t0.609564\t19000 \n", + "177\t44 \t157.812\t1712.93\t0.609564\t19000 \n", + "178\t29 \t157.687\t1712.94\t0.609564\t19000 \n", + "179\t23 \t1.77039\t3.95196\t0.609564\t31.999 \n", + "180\t49 \t4.35756\t4.998 \t0.609564\t23.0276\n", + "181\t27 \t162.321\t1712.52\t0.609564\t19000 \n", + "182\t35 \t2.90708\t4.60763\t0.609564\t28.7563\n", + "183\t34 \t7.42436\t6.59413\t0.609564\t30.7741\n", + "184\t24 \t9.67468\t6.57539\t0.609564\t31.9863\n", + "185\t38 \t161.209\t1712.63\t0.609564\t19000 \n", + "186\t36 \t3.59935\t5.95467\t0.609564\t45.3705\n", + "187\t38 \t4.47756\t4.04764\t0.609564\t21.0523\n", + "188\t31 \t6.99619\t4.28424\t0.609564\t18.0484\n", + "189\t30 \t6.87105\t6.37969\t0.609564\t44.9262\n", + "190\t29 \t3.7018 \t5.05629\t0.609564\t31.9229\n", + "191\t32 \t7.02155\t8.26568\t0.609564\t40.6163\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "192\t35 \t12.8466\t9.80238\t0.609564\t33.7097\n", + "193\t33 \t6.22789\t6.41371\t0.609564\t28.0646\n", + "194\t36 \t10.301 \t6.50034\t0.609564\t45.2998\n", + "195\t21 \t5.99726\t4.49903\t0.609564\t28.3941\n", + "196\t43 \t6.7137 \t4.24116\t0.609564\t21.0332\n", + "197\t36 \t318.891\t2411.72\t0.609564\t19000 \n", + "198\t32 \t5.36486\t5.02585\t0.609564\t41.317 \n", + "199\t31 \t160.874\t1712.66\t0.609564\t19000 \n", + "200\t29 \t2.66322\t3.95457\t0.609564\t21.0016\n", + "201\t36 \t160.893\t1712.66\t0.609564\t19000 \n", + "202\t28 \t158.7 \t1712.85\t0.609564\t19000 \n", + "203\t35 \t3.17743\t6.83572\t0.609564\t41.3641\n", + "204\t31 \t3.92415\t6.53385\t0.609564\t45.2705\n", + "205\t26 \t3.75571\t4.93298\t0.609564\t30.2372\n", + "206\t24 \t5.56151\t5.09636\t0.609564\t31.2888\n", + "207\t17 \t6.83968\t4.26532\t0.609564\t18.2623\n", + "208\t31 \t161.394\t1712.61\t0.609564\t19000 \n", + "209\t32 \t2.95069\t3.85144\t0.609564\t24.7373\n", + "210\t26 \t160.987\t1712.65\t0.609564\t19000 \n", + "211\t32 \t3.6368 \t3.81772\t0.609564\t23.1692\n", + "212\t25 \t6.15856\t4.56623\t0.609564\t29.3976\n", + "213\t38 \t5.70122\t5.57761\t0.609564\t32.431 \n", + "214\t33 \t4.19117\t4.5889 \t0.609564\t30.9891\n", + "215\t30 \t6.06639\t3.52708\t0.609564\t24.4239\n", + "216\t35 \t8.30968\t6.75003\t0.397617\t45.1567\n", + "217\t28 \t160.564\t1712.69\t0.397617\t19000 \n", + "218\t36 \t158.689\t1712.85\t0.397617\t19000 \n", + "219\t39 \t158.312\t1712.89\t0.397617\t19000 \n", + "220\t36 \t157.627\t1712.95\t0.397617\t19000 \n", + "221\t25 \t312.086\t2412.6 \t0.397617\t19000 \n", + "222\t34 \t0.501193\t1.13933\t0.397617\t13.0339\n", + "223\t23 \t156.927 \t1713.01\t0.397617\t19000 \n", + "224\t38 \t0.943453\t2.65171\t0.397617\t20.768 \n", + "225\t30 \t3.82862 \t6.17443\t0.397617\t45.3044\n", + "226\t26 \t161.656 \t1712.58\t0.397617\t19000 \n", + "227\t27 \t2.27093 \t4.40767\t0.397617\t32.7537\n", + "228\t35 \t160.279 \t1712.71\t0.397617\t19000 \n", + "229\t31 \t157.745 \t1712.94\t0.397617\t19000 \n", + "230\t25 \t156.672 \t1713.03\t0.397617\t19000 \n", + "231\t34 \t1.14852 \t3.82843\t0.397617\t30.2091\n", + "232\t30 \t157.825 \t1712.93\t0.397617\t19000 \n", + "233\t30 \t1.3102 \t3.84024\t0.397617\t22.1105\n", + "234\t28 \t3.90023 \t6.73329\t0.397617\t22.1105\n", + "235\t29 \t10.1566 \t9.01315\t0.397617\t29.061 \n", + "236\t34 \t11.9139 \t8.15095\t0.397617\t28.8913\n", + "237\t31 \t168.236 \t1711.99\t0.397617\t19000 \n", + "238\t28 \t5.71294 \t5.21328\t0.397617\t23.7956\n", + "239\t27 \t10.4599 \t6.25279\t0.397617\t30.4977\n", + "240\t28 \t7.60396 \t5.15226\t0.397617\t28.1086\n", + "241\t27 \t162.315 \t1712.52\t0.397617\t19000 \n", + "242\t35 \t4.14492 \t3.74137\t0.397617\t18.0752\n", + "243\t17 \t6.82987 \t2.282 \t0.397617\t14.7447\n", + "244\t27 \t319.257 \t2411.68\t0.397617\t19000 \n", + "245\t26 \t316.309 \t2412.06\t0.397617\t19000 \n", + "246\t33 \t158.674 \t1712.86\t0.397617\t19000 \n", + "247\t33 \t156.586 \t1713.04\t0.397617\t19000 \n", + "248\t33 \t1.32305 \t5.20737\t0.397617\t41.4451\n", + "249\t20 \t1.57203 \t3.34877\t0.397617\t21.2085\n", + "250\t23 \t159.763 \t1712.76\t0.397617\t19000 \n", + "251\t32 \t1.375 \t2.82486\t0.397617\t14.8039\n", + "252\t25 \t4.60218 \t5.01528\t0.397617\t21.7426\n", + "253\t26 \t162.904 \t1712.47\t0.397617\t19000 \n", + "254\t27 \t3.16209 \t3.26957\t0.397617\t12.3506\n", + "255\t25 \t162.777 \t1712.48\t0.397617\t19000 \n", + "256\t29 \t471.958 \t2941.83\t0.397617\t19000 \n", + "257\t29 \t2.27946 \t3.71202\t0.397617\t27.1471\n", + "258\t31 \t4.64166 \t5.75256\t0.397617\t28.4786\n", + "259\t28 \t319.362 \t2411.67\t0.397617\t19000 \n", + "260\t35 \t4.73939 \t4.34233\t0.397617\t29.8287\n", + "261\t31 \t160.574 \t1712.68\t0.397617\t19000 \n", + "262\t32 \t2.54802 \t2.95266\t0.397617\t12.4572\n", + "263\t22 \t5.63641 \t4.14784\t0.397617\t32.7722\n", + "264\t28 \t161.01 \t1712.64\t0.397617\t19000 \n", + "265\t25 \t2.37419 \t4.40111\t0.397617\t38.9579\n", + "266\t28 \t4.78932 \t5.148 \t0.397617\t34.245 \n", + "267\t30 \t3.20725 \t3.46509\t0.397617\t14.7207\n", + "268\t27 \t6.28551 \t5.17984\t0.397617\t32.1738\n", + "269\t26 \t159.175 \t1712.81\t0.397617\t19000 \n", + "270\t21 \t157.439 \t1712.96\t0.397617\t19000 \n", + "271\t31 \t1.70778 \t5.86928\t0.397617\t45.3044\n", + "272\t29 \t2.86861 \t5.6872 \t0.397617\t30.1678\n", + "273\t28 \t317.712 \t2411.88\t0.397617\t19000 \n", + "274\t18 \t1.82274 \t3.01622\t0.397617\t20.3646\n", + "275\t31 \t160.548 \t1712.69\t0.397617\t19000 \n", + "276\t34 \t158.793 \t1712.84\t0.397617\t19000 \n", + "277\t22 \t1.5471 \t2.63178\t0.397617\t18.8346\n", + "278\t31 \t4.64883 \t4.1138 \t0.397617\t26.7772\n", + "279\t27 \t161.167 \t1712.63\t0.397617\t19000 \n", + "280\t37 \t2.71995 \t3.24906\t0.397617\t23.137 \n", + "281\t21 \t3.45097 \t2.76922\t0.397617\t15.8077\n", + "282\t18 \t5.13477 \t3.89409\t0.397617\t28.2481\n", + "283\t16 \t161.784 \t1712.57\t0.397617\t19000 \n", + "284\t29 \t158.564 \t1712.86\t0.397617\t19000 \n", + "285\t22 \t157.063 \t1713 \t0.397617\t19000 \n", + "286\t27 \t157.191 \t1712.99\t0.397617\t19000 \n", + "287\t28 \t1.20628 \t4.79666\t0.397617\t45.3044\n", + "288\t26 \t2.50075 \t4.46838\t0.397617\t22.8729\n", + "289\t24 \t6.65841 \t6.40466\t0.397617\t41.0998\n", + "290\t31 \t7.53713 \t5.57591\t0.397617\t29.1451\n", + "291\t30 \t162.409 \t1712.51\t0.397617\t19000 \n", + "292\t29 \t3.58606 \t4.18704\t0.397617\t27.4076\n", + "293\t32 \t6.59813 \t3.33065\t0.397617\t17.3824\n", + "294\t28 \t6.27633 \t2.82533\t0.397617\t11.1202\n", + "295\t26 \t7.24079 \t3.499 \t0.397617\t31.6147\n", + "296\t29 \t6.28285 \t4.01556\t0.397617\t22.6016\n", + "297\t22 \t162.503 \t1712.5 \t0.397617\t19000 \n", + "298\t30 \t158.935 \t1712.83\t0.397617\t19000 \n", + "299\t27 \t1.06801 \t2.70611\t0.397617\t24.5875\n", + "300\t26 \t3.04605 \t5.8602 \t0.397617\t33.4024\n", + "301\t34 \t161.016 \t1712.64\t0.397617\t19000 \n", + "302\t21 \t2.36935 \t2.90202\t0.397617\t19.7672\n", + "303\t21 \t4.98249 \t3.9674 \t0.397617\t19.7672\n", + "304\t25 \t9.26367 \t4.92427\t0.397617\t30.9986\n", + "305\t23 \t5.17186 \t3.52737\t0.397617\t32.1169\n", + "306\t26 \t5.23414 \t3.96035\t0.397617\t26.8536\n", + "307\t22 \t5.58859 \t4.58893\t0.397617\t40.9253\n", + "308\t24 \t6.6248 \t3.94605\t0.397617\t16.3156\n", + "309\t25 \t8.01551 \t5.36151\t0.397617\t41.1654\n", + "310\t22 \t5.02945 \t3.59698\t0.397617\t15.569 \n", + "311\t20 \t163.116 \t1712.45\t0.397617\t19000 \n", + "312\t22 \t5.06928 \t2.9438 \t0.397617\t11.9194\n", + "313\t35 \t163.028 \t1712.46\t0.397617\t19000 \n", + "314\t31 \t3.62278 \t2.40838\t0.397617\t12.1409\n", + "315\t23 \t5.84128 \t3.3107 \t0.397617\t27.8403\n", + "316\t20 \t160.825 \t1712.66\t0.397617\t19000 \n", + "317\t19 \t2.28503 \t2.84587\t0.397617\t13.7126\n", + "318\t39 \t5.90527 \t3.93933\t0.397617\t27.1676\n", + "319\t30 \t316.329 \t2412.05\t0.397617\t19000 \n", + "320\t34 \t2.28594 \t3.15276\t0.397617\t12.3525\n", + "321\t34 \t6.74838 \t4.72386\t0.397617\t41.3067\n", + "322\t27 \t5.60197 \t3.92793\t0.397617\t21.7373\n", + "323\t30 \t6.95842 \t5.16218\t0.397617\t33.7085\n", + "324\t20 \t4.25279 \t3.70562\t0.397617\t15.5879\n", + "325\t27 \t6.39158 \t3.20207\t0.397617\t14.9252\n", + "326\t16 \t6.77488 \t3.06255\t0.397617\t20.0028\n", + "327\t32 \t5.8472 \t3.51687\t0.397617\t24.7157\n", + "328\t36 \t5.75826 \t3.64029\t0.397617\t12.7658\n", + "329\t22 \t6.89544 \t3.97525\t0.397617\t31.4279\n", + "330\t26 \t5.76038 \t4.39289\t0.397617\t31.048 \n", + "331\t26 \t161.128 \t1712.63\t0.397617\t19000 \n", + "332\t34 \t2.26985 \t3.7761 \t0.397617\t30.6276\n", + "333\t17 \t4.18186 \t4.20657\t0.397617\t33.22 \n", + "334\t27 \t4.37171 \t3.91013\t0.397617\t26.9265\n", + "335\t23 \t5.36706 \t3.15077\t0.397617\t18.6875\n", + "336\t19 \t161.802 \t1712.57\t0.397617\t19000 \n", + "337\t22 \t3.06493 \t2.44296\t0.397617\t16.5116\n", + "338\t17 \t4.32336 \t3.85885\t0.397617\t31.8915\n", + "339\t25 \t160.238 \t1712.71\t0.397617\t19000 \n", + "340\t23 \t158.156 \t1712.9 \t0.397617\t19000 \n", + "341\t25 \t157.124 \t1712.99\t0.397617\t19000 \n", + "342\t20 \t0.66134 \t2.90095\t0.397617\t32.5718\n", + "343\t23 \t0.397617\t5.55112e-17\t0.397617\t0.397617\n", + "344\t30 \t0.642931\t1.90505 \t0.397617\t16.4237 \n", + "345\t17 \t1.5187 \t3.99068 \t0.397617\t18.5749 \n", + "346\t33 \t160.24 \t1712.72 \t0.397617\t19000 \n", + "347\t26 \t0.914431\t3.34972 \t0.397617\t34.409 \n", + "348\t31 \t1.177 \t2.31615 \t0.397617\t9.36694 \n", + "349\t27 \t3.06082 \t4.72373 \t0.397617\t31.0451 \n", + "350\t33 \t3.56562 \t3.63362 \t0.397617\t18.6164 \n", + "Run stopped because of stopping criteria: Max ngen\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "[135.03602585915957, 1.4776605092504214, -71.84058695745065, -44.92993213333238, 40.25071107407602, 0.010004310004393278, 14.732705820974624, -59.69461263565651, -12.189602680407354, 6.788139333355208] the gene\n", + "0.3976174586189967\n" + ] + } + ], + "source": [ + "efel_filter_iterable = [\n", + " \"ISI_log_slope\",\n", + " \"mean_frequency\",\n", + " \"adaptation_index2\",\n", + " \"first_isi\",\n", + " \"ISI_CV\",\n", + " \"median_isi\",\n", + " \"Spikecount\",\n", + " \"all_ISI_values\",\n", + " \"ISI_values\",\n", + " \"time_to_first_spike\",\n", + " \"time_to_last_spike\",\n", + " \"time_to_second_spike\"\n", + " ]\n", + "# \"AHP_depth_abs\",\n", + "obs_preds,opt,target,hall_of_fame,cell_evaluator = test_opt_relative_diff(specimen_id = 325479788,model_type=\"IZHI\",efel_filter_iterable=efel_filter_iterable)\n", + "#\"voltage_after_stim\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "check_bin_vm_soma(target,opt)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CkvrvtvPeakabcdcelltype
0135.041.48-71.84-44.9340.250.0114.73-59.69-12.197
\n", + "
" + ], + "text/plain": [ + " C k vr vt vPeak a b c d celltype\n", + "0 135.04 1.48 -71.84 -44.93 40.25 0.01 14.73 -59.69 -12.19 7" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "params = opt.attrs_to_params()\n", + "params = pd.DataFrame([params])\n", + "params" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
EFEL_feature_NU_test_Namepredictionobservationneuronunit_score
0ISI_log_slope0.4857040.486931Relative Difference = 0.00
1mean_frequency10.08629410.087424Relative Difference = 0.00
2adaptation_index20.0919430.086453Relative Difference = 0.01
3ISI_CV0.4760550.389111Relative Difference = 0.09
4Spikecount9.0000009.000000Relative Difference = 0.00
5all_ISI_values102.212500102.187500Relative Difference = 0.02
6ISI_values108.400000108.385714Relative Difference = 0.01
7time_to_first_spike74.60000074.700000Relative Difference = 0.10
8time_to_last_spike892.300000892.200000Relative Difference = 0.10
9time_to_second_spike133.500000133.500000Relative Difference = 0.00
10spike_01.0743851.074250Relative Difference = 0.00
11spike_11.1332801.133000Relative Difference = 0.00
12spike_21.2030801.198500Relative Difference = 0.00
13spike_31.2744201.273250Relative Difference = 0.00
14spike_41.3507501.358000Relative Difference = 0.01
15spike_51.4403451.453500Relative Difference = 0.01
16spike_61.5417401.566000Relative Difference = 0.02
17spike_71.6796451.706250Relative Difference = 0.03
18spike_81.8919951.891750Relative Difference = 0.00
\n", + "
" + ], + "text/plain": [ + " EFEL_feature_NU_test_Name prediction observation \\\n", + "0 ISI_log_slope 0.485704 0.486931 \n", + "1 mean_frequency 10.086294 10.087424 \n", + "2 adaptation_index2 0.091943 0.086453 \n", + "3 ISI_CV 0.476055 0.389111 \n", + "4 Spikecount 9.000000 9.000000 \n", + "5 all_ISI_values 102.212500 102.187500 \n", + "6 ISI_values 108.400000 108.385714 \n", + "7 time_to_first_spike 74.600000 74.700000 \n", + "8 time_to_last_spike 892.300000 892.200000 \n", + "9 time_to_second_spike 133.500000 133.500000 \n", + "10 spike_0 1.074385 1.074250 \n", + "11 spike_1 1.133280 1.133000 \n", + "12 spike_2 1.203080 1.198500 \n", + "13 spike_3 1.274420 1.273250 \n", + "14 spike_4 1.350750 1.358000 \n", + "15 spike_5 1.440345 1.453500 \n", + "16 spike_6 1.541740 1.566000 \n", + "17 spike_7 1.679645 1.706250 \n", + "18 spike_8 1.891995 1.891750 \n", + "\n", + " neuronunit_score \n", + "0 Relative Difference = 0.00 \n", + "1 Relative Difference = 0.00 \n", + "2 Relative Difference = 0.01 \n", + "3 Relative Difference = 0.09 \n", + "4 Relative Difference = 0.00 \n", + "5 Relative Difference = 0.02 \n", + "6 Relative Difference = 0.01 \n", + "7 Relative Difference = 0.10 \n", + "8 Relative Difference = 0.10 \n", + "9 Relative Difference = 0.00 \n", + "10 Relative Difference = 0.00 \n", + "11 Relative Difference = 0.00 \n", + "12 Relative Difference = 0.00 \n", + "13 Relative Difference = 0.00 \n", + "14 Relative Difference = 0.01 \n", + "15 Relative Difference = 0.01 \n", + "16 Relative Difference = 0.02 \n", + "17 Relative Difference = 0.03 \n", + "18 Relative Difference = 0.00 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame(obs_preds)\n", + "df.rename(columns={0:'EFEL_feature_NU_test_Name',1:'prediction',2:'observation',3:'neuronunit_score'},inplace=True)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example 2\n", + "* Now fit Adaptive Exponential model to a single sweep from Allen specimen 325479788 sweep number 64" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "check_bin_vm_soma(target,opt)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CkvrvtvPeakabcdcelltype
0110.00.92-65.0-45.025.00.116.5-50.047.55
\n", + "
" + ], + "text/plain": [ + " C k vr vt vPeak a b c d celltype\n", + "0 110.0 0.92 -65.0 -45.0 25.0 0.11 6.5 -50.0 47.5 5" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "params = opt.attrs_to_params()\n", + "params = pd.DataFrame([params])\n", + "params" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/neuronunit/OptimizationMultispikingAdexp.ipynb b/examples/neuronunit/OptimizationMultispikingAdexp.ipynb new file mode 100644 index 00000000..e653d6a7 --- /dev/null +++ b/examples/neuronunit/OptimizationMultispikingAdexp.ipynb @@ -0,0 +1,875 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# An example of using BluePyOpt/NeuronUnit Optimization\n", + "Using:\n", + "* Allen Brain Experimental data (`specimen_id=325479788`, sweep number `64`) to derive features from.\n", + "* EFEL feature extraction\n", + "* BluePyOpt Optimization.\n", + "* Numba JIT simple cell models (Adaptive Exponential).\n", + "* Neuronunit model scoring" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import efel\n", + "#efel.getFeatureNames()#.getfeaturelist()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/user/git/revitalize/neuronunit/neuronunit/__init__.py\n" + ] + } + ], + "source": [ + "import sys\n", + "sys.path.insert(0,'/home/user/git/revitalize/neuronunit')\n", + "del sys.path[-5]\n", + "#print(sys.path)\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "sns.set(context=\"paper\", font=\"monospace\")\n", + "%matplotlib inline\n", + "SILENT = True\n", + "import warnings\n", + "if SILENT:\n", + " warnings.filterwarnings(\"ignore\")\n", + "import neuronunit\n", + "print(neuronunit.__file__)\n", + "from neuronunit.plotting.plot_utils import check_bin_vm_soma\n", + "from neuronunit.allenapi.allen_data_driven import opt_setup\n", + "from nb_utils import optimize_job\n", + "from sciunit.scores import RelativeDifferenceScore\n", + "import pandas as pd\n", + "import pickle\n", + "import quantities as pq\n", + "specimen_id = 325479788\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Below is a plot of vm trace for fitting the simple model to with neuron unit.\n", + "* It is from Allen Specimen id `325479788`, sweep number `64`.\n", + "* sweep number \n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "with open('325479788later_allen_NU_tests.p', \"rb\") as f:\n", + " suite = pickle.load(f)\n", + " \n", + "plt.plot(suite.traces[\"vm_soma\"].times,suite.traces[\"vm_soma\"])\n", + "plt.xlabel(pq.s)\n", + "plt.ylabel(suite.traces[\"vm_soma\"].dimensionality)\n", + "plt.title(\"$V_{M}$ Allen Specimen id 325479788, sweep number 64\")\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example 2\n", + "* AdExp model \n", + "* Allen specimen 325479788\n", + "You will notice that all the features are timinig related, and some would seem redudandant. This is because one must use brute force to get a good fit, for this particular problem." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next can use sensativity analysis on the genes to find out which genes needed varying." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:\n", + " \u001b[33m\u001b[1mWarning:\u001b[0m to view this Streamlit app on a browser, run it with the following\n", + " command:\n", + "\n", + " streamlit run /home/user/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py [ARGUMENTS]\n", + "2021-03-15 11:04:43.132 WARNING root: \n", + " \u001b[33m\u001b[1mWarning:\u001b[0m to view this Streamlit app on a browser, run it with the following\n", + " command:\n", + "\n", + " streamlit run /home/user/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py [ARGUMENTS]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4cbf4f9cdbd349118f73c0e4be3c5c04", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=80.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 \t10 \t14300.1\t13354.4\t35.0867\t28000\n", + "3 \t5 \t36.0638\t1.70088\t35.0867\t39.7866\n", + "4 \t5 \t38.7272\t1.66715\t35.0867\t39.7866\n", + "5 \t4 \t39.473 \t5.08068\t34.3679\t46.7438\n", + "6 \t4 \t38.3002\t4.88862\t31.4011\t45.9724\n", + "7 \t4 \t41.2995\t6.01587\t31.4011\t45.9724\n", + "8 \t4 \t39.8116\t7.89263\t31.4011\t51.141 \n", + "9 \t4 \t38.5219\t6.82054\t26.9666\t43.9914\n", + "10 \t4 \t4690.78\t10424.2\t25.9778\t28000 \n", + "11 \t4 \t26.6927\t0.530552\t25.9704\t27.2276\n", + "12 \t4 \t26.2448\t0.382868\t25.9704\t26.7862\n", + "13 \t4 \t27.1561\t1.62613 \t25.9148\t30.6928\n", + "14 \t4 \t27.928 \t2.19757 \t25.9148\t31.028 \n", + "15 \t4 \t26.7111\t1.78068 \t25.9148\t30.6928\n", + "16 \t4 \t28.4729\t2.51482 \t24.3965\t30.6928\n", + "17 \t4 \t28.7785\t3.21082 \t24.3965\t32.3148\n", + "18 \t4 \t29.6987\t2.93751 \t24.3965\t33.2247\n", + "19 \t4 \t29.7087\t3.70762 \t24.3965\t33.3952\n", + "20 \t4 \t27.0921\t2.89391 \t24.3965\t33.3952\n", + "21 \t4 \t31.4138\t3.23563 \t24.3965\t33.7847\n", + "22 \t5 \t30.3041\t2.8083 \t24.3965\t32.9183\n", + "23 \t4 \t28.6285\t2.30246 \t24.3965\t31.5579\n", + "24 \t4 \t26.4523\t2.29056 \t24.3965\t30.527 \n", + "25 \t4 \t27.4553\t1.77025 \t24.3965\t30.527 \n", + "26 \t4 \t28.526 \t2.40204 \t24.3965\t31.319 \n", + "27 \t4 \t26.4464\t2.90464 \t24.3965\t30.8631\n", + "28 \t4 \t25.4537\t1.51874 \t24.3965\t28.0307\n", + "29 \t5 \t30.0156\t2.58374 \t24.3965\t31.8619\n", + "30 \t4 \t30.0264\t2.54754 \t24.3965\t31.9307\n", + "31 \t4 \t25.6522\t2.80781 \t24.3965\t31.9307\n", + "32 \t4 \t29.8249\t2.5655 \t24.3965\t31.9307\n", + "33 \t4 \t27.5875\t2.50651 \t24.3965\t30.4997\n", + "34 \t4 \t28.5677\t2.83519 \t24.3965\t33.0115\n", + "35 \t4 \t28.3058\t3.98849 \t24.3965\t33.7966\n", + "36 \t4 \t31.48 \t3.32513 \t24.3965\t33.7966\n", + "37 \t4 \t30.5894\t2.89001 \t24.3965\t33.637 \n", + "38 \t4 \t26.0736\t2.8294 \t24.3965\t32.1 \n", + "39 \t4 \t25.7309\t1.17268 \t24.3965\t27.1354\n", + "40 \t5 \t26.8837\t2.70114 \t24.0146\t32.2919\n", + "41 \t4 \t28.9185\t2.93869 \t24.0146\t32.2919\n", + "42 \t4 \t27.2582\t1.83214 \t24.0146\t29.898 \n", + "43 \t4 \t27.9368\t2.77346 \t24.0146\t29.898 \n", + "44 \t4 \t24.0146\t0 \t24.0146\t24.0146\n", + "45 \t4 \t24.0146\t0 \t24.0146\t24.0146\n", + "46 \t4 \t24.0146\t0 \t24.0146\t24.0146\n", + "47 \t4 \t25.9918\t2.97441 \t24.0146\t31.7025\n", + "48 \t4 \t29.2504\t2.81955 \t24.0146\t31.7025\n", + "49 \t4 \t27.5204\t2.81125 \t24.0146\t31.9244\n", + "50 \t4 \t28.2478\t2.11766 \t24.0146\t31.0137\n", + "51 \t4 \t27.5579\t1.8041 \t24.0146\t28.8419\n", + "52 \t4 \t25.2123\t1.22762 \t24.0146\t26.8771\n", + "53 \t4 \t27.0764\t1.64271 \t24.0146\t28.9129\n", + "54 \t4 \t24.8185\t1.18411 \t24.0146\t26.9998\n", + "55 \t4 \t26.5963\t2.58916 \t24.0146\t31.6966\n", + "56 \t4 \t27.5916\t2.90903 \t24.0146\t32.4979\n", + "57 \t4 \t29.8025\t2.7903 \t24.0146\t32.4979\n", + "58 \t4 \t29.5428\t3.66286 \t24.0146\t35.5784\n", + "59 \t4 \t29.8031\t3.60045 \t24.0146\t35.5784\n", + "60 \t4 \t28.2948\t3.14608 \t24.0146\t31.8677\n", + "61 \t5 \t29.0471\t2.36281 \t24.0146\t31.0186\n", + "62 \t5 \t27.8823\t2.80431 \t24.0146\t31.1313\n", + "63 \t4 \t27.1688\t3.48257 \t24.0146\t32.3864\n", + "64 \t4 \t30.7359\t3.05742 \t24.0146\t32.3864\n", + "65 \t4 \t30.4807\t2.97171 \t24.0146\t32.3864\n", + "66 \t5 \t28.7987\t3.70261 \t24.0146\t32.6782\n", + "67 \t4 \t30.1161\t3.09891 \t24.0146\t32.2467\n", + "68 \t4 \t27.8886\t3.38234 \t23.8188\t32.2389\n", + "69 \t4 \t28.9921\t2.87381 \t23.8188\t32.0035\n", + "70 \t4 \t29.666 \t2.7114 \t23.8188\t32.0241\n", + "71 \t5 \t28.8769\t3.71611 \t23.8188\t32.7455\n", + "72 \t4 \t29.2348\t2.61119 \t23.8188\t31.864 \n", + "73 \t4 \t29.3676\t4.01311 \t23.8188\t33.8776\n", + "74 \t5 \t29.3413\t4.02053 \t23.8104\t33.8652\n", + "75 \t4 \t30.2085\t3.60879 \t23.8104\t33.8652\n", + "76 \t4 \t30.1206\t4.68518 \t23.2012\t33.8649\n", + "77 \t4 \t31.6633\t3.83698 \t23.2012\t33.8649\n", + "78 \t4 \t30.3572\t3.41776 \t23.2012\t33.8649\n", + "79 \t4 \t24.2868\t2.4276 \t23.2012\t29.7151\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:Run stopped because of stopping criteria: Max ngen\n", + "2021-03-15 11:14:50.081 INFO __main__: Run stopped because of stopping criteria: Max ngen\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "80 \t4 \t25.3229\t3.00177 \t23.2012\t29.7151\n", + "\n", + "[660.3795821476443, -30.666039302947986, -60.920930704722736, -78.41846316810995, 31.21877517971365, 17.170583541969204, 2.4467818438403057, 6.292840619083147, 321.07639425891404, -33.47136426203058, 62.12165911123304] the gene\n" + ] + } + ], + "source": [ + "efel_filter_iterable = {\n", + " \"mean_frequency\":None,\n", + " \"ISI_log_slope\":None,\n", + " \"mean_frequency\":None,\n", + " \"adaptation_index2\":None,\n", + " \"first_isi\":None,\n", + " \"ISI_CV\":None,\n", + " \"median_isi\":None,\n", + " \"Spikecount\":None,\n", + " \"all_ISI_values\":None,\n", + " \"ISI_values\":None,\n", + " \"time_to_first_spike\":None,\n", + " \"time_to_last_spike\":None,\n", + " \"time_to_second_spike\":None,\n", + " \"AHP1_depth_from_peak\":None,\n", + " \"AHP2_depth_from_peak\":None,\n", + " \"AHP_depth\":None,\n", + " \"AHP_depth_abs\":None,\n", + " \"AHP_depth_abs_slow\":None,\n", + " \"AHP_depth_diff\":None,\n", + " \"AHP_depth_from_peak\":None,\n", + " \"AHP_slow_time\":None,\n", + " \"AHP_time_from_peak\":None}\n", + "\n", + "\n", + "def test_opt_relative_diff(specimen_id,model_type = \"ADEXP\",efel_filter_iterable=None):\n", + " if model_type in str(\"IZHI\"):\n", + " fitnesses,scores,obs_preds,opt,target,hall_of_fame,cell_evaluator = optimize_job(specimen_id,\n", + " model_type,\n", + " score_type=RelativeDifferenceScore,\n", + " efel_filter_iterable=efel_filter_iterable, MU =100,NGEN=200)\n", + " else:\n", + " fitnesses,scores,obs_preds,opt,target,hall_of_fame,cell_evaluator = optimize_job(specimen_id,\n", + " model_type,\n", + " score_type=RelativeDifferenceScore,\n", + " efel_filter_iterable=efel_filter_iterable, MU =25,NGEN=40)\n", + " \n", + " return obs_preds,opt,target,hall_of_fame,cell_evaluator\n", + "( obs_preds,\n", + " opt,\n", + " target,\n", + " hall_of_fame,\n", + " cell_evaluator ) = test_opt_relative_diff(specimen_id = 325479788,\n", + " model_type=\"ADEXP\",\n", + " efel_filter_iterable=efel_filter_iterable)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEHCAYAAACwUAEWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3dd5wb5Z348c+Myq60TeveGzYPBtN7x6a3hBxcDhLyO0ICFwKXQELxcUAgHAmdhJBcjoDDkUBIcpDQCcU2ppmOjTEe9962N2nVZn5/jFYrrcpqm7SSv+/Xy6/dnfLMVyN5vnrKPKNZloUQQgiRiV7oAIQQQgxvkiiEEEJkJYlCCCFEVpIohBBCZCWJQgghRFaSKIQQQmTlLHQA/SRjeoUQon+0vu5QrImCurq2fu3n83lpbvYPcjRDT+LOn2KMGYoz7mKMGYozbp/Pi8vl6Ne+0vQkhBAiK0kUQgghsirapichxOAzTZOWlgai0UhejtfcrBOJmHk51mAqhrgdDic1NSPR9YHXByRRCCHiWloaKC/34vFU5OV4DodONDq8L7jpFEPcgUAHLS0N1NaOHnBZ0vQkhIiLRiN5SxJiaHk8FYNWM5REIYQQIitJFEKIggoEAsybdyxvvbUYgGg0ylVXXc4ZZ5xEQ0N9fLsHHribCy44l9df/8egHfuOO27l0ku/yVVXXc5VV13Ozp07B63sdG6//ZZBLW/NGoNlyz4b1DLTyXuiUEpdoJR6Tym1WCl1tFJqnlJqqVLqHaXUvvmOR+Sf1dlO8P2/pCyPNm8ntPyV1O0jITrffQLLTG0TjtZvJLRyYfrjREJ0vvtk2v0ALNO010dCWeMNLf8H0abtWbfpEtn8GeGNn+S0bW+sUIDO9/5EqT8z5uOPP2TevFN4//33AHA4HDz00MPMnLl30nbXXHM9Z555zqAf/0c/ms9DDz3MQw89zLhx4wa9/EQ33/zTQS1vzZrVLF8+9Ikir53ZSqlq4MfAPMMwArFlHwBnAWOBnwHn5TMmkX9hYwmhZS9RduTXk5YH33qc6I5VuA84I2l5dIdBeMVruOechlad3DEXeO0hrLZ63PvOSzlOdPsqwitexX3A6WiVI1PWW/4mwitexTlpDs4pB2SMN7j0Tzg2fYr33Pm9vrbAK78AwHX5Y71u25vIxo8Jf/4Pyo64AByuAZc3XL3//nv8y798k/vvv6vP+zY3N3PnnT/F7/dTWzuCm2/+KXV1u7nllvlMmTKVVau+5NZbf8asWXv3XljM88//nebmZr71rUu46abrufjiS6ip8TF//o8ZP348dXV13HjjLey11yxefvkFnnvuGUzT4rvf/R6HH34kABdd9E8cdNChbNq0gXPPPY+jjjqWm2++gbVrV/PKK4sBePTR/2Hlyi9oampk7NixOJ0ubr/9zrRl3nHHrbjdbjZt2sjkyVO44Yab+P3vf8drr71COBzh/fff5aqrrmGffWb3+RzmIt+jno4CNgPPKaX8wBWAZRhGPVCvlNorz/EIITLwd4YJhgc+sqfMpeMtz5zo1q5dzcyZs5g8eQqbN29kypRpOZf9hz/8nlNPPZOTTz6Vxx57hCVLFjN79r60trZy44238uabi3jttZezJor7778Tr9fuwH/ggV9z7rnnceut/8mDD97HPvvsyz777MuOHdtpa2vl0Uf/wPr1a3n00Ye5/vr/5Omn/8Jvf7uAcDjM1Vd/P54oduzYzr33PsjEiZOIRCI4nU4eeuhhvvGN85OOff75X+ell57n0ksv5/7776K5uTljmXPmHMB1193It771dQKBAN/+9mWMHTuOhoYGvvWtS3I+Z/2R70QxCjgAOAQ4F7gNaFVKXQqsAvp3f7kQYlBFTZPr/vtdAsHogMvylDl48IfH40gznn/Lls3s2rWTG2+8lrq6OpYufa9PiWLTpg2sWLGcv/3tr3R2dnLmmVUATJw4GYfDgc/no6OjI2sZP/rRfObM2T9p2QUXXMjVV1/Bs892N4VOnjwFp9PJ9Ol7sWPHNrZv30pd3S6uvvr7ALS3d08rNGbMWCZOnASA05n5MlteXo7H48Hj8QBkLXPy5KkA1NT48Ps74vvkQ74TRQvwoWEYAaXUUuwahdcwjAUASqmcx3L5fN5+BeBw6P3et5BKKe7WcjdBUt/DkNNBNM3yQFMZAaC62oOzxzq/rqXdByDQmLBfder6iO6nA6ioLMOTsH/PmNsAp9OR0/nv+m89GO9Vh9dNJ+Cr8aI5e296GozPSHOzjsNh/7vvquMIDUKNwu3ScbvSX2qWLn2Xyy+/grPP/goNDfXcccdtXHTRNwHwer20trYwZsyY+PZdyxwOO+lMmzado446hiOPPBqAUChEQ0M9mkb8dWiaFt++J3td8vpwOMzvfvcbrr32P3jwwfu46abbcDh0tm7dgmWZbNq0gfHjJzB58mSmTZvOgw/+Fl3XCQaD8XKcTleGY3YfS9e1pPg0TctYZmKcXds7HDput5toNJLx9Tmd3Z+JTNvkIt+J4lPgJ0opDdgbWAMcrJQaid1HsSHXgvo7IVcxTuYFpRV3qNPuPO65PBKJpl/eHgSgtTWATvI607TS7pOyn5m63mwPANDRHiSYsH+6mCORaJ/O/2C8V2F/7Dy1+NFy6KMYjM9IJGLGbyQrdzko7+ckcj1lujlt6dJ3ueKKHxCNmvh8I9ixYzt+f4CysjLOPvur3HrrTey//4Fce63dP3T88Sdxyy3zWbjwdR544Nd885uXcPfd/8Xjj/8e0zS56qqrqanxYVn2MaNRE8uyMh7fsizuuefn8aana665nhdffJZzzz2PU045nXXr1vLyyy+x//4HUFlZxfXXX0NjYyP/8R83UVVVw+mnn80VV3wXXdfZa6+ZXHPN9V0lJx1z0aLXefrpv7Br1w6uuOK7nHrqGZimlRSfZVkZy7S3Sd4+GjU54ICDePrpv7B58yYuvvgSZsxIbr2PRMz4Z8Ln86Lr/Xs/tXyPqFBK3QicA0SBbwPTgP8CTOBywzBW5FCMJbPHFoe0iWLZSwTf/wtVPTp8/c/fSXTHqpTlkS2fE3j5PiouvAe9R2d2+5+uxWqrT9kHILJ5OYFX7qfiG/ehp+nMNtsb6Hjyx3jO+FFSZ3bPmNsevgTH+H1y6sxue/gSgLTx9FV49dt0Ln6Eyu/8Lm+Jor5+B6NGjR9QGX1RDHc4g93ncM89P+f++38FFE/cie9nwuyxw3+accMwfoY9uqnLWuD1fMchhBAiN3LDnRBC9GL8+Anx2sSeSBKFEEKIrCRRCCGEyEoShRBCiKwkUQghhMhKEoUQoqAefPA+rrzyMubP/xF+f/a7qJcsWczu3btSluc6K+vSpe/y6qupE0/2xUsvPc/jj/8+7bodO7Zz/PGH8/nnywA4//xz+MMfHsupzGzbDcXMuX0hT7gTQhTMypVf0NDQwK9//Tv+/vf/47nn/saFF16ccfu33lrMiBEjGTNmbNLyXGdlPeqoYwYUby5mzVK8++7buN1ljBgxYlDKvOaa66murhmUsvpDEoUQIi0r2NHrFOy50JxutLL0T81buXIFBx98CAAHH3wYjz76P0D37Ktr1hicf/7XOfPMc7jxxutYsWI569atweut4Je//G9aW1tznpX1yScf54UXnuXMM8+NT6L3wgt/55VXXgLgiy8+Z9Gi99LOSGtZFrfc8h8EAn7cbjcHHnhwxtfr89XS2NjA22+/ybHHngBAa2srt912E8FgJz5fLbfeekdKmfvvfxBAxhlpC0kShRAihWVGaX/yWggHBl6Yy0Plvz6Elmb6iPb2NsaOte8c9ng8tLW1AvZ8SxdddDHjxo3n29/+BmeccTY/+9k93HHHrXz1q+fHJ/Grra3NaVZWgG984//h89XS0NAQ3+6cc87jnHPO48knH+foo48F0s9Ia5pRpk2bzr/925X84hf39vqSp0yZymeffcLcuafQ0NDAc889w3HHncDXvnYBDz30C958cyGWZaWUmW322EKSRCGESKHpDiq/ce/g1SgyzDFUWVmF329POxIIBKiqqgZA13WmTLFnS62qqqa9vZ2qqqqcj9lzVtZs3n//PdatWxtvvko3I63fH2Dq1GkATJ8+I2lW13ROPvl0ZsyYSVNTI2D3XZx6qv2clb32msn27faDsBLLbG1tzTp7bCFJohBCpKWVVWRsMhos++47h6eeeoLzzjufzz77hNmz9wPANE02b97IuHETaG1tobKyErBnZY1EwoN2/C1bNvOnP/2Bu+66P75s6tRpHHnkMRxxxFGAPSPtkiWLWLduLQAbNqxn9OjRacvrMm7cOMaNG8dLLz0P2Hd2b9iwnoMOOoR169Yye/a+WJaVVObIkaOYMGESU6dO5xe/+E189tguHo+H5uamQXvtfSGJQghRMPvuux81NT6uvPIyKioq+clPbgfA5XLxxz/+L+vWreXiiy9B0+x57E444UQeeeS3jBkzlptuuo0331wYm5V1J1dddXn8W3s6119/NVu3bok/Ee6BB37NE0/8Lw0N9fz4xz8A4KGHHubii7/N3Xf/F3/842PxGWlPOGEur732Cj/84fdxu129JoqevvKVf+K2227ijTdexeer5XvfuwrTNJPKHDlyFD6fjzPOOJurrro8ZUbaE06Yyy23zGfx4oU88MCvcbny99RDSRRCiIK6+uprU5ZpmsaNN/4kZfnRRx/H0UcfF/977txTmDv3lLTlHnLIYYB98Qe4++5fpGwzf/7NKctqa2v5+c/vS1l+110P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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "check_bin_vm_soma(target,opt)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cmv_spikev_resetv_resttau_mabdelta_Ttau_wv_threshspike_delta
0660.38-30.67-60.92-78.4231.2217.172.456.29321.08-33.4762.12
\n", + "
" + ], + "text/plain": [ + " cm v_spike v_reset v_rest tau_m a b delta_T tau_w \\\n", + "0 660.38 -30.67 -60.92 -78.42 31.22 17.17 2.45 6.29 321.08 \n", + "\n", + " v_thresh spike_delta \n", + "0 -33.47 62.12 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "params = opt.attrs_to_params()\n", + "params = pd.DataFrame([params])\n", + "params" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
EFEL_feature_NU_test_Namepredictionobservationneuronunit_score
0mean_frequency10.08629410.129432Relative Difference = 0.04
1ISI_log_slope0.4857040.463778Relative Difference = 0.02
2adaptation_index20.0919430.093395Relative Difference = 0.00
3ISI_CV0.4760550.470615Relative Difference = 0.01
4Spikecount9.0000009.000000Relative Difference = 0.00
5all_ISI_values102.212500101.650000Relative Difference = 0.56
6ISI_values108.400000106.985714Relative Difference = 1.41
7time_to_first_spike74.60000075.300000Relative Difference = 0.70
8time_to_last_spike892.300000888.500000Relative Difference = 3.80
9time_to_second_spike133.500000139.600000Relative Difference = 6.10
10AHP1_depth_from_peak88.656250122.950624Relative Difference = 34.29
11AHP2_depth_from_peak89.250002122.952742Relative Difference = 33.70
12AHP_depth24.57919917.603728Relative Difference = 6.98
13AHP_depth_abs-55.208334-60.838927Relative Difference = 5.63
14AHP_depth_abs_slow-56.625001-57.028899Relative Difference = 0.40
15AHP_depth_diff-0.101563-0.002945Relative Difference = 0.10
16AHP_depth_from_peak88.236113122.960586Relative Difference = 34.72
17AHP_slow_time0.1865970.054344Relative Difference = 0.13
18AHP_time_from_peak10.9555560.100000Relative Difference = 10.86
19spike_01.0743851.075300Relative Difference = 0.00
20spike_11.1332801.139600Relative Difference = 0.01
21spike_21.2030801.208100Relative Difference = 0.01
22spike_31.2744201.281700Relative Difference = 0.01
23spike_41.3507501.361800Relative Difference = 0.01
24spike_51.4403451.450600Relative Difference = 0.01
25spike_61.5417401.552000Relative Difference = 0.01
26spike_71.6796451.675400Relative Difference = 0.00
27spike_81.8919951.888500Relative Difference = 0.00
\n", + "
" + ], + "text/plain": [ + " EFEL_feature_NU_test_Name prediction observation \\\n", + "0 mean_frequency 10.086294 10.129432 \n", + "1 ISI_log_slope 0.485704 0.463778 \n", + "2 adaptation_index2 0.091943 0.093395 \n", + "3 ISI_CV 0.476055 0.470615 \n", + "4 Spikecount 9.000000 9.000000 \n", + "5 all_ISI_values 102.212500 101.650000 \n", + "6 ISI_values 108.400000 106.985714 \n", + "7 time_to_first_spike 74.600000 75.300000 \n", + "8 time_to_last_spike 892.300000 888.500000 \n", + "9 time_to_second_spike 133.500000 139.600000 \n", + "10 AHP1_depth_from_peak 88.656250 122.950624 \n", + "11 AHP2_depth_from_peak 89.250002 122.952742 \n", + "12 AHP_depth 24.579199 17.603728 \n", + "13 AHP_depth_abs -55.208334 -60.838927 \n", + "14 AHP_depth_abs_slow -56.625001 -57.028899 \n", + "15 AHP_depth_diff -0.101563 -0.002945 \n", + "16 AHP_depth_from_peak 88.236113 122.960586 \n", + "17 AHP_slow_time 0.186597 0.054344 \n", + "18 AHP_time_from_peak 10.955556 0.100000 \n", + "19 spike_0 1.074385 1.075300 \n", + "20 spike_1 1.133280 1.139600 \n", + "21 spike_2 1.203080 1.208100 \n", + "22 spike_3 1.274420 1.281700 \n", + "23 spike_4 1.350750 1.361800 \n", + "24 spike_5 1.440345 1.450600 \n", + "25 spike_6 1.541740 1.552000 \n", + "26 spike_7 1.679645 1.675400 \n", + "27 spike_8 1.891995 1.888500 \n", + "\n", + " neuronunit_score \n", + "0 Relative Difference = 0.04 \n", + "1 Relative Difference = 0.02 \n", + "2 Relative Difference = 0.00 \n", + "3 Relative Difference = 0.01 \n", + "4 Relative Difference = 0.00 \n", + "5 Relative Difference = 0.56 \n", + "6 Relative Difference = 1.41 \n", + "7 Relative Difference = 0.70 \n", + "8 Relative Difference = 3.80 \n", + "9 Relative Difference = 6.10 \n", + "10 Relative Difference = 34.29 \n", + "11 Relative Difference = 33.70 \n", + "12 Relative Difference = 6.98 \n", + "13 Relative Difference = 5.63 \n", + "14 Relative Difference = 0.40 \n", + "15 Relative Difference = 0.10 \n", + "16 Relative Difference = 34.72 \n", + "17 Relative Difference = 0.13 \n", + "18 Relative Difference = 10.86 \n", + "19 Relative Difference = 0.00 \n", + "20 Relative Difference = 0.01 \n", + "21 Relative Difference = 0.01 \n", + "22 Relative Difference = 0.01 \n", + "23 Relative Difference = 0.01 \n", + "24 Relative Difference = 0.01 \n", + "25 Relative Difference = 0.01 \n", + "26 Relative Difference = 0.00 \n", + "27 Relative Difference = 0.00 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame(obs_preds)\n", + "df.rename(columns={0:'EFEL_feature_NU_test_Name',1:'prediction',2:'observation',3:'neuronunit_score'},inplace=True)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example 2\n", + "* Now fit Adaptive Exponential model to a single sweep from Allen specimen 325479788 sweep number 64" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEHCAYAAACwUAEWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3dd5wb5Z348c+Myq60TeveGzYPBtN7x6a3hBxcDhLyO0ICFwKXQELxcUAgHAmdhJBcjoDDkUBIcpDQCcU2ppmOjTEe9962N2nVZn5/jFYrrcpqm7SSv+/Xy6/dnfLMVyN5vnrKPKNZloUQQgiRiV7oAIQQQgxvkiiEEEJkJYlCCCFEVpIohBBCZCWJQgghRFaSKIQQQmTlLHQA/SRjeoUQon+0vu5QrImCurq2fu3n83lpbvYPcjRDT+LOn2KMGYoz7mKMGYozbp/Pi8vl6Ne+0vQkhBAiK0kUQgghsirapichxOAzTZOWlgai0UhejtfcrBOJmHk51mAqhrgdDic1NSPR9YHXByRRCCHiWloaKC/34vFU5OV4DodONDq8L7jpFEPcgUAHLS0N1NaOHnBZ0vQkhIiLRiN5SxJiaHk8FYNWM5REIYQQIitJFEKIggoEAsybdyxvvbUYgGg0ylVXXc4ZZ5xEQ0N9fLsHHribCy44l9df/8egHfuOO27l0ku/yVVXXc5VV13Ozp07B63sdG6//ZZBLW/NGoNlyz4b1DLTyXuiUEpdoJR6Tym1WCl1tFJqnlJqqVLqHaXUvvmOR+Sf1dlO8P2/pCyPNm8ntPyV1O0jITrffQLLTG0TjtZvJLRyYfrjREJ0vvtk2v0ALNO010dCWeMNLf8H0abtWbfpEtn8GeGNn+S0bW+sUIDO9/5EqT8z5uOPP2TevFN4//33AHA4HDz00MPMnLl30nbXXHM9Z555zqAf/0c/ms9DDz3MQw89zLhx4wa9/EQ33/zTQS1vzZrVLF8+9Ikir53ZSqlq4MfAPMMwArFlHwBnAWOBnwHn5TMmkX9hYwmhZS9RduTXk5YH33qc6I5VuA84I2l5dIdBeMVruOechlad3DEXeO0hrLZ63PvOSzlOdPsqwitexX3A6WiVI1PWW/4mwitexTlpDs4pB2SMN7j0Tzg2fYr33Pm9vrbAK78AwHX5Y71u25vIxo8Jf/4Pyo64AByuAZc3XL3//nv8y798k/vvv6vP+zY3N3PnnT/F7/dTWzuCm2/+KXV1u7nllvlMmTKVVau+5NZbf8asWXv3XljM88//nebmZr71rUu46abrufjiS6ip8TF//o8ZP348dXV13HjjLey11yxefvkFnnvuGUzT4rvf/R6HH34kABdd9E8cdNChbNq0gXPPPY+jjjqWm2++gbVrV/PKK4sBePTR/2Hlyi9oampk7NixOJ0ubr/9zrRl3nHHrbjdbjZt2sjkyVO44Yab+P3vf8drr71COBzh/fff5aqrrmGffWb3+RzmIt+jno4CNgPPKaX8wBWAZRhGPVCvlNorz/EIITLwd4YJhgc+sqfMpeMtz5zo1q5dzcyZs5g8eQqbN29kypRpOZf9hz/8nlNPPZOTTz6Vxx57hCVLFjN79r60trZy44238uabi3jttZezJor7778Tr9fuwH/ggV9z7rnnceut/8mDD97HPvvsyz777MuOHdtpa2vl0Uf/wPr1a3n00Ye5/vr/5Omn/8Jvf7uAcDjM1Vd/P54oduzYzr33PsjEiZOIRCI4nU4eeuhhvvGN85OOff75X+ell57n0ksv5/7776K5uTljmXPmHMB1193It771dQKBAN/+9mWMHTuOhoYGvvWtS3I+Z/2R70QxCjgAOAQ4F7gNaFVKXQqsAvp3f7kQYlBFTZPr/vtdAsHogMvylDl48IfH40gznn/Lls3s2rWTG2+8lrq6OpYufa9PiWLTpg2sWLGcv/3tr3R2dnLmmVUATJw4GYfDgc/no6OjI2sZP/rRfObM2T9p2QUXXMjVV1/Bs892N4VOnjwFp9PJ9Ol7sWPHNrZv30pd3S6uvvr7ALS3d08rNGbMWCZOnASA05n5MlteXo7H48Hj8QBkLXPy5KkA1NT48Ps74vvkQ74TRQvwoWEYAaXUUuwahdcwjAUASqmcx3L5fN5+BeBw6P3et5BKKe7WcjdBUt/DkNNBNM3yQFMZAaC62oOzxzq/rqXdByDQmLBfder6iO6nA6ioLMOTsH/PmNsAp9OR0/nv+m89GO9Vh9dNJ+Cr8aI5e296GozPSHOzjsNh/7vvquMIDUKNwu3ScbvSX2qWLn2Xyy+/grPP/goNDfXcccdtXHTRNwHwer20trYwZsyY+PZdyxwOO+lMmzado446hiOPPBqAUChEQ0M9mkb8dWiaFt++J3td8vpwOMzvfvcbrr32P3jwwfu46abbcDh0tm7dgmWZbNq0gfHjJzB58mSmTZvOgw/+Fl3XCQaD8XKcTleGY3YfS9e1pPg0TctYZmKcXds7HDput5toNJLx9Tmd3Z+JTNvkIt+J4lPgJ0opDdgbWAMcrJQaid1HsSHXgvo7IVcxTuYFpRV3qNPuPO65PBKJpl/eHgSgtTWATvI607TS7pOyn5m63mwPANDRHiSYsH+6mCORaJ/O/2C8V2F/7Dy1+NFy6KMYjM9IJGLGbyQrdzko7+ckcj1lujlt6dJ3ueKKHxCNmvh8I9ixYzt+f4CysjLOPvur3HrrTey//4Fce63dP3T88Sdxyy3zWbjwdR544Nd885uXcPfd/8Xjj/8e0zS56qqrqanxYVn2MaNRE8uyMh7fsizuuefn8aana665nhdffJZzzz2PU045nXXr1vLyyy+x//4HUFlZxfXXX0NjYyP/8R83UVVVw+mnn80VV3wXXdfZa6+ZXHPN9V0lJx1z0aLXefrpv7Br1w6uuOK7nHrqGZimlRSfZVkZy7S3Sd4+GjU54ICDePrpv7B58yYuvvgSZsxIbr2PRMz4Z8Ln86Lr/Xs/tXyPqFBK3QicA0SBbwPTgP8CTOBywzBW5FCMJbPHFoe0iWLZSwTf/wtVPTp8/c/fSXTHqpTlkS2fE3j5PiouvAe9R2d2+5+uxWqrT9kHILJ5OYFX7qfiG/ehp+nMNtsb6Hjyx3jO+FFSZ3bPmNsevgTH+H1y6sxue/gSgLTx9FV49dt0Ln6Eyu/8Lm+Jor5+B6NGjR9QGX1RDHc4g93ncM89P+f++38FFE/cie9nwuyxw3+accMwfoY9uqnLWuD1fMchhBAiN3LDnRBC9GL8+Anx2sSeSBKFEEKIrCRRCCGEyEoShRBCiKwkUQghhMhKEoUQoqAefPA+rrzyMubP/xF+f/a7qJcsWczu3btSluc6K+vSpe/y6qupE0/2xUsvPc/jj/8+7bodO7Zz/PGH8/nnywA4//xz+MMfHsupzGzbDcXMuX0hT7gTQhTMypVf0NDQwK9//Tv+/vf/47nn/saFF16ccfu33lrMiBEjGTNmbNLyXGdlPeqoYwYUby5mzVK8++7buN1ljBgxYlDKvOaa66murhmUsvpDEoUQIi0r2NHrFOy50JxutLL0T81buXIFBx98CAAHH3wYjz76P0D37Ktr1hicf/7XOfPMc7jxxutYsWI569atweut4Je//G9aW1tznpX1yScf54UXnuXMM8+NT6L3wgt/55VXXgLgiy8+Z9Gi99LOSGtZFrfc8h8EAn7cbjcHHnhwxtfr89XS2NjA22+/ybHHngBAa2srt912E8FgJz5fLbfeekdKmfvvfxBAxhlpC0kShRAihWVGaX/yWggHBl6Yy0Plvz6Elmb6iPb2NsaOte8c9ng8tLW1AvZ8SxdddDHjxo3n29/+BmeccTY/+9k93HHHrXz1q+fHJ/Grra3NaVZWgG984//h89XS0NAQ3+6cc87jnHPO48knH+foo48F0s9Ia5pRpk2bzr/925X84hf39vqSp0yZymeffcLcuafQ0NDAc889w3HHncDXvnYBDz30C958cyGWZaWUmW322EKSRCGESKHpDiq/ce/g1SgyzDFUWVmF329POxIIBKiqqgZA13WmTLFnS62qqqa9vZ2qqqqcj9lzVtZs3n//PdatWxtvvko3I63fH2Dq1GkATJ8+I2lW13ROPvl0ZsyYSVNTI2D3XZx6qv2clb32msn27faDsBLLbG1tzTp7bCFJohBCpKWVVWRsMhos++47h6eeeoLzzjufzz77hNmz9wPANE02b97IuHETaG1tobKyErBnZY1EwoN2/C1bNvOnP/2Bu+66P75s6tRpHHnkMRxxxFGAPSPtkiWLWLduLQAbNqxn9OjRacvrMm7cOMaNG8dLLz0P2Hd2b9iwnoMOOoR169Yye/a+WJaVVObIkaOYMGESU6dO5xe/+E189tguHo+H5uamQXvtfSGJQghRMPvuux81NT6uvPIyKioq+clPbgfA5XLxxz/+L+vWreXiiy9B0+x57E444UQeeeS3jBkzlptuuo0331wYm5V1J1dddXn8W3s6119/NVu3bok/Ee6BB37NE0/8Lw0N9fz4xz8A4KGHHubii7/N3Xf/F3/842PxGWlPOGEur732Cj/84fdxu129JoqevvKVf+K2227ijTdexeer5XvfuwrTNJPKHDlyFD6fjzPOOJurrro8ZUbaE06Yyy23zGfx4oU88MCvcbny99RDSRRCiIK6+uprU5ZpmsaNN/4kZfnRRx/H0UcfF/977txTmDv3lLTlHnLIYYB98Qe4++5fpGwzf/7NKctqa2v5+c/vS1l+110P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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "check_bin_vm_soma(target,opt)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cmv_spikev_resetv_resttau_mabdelta_Ttau_wv_threshspike_delta
0660.38-30.67-60.92-78.4231.2217.172.456.29321.08-33.4762.12
\n", + "
" + ], + "text/plain": [ + " cm v_spike v_reset v_rest tau_m a b delta_T tau_w \\\n", + "0 660.38 -30.67 -60.92 -78.42 31.22 17.17 2.45 6.29 321.08 \n", + "\n", + " v_thresh spike_delta \n", + "0 -33.47 62.12 " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "params = opt.attrs_to_params()\n", + "params = pd.DataFrame([params])\n", + "params" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/neuronunit/ReducedModelOptimizationEphyProperties.ipynb b/examples/neuronunit/ReducedModelOptimizationEphyProperties.ipynb new file mode 100644 index 00000000..6f5552fa --- /dev/null +++ b/examples/neuronunit/ReducedModelOptimizationEphyProperties.ipynb @@ -0,0 +1,1105 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "sys.path.insert(0,'/home/user/git/revitalize/neuronunit')\n", + "del sys.path[-5]\n", + "import pandas as pd\n", + "from neuronunit.optimization.optimization_management import public_opt\n", + "from sciunit.scores import RelativeDifferenceScore, ZScore\n", + "from sciunit.utils import config_set, config_get\n", + "config_set('PREVALIDATE', False)\n", + "from neuronunit.allenapi.allen_data_driven import make_allen_hard_coded_limited, make_allen_hard_coded_complete\n", + "import warnings\n", + "from neuronunit.optimization.model_parameters import BPO_PARAMS\n", + "warnings.filterwarnings(\"ignore\")\n", + "_,_,_,a_cells = make_allen_hard_coded_limited()\n", + "\n", + "\n", + "[\n", + " allen_suite_623960880,\n", + " allen_suite_623893177,\n", + " allen_suite471819401,\n", + " allen_suite482493761,\n", + " a_cells2,\n", + " df\n", + "] = make_allen_hard_coded_complete()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# In this notebook\n", + "we fit Izhikevich and Adaptive Exponential Integrate and fire models to electrophysiology observations \n", + "from the Allen Brain, using BluePyOpt and NeuronUnit.\n", + "\n", + "# Immediately Below \n", + "* is a list of some of the observations we will use:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
TimeConstantTestnameRestingPotentialTestInputResistanceTestRheobaseTest
62396088023.8 ms623960880-65.1 mV241.0 megaohm70.0 pA
62389317727.8 ms623893177-77.0 mV136.0 megaohm190.0 pA
47181940113.8 ms471819401-77.5 mV132.0 megaohm190.0 pA
48249376124.4 ms482493761-71.6 mV132.0 megaohm70.0 pA
\n", + "
" + ], + "text/plain": [ + " TimeConstantTest name RestingPotentialTest \\\n", + "623960880 23.8 ms 623960880 -65.1 mV \n", + "623893177 27.8 ms 623893177 -77.0 mV \n", + "471819401 13.8 ms 471819401 -77.5 mV \n", + "482493761 24.4 ms 482493761 -71.6 mV \n", + "\n", + " InputResistanceTest RheobaseTest \n", + "623960880 241.0 megaohm 70.0 pA \n", + "623893177 136.0 megaohm 190.0 pA \n", + "471819401 132.0 megaohm 190.0 pA \n", + "482493761 132.0 megaohm 70.0 pA " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Allen Specimen ID: 471819401\n", + "Four data fitting constraints:\n", + "* RheobaseTest\t\n", + "* TimeConstantTest\t\n", + "* RestingPotentialTest\t\n", + "* InputResistanceTest\t\n", + "# Model AdExp" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nopt,obs_preds,df = public_opt(\\n a_cells[\\'471819401\\'],\\n BPO_PARAMS,\\n \\'471819401\\',\\n \"ADEXP\",\\n 100,\\n 200,\\n \"IBEA\",\\n score_type=RelativeDifferenceScore\\n )\\n'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "opt,obs_preds,df = public_opt(\n", + " a_cells['471819401'],\n", + " BPO_PARAMS,\n", + " '471819401',\n", + " \"ADEXP\",\n", + " 100,\n", + " 200,\n", + " \"IBEA\",\n", + " score_type=RelativeDifferenceScore\n", + " )\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
TimeConstantTestnameRestingPotentialTestInputResistanceTestRheobaseTest
62396088023.8 ms623960880-65.1 mV241.0 megaohm70.0 pA
62389317727.8 ms623893177-77.0 mV136.0 megaohm190.0 pA
47181940113.8 ms471819401-77.5 mV132.0 megaohm190.0 pA
48249376124.4 ms482493761-71.6 mV132.0 megaohm70.0 pA
\n", + "
" + ], + "text/plain": [ + " TimeConstantTest name RestingPotentialTest \\\n", + "623960880 23.8 ms 623960880 -65.1 mV \n", + "623893177 27.8 ms 623893177 -77.0 mV \n", + "471819401 13.8 ms 471819401 -77.5 mV \n", + "482493761 24.4 ms 482493761 -71.6 mV \n", + "\n", + " InputResistanceTest RheobaseTest \n", + "623960880 241.0 megaohm 70.0 pA \n", + "623893177 136.0 megaohm 190.0 pA \n", + "471819401 132.0 megaohm 190.0 pA \n", + "482493761 132.0 megaohm 70.0 pA " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Solution Model Parameters:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "#opt.attrs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Allen Specimen ID: 471819401\n", + "Four data fitting constraints:\n", + "* RheobaseTest\t\n", + "* TimeConstantTest\t\n", + "* RestingPotentialTest\t\n", + "* InputResistanceTest\t\n", + "# Model Izhikevich" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RheobaseTest\n", + "TimeConstantTest\n", + "RestingPotentialTest\n", + "InputResistanceTest\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:gen\tnevals\tavg \tstd \tmin \tmax \n", + "1 \t100 \t2021.55\t5233.26\t155.64\t53005.5\n", + "gen\tnevals\tavg \tstd \tmin \tmax \n", + "1 \t100 \t2021.55\t5233.26\t155.64\t53005.5\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "335452e7831d4f82bbb465d7a6f8ae6a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=360.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:2 \t77 \t1706.47\t3776.46\t123.486\t53005.5\n", + "2 \t77 \t1706.47\t3776.46\t123.486\t53005.5\n", + "INFO:__main__:3 \t27 \t470.277\t785.894\t123.486\t4000 \n", + "3 \t27 \t470.277\t785.894\t123.486\t4000 \n", + "INFO:__main__:4 \t39 \t367.732\t704.635\t98.6366\t4000 \n", + "4 \t39 \t367.732\t704.635\t98.6366\t4000 \n", + "INFO:__main__:5 \t30 \t317.461\t605.577\t98.6366\t4000 \n", + "5 \t30 \t317.461\t605.577\t98.6366\t4000 \n", + "INFO:__main__:6 \t29 \t327.117\t702.073\t98.6366\t4000 \n", + "6 \t29 \t327.117\t702.073\t98.6366\t4000 \n", + "INFO:__main__:7 \t35 \t337.21 \t621.931\t98.6366\t4000 \n", + "7 \t35 \t337.21 \t621.931\t98.6366\t4000 \n", + "INFO:__main__:8 \t29 \t263.531\t467.082\t98.6366\t4000 \n", + "8 \t29 \t263.531\t467.082\t98.6366\t4000 \n", + "INFO:__main__:9 \t34 \t190.609\t284.276\t98.6365\t1108.13\n", + "9 \t34 \t190.609\t284.276\t98.6365\t1108.13\n", + "INFO:__main__:10 \t33 \t281.454\t497.015\t98.6365\t4000 \n", + "10 \t33 \t281.454\t497.015\t98.6365\t4000 \n", + "INFO:__main__:11 \t32 \t271.855\t593.204\t98.6365\t4000 \n", + "11 \t32 \t271.855\t593.204\t98.6365\t4000 \n", + "INFO:__main__:12 \t42 \t511.395\t873.335\t98.6365\t4000 \n", + "12 \t42 \t511.395\t873.335\t98.6365\t4000 \n", + "INFO:__main__:13 \t38 \t338.553\t710.107\t98.6183\t4000 \n", + "13 \t38 \t338.553\t710.107\t98.6183\t4000 \n", + "INFO:__main__:14 \t39 \t294.72 \t348.998\t98.6183\t1105.13\n", + "14 \t39 \t294.72 \t348.998\t98.6183\t1105.13\n", + "INFO:__main__:15 \t36 \t281.893\t313.55 \t98.6183\t1105.22\n", + "15 \t36 \t281.893\t313.55 \t98.6183\t1105.22\n", + "INFO:__main__:16 \t32 \t297.185\t318.432\t92.681 \t1101.86\n", + "16 \t32 \t297.185\t318.432\t92.681 \t1101.86\n", + "INFO:__main__:17 \t26 \t265.052\t333.272\t92.681 \t1102.29\n", + "17 \t26 \t265.052\t333.272\t92.681 \t1102.29\n", + "INFO:__main__:18 \t34 \t314.78 \t349.794\t92.681 \t1098.98\n", + "18 \t34 \t314.78 \t349.794\t92.681 \t1098.98\n", + "INFO:__main__:19 \t34 \t355.1 \t363.304\t92.592 \t1103.21\n", + "19 \t34 \t355.1 \t363.304\t92.592 \t1103.21\n", + "INFO:__main__:20 \t37 \t359.985\t499.946\t91.192 \t4000 \n", + "20 \t37 \t359.985\t499.946\t91.192 \t4000 \n", + "INFO:__main__:21 \t38 \t310.315\t372.078\t86.903 \t1099.92\n", + "21 \t38 \t310.315\t372.078\t86.903 \t1099.92\n", + "INFO:__main__:22 \t35 \t264.051\t303.926\t86.903 \t1151.99\n", + "22 \t35 \t264.051\t303.926\t86.903 \t1151.99\n", + "INFO:__main__:23 \t25 \t281.016\t323.624\t86.903 \t1095.42\n", + "23 \t25 \t281.016\t323.624\t86.903 \t1095.42\n", + "INFO:__main__:24 \t41 \t390.177\t393.301\t86.903 \t1086.41\n", + "24 \t41 \t390.177\t393.301\t86.903 \t1086.41\n", + "INFO:__main__:25 \t32 \t298.418\t351.585\t86.903 \t1107.63\n", + "25 \t32 \t298.418\t351.585\t86.903 \t1107.63\n", + "INFO:__main__:26 \t31 \t312.749\t337.18 \t86.903 \t1082.32\n", + "26 \t31 \t312.749\t337.18 \t86.903 \t1082.32\n", + "INFO:__main__:27 \t37 \t337.476\t362.003\t75.9192\t1085.22\n", + "27 \t37 \t337.476\t362.003\t75.9192\t1085.22\n", + "INFO:__main__:28 \t33 \t274.54 \t334.681\t75.9192\t1085.23\n", + "28 \t33 \t274.54 \t334.681\t75.9192\t1085.23\n", + "INFO:__main__:29 \t29 \t339.854\t494.389\t75.9192\t4000 \n", + "29 \t29 \t339.854\t494.389\t75.9192\t4000 \n", + "INFO:__main__:30 \t36 \t256.698\t325.859\t75.9192\t1080.43\n", + "30 \t36 \t256.698\t325.859\t75.9192\t1080.43\n", + "INFO:__main__:31 \t28 \t247.13 \t286.899\t75.9192\t1080.77\n", + "31 \t28 \t247.13 \t286.899\t75.9192\t1080.77\n", + "INFO:__main__:32 \t37 \t390.16 \t528.358\t75.9192\t4000 \n", + "32 \t37 \t390.16 \t528.358\t75.9192\t4000 \n", + "INFO:__main__:33 \t32 \t317.456\t389.453\t75.7641\t1250.71\n", + "33 \t32 \t317.456\t389.453\t75.7641\t1250.71\n", + "INFO:__main__:34 \t28 \t240.548\t291.113\t75.7641\t1076.37\n", + "34 \t28 \t240.548\t291.113\t75.7641\t1076.37\n", + "INFO:__main__:35 \t32 \t310.543\t350.171\t75.7641\t1079.43\n", + "35 \t32 \t310.543\t350.171\t75.7641\t1079.43\n", + "INFO:__main__:36 \t30 \t291.362\t335.039\t75.7641\t1079.66\n", + "36 \t30 \t291.362\t335.039\t75.7641\t1079.66\n", + "INFO:__main__:37 \t30 \t301.94 \t354.94 \t75.7641\t1080.24\n", + "37 \t30 \t301.94 \t354.94 \t75.7641\t1080.24\n", + "INFO:__main__:38 \t37 \t280.06 \t328.832\t75.7641\t1083.89\n", + "38 \t37 \t280.06 \t328.832\t75.7641\t1083.89\n", + "INFO:__main__:39 \t35 \t339.227\t394.556\t75.7641\t1092.25\n", + "39 \t35 \t339.227\t394.556\t75.7641\t1092.25\n", + "INFO:__main__:40 \t25 \t221.876\t249.362\t75.7641\t1116.22\n", + "40 \t25 \t221.876\t249.362\t75.7641\t1116.22\n", + "INFO:__main__:41 \t41 \t246.972\t338.466\t75.7641\t1087.05\n", + "41 \t41 \t246.972\t338.466\t75.7641\t1087.05\n", + "INFO:__main__:42 \t33 \t273.822\t344.576\t75.7641\t1088.3 \n", + "42 \t33 \t273.822\t344.576\t75.7641\t1088.3 \n", + "INFO:__main__:43 \t37 \t360.772\t381.211\t75.7641\t1079.61\n", + "43 \t37 \t360.772\t381.211\t75.7641\t1079.61\n", + "INFO:__main__:44 \t30 \t293.032\t341.99 \t75.7641\t1076.09\n", + "44 \t30 \t293.032\t341.99 \t75.7641\t1076.09\n", + "INFO:__main__:45 \t30 \t323.274\t498.505\t75.7641\t4000 \n", + "45 \t30 \t323.274\t498.505\t75.7641\t4000 \n", + "INFO:__main__:46 \t41 \t339.521\t531.628\t75.7641\t4000 \n", + "46 \t41 \t339.521\t531.628\t75.7641\t4000 \n", + "INFO:__main__:47 \t38 \t321.08 \t524.718\t75.7467\t4000 \n", + "47 \t38 \t321.08 \t524.718\t75.7467\t4000 \n", + "INFO:__main__:48 \t38 \t363.264\t517.255\t75.7467\t4000 \n", + "48 \t38 \t363.264\t517.255\t75.7467\t4000 \n", + "INFO:__main__:49 \t36 \t332.404\t411.404\t75.7467\t1138.51\n", + "49 \t36 \t332.404\t411.404\t75.7467\t1138.51\n", + "INFO:__main__:50 \t35 \t377.229\t405.111\t75.7467\t1073.9 \n", + "50 \t35 \t377.229\t405.111\t75.7467\t1073.9 \n", + "INFO:__main__:51 \t36 \t344.416\t396.483\t75.7467\t1090.49\n", + "51 \t36 \t344.416\t396.483\t75.7467\t1090.49\n", + "INFO:__main__:52 \t30 \t256.365\t302.681\t64.472 \t1054.72\n", + "52 \t30 \t256.365\t302.681\t64.472 \t1054.72\n", + "INFO:__main__:53 \t32 \t354.314\t371.878\t64.472 \t1054.5 \n", + "53 \t32 \t354.314\t371.878\t64.472 \t1054.5 \n", + "INFO:__main__:54 \t37 \t324.557\t371.253\t64.472 \t1069.97\n", + "54 \t37 \t324.557\t371.253\t64.472 \t1069.97\n", + "INFO:__main__:55 \t37 \t378.392\t517.479\t64.472 \t4000 \n", + "55 \t37 \t378.392\t517.479\t64.472 \t4000 \n", + "INFO:__main__:56 \t34 \t323.873\t394.349\t54.933 \t1083.05\n", + "56 \t34 \t323.873\t394.349\t54.933 \t1083.05\n", + "INFO:__main__:57 \t40 \t358.75 \t390.744\t54.933 \t1070.98\n", + "57 \t40 \t358.75 \t390.744\t54.933 \t1070.98\n", + "INFO:__main__:58 \t38 \t404.774\t635.434\t54.933 \t4000 \n", + "58 \t38 \t404.774\t635.434\t54.933 \t4000 \n", + "INFO:__main__:59 \t34 \t321.774\t404.165\t53.203 \t1122.88\n", + "59 \t34 \t321.774\t404.165\t53.203 \t1122.88\n", + "INFO:__main__:60 \t26 \t296.554\t346.618\t53.203 \t1054.6 \n", + "60 \t26 \t296.554\t346.618\t53.203 \t1054.6 \n", + "INFO:__main__:61 \t34 \t344.792\t508.617\t53.203 \t4000 \n", + "61 \t34 \t344.792\t508.617\t53.203 \t4000 \n", + "INFO:__main__:62 \t32 \t331.132\t523.313\t53.203 \t4000 \n", + "62 \t32 \t331.132\t523.313\t53.203 \t4000 \n", + "INFO:__main__:63 \t41 \t236.766\t378.524\t51.961 \t1053.65\n", + "63 \t41 \t236.766\t378.524\t51.961 \t1053.65\n", + "INFO:__main__:64 \t36 \t275.242\t397.892\t51.961 \t1073.73\n", + "64 \t36 \t275.242\t397.892\t51.961 \t1073.73\n", + "INFO:__main__:65 \t29 \t237.638\t352.196\t51.961 \t1060.15\n", + "65 \t29 \t237.638\t352.196\t51.961 \t1060.15\n", + "INFO:__main__:66 \t40 \t362.548\t425.776\t51.883 \t1090.9 \n", + "66 \t40 \t362.548\t425.776\t51.883 \t1090.9 \n", + "INFO:__main__:67 \t36 \t385.591\t528.916\t51.883 \t4000 \n", + "67 \t36 \t385.591\t528.916\t51.883 \t4000 \n", + "INFO:__main__:68 \t30 \t274.54 \t493.278\t51.883 \t4000 \n", + "68 \t30 \t274.54 \t493.278\t51.883 \t4000 \n", + "INFO:__main__:69 \t38 \t226.212\t344.884\t51.883 \t1051.2 \n", + "69 \t38 \t226.212\t344.884\t51.883 \t1051.2 \n", + "INFO:__main__:70 \t32 \t229.04 \t354.291\t51.883 \t1054.88\n", + "70 \t32 \t229.04 \t354.291\t51.883 \t1054.88\n", + "INFO:__main__:71 \t36 \t308.674\t400.177\t51.2068\t1054.23\n", + "71 \t36 \t308.674\t400.177\t51.2068\t1054.23\n", + "INFO:__main__:72 \t38 \t284.76 \t363.495\t51.2068\t1065.12\n", + "72 \t38 \t284.76 \t363.495\t51.2068\t1065.12\n", + "INFO:__main__:73 \t34 \t304.114\t519.491\t51.2068\t4000 \n", + "73 \t34 \t304.114\t519.491\t51.2068\t4000 \n", + "INFO:__main__:74 \t29 \t285.872\t370.128\t51.102 \t1247.69\n", + "74 \t29 \t285.872\t370.128\t51.102 \t1247.69\n", + "INFO:__main__:75 \t34 \t325.042\t404.975\t50.0449\t1198.16\n", + "75 \t34 \t325.042\t404.975\t50.0449\t1198.16\n", + "INFO:__main__:76 \t42 \t284.624\t387.917\t50.0449\t1233.09\n", + "76 \t42 \t284.624\t387.917\t50.0449\t1233.09\n", + "INFO:__main__:77 \t21 \t242.367\t299.983\t50.0449\t1070.22\n", + "77 \t21 \t242.367\t299.983\t50.0449\t1070.22\n", + "INFO:__main__:78 \t37 \t334.927\t381.589\t50.0449\t1065.82\n", + "78 \t37 \t334.927\t381.589\t50.0449\t1065.82\n", + "INFO:__main__:79 \t35 \t388.284\t551.934\t50.0449\t4000 \n", + "79 \t35 \t388.284\t551.934\t50.0449\t4000 \n", + "INFO:__main__:80 \t27 \t259.758\t378.944\t50.0449\t1052.95\n", + "80 \t27 \t259.758\t378.944\t50.0449\t1052.95\n", + "INFO:__main__:81 \t35 \t256.715\t341.246\t50.0449\t1052.5 \n", + "81 \t35 \t256.715\t341.246\t50.0449\t1052.5 \n", + "INFO:__main__:82 \t25 \t277.515\t511.105\t50.0449\t4000 \n", + "82 \t25 \t277.515\t511.105\t50.0449\t4000 \n", + "INFO:__main__:83 \t29 \t233.827\t352.276\t50.0449\t1052.9 \n", + "83 \t29 \t233.827\t352.276\t50.0449\t1052.9 \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:84 \t35 \t308.118\t387.541\t50.0449\t1065.72\n", + "84 \t35 \t308.118\t387.541\t50.0449\t1065.72\n", + "INFO:__main__:85 \t32 \t242.755\t362.318\t50.0449\t1054.31\n", + "85 \t32 \t242.755\t362.318\t50.0449\t1054.31\n", + "INFO:__main__:86 \t26 \t272.678\t371.763\t50.0449\t1098.42\n", + "86 \t26 \t272.678\t371.763\t50.0449\t1098.42\n", + "INFO:__main__:87 \t33 \t329.723\t382.409\t50.0449\t1070.29\n", + "87 \t33 \t329.723\t382.409\t50.0449\t1070.29\n", + "INFO:__main__:88 \t24 \t275.916\t354.832\t50.0449\t1050.52\n", + "88 \t24 \t275.916\t354.832\t50.0449\t1050.52\n", + "INFO:__main__:89 \t32 \t279.186\t380.668\t50.0449\t1059.69\n", + "89 \t32 \t279.186\t380.668\t50.0449\t1059.69\n", + "INFO:__main__:90 \t33 \t299.996\t381.694\t50.0449\t1182.41\n", + "90 \t33 \t299.996\t381.694\t50.0449\t1182.41\n", + "INFO:__main__:91 \t36 \t241.07 \t364.727\t50.0449\t1065.62\n", + "91 \t36 \t241.07 \t364.727\t50.0449\t1065.62\n", + "INFO:__main__:92 \t34 \t308.879\t388.07 \t50.0449\t1075.22\n", + "92 \t34 \t308.879\t388.07 \t50.0449\t1075.22\n", + "INFO:__main__:93 \t29 \t305.123\t400.907\t50.0449\t1053.89\n", + "93 \t29 \t305.123\t400.907\t50.0449\t1053.89\n", + "INFO:__main__:94 \t32 \t319.644\t388.127\t50.0449\t1310.93\n", + "94 \t32 \t319.644\t388.127\t50.0449\t1310.93\n", + "INFO:__main__:95 \t34 \t235.794\t339.267\t50.0449\t1071.1 \n", + "95 \t34 \t235.794\t339.267\t50.0449\t1071.1 \n", + "INFO:__main__:96 \t40 \t365.592\t411.619\t50.0449\t1093.28\n", + "96 \t40 \t365.592\t411.619\t50.0449\t1093.28\n", + "INFO:__main__:97 \t28 \t300.901\t379.156\t50.0449\t1057.37\n", + "97 \t28 \t300.901\t379.156\t50.0449\t1057.37\n", + "INFO:__main__:98 \t38 \t277.143\t383.495\t50.0395\t1056.79\n", + "98 \t38 \t277.143\t383.495\t50.0395\t1056.79\n", + "INFO:__main__:99 \t41 \t424.243\t427.333\t50.0395\t1057.82\n", + "99 \t41 \t424.243\t427.333\t50.0395\t1057.82\n", + "INFO:__main__:100\t28 \t368.685\t495.314\t50.0395\t4000 \n", + "100\t28 \t368.685\t495.314\t50.0395\t4000 \n", + "INFO:__main__:101\t37 \t311.276\t378.955\t50.0395\t1299.27\n", + "101\t37 \t311.276\t378.955\t50.0395\t1299.27\n", + "INFO:__main__:102\t32 \t378.797\t411.537\t50.0395\t1071.66\n", + "102\t32 \t378.797\t411.537\t50.0395\t1071.66\n", + "INFO:__main__:103\t29 \t342.642\t367.994\t50.039 \t1075.47\n", + "103\t29 \t342.642\t367.994\t50.039 \t1075.47\n", + "INFO:__main__:104\t23 \t267.946\t345.155\t50.039 \t1130.41\n", + "104\t23 \t267.946\t345.155\t50.039 \t1130.41\n", + "INFO:__main__:105\t35 \t260.882\t331.204\t44.102 \t1092.41\n", + "105\t35 \t260.882\t331.204\t44.102 \t1092.41\n", + "INFO:__main__:106\t30 \t338.755\t526.041\t44.102 \t4000 \n", + "106\t30 \t338.755\t526.041\t44.102 \t4000 \n", + "INFO:__main__:107\t31 \t277.036\t399.298\t44.102 \t1225.66\n", + "107\t31 \t277.036\t399.298\t44.102 \t1225.66\n", + "INFO:__main__:108\t30 \t281.094\t393.543\t44.102 \t1081.09\n", + "108\t30 \t281.094\t393.543\t44.102 \t1081.09\n", + "INFO:__main__:109\t26 \t253.831\t355.962\t44.102 \t1120.21\n", + "109\t26 \t253.831\t355.962\t44.102 \t1120.21\n", + "INFO:__main__:110\t30 \t297.442\t394.437\t44.102 \t1058.26\n", + "110\t30 \t297.442\t394.437\t44.102 \t1058.26\n", + "INFO:__main__:111\t29 \t319.053\t404.054\t43.472 \t1090.52\n", + "111\t29 \t319.053\t404.054\t43.472 \t1090.52\n", + "INFO:__main__:112\t37 \t346.868\t422.409\t43.244 \t1058.74\n", + "112\t37 \t346.868\t422.409\t43.244 \t1058.74\n", + "INFO:__main__:113\t33 \t331.307\t398.919\t35.219 \t1055.7 \n", + "113\t33 \t331.307\t398.919\t35.219 \t1055.7 \n", + "INFO:__main__:114\t40 \t376.2 \t428.055\t35.219 \t1064.67\n", + "114\t40 \t376.2 \t428.055\t35.219 \t1064.67\n", + "INFO:__main__:115\t30 \t329.868\t394.947\t35.219 \t1067.25\n", + "115\t30 \t329.868\t394.947\t35.219 \t1067.25\n", + "INFO:__main__:116\t37 \t349.074\t404.233\t35.219 \t1070.46\n", + "116\t37 \t349.074\t404.233\t35.219 \t1070.46\n", + "INFO:__main__:117\t40 \t404.389\t535.358\t35.219 \t4000 \n", + "117\t40 \t404.389\t535.358\t35.219 \t4000 \n", + "INFO:__main__:118\t34 \t346.831\t535.673\t32.4706\t4000 \n", + "118\t34 \t346.831\t535.673\t32.4706\t4000 \n", + "INFO:__main__:119\t33 \t258.5 \t391.571\t32.4706\t1087.03\n", + "119\t33 \t258.5 \t391.571\t32.4706\t1087.03\n", + "INFO:__main__:120\t32 \t274.62 \t394.02 \t32.4706\t1064.64\n", + "120\t32 \t274.62 \t394.02 \t32.4706\t1064.64\n", + "INFO:__main__:121\t34 \t274.889\t367.697\t32.4706\t1061.37\n", + "121\t34 \t274.889\t367.697\t32.4706\t1061.37\n", + "INFO:__main__:122\t36 \t271.904\t371.393\t29.3 \t1076.89\n", + "122\t36 \t271.904\t371.393\t29.3 \t1076.89\n", + "INFO:__main__:123\t26 \t233.624\t344.632\t29.3 \t1032.65\n", + "123\t26 \t233.624\t344.632\t29.3 \t1032.65\n", + "INFO:__main__:124\t26 \t249.833\t362.172\t25.738 \t1254.55\n", + "124\t26 \t249.833\t362.172\t25.738 \t1254.55\n", + "INFO:__main__:125\t40 \t319.676\t408.652\t25.738 \t1057.22\n", + "125\t40 \t319.676\t408.652\t25.738 \t1057.22\n", + "INFO:__main__:126\t38 \t364.153\t427.094\t25.738 \t1052.46\n", + "126\t38 \t364.153\t427.094\t25.738 \t1052.46\n", + "INFO:__main__:127\t39 \t332.645\t395.365\t25.738 \t1058.36\n", + "127\t39 \t332.645\t395.365\t25.738 \t1058.36\n", + "INFO:__main__:128\t37 \t388.607\t453.351\t25.738 \t1317.91\n", + "128\t37 \t388.607\t453.351\t25.738 \t1317.91\n", + "INFO:__main__:129\t35 \t396.331\t388.35 \t25.738 \t1101.63\n", + "129\t35 \t396.331\t388.35 \t25.738 \t1101.63\n", + "INFO:__main__:130\t33 \t376.701\t366.695\t25.738 \t1087.4 \n", + "130\t33 \t376.701\t366.695\t25.738 \t1087.4 \n", + "INFO:__main__:131\t29 \t357.674\t344.815\t25.738 \t1054.83\n", + "131\t29 \t357.674\t344.815\t25.738 \t1054.83\n", + "INFO:__main__:132\t32 \t324.572\t335.743\t24.1442\t1055.82\n", + "132\t32 \t324.572\t335.743\t24.1442\t1055.82\n", + "INFO:__main__:133\t26 \t378.8 \t352.587\t24.1442\t1085.92\n", + "133\t26 \t378.8 \t352.587\t24.1442\t1085.92\n", + "INFO:__main__:134\t34 \t404.242\t364.962\t24.1442\t1055.84\n", + "134\t34 \t404.242\t364.962\t24.1442\t1055.84\n", + "INFO:__main__:135\t21 \t299.562\t321.13 \t24.1442\t1065.08\n", + "135\t21 \t299.562\t321.13 \t24.1442\t1065.08\n", + "INFO:__main__:136\t37 \t450.961\t382.658\t24.1442\t1079.1 \n", + "136\t37 \t450.961\t382.658\t24.1442\t1079.1 \n", + "INFO:__main__:137\t34 \t488.933\t354.676\t24.1442\t1057.06\n", + "137\t34 \t488.933\t354.676\t24.1442\t1057.06\n", + "INFO:__main__:138\t20 \t333.654\t304.447\t24.1442\t1229.3 \n", + "138\t20 \t333.654\t304.447\t24.1442\t1229.3 \n", + "INFO:__main__:139\t28 \t316.93 \t350.666\t24.1442\t1055.16\n", + "139\t28 \t316.93 \t350.666\t24.1442\t1055.16\n", + "INFO:__main__:140\t32 \t328.851\t354.405\t24.1442\t1055.53\n", + "140\t32 \t328.851\t354.405\t24.1442\t1055.53\n", + "INFO:__main__:141\t34 \t366.875\t383.337\t24.1442\t1103.48\n", + "141\t34 \t366.875\t383.337\t24.1442\t1103.48\n", + "INFO:__main__:142\t44 \t491.666\t395.364\t24.1442\t1072.15\n", + "142\t44 \t491.666\t395.364\t24.1442\t1072.15\n", + "INFO:__main__:143\t35 \t367.66 \t533.678\t24.1426\t4000 \n", + "143\t35 \t367.66 \t533.678\t24.1426\t4000 \n", + "INFO:__main__:144\t29 \t255.927\t387.66 \t24.1426\t1068.19\n", + "144\t29 \t255.927\t387.66 \t24.1426\t1068.19\n", + "INFO:__main__:145\t34 \t338.053\t411.866\t24.1426\t1066.68\n", + "145\t34 \t338.053\t411.866\t24.1426\t1066.68\n", + "INFO:__main__:146\t30 \t282.29 \t388.16 \t24.1426\t1086.88\n", + "146\t30 \t282.29 \t388.16 \t24.1426\t1086.88\n", + "INFO:__main__:147\t29 \t255.615\t364.999\t24.1426\t1054.84\n", + "147\t29 \t255.615\t364.999\t24.1426\t1054.84\n", + "INFO:__main__:148\t28 \t250.972\t380.014\t24.1426\t1130.01\n", + "148\t28 \t250.972\t380.014\t24.1426\t1130.01\n", + "INFO:__main__:149\t25 \t226.338\t326.668\t24.1426\t1057.6 \n", + "149\t25 \t226.338\t326.668\t24.1426\t1057.6 \n", + "INFO:__main__:150\t38 \t351.574\t438.045\t24.1426\t1047.08\n", + "150\t38 \t351.574\t438.045\t24.1426\t1047.08\n", + "INFO:__main__:151\t35 \t343.464\t410.987\t24.1426\t1083.49\n", + "151\t35 \t343.464\t410.987\t24.1426\t1083.49\n", + "INFO:__main__:152\t34 \t305.678\t411.755\t24.1426\t1074.23\n", + "152\t34 \t305.678\t411.755\t24.1426\t1074.23\n", + "INFO:__main__:153\t30 \t271.102\t402.2 \t24.1426\t1060.61\n", + "153\t30 \t271.102\t402.2 \t24.1426\t1060.61\n", + "INFO:__main__:154\t40 \t294.04 \t410.645\t23.187 \t1167.77\n", + "154\t40 \t294.04 \t410.645\t23.187 \t1167.77\n", + "INFO:__main__:155\t36 \t275.262\t382.269\t23.187 \t1068.01\n", + "155\t36 \t275.262\t382.269\t23.187 \t1068.01\n", + "INFO:__main__:156\t35 \t301.546\t367.104\t23.187 \t1057.25\n", + "156\t35 \t301.546\t367.104\t23.187 \t1057.25\n", + "INFO:__main__:157\t31 \t249.146\t347.403\t23.187 \t1044.1 \n", + "157\t31 \t249.146\t347.403\t23.187 \t1044.1 \n", + "INFO:__main__:158\t33 \t306.837\t405.616\t23.1867\t1059.8 \n", + "158\t33 \t306.837\t405.616\t23.1867\t1059.8 \n", + "INFO:__main__:159\t38 \t376.395\t429.315\t23.1867\t1097.88\n", + "159\t38 \t376.395\t429.315\t23.1867\t1097.88\n", + "INFO:__main__:160\t32 \t338.326\t414.49 \t23.1867\t1042.24\n", + "160\t32 \t338.326\t414.49 \t23.1867\t1042.24\n", + "INFO:__main__:161\t41 \t420.404\t454.393\t23.1867\t1349.31\n", + "161\t41 \t420.404\t454.393\t23.1867\t1349.31\n", + "INFO:__main__:162\t26 \t281.659\t379.211\t23.1867\t1072.39\n", + "162\t26 \t281.659\t379.211\t23.1867\t1072.39\n", + "INFO:__main__:163\t34 \t372.681\t432.192\t23.1867\t1061.36\n", + "163\t34 \t372.681\t432.192\t23.1867\t1061.36\n", + "INFO:__main__:164\t25 \t259.526\t348.624\t23.1867\t1053.73\n", + "164\t25 \t259.526\t348.624\t23.1867\t1053.73\n", + "INFO:__main__:165\t39 \t327.038\t393.548\t23.1867\t1043.87\n", + "165\t39 \t327.038\t393.548\t23.1867\t1043.87\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:166\t40 \t329.412\t409.085\t23.1867\t1270.2 \n", + "166\t40 \t329.412\t409.085\t23.1867\t1270.2 \n", + "INFO:__main__:167\t29 \t306.757\t417.574\t23.1867\t1054.13\n", + "167\t29 \t306.757\t417.574\t23.1867\t1054.13\n", + "INFO:__main__:168\t27 \t224.987\t315.714\t23.1867\t1043.31\n", + "168\t27 \t224.987\t315.714\t23.1867\t1043.31\n", + "INFO:__main__:169\t35 \t305.959\t384.644\t23.1867\t1046.06\n", + "169\t35 \t305.959\t384.644\t23.1867\t1046.06\n", + "INFO:__main__:170\t37 \t335.442\t416.213\t23.1867\t1055.14\n", + "170\t37 \t335.442\t416.213\t23.1867\t1055.14\n", + "INFO:__main__:171\t38 \t316.353\t395.14 \t22.0994\t1074.62\n", + "171\t38 \t316.353\t395.14 \t22.0994\t1074.62\n", + "INFO:__main__:172\t24 \t261.666\t320.098\t22.0994\t1040.63\n", + "172\t24 \t261.666\t320.098\t22.0994\t1040.63\n", + "INFO:__main__:173\t40 \t387.109\t409.022\t22.0994\t1077.12\n", + "173\t40 \t387.109\t409.022\t22.0994\t1077.12\n", + "INFO:__main__:174\t33 \t367.992\t409.438\t22.0994\t1064.58\n", + "174\t33 \t367.992\t409.438\t22.0994\t1064.58\n", + "INFO:__main__:175\t21 \t233.787\t339.264\t22.0994\t1043.63\n", + "175\t21 \t233.787\t339.264\t22.0994\t1043.63\n", + "INFO:__main__:176\t38 \t298.464\t369.225\t22.0994\t1086.16\n", + "176\t38 \t298.464\t369.225\t22.0994\t1086.16\n", + "INFO:__main__:177\t29 \t327.152\t358.847\t19.832 \t1052.18\n", + "177\t29 \t327.152\t358.847\t19.832 \t1052.18\n", + "INFO:__main__:178\t39 \t413.239\t455.027\t19.832 \t1085.59\n", + "178\t39 \t413.239\t455.027\t19.832 \t1085.59\n", + "INFO:__main__:179\t36 \t363.374\t399.723\t19.832 \t1043.04\n", + "179\t36 \t363.374\t399.723\t19.832 \t1043.04\n", + "INFO:__main__:180\t42 \t353.663\t422.51 \t19.832 \t1044.05\n", + "180\t42 \t353.663\t422.51 \t19.832 \t1044.05\n", + "INFO:__main__:181\t24 \t231.597\t329.348\t19.832 \t1064.87\n", + "181\t24 \t231.597\t329.348\t19.832 \t1064.87\n", + "INFO:__main__:182\t31 \t240.967\t447.975\t19.832 \t3180.84\n", + "182\t31 \t240.967\t447.975\t19.832 \t3180.84\n", + "INFO:__main__:183\t26 \t277.974\t370.35 \t19.832 \t1043.85\n", + "183\t26 \t277.974\t370.35 \t19.832 \t1043.85\n", + "INFO:__main__:184\t38 \t321.351\t432.982\t19.832 \t1072.71\n", + "184\t38 \t321.351\t432.982\t19.832 \t1072.71\n", + "INFO:__main__:185\t31 \t260.815\t385.861\t19.827 \t1060.39\n", + "185\t31 \t260.815\t385.861\t19.827 \t1060.39\n", + "INFO:__main__:186\t39 \t301.378\t532.89 \t19.8267\t4000 \n", + "186\t39 \t301.378\t532.89 \t19.8267\t4000 \n", + "INFO:__main__:187\t31 \t274.562\t421.155\t19.8267\t1058.9 \n", + "187\t31 \t274.562\t421.155\t19.8267\t1058.9 \n", + "INFO:__main__:188\t41 \t350 \t435.772\t19.8267\t1058.42\n", + "188\t41 \t350 \t435.772\t19.8267\t1058.42\n", + "INFO:__main__:189\t38 \t328.212\t425.833\t19.8267\t1084.38\n", + "189\t38 \t328.212\t425.833\t19.8267\t1084.38\n", + "INFO:__main__:190\t32 \t261.598\t383.743\t19.8267\t1042.79\n", + "190\t32 \t261.598\t383.743\t19.8267\t1042.79\n", + "INFO:__main__:191\t36 \t290.03 \t418.498\t19.8267\t1150.51\n", + "191\t36 \t290.03 \t418.498\t19.8267\t1150.51\n", + "INFO:__main__:192\t23 \t139.714\t278.481\t19.8266\t1048.49\n", + "192\t23 \t139.714\t278.481\t19.8266\t1048.49\n", + "INFO:__main__:193\t27 \t237.771\t373.354\t19.8266\t1065.74\n", + "193\t27 \t237.771\t373.354\t19.8266\t1065.74\n", + "INFO:__main__:194\t34 \t250.274\t374.03 \t19.8266\t1070.99\n", + "194\t34 \t250.274\t374.03 \t19.8266\t1070.99\n", + "INFO:__main__:195\t33 \t241.163\t365.695\t19.8266\t1042.62\n", + "195\t33 \t241.163\t365.695\t19.8266\t1042.62\n", + "INFO:__main__:196\t25 \t219.499\t354.054\t19.8266\t1067.07\n", + "196\t25 \t219.499\t354.054\t19.8266\t1067.07\n", + "INFO:__main__:197\t36 \t304.921\t379.345\t19.8266\t1162.58\n", + "197\t36 \t304.921\t379.345\t19.8266\t1162.58\n", + "INFO:__main__:198\t34 \t287.404\t395.809\t19.8266\t1068.52\n", + "198\t34 \t287.404\t395.809\t19.8266\t1068.52\n", + "INFO:__main__:199\t36 \t294.262\t396.349\t19.8266\t1054.01\n", + "199\t36 \t294.262\t396.349\t19.8266\t1054.01\n", + "INFO:__main__:200\t37 \t378.295\t412.546\t19.8266\t1121.96\n", + "200\t37 \t378.295\t412.546\t19.8266\t1121.96\n", + "INFO:__main__:201\t32 \t244.41 \t361.506\t19.8266\t1058.7 \n", + "201\t32 \t244.41 \t361.506\t19.8266\t1058.7 \n", + "INFO:__main__:202\t31 \t247.793\t369.937\t19.8266\t1071.28\n", + "202\t31 \t247.793\t369.937\t19.8266\t1071.28\n", + "INFO:__main__:203\t28 \t215.672\t330.686\t19.8266\t1043.3 \n", + "203\t28 \t215.672\t330.686\t19.8266\t1043.3 \n", + "INFO:__main__:204\t33 \t365.772\t384.401\t19.8266\t1043.4 \n", + "204\t33 \t365.772\t384.401\t19.8266\t1043.4 \n", + "INFO:__main__:205\t38 \t327.454\t416.131\t19.8266\t1066.43\n", + "205\t38 \t327.454\t416.131\t19.8266\t1066.43\n", + "INFO:__main__:206\t29 \t300.745\t409.749\t19.8266\t1122.98\n", + "206\t29 \t300.745\t409.749\t19.8266\t1122.98\n", + "INFO:__main__:207\t23 \t232.725\t337.59 \t19.8266\t1041.49\n", + "207\t23 \t232.725\t337.59 \t19.8266\t1041.49\n", + "INFO:__main__:208\t31 \t335.145\t392.863\t19.8266\t1058.56\n", + "208\t31 \t335.145\t392.863\t19.8266\t1058.56\n", + "INFO:__main__:209\t30 \t313.595\t411.034\t19.8266\t1043.8 \n", + "209\t30 \t313.595\t411.034\t19.8266\t1043.8 \n", + "INFO:__main__:210\t27 \t228.096\t316.372\t19.8266\t1070.05\n", + "210\t27 \t228.096\t316.372\t19.8266\t1070.05\n", + "INFO:__main__:211\t35 \t237.203\t371.056\t19.8266\t1048.29\n", + "211\t35 \t237.203\t371.056\t19.8266\t1048.29\n", + "INFO:__main__:212\t33 \t323.968\t397.053\t19.8266\t1041.28\n", + "212\t33 \t323.968\t397.053\t19.8266\t1041.28\n", + "INFO:__main__:213\t31 \t248.462\t355.473\t19.8266\t1064.68\n", + "213\t31 \t248.462\t355.473\t19.8266\t1064.68\n", + "INFO:__main__:214\t33 \t278.973\t419.795\t19.8266\t1051.09\n", + "214\t33 \t278.973\t419.795\t19.8266\t1051.09\n", + "INFO:__main__:215\t34 \t243.234\t382.01 \t19.8266\t1043.2 \n", + "215\t34 \t243.234\t382.01 \t19.8266\t1043.2 \n", + "INFO:__main__:216\t29 \t277.911\t387.423\t19.8266\t1040.6 \n", + "216\t29 \t277.911\t387.423\t19.8266\t1040.6 \n", + "INFO:__main__:217\t33 \t271.911\t415.275\t19.8266\t1183.94\n", + "217\t33 \t271.911\t415.275\t19.8266\t1183.94\n", + "INFO:__main__:218\t29 \t233.175\t361.327\t19.8266\t1041.01\n", + "218\t29 \t233.175\t361.327\t19.8266\t1041.01\n", + "INFO:__main__:219\t32 \t268.848\t382.675\t19.8266\t1055.68\n", + "219\t32 \t268.848\t382.675\t19.8266\t1055.68\n", + "INFO:__main__:220\t38 \t360.164\t455.584\t19.8266\t1044.54\n", + "220\t38 \t360.164\t455.584\t19.8266\t1044.54\n", + "INFO:__main__:221\t27 \t277.852\t400.324\t19.8266\t1066.77\n", + "221\t27 \t277.852\t400.324\t19.8266\t1066.77\n", + "INFO:__main__:222\t34 \t296.05 \t412.297\t19.8266\t1040.29\n", + "222\t34 \t296.05 \t412.297\t19.8266\t1040.29\n", + "INFO:__main__:223\t33 \t295.889\t423.234\t19.8266\t1096.45\n", + "223\t33 \t295.889\t423.234\t19.8266\t1096.45\n", + "INFO:__main__:224\t43 \t324.141\t428.543\t19.7822\t1052.22\n", + "224\t43 \t324.141\t428.543\t19.7822\t1052.22\n", + "INFO:__main__:225\t40 \t296.068\t414.514\t19.7822\t1040.48\n", + "225\t40 \t296.068\t414.514\t19.7822\t1040.48\n", + "INFO:__main__:226\t32 \t306.646\t420.568\t19.7822\t1049.92\n", + "226\t32 \t306.646\t420.568\t19.7822\t1049.92\n", + "INFO:__main__:227\t34 \t330.246\t409.992\t19.7822\t1111.31\n", + "227\t34 \t330.246\t409.992\t19.7822\t1111.31\n", + "INFO:__main__:228\t32 \t229.042\t367.103\t19.7822\t1086.79\n", + "228\t32 \t229.042\t367.103\t19.7822\t1086.79\n", + "INFO:__main__:229\t29 \t253.543\t408.55 \t19.7822\t1060.29\n", + "229\t29 \t253.543\t408.55 \t19.7822\t1060.29\n", + "INFO:__main__:230\t24 \t206.876\t356.636\t19.7822\t1064.17\n", + "230\t24 \t206.876\t356.636\t19.7822\t1064.17\n", + "INFO:__main__:231\t39 \t301.569\t422.862\t19.7822\t1078.12\n", + "231\t39 \t301.569\t422.862\t19.7822\t1078.12\n", + "INFO:__main__:232\t29 \t223.463\t388.181\t19.7822\t1086.44\n", + "232\t29 \t223.463\t388.181\t19.7822\t1086.44\n", + "INFO:__main__:233\t30 \t175.104\t341.017\t19.7822\t1084.18\n", + "233\t30 \t175.104\t341.017\t19.7822\t1084.18\n", + "INFO:__main__:234\t35 \t293.868\t418.245\t19.7822\t1070.14\n", + "234\t35 \t293.868\t418.245\t19.7822\t1070.14\n", + "INFO:__main__:235\t27 \t238.882\t364.728\t19.7822\t1087.27\n", + "235\t27 \t238.882\t364.728\t19.7822\t1087.27\n", + "INFO:__main__:236\t33 \t287.376\t358.66 \t19.7822\t1086.84\n", + "236\t33 \t287.376\t358.66 \t19.7822\t1086.84\n", + "INFO:__main__:237\t24 \t216.756\t368.854\t19.7822\t1158.71\n", + "237\t24 \t216.756\t368.854\t19.7822\t1158.71\n", + "INFO:__main__:238\t28 \t266.092\t399.917\t19.7822\t1151.27\n", + "238\t28 \t266.092\t399.917\t19.7822\t1151.27\n", + "INFO:__main__:239\t27 \t250.735\t380.206\t19.7822\t1084.62\n", + "239\t27 \t250.735\t380.206\t19.7822\t1084.62\n", + "INFO:__main__:240\t29 \t221.281\t354.21 \t19.7822\t1063.37\n", + "240\t29 \t221.281\t354.21 \t19.7822\t1063.37\n", + "INFO:__main__:241\t45 \t351.562\t453.186\t19.7813\t1088.35\n", + "241\t45 \t351.562\t453.186\t19.7813\t1088.35\n", + "INFO:__main__:242\t36 \t278.525\t404.627\t19.7813\t1148.3 \n", + "242\t36 \t278.525\t404.627\t19.7813\t1148.3 \n", + "INFO:__main__:243\t30 \t207.426\t372.179\t19.7813\t1054.57\n", + "243\t30 \t207.426\t372.179\t19.7813\t1054.57\n", + "INFO:__main__:244\t31 \t273.677\t390.593\t19.7813\t1047.58\n", + "244\t31 \t273.677\t390.593\t19.7813\t1047.58\n", + "INFO:__main__:245\t36 \t283.985\t408.17 \t19.7813\t1079.37\n", + "245\t36 \t283.985\t408.17 \t19.7813\t1079.37\n", + "INFO:__main__:246\t24 \t203.114\t294.615\t19.7813\t1061.59\n", + "246\t24 \t203.114\t294.615\t19.7813\t1061.59\n", + "INFO:__main__:247\t33 \t258.005\t392.868\t19.7813\t1133.08\n", + "247\t33 \t258.005\t392.868\t19.7813\t1133.08\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:248\t32 \t314.312\t411.642\t19.7813\t1058.45\n", + "248\t32 \t314.312\t411.642\t19.7813\t1058.45\n", + "INFO:__main__:249\t38 \t282.324\t417.593\t19.7813\t1073.57\n", + "249\t38 \t282.324\t417.593\t19.7813\t1073.57\n", + "INFO:__main__:250\t37 \t261.208\t383.303\t19.7813\t1047.86\n", + "250\t37 \t261.208\t383.303\t19.7813\t1047.86\n", + "INFO:__main__:251\t28 \t231.084\t377.323\t19.7813\t1062.76\n", + "251\t28 \t231.084\t377.323\t19.7813\t1062.76\n", + "INFO:__main__:252\t34 \t281.154\t398.391\t19.7813\t1097.71\n", + "252\t34 \t281.154\t398.391\t19.7813\t1097.71\n", + "INFO:__main__:253\t32 \t230.311\t383.947\t19.7813\t1067.21\n", + "253\t32 \t230.311\t383.947\t19.7813\t1067.21\n", + "INFO:__main__:254\t28 \t225.906\t350.988\t19.7813\t1050 \n", + "254\t28 \t225.906\t350.988\t19.7813\t1050 \n", + "INFO:__main__:255\t39 \t274.064\t399.549\t19.7813\t1040.47\n", + "255\t39 \t274.064\t399.549\t19.7813\t1040.47\n", + "INFO:__main__:256\t25 \t246.588\t357.269\t19.7813\t1076.14\n", + "256\t25 \t246.588\t357.269\t19.7813\t1076.14\n", + "INFO:__main__:257\t39 \t256.315\t394.01 \t19.7813\t1074.94\n", + "257\t39 \t256.315\t394.01 \t19.7813\t1074.94\n", + "INFO:__main__:258\t38 \t313.748\t402.05 \t19.7813\t1048 \n", + "258\t38 \t313.748\t402.05 \t19.7813\t1048 \n", + "INFO:__main__:259\t29 \t300.567\t538.935\t19.7813\t4000 \n", + "259\t29 \t300.567\t538.935\t19.7813\t4000 \n", + "INFO:__main__:260\t33 \t196.335\t358.906\t19.7813\t1034.85\n", + "260\t33 \t196.335\t358.906\t19.7813\t1034.85\n", + "INFO:__main__:261\t37 \t229.055\t384.674\t19.7813\t1072.95\n", + "261\t37 \t229.055\t384.674\t19.7813\t1072.95\n", + "INFO:__main__:262\t22 \t243.22 \t369.701\t19.7813\t1082.85\n", + "262\t22 \t243.22 \t369.701\t19.7813\t1082.85\n", + "INFO:__main__:263\t36 \t318.889\t397.271\t19.7813\t1057.09\n", + "263\t36 \t318.889\t397.271\t19.7813\t1057.09\n", + "INFO:__main__:264\t41 \t353.098\t451.404\t19.7813\t1062.67\n", + "264\t41 \t353.098\t451.404\t19.7813\t1062.67\n", + "INFO:__main__:265\t32 \t315.815\t395.006\t19.7813\t1085.33\n", + "265\t32 \t315.815\t395.006\t19.7813\t1085.33\n", + "INFO:__main__:266\t35 \t290.356\t399.197\t19.7813\t1064.46\n", + "266\t35 \t290.356\t399.197\t19.7813\t1064.46\n", + "INFO:__main__:267\t31 \t288.102\t400.967\t19.7813\t1036.78\n", + "267\t31 \t288.102\t400.967\t19.7813\t1036.78\n", + "INFO:__main__:268\t36 \t312.462\t400.069\t19.022 \t1050.88\n", + "268\t36 \t312.462\t400.069\t19.022 \t1050.88\n", + "INFO:__main__:269\t36 \t294.957\t424.122\t19.022 \t1049.28\n", + "269\t36 \t294.957\t424.122\t19.022 \t1049.28\n", + "INFO:__main__:270\t31 \t299.92 \t396.398\t19.022 \t1041.28\n", + "270\t31 \t299.92 \t396.398\t19.022 \t1041.28\n", + "INFO:__main__:271\t42 \t337.073\t444.7 \t14.2321\t1039.46\n", + "271\t42 \t337.073\t444.7 \t14.2321\t1039.46\n", + "INFO:__main__:272\t31 \t280.845\t376.029\t14.2321\t1087.72\n", + "272\t31 \t280.845\t376.029\t14.2321\t1087.72\n", + "INFO:__main__:273\t32 \t275.937\t405.197\t14.2321\t1046.02\n", + "273\t32 \t275.937\t405.197\t14.2321\t1046.02\n", + "INFO:__main__:274\t23 \t198.75 \t336.328\t14.2228\t1060.64\n", + "274\t23 \t198.75 \t336.328\t14.2228\t1060.64\n", + "INFO:__main__:275\t29 \t256.057\t359.753\t14.2228\t1074.16\n", + "275\t29 \t256.057\t359.753\t14.2228\t1074.16\n", + "INFO:__main__:276\t43 \t267.383\t388.3 \t14.2228\t1074.67\n", + "276\t43 \t267.383\t388.3 \t14.2228\t1074.67\n", + "INFO:__main__:277\t35 \t260.468\t357.813\t14.2228\t1042.9 \n", + "277\t35 \t260.468\t357.813\t14.2228\t1042.9 \n", + "INFO:__main__:278\t31 \t264.155\t371.778\t14.2228\t1043.36\n", + "278\t31 \t264.155\t371.778\t14.2228\t1043.36\n", + "INFO:__main__:279\t40 \t319.307\t437.534\t14.2228\t1044.05\n", + "279\t40 \t319.307\t437.534\t14.2228\t1044.05\n" + ] + } + ], + "source": [ + "opt,obs_preds,df = public_opt(\n", + " a_cells['471819401'],\n", + " BPO_PARAMS,\n", + " 'fi_curve',\n", + " \"IZHI\",\n", + " 100,\n", + " 360,\n", + " \"IBEA\",\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Solution Parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "opt.attrs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Just FI curve on AdExp model\n", + "Allen Specimin Id: 471819401" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "opt,obs_preds,df = public_opt(\n", + " a_cells['fi_curve'],\n", + " BPO_PARAMS,\n", + " 'fi_curve',\n", + " \"ADEXP\",\n", + " 100,\n", + " 100,\n", + " \"IBEA\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "opt.attrs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Allen Specimen ID: 623960880\n", + "Four data fitting constraints:\n", + "* RheobaseTest\t\n", + "* TimeConstantTest\t\n", + "* RestingPotentialTest\t\n", + "* InputResistanceTest\t\n", + "# Model Izhikevich" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "opt,obs_preds,df = public_opt(\n", + " allen_suite_623960880.tests,\n", + " BPO_PARAMS,\n", + " allen_suite_623960880.name,\n", + " \"IZHI\",\n", + " 100,\n", + " 100,\n", + " \"IBEA\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "opt.attrs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/neuronunit/ReducedModelOptimizationIzhikevichMultiSpiking.ipynb b/examples/neuronunit/ReducedModelOptimizationIzhikevichMultiSpiking.ipynb new file mode 100644 index 00000000..26723b39 --- /dev/null +++ b/examples/neuronunit/ReducedModelOptimizationIzhikevichMultiSpiking.ipynb @@ -0,0 +1,411 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# An example of using BluePyOpt/NeuronUnit Optimization\n", + "Using:\n", + "* Allen Brain Experimental data (`specimen_id=325479788`, sweep number `64`) to derive features from.\n", + "* EFEL feature extraction\n", + "* BluePyOpt Optimization.\n", + "* Numba JIT simple cell models (Izhikevich, Adaptive Exponential).\n", + "* Neuronunit model scoring" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "sys.path.insert(0,'/home/user/git/revitalize/neuronunit')\n", + "del sys.path[-5]\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "sns.set(context=\"paper\", font=\"monospace\")\n", + "%matplotlib inline\n", + "SILENT = True\n", + "import warnings\n", + "if SILENT:\n", + " warnings.filterwarnings(\"ignore\")\n", + "\n", + "from neuronunit.plotting.plot_utils import check_bin_vm_soma\n", + "from neuronunit.allenapi.allen_data_driven import opt_setup\n", + "from nb_utils import optimize_job\n", + "from sciunit.scores import RelativeDifferenceScore\n", + "import pandas as pd\n", + "import pickle\n", + "import quantities as pq\n", + "specimen_id = 325479788\n", + "import numpy as np\n", + "from neuronunit.tests.target_spike_current import SpikeCountSearch\n", + "from neuronunit.optimization.optimization_management import inject_model_soma\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def test_opt_relative_diff(specimen_id,model_type = \"ADEXP\",efel_filter_iterable=None):\n", + " fitnesses,scores,obs_preds,opt,target,hall_of_fame,cell_evaluator = optimize_job(specimen_id,\n", + " model_type,\n", + " score_type=RelativeDifferenceScore,\n", + " efel_filter_iterable=efel_filter_iterable)\n", + " print(fitnesses)\n", + " return obs_preds,opt,target,hall_of_fame,cell_evaluator\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Below is a plot of vm trace for fitting the simple model to with neuron unit.\n", + "* It is from Allen Specimen id `325479788`, sweep number `64`.\n", + "* sweep number \n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "with open('325479788later_allen_NU_tests.p', \"rb\") as f:\n", + " suite = pickle.load(f)\n", + " \n", + "plt.plot(suite.traces[\"vm_soma\"].times,suite.traces[\"vm_soma\"])\n", + "plt.xlabel(pq.s)\n", + "plt.ylabel(suite.traces[\"vm_soma\"].dimensionality)\n", + "plt.title(\"$V_{M}$ Allen Specimen id 325479788, sweep number 64\")\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example 1\n", + "* Izhikevich model \n", + "* Allen specimen 325479788" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:\n", + " \u001b[33m\u001b[1mWarning:\u001b[0m to view this Streamlit app on a browser, run it with the following\n", + " command:\n", + "\n", + " streamlit run /home/user/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py [ARGUMENTS]\n", + "2021-02-15 17:45:08.299 WARNING root: \n", + " \u001b[33m\u001b[1mWarning:\u001b[0m to view this Streamlit app on a browser, run it with the following\n", + " command:\n", + "\n", + " streamlit run /home/user/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py [ARGUMENTS]\n", + "INFO:__main__:gen\tnevals\tavg \tstd \tmin \tmax \n", + "1 \t100 \t5391.89\t7563.54\t153.034\t18000\n", + "2021-02-15 17:46:56.902 INFO __main__: gen\tnevals\tavg \tstd \tmin \tmax \n", + "1 \t100 \t5391.89\t7563.54\t153.034\t18000\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c12820ea89654cb6b09d2a3c82b91c4c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=500.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:2 \t100 \t5180.17\t7446.7 \t141.184\t18000\n", + "2021-02-15 17:48:40.335 INFO __main__: 2 \t100 \t5180.17\t7446.7 \t141.184\t18000\n", + "INFO:__main__:3 \t50 \t1492.21\t4214.83\t110.193\t18000\n", + "2021-02-15 17:49:19.076 INFO __main__: 3 \t50 \t1492.21\t4214.83\t110.193\t18000\n", + "INFO:__main__:4 \t50 \t1624.99\t4808.92\t108.63 \t18000\n", + "2021-02-15 17:49:58.665 INFO __main__: 4 \t50 \t1624.99\t4808.92\t108.63 \t18000\n", + "INFO:__main__:5 \t50 \t1426.04\t4527.41\t60.0746\t18000\n", + "2021-02-15 17:50:37.726 INFO __main__: 5 \t50 \t1426.04\t4527.41\t60.0746\t18000\n", + "INFO:__main__:6 \t50 \t1377.76\t4536.27\t47.1518\t18000\n", + "2021-02-15 17:51:18.032 INFO __main__: 6 \t50 \t1377.76\t4536.27\t47.1518\t18000\n", + "INFO:__main__:7 \t50 \t2259.42\t5639.89\t45.8588\t18000\n", + "2021-02-15 17:52:06.415 INFO __main__: 7 \t50 \t2259.42\t5639.89\t45.8588\t18000\n", + "INFO:__main__:8 \t50 \t2388.88\t5898.68\t45.1384\t18000\n", + "2021-02-15 17:52:57.611 INFO __main__: 8 \t50 \t2388.88\t5898.68\t45.1384\t18000\n", + "INFO:__main__:9 \t50 \t1994.79\t5371.59\t45.1384\t18000\n", + "2021-02-15 17:53:44.316 INFO __main__: 9 \t50 \t1994.79\t5371.59\t45.1384\t18000\n", + "INFO:__main__:10 \t50 \t1900.04\t5295.74\t33.3619\t18000\n", + "2021-02-15 17:54:33.080 INFO __main__: 10 \t50 \t1900.04\t5295.74\t33.3619\t18000\n", + "INFO:__main__:11 \t50 \t1318.6 \t4554.72\t33.3619\t18000\n", + "2021-02-15 17:55:13.716 INFO __main__: 11 \t50 \t1318.6 \t4554.72\t33.3619\t18000\n", + "INFO:__main__:12 \t50 \t1925.4 \t5391.8 \t30.3038\t18000\n", + "2021-02-15 17:55:58.269 INFO __main__: 12 \t50 \t1925.4 \t5391.8 \t30.3038\t18000\n", + "INFO:__main__:13 \t50 \t1684.84\t4898.12\t29.4101\t18000\n", + "2021-02-15 17:56:35.234 INFO __main__: 13 \t50 \t1684.84\t4898.12\t29.4101\t18000\n", + "INFO:__main__:14 \t50 \t509.564\t2538.56\t29.4101\t18000\n", + "2021-02-15 17:57:01.876 INFO __main__: 14 \t50 \t509.564\t2538.56\t29.4101\t18000\n", + "INFO:__main__:15 \t50 \t745.381\t3329.17\t29.4101\t18000\n", + "2021-02-15 17:57:32.496 INFO __main__: 15 \t50 \t745.381\t3329.17\t29.4101\t18000\n", + "INFO:__main__:16 \t50 \t1125.79\t4243.04\t29.3968\t18000\n", + "2021-02-15 17:58:09.694 INFO __main__: 16 \t50 \t1125.79\t4243.04\t29.3968\t18000\n", + "INFO:__main__:17 \t50 \t250.039\t1467.89\t29.3968\t14038.8\n", + "2021-02-15 17:58:31.787 INFO __main__: 17 \t50 \t250.039\t1467.89\t29.3968\t14038.8\n", + "INFO:__main__:18 \t50 \t1743.18\t5151.88\t29.3193\t18000 \n", + "2021-02-15 17:59:15.897 INFO __main__: 18 \t50 \t1743.18\t5151.88\t29.3193\t18000 \n", + "INFO:__main__:19 \t50 \t1504.88\t4849.04\t29.3193\t18000 \n", + "2021-02-15 17:59:57.482 INFO __main__: 19 \t50 \t1504.88\t4849.04\t29.3193\t18000 \n", + "INFO:__main__:20 \t50 \t2009.5 \t5425.28\t29.308 \t18000 \n", + "2021-02-15 18:00:39.093 INFO __main__: 20 \t50 \t2009.5 \t5425.28\t29.308 \t18000 \n", + "INFO:__main__:21 \t50 \t951.132\t3751.59\t29.308 \t18000 \n", + "2021-02-15 18:01:10.231 INFO __main__: 21 \t50 \t951.132\t3751.59\t29.308 \t18000 \n", + "INFO:__main__:22 \t50 \t1535.33\t4651.5 \t29.1504\t18000 \n", + "2021-02-15 18:01:49.034 INFO __main__: 22 \t50 \t1535.33\t4651.5 \t29.1504\t18000 \n", + "INFO:__main__:23 \t50 \t2059.26\t5384.66\t29.1504\t18000 \n", + "2021-02-15 18:02:33.576 INFO __main__: 23 \t50 \t2059.26\t5384.66\t29.1504\t18000 \n", + "INFO:__main__:24 \t50 \t2059.6 \t5522.45\t29.0188\t18000 \n", + "2021-02-15 18:03:19.451 INFO __main__: 24 \t50 \t2059.6 \t5522.45\t29.0188\t18000 \n", + "INFO:__main__:25 \t50 \t902.059\t3740.62\t29.0188\t18000 \n", + "2021-02-15 18:03:50.880 INFO __main__: 25 \t50 \t902.059\t3740.62\t29.0188\t18000 \n", + "INFO:__main__:26 \t50 \t584.798\t3050.24\t29.0188\t18000 \n", + "2021-02-15 18:04:20.905 INFO __main__: 26 \t50 \t584.798\t3050.24\t29.0188\t18000 \n", + "INFO:__main__:27 \t50 \t1123.02\t4100.8 \t29.0129\t18000 \n", + "2021-02-15 18:04:55.252 INFO __main__: 27 \t50 \t1123.02\t4100.8 \t29.0129\t18000 \n", + "INFO:__main__:28 \t50 \t593.782\t3053.5 \t29.0129\t18000 \n", + "2021-02-15 18:05:26.291 INFO __main__: 28 \t50 \t593.782\t3053.5 \t29.0129\t18000 \n", + "INFO:__main__:29 \t50 \t981.381\t3901.4 \t29.0129\t18000 \n", + "2021-02-15 18:06:00.108 INFO __main__: 29 \t50 \t981.381\t3901.4 \t29.0129\t18000 \n", + "INFO:__main__:30 \t50 \t1812.49\t4959 \t29.0127\t18000 \n", + "2021-02-15 18:06:36.053 INFO __main__: 30 \t50 \t1812.49\t4959 \t29.0127\t18000 \n", + "INFO:__main__:31 \t50 \t1464.81\t4850.69\t29.0037\t18000 \n", + "2021-02-15 18:07:18.321 INFO __main__: 31 \t50 \t1464.81\t4850.69\t29.0037\t18000 \n", + "INFO:__main__:32 \t50 \t1592.57\t5008.07\t26.1811\t18000 \n", + "2021-02-15 18:08:00.685 INFO __main__: 32 \t50 \t1592.57\t5008.07\t26.1811\t18000 \n", + "INFO:__main__:33 \t50 \t1487.31\t4666.37\t26.1682\t18000 \n", + "2021-02-15 18:08:40.219 INFO __main__: 33 \t50 \t1487.31\t4666.37\t26.1682\t18000 \n", + "INFO:__main__:34 \t50 \t1919.51\t5394.71\t26.1682\t18000 \n", + "2021-02-15 18:09:25.766 INFO __main__: 34 \t50 \t1919.51\t5394.71\t26.1682\t18000 \n", + "INFO:__main__:35 \t50 \t1317 \t4350.62\t26.1682\t18000 \n", + "2021-02-15 18:09:56.898 INFO __main__: 35 \t50 \t1317 \t4350.62\t26.1682\t18000 \n", + "INFO:__main__:36 \t50 \t1195.17\t4303.1 \t26.1642\t18000 \n", + "2021-02-15 18:10:29.711 INFO __main__: 36 \t50 \t1195.17\t4303.1 \t26.1642\t18000 \n", + "INFO:__main__:37 \t50 \t1051.05\t3957.78\t26.1642\t18000 \n", + "2021-02-15 18:11:02.253 INFO __main__: 37 \t50 \t1051.05\t3957.78\t26.1642\t18000 \n", + "INFO:__main__:38 \t50 \t314.372\t1953.63\t26.1629\t14041.2\n", + "2021-02-15 18:11:24.793 INFO __main__: 38 \t50 \t314.372\t1953.63\t26.1629\t14041.2\n", + "INFO:__main__:39 \t50 \t344.012\t2245.37\t26.1629\t18000 \n", + "2021-02-15 18:11:52.645 INFO __main__: 39 \t50 \t344.012\t2245.37\t26.1629\t18000 \n", + "INFO:__main__:40 \t50 \t1177.64\t4162.09\t26.1626\t18000 \n", + "2021-02-15 18:12:26.096 INFO __main__: 40 \t50 \t1177.64\t4162.09\t26.1626\t18000 \n", + "INFO:__main__:41 \t50 \t443.075\t2379.06\t26.1626\t14041.3\n", + "2021-02-15 18:12:49.707 INFO __main__: 41 \t50 \t443.075\t2379.06\t26.1626\t14041.3\n", + "INFO:__main__:42 \t50 \t304.953\t1952.29\t26.1623\t14040.5\n", + "2021-02-15 18:13:11.805 INFO __main__: 42 \t50 \t304.953\t1952.29\t26.1623\t14040.5\n", + "INFO:__main__:43 \t50 \t1278.13\t3991.72\t26.1623\t14040.6\n", + "2021-02-15 18:13:34.445 INFO __main__: 43 \t50 \t1278.13\t3991.72\t26.1623\t14040.6\n", + "INFO:__main__:44 \t50 \t725.655\t3038.66\t26.1623\t14041.8\n", + "2021-02-15 18:13:56.691 INFO __main__: 44 \t50 \t725.655\t3038.66\t26.1623\t14041.8\n", + "INFO:__main__:45 \t50 \t722.582\t3039.36\t26.1623\t14040.9\n", + "2021-02-15 18:14:19.657 INFO __main__: 45 \t50 \t722.582\t3039.36\t26.1623\t14040.9\n", + "INFO:__main__:46 \t50 \t447.741\t2378.24\t26.1623\t14040.5\n", + "2021-02-15 18:14:42.533 INFO __main__: 46 \t50 \t447.741\t2378.24\t26.1623\t14040.5\n", + "INFO:__main__:47 \t50 \t761.068\t3230.71\t26.1618\t18000 \n", + "2021-02-15 18:15:07.080 INFO __main__: 47 \t50 \t761.068\t3230.71\t26.1618\t18000 \n", + "INFO:__main__:48 \t50 \t304.384\t1952.23\t26.1618\t14039.8\n", + "2021-02-15 18:15:29.403 INFO __main__: 48 \t50 \t304.384\t1952.23\t26.1618\t14039.8\n", + "INFO:__main__:49 \t50 \t304.181\t1952.5 \t26.1618\t14041.5\n", + "2021-02-15 18:15:54.429 INFO __main__: 49 \t50 \t304.181\t1952.5 \t26.1618\t14041.5\n", + "INFO:__main__:50 \t50 \t720.731\t3039.89\t26.1618\t14041.7\n", + "2021-02-15 18:16:19.661 INFO __main__: 50 \t50 \t720.731\t3039.89\t26.1618\t14041.7\n", + "INFO:__main__:51 \t50 \t165.301\t1387.57\t26.1455\t14041 \n", + "2021-02-15 18:16:43.819 INFO __main__: 51 \t50 \t165.301\t1387.57\t26.1455\t14041 \n", + "INFO:__main__:52 \t50 \t998.083\t3559.17\t26.1455\t14041.1\n", + "2021-02-15 18:17:07.359 INFO __main__: 52 \t50 \t998.083\t3559.17\t26.1455\t14041.1\n", + "INFO:__main__:53 \t50 \t998.753\t3559.12\t26.1455\t14042.6\n", + "2021-02-15 18:17:31.327 INFO __main__: 53 \t50 \t998.753\t3559.12\t26.1455\t14042.6\n", + "INFO:__main__:54 \t50 \t999.657\t3558.84\t26.1455\t14041.2\n", + "2021-02-15 18:17:58.353 INFO __main__: 54 \t50 \t999.657\t3558.84\t26.1455\t14041.2\n", + "INFO:__main__:55 \t50 \t861.978\t3312.07\t26.1455\t14041.2\n", + "2021-02-15 18:18:26.707 INFO __main__: 55 \t50 \t861.978\t3312.07\t26.1455\t14041.2\n", + "INFO:__main__:56 \t50 \t1555.72\t4364.9 \t26.142 \t14041.2\n", + "2021-02-15 18:18:56.040 INFO __main__: 56 \t50 \t1555.72\t4364.9 \t26.142 \t14041.2\n", + "INFO:__main__:57 \t50 \t861.55 \t3312.22\t26.142 \t14042.4\n", + "2021-02-15 18:19:19.990 INFO __main__: 57 \t50 \t861.55 \t3312.22\t26.142 \t14042.4\n", + "INFO:__main__:58 \t50 \t167.155\t1387.4 \t26.142 \t14041.2\n", + "2021-02-15 18:19:44.350 INFO __main__: 58 \t50 \t167.155\t1387.4 \t26.142 \t14041.2\n", + "INFO:__main__:59 \t50 \t722.846\t3039.41\t26.142 \t14041.2\n", + "2021-02-15 18:20:08.947 INFO __main__: 59 \t50 \t722.846\t3039.41\t26.142 \t14041.2\n", + "INFO:__main__:60 \t50 \t1000.38\t3558.61\t26.142 \t14041.2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-02-15 18:20:32.594 INFO __main__: 60 \t50 \t1000.38\t3558.61\t26.142 \t14041.2\n", + "INFO:__main__:61 \t50 \t1694.77\t4533.47\t26.142 \t14041.4\n", + "2021-02-15 18:21:01.145 INFO __main__: 61 \t50 \t1694.77\t4533.47\t26.142 \t14041.4\n", + "INFO:__main__:62 \t50 \t901.465\t3486.46\t26.142 \t18000 \n", + "2021-02-15 18:21:36.898 INFO __main__: 62 \t50 \t901.465\t3486.46\t26.142 \t18000 \n", + "INFO:__main__:63 \t50 \t1593.31\t4493.23\t26.142 \t18000 \n", + "2021-02-15 18:22:14.666 INFO __main__: 63 \t50 \t1593.31\t4493.23\t26.142 \t18000 \n", + "INFO:__main__:64 \t50 \t303.971\t1952.46\t26.142 \t14041.5\n", + "2021-02-15 18:22:36.532 INFO __main__: 64 \t50 \t303.971\t1952.46\t26.142 \t14041.5\n", + "INFO:__main__:65 \t50 \t1354.09\t4271.59\t26.142 \t18000 \n", + "2021-02-15 18:23:10.308 INFO __main__: 65 \t50 \t1354.09\t4271.59\t26.142 \t18000 \n", + "INFO:__main__:66 \t50 \t303.812\t1952.41\t26.142 \t14040.9\n", + "2021-02-15 18:23:34.863 INFO __main__: 66 \t50 \t303.812\t1952.41\t26.142 \t14040.9\n", + "INFO:__main__:67 \t50 \t442.417\t2379 \t26.142 \t14040 \n", + "2021-02-15 18:24:07.431 INFO __main__: 67 \t50 \t442.417\t2379 \t26.142 \t14040 \n", + "INFO:__main__:68 \t50 \t581.218\t2733.24\t26.142 \t14042.1\n", + "2021-02-15 18:24:33.535 INFO __main__: 68 \t50 \t581.218\t2733.24\t26.142 \t14042.1\n", + "INFO:__main__:69 \t50 \t720.059\t3039.93\t26.142 \t14041.9\n", + "2021-02-15 18:25:06.939 INFO __main__: 69 \t50 \t720.059\t3039.93\t26.142 \t14041.9\n", + "INFO:__main__:70 \t50 \t581.189\t2733.08\t26.142 \t14040.7\n", + "2021-02-15 18:25:30.933 INFO __main__: 70 \t50 \t581.189\t2733.08\t26.142 \t14040.7\n", + "INFO:__main__:71 \t50 \t858.89 \t3312.78\t26.142 \t14042.4\n", + "2021-02-15 18:25:52.903 INFO __main__: 71 \t50 \t858.89 \t3312.78\t26.142 \t14042.4\n", + "INFO:__main__:72 \t50 \t205.128\t1779.49\t26.142 \t18000 \n", + "2021-02-15 18:26:21.605 INFO __main__: 72 \t50 \t205.128\t1779.49\t26.142 \t18000 \n", + "INFO:__main__:73 \t50 \t165.134\t1387.39\t26.142 \t14039 \n", + "2021-02-15 18:26:45.897 INFO __main__: 73 \t50 \t165.134\t1387.39\t26.142 \t14039 \n", + "INFO:__main__:74 \t50 \t164.985\t1387.57\t26.142 \t14040.7\n", + "2021-02-15 18:27:10.023 INFO __main__: 74 \t50 \t164.985\t1387.57\t26.142 \t14040.7\n", + "INFO:__main__:75 \t50 \t165.098\t1387.5 \t26.142 \t14040.1\n", + "2021-02-15 18:27:32.645 INFO __main__: 75 \t50 \t165.098\t1387.5 \t26.142 \t14040.1\n", + "INFO:__main__:76 \t50 \t304.738\t1952.47\t26.142 \t14042.2\n", + "2021-02-15 18:27:56.717 INFO __main__: 76 \t50 \t304.738\t1952.47\t26.142 \t14042.2\n", + "INFO:__main__:77 \t50 \t303.908\t1952.29\t26.142 \t14040.2\n", + "2021-02-15 18:28:20.352 INFO __main__: 77 \t50 \t303.908\t1952.29\t26.142 \t14040.2\n", + "INFO:__main__:78 \t50 \t481.634\t2622.94\t26.142 \t18000 \n", + "2021-02-15 18:28:47.301 INFO __main__: 78 \t50 \t481.634\t2622.94\t26.142 \t18000 \n" + ] + } + ], + "source": [ + "import quantities as qt\n", + "efel_filter_iterable = {\n", + " \"ISI_log_slope\":None,\n", + " \"adaptation_index2\":None,\n", + " \"first_isi\":None,\n", + " \"ISI_CV\":None,\n", + " \"median_isi\":None,\n", + " \"Spikecount\":None,\n", + " \"all_ISI_values\":None,\n", + " \"ISI_values\":None,\n", + " \"time_to_first_spike\":None,\n", + " \"time_to_last_spike\":None,\n", + " \"time_to_second_spike\":None}\n", + "#}\n", + "efel_filter_iterable = list(efel_filter_iterable.keys())\n", + "# \"extra_tests\":{\"var_expl\":suite.traces[\"vm_soma\"],\"vmr\":qt.mV}\n", + "obs_preds,opt,target,hall_of_fame,cell_evaluator = test_opt_relative_diff(specimen_id = 325479788,\n", + " model_type=\"IZHI\",\n", + " efel_filter_iterable=efel_filter_iterable)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "check_bin_vm_soma(target,opt)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from jithub.models.model_classes import IzhiModel" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.DataFrame(obs_preds)\n", + "df.rename(columns={0:'EFEL_feature_NU_test_Name',1:'prediction',2:'observation',3:'neuronunit_score'},inplace=True)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "3:'neuronunit_score'},inplace=True)\n", + "df" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/neuronunit/ReducedModelOptimizationMultiSpiking.ipynb b/examples/neuronunit/ReducedModelOptimizationMultiSpiking.ipynb new file mode 100644 index 00000000..e3f8bc7f --- /dev/null +++ b/examples/neuronunit/ReducedModelOptimizationMultiSpiking.ipynb @@ -0,0 +1,2402 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# An example of using BluePyOpt/NeuronUnit Optimization\n", + "Using:\n", + "* Allen Brain Experimental data (`specimen_id=325479788`, sweep number `64`) to derive features from.\n", + "* EFEL feature extraction\n", + "* BluePyOpt Optimization.\n", + "* Numba JIT simple cell models (Izhikevich, Adaptive Exponential).\n", + "* Neuronunit model scoring" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "sns.set(context=\"paper\", font=\"monospace\")\n", + "%matplotlib inline\n", + "SILENT = True\n", + "import warnings\n", + "if SILENT:\n", + " warnings.filterwarnings(\"ignore\")\n", + "\n", + "from neuronunit.plotting.plot_utils import check_bin_vm_soma\n", + "from neuronunit.allenapi.allen_data_driven import opt_setup\n", + "from nb_utils import optimize_job\n", + "from sciunit.scores import RelativeDifferenceScore\n", + "import pandas as pd\n", + "import pickle\n", + "import quantities as pq\n", + "specimen_id = 325479788\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def test_opt_relative_diff(specimen_id,model_type = \"ADEXP\",efel_filter_iterable=None): \n", + " _,scores,obs_preds,opt,target = optimize_job(specimen_id,\n", + " model_type,\n", + " score_type=RelativeDifferenceScore,\n", + " efel_filter_iterable=efel_filter_iterable)\n", + " return obs_preds,opt,target\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Below is a plot of vm trace for fitting the simple model to with neuron unit.\n", + "* It is from Allen Specimen id `325479788`, sweep number `64`.\n", + "* sweep number \n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "with open('325479788later_allen_NU_tests.p', \"rb\") as f:\n", + " suite = pickle.load(f)\n", + " \n", + "plt.plot(suite.traces[\"vm_soma\"].times,suite.traces[\"vm_soma\"])\n", + "plt.xlabel(pq.s)\n", + "plt.ylabel(suite.traces[\"vm_soma\"].dimensionality)\n", + "plt.title(\"$V_{M}$ Allen Specimen id 325479788, sweep number 64\")\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example 1\n", + "* Izhikevich model \n", + "* Allen specimen 325479788" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:gen\tnevals\tavg \tstd \tmin \tmax \n", + "1 \t200 \t4920.71\t8146.33\t19.3253\t19000\n", + "gen\tnevals\tavg \tstd \tmin \tmax \n", + "1 \t200 \t4920.71\t8146.33\t19.3253\t19000\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bb6e0908904448d9ab6f902e4c88ef0a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=350.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:2 \t142 \t4573.65\t7952.37\t19.3253\t19000\n", + "2 \t142 \t4573.65\t7952.37\t19.3253\t19000\n", + "INFO:__main__:3 \t37 \t253.777\t1505.5 \t19.3253\t14023.2\n", + "3 \t37 \t253.777\t1505.5 \t19.3253\t14023.2\n", + "INFO:__main__:4 \t33 \t615.113\t3219.71\t11.5634\t19000 \n", + "4 \t33 \t615.113\t3219.71\t11.5634\t19000 \n", + "INFO:__main__:5 \t31 \t624.864\t3219.5 \t11.5634\t19000 \n", + "5 \t31 \t624.864\t3219.5 \t11.5634\t19000 \n", + "INFO:__main__:6 \t37 \t1786.98\t5417.1 \t11.5634\t19000 \n", + "6 \t37 \t1786.98\t5417.1 \t11.5634\t19000 \n", + "INFO:__main__:7 \t42 \t1911.93\t5665.52\t11.5634\t19000 \n", + "7 \t42 \t1911.93\t5665.52\t11.5634\t19000 \n", + "INFO:__main__:8 \t36 \t1920.99\t5478.39\t11.5634\t19000 \n", + "8 \t36 \t1920.99\t5478.39\t11.5634\t19000 \n", + "INFO:__main__:9 \t31 \t1520.02\t5126.78\t11.5634\t19000 \n", + "9 \t31 \t1520.02\t5126.78\t11.5634\t19000 \n", + "INFO:__main__:10 \t43 \t973.552\t4116.65\t11.5634\t19000 \n", + "10 \t43 \t973.552\t4116.65\t11.5634\t19000 \n", + "INFO:__main__:11 \t33 \t964.614\t4116.57\t11.5634\t19000 \n", + "11 \t33 \t964.614\t4116.57\t11.5634\t19000 \n", + "INFO:__main__:12 \t29 \t959.178\t4117.28\t11.5634\t19000 \n", + "12 \t29 \t959.178\t4117.28\t11.5634\t19000 \n", + "INFO:__main__:13 \t28 \t584.324\t3222.93\t11.5634\t19000 \n", + "13 \t28 \t584.324\t3222.93\t11.5634\t19000 \n", + "INFO:__main__:14 \t27 \t1144.14\t4487.4 \t11.5634\t19000 \n", + "14 \t27 \t1144.14\t4487.4 \t11.5634\t19000 \n", + "INFO:__main__:15 \t29 \t1145.86\t4486.97\t11.5634\t19000 \n", + "15 \t29 \t1145.86\t4486.97\t11.5634\t19000 \n", + "INFO:__main__:16 \t30 \t1330.85\t4821.71\t11.5634\t19000 \n", + "16 \t30 \t1330.85\t4821.71\t11.5634\t19000 \n", + "INFO:__main__:17 \t34 \t769.466\t3702.06\t11.5634\t19000 \n", + "17 \t34 \t769.466\t3702.06\t11.5634\t19000 \n", + "INFO:__main__:18 \t35 \t1520.74\t5126.57\t10.765 \t19000 \n", + "18 \t35 \t1520.74\t5126.57\t10.765 \t19000 \n", + "INFO:__main__:19 \t30 \t719.633\t3486.05\t10.765 \t19000 \n", + "19 \t30 \t719.633\t3486.05\t10.765 \t19000 \n", + "INFO:__main__:20 \t36 \t790.984\t3703.19\t10.765 \t19000 \n", + "20 \t36 \t790.984\t3703.19\t10.765 \t19000 \n", + "INFO:__main__:21 \t44 \t1145.21\t4487.13\t9.86074\t19000 \n", + "21 \t44 \t1145.21\t4487.13\t9.86074\t19000 \n", + "INFO:__main__:22 \t33 \t1520.73\t5126.65\t9.86074\t19000 \n", + "22 \t33 \t1520.73\t5126.65\t9.86074\t19000 \n", + "INFO:__main__:23 \t23 \t960.7 \t4117.2 \t9.86074\t19000 \n", + "23 \t23 \t960.7 \t4117.2 \t9.86074\t19000 \n", + "INFO:__main__:24 \t30 \t1330.02\t4821.94\t9.86074\t19000 \n", + "24 \t30 \t1330.02\t4821.94\t9.86074\t19000 \n", + "INFO:__main__:25 \t37 \t579.193\t3222.97\t9.86074\t19000 \n", + "25 \t37 \t579.193\t3222.97\t9.86074\t19000 \n", + "INFO:__main__:26 \t28 \t590.316\t3223.41\t7.4374 \t19000 \n", + "26 \t28 \t590.316\t3223.41\t7.4374 \t19000 \n", + "INFO:__main__:27 \t39 \t417.439\t2647.36\t7.4374 \t19000 \n", + "27 \t39 \t417.439\t2647.36\t7.4374 \t19000 \n", + "INFO:__main__:28 \t41 \t1916.12\t5665.81\t7.4374 \t19000 \n", + "28 \t41 \t1916.12\t5665.81\t7.4374 \t19000 \n", + "INFO:__main__:29 \t29 \t1142.33\t4487.87\t5.65479\t19000 \n", + "29 \t29 \t1142.33\t4487.87\t5.65479\t19000 \n", + "INFO:__main__:30 \t34 \t631.659\t3242.92\t5.65479\t19000 \n", + "30 \t34 \t631.659\t3242.92\t5.65479\t19000 \n", + "INFO:__main__:31 \t27 \t210.063\t1881.7 \t5.33158\t19000 \n", + "31 \t27 \t210.063\t1881.7 \t5.33158\t19000 \n", + "INFO:__main__:32 \t34 \t1341.58\t4821.07\t5.33158\t19000 \n", + "32 \t34 \t1341.58\t4821.07\t5.33158\t19000 \n", + "INFO:__main__:33 \t34 \t574.244\t3223.84\t3.39391\t19000 \n", + "33 \t34 \t574.244\t3223.84\t3.39391\t19000 \n", + "INFO:__main__:34 \t33 \t385.795\t2645.72\t3.39391\t19000 \n", + "34 \t33 \t385.795\t2645.72\t3.39391\t19000 \n", + "INFO:__main__:35 \t33 \t581.711\t3224.14\t3.39391\t19000 \n", + "35 \t33 \t581.711\t3224.14\t3.39391\t19000 \n", + "INFO:__main__:36 \t38 \t573.037\t3224.05\t3.39391\t19000 \n", + "36 \t38 \t573.037\t3224.05\t3.39391\t19000 \n", + "INFO:__main__:37 \t22 \t6.79551\t6.6178 \t3.39391\t36.876 \n", + "37 \t22 \t6.79551\t6.6178 \t3.39391\t36.876 \n", + "INFO:__main__:38 \t33 \t196.744\t1880.34\t3.39391\t19000 \n", + "38 \t33 \t196.744\t1880.34\t3.39391\t19000 \n", + "INFO:__main__:39 \t38 \t194.926\t1880.51\t3.09551\t19000 \n", + "39 \t38 \t194.926\t1880.51\t3.09551\t19000 \n", + "INFO:__main__:40 \t35 \t6.87794\t4.81194\t3.09551\t33.3177\n", + "40 \t35 \t6.87794\t4.81194\t3.09551\t33.3177\n", + "INFO:__main__:41 \t34 \t197.128\t1880.3 \t2.55094\t19000 \n", + "41 \t34 \t197.128\t1880.3 \t2.55094\t19000 \n", + "INFO:__main__:42 \t33 \t571.225\t3224.37\t2.55094\t19000 \n", + "42 \t33 \t571.225\t3224.37\t2.55094\t19000 \n", + "INFO:__main__:43 \t33 \t6.7546 \t6.37133\t2.55094\t35.5385\n", + "43 \t33 \t6.7546 \t6.37133\t2.55094\t35.5385\n", + "INFO:__main__:44 \t42 \t1137.76\t4489.01\t2.36366\t19000 \n", + "44 \t42 \t1137.76\t4489.01\t2.36366\t19000 \n", + "INFO:__main__:45 \t32 \t382.58 \t2646.17\t2.36366\t19000 \n", + "45 \t32 \t382.58 \t2646.17\t2.36366\t19000 \n", + "INFO:__main__:46 \t30 \t192.592\t1880.75\t2.36366\t19000 \n", + "46 \t30 \t192.592\t1880.75\t2.36366\t19000 \n", + "INFO:__main__:47 \t29 \t193.936\t1880.62\t2.17436\t19000 \n", + "47 \t29 \t193.936\t1880.62\t2.17436\t19000 \n", + "INFO:__main__:48 \t28 \t203.132\t1882.45\t2.17436\t19000 \n", + "48 \t28 \t203.132\t1882.45\t2.17436\t19000 \n", + "INFO:__main__:49 \t33 \t4.75986\t5.21479\t2.17436\t31.0738\n", + "49 \t33 \t4.75986\t5.21479\t2.17436\t31.0738\n", + "INFO:__main__:50 \t34 \t6.8155 \t5.02755\t2.17436\t40.0652\n", + "50 \t34 \t6.8155 \t5.02755\t2.17436\t40.0652\n", + "INFO:__main__:51 \t34 \t197.677\t1880.24\t2.17436\t19000 \n", + "51 \t34 \t197.677\t1880.24\t2.17436\t19000 \n", + "INFO:__main__:52 \t37 \t571.175\t3224.38\t2.17436\t19000 \n", + "52 \t37 \t571.175\t3224.38\t2.17436\t19000 \n", + "INFO:__main__:53 \t39 \t5.2493 \t6.02095\t2.17436\t30.7877\n", + "53 \t39 \t5.2493 \t6.02095\t2.17436\t30.7877\n", + "INFO:__main__:54 \t32 \t235.766\t1902.63\t1.86219\t19000 \n", + "54 \t32 \t235.766\t1902.63\t1.86219\t19000 \n", + "INFO:__main__:55 \t36 \t569.757\t3224.63\t1.86219\t19000 \n", + "55 \t36 \t569.757\t3224.63\t1.86219\t19000 \n", + "INFO:__main__:56 \t35 \t380.659\t2646.44\t1.86219\t19000 \n", + "56 \t35 \t380.659\t2646.44\t1.86219\t19000 \n", + "INFO:__main__:57 \t33 \t381.187\t2646.37\t1.86219\t19000 \n", + "57 \t33 \t381.187\t2646.37\t1.86219\t19000 \n", + "INFO:__main__:58 \t30 \t566.53 \t3225.19\t1.86219\t19000 \n", + "58 \t30 \t566.53 \t3225.19\t1.86219\t19000 \n", + "INFO:__main__:59 \t44 \t567.567\t3225.01\t1.85955\t19000 \n", + "59 \t44 \t567.567\t3225.01\t1.85955\t19000 \n", + "INFO:__main__:60 \t35 \t378.889\t2646.69\t1.85955\t19000 \n", + "60 \t35 \t378.889\t2646.69\t1.85955\t19000 \n", + "INFO:__main__:61 \t32 \t3.55495\t5.78245\t1.85955\t31.4944\n", + "61 \t32 \t3.55495\t5.78245\t1.85955\t31.4944\n", + "INFO:__main__:62 \t30 \t195.271\t1880.49\t1.85955\t19000 \n", + "62 \t30 \t195.271\t1880.49\t1.85955\t19000 \n", + "INFO:__main__:63 \t40 \t3.27952\t4.00686\t1.85955\t28.032 \n", + "63 \t40 \t3.27952\t4.00686\t1.85955\t28.032 \n", + "INFO:__main__:64 \t43 \t194.856\t1880.53\t1.85955\t19000 \n", + "64 \t43 \t194.856\t1880.53\t1.85955\t19000 \n", + "INFO:__main__:65 \t32 \t191.703\t1880.84\t1.85955\t19000 \n", + "65 \t32 \t191.703\t1880.84\t1.85955\t19000 \n", + "INFO:__main__:66 \t29 \t190.444\t1880.96\t1.85955\t19000 \n", + "66 \t29 \t190.444\t1880.96\t1.85955\t19000 \n", + "INFO:__main__:67 \t29 \t3.72609\t6.01148\t1.85955\t42.3728\n", + "67 \t29 \t3.72609\t6.01148\t1.85955\t42.3728\n", + "INFO:__main__:68 \t35 \t381.109\t2646.38\t1.85955\t19000 \n", + "68 \t35 \t381.109\t2646.38\t1.85955\t19000 \n", + "INFO:__main__:69 \t38 \t191.641\t1880.84\t1.85955\t19000 \n", + "69 \t38 \t191.641\t1880.84\t1.85955\t19000 \n", + "INFO:__main__:70 \t34 \t190.853\t1880.92\t1.85955\t19000 \n", + "70 \t34 \t190.853\t1880.92\t1.85955\t19000 \n", + "INFO:__main__:71 \t42 \t5.61492\t7.74483\t1.85955\t41.2139\n", + "71 \t42 \t5.61492\t7.74483\t1.85955\t41.2139\n", + "INFO:__main__:72 \t31 \t7.94364\t6.0591 \t1.85955\t41.346 \n", + "72 \t31 \t7.94364\t6.0591 \t1.85955\t41.346 \n", + "INFO:__main__:73 \t32 \t223.976\t1901.4 \t1.85955\t19000 \n", + "73 \t32 \t223.976\t1901.4 \t1.85955\t19000 \n", + "INFO:__main__:74 \t31 \t191.228\t1880.88\t1.85955\t19000 \n", + "74 \t31 \t191.228\t1880.88\t1.85955\t19000 \n", + "INFO:__main__:75 \t38 \t192.732\t1880.74\t1.85955\t19000 \n", + "75 \t38 \t192.732\t1880.74\t1.85955\t19000 \n", + "INFO:__main__:76 \t32 \t567.571\t3225.01\t1.85955\t19000 \n", + "76 \t32 \t567.571\t3225.01\t1.85955\t19000 \n", + "INFO:__main__:77 \t37 \t192.144\t1880.79\t1.85955\t19000 \n", + "77 \t37 \t192.144\t1880.79\t1.85955\t19000 \n", + "INFO:__main__:78 \t34 \t755.482\t3704.9 \t1.7852 \t19000 \n", + "78 \t34 \t755.482\t3704.9 \t1.7852 \t19000 \n", + "INFO:__main__:79 \t21 \t2.40991\t3.11907\t1.7852 \t29.5369\n", + "79 \t21 \t2.40991\t3.11907\t1.7852 \t29.5369\n", + "INFO:__main__:80 \t44 \t193.549\t1880.66\t1.7852 \t19000 \n", + "80 \t44 \t193.549\t1880.66\t1.7852 \t19000 \n", + "INFO:__main__:81 \t32 \t379.092\t2646.66\t1.7852 \t19000 \n", + "81 \t32 \t379.092\t2646.66\t1.7852 \t19000 \n", + "INFO:__main__:82 \t25 \t3.12747\t4.25084\t1.7852 \t25.6503\n", + "82 \t25 \t3.12747\t4.25084\t1.7852 \t25.6503\n", + "INFO:__main__:83 \t36 \t194.234\t1880.59\t1.7852 \t19000 \n", + "83 \t36 \t194.234\t1880.59\t1.7852 \t19000 \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:84 \t37 \t943.792\t4120.75\t1.7852 \t19000 \n", + "84 \t37 \t943.792\t4120.75\t1.7852 \t19000 \n", + "INFO:__main__:85 \t23 \t2.71643\t3.08355\t1.72661\t28.9218\n", + "85 \t23 \t2.71643\t3.08355\t1.72661\t28.9218\n", + "INFO:__main__:86 \t33 \t380.758\t2646.43\t1.72661\t19000 \n", + "86 \t33 \t380.758\t2646.43\t1.72661\t19000 \n", + "INFO:__main__:87 \t34 \t191.531\t1880.85\t1.72661\t19000 \n", + "87 \t34 \t191.531\t1880.85\t1.72661\t19000 \n", + "INFO:__main__:88 \t36 \t191.689\t1880.84\t1.72661\t19000 \n", + "88 \t36 \t191.689\t1880.84\t1.72661\t19000 \n", + "INFO:__main__:89 \t38 \t567.823\t3224.96\t1.72661\t19000 \n", + "89 \t38 \t567.823\t3224.96\t1.72661\t19000 \n", + "INFO:__main__:90 \t28 \t2.77583\t3.63886\t1.72661\t24.3991\n", + "90 \t28 \t2.77583\t3.63886\t1.72661\t24.3991\n", + "INFO:__main__:91 \t34 \t380.871\t2646.41\t1.72661\t19000 \n", + "91 \t34 \t380.871\t2646.41\t1.72661\t19000 \n", + "INFO:__main__:92 \t28 \t3.87577\t6.16494\t1.72661\t36.1581\n", + "92 \t28 \t3.87577\t6.16494\t1.72661\t36.1581\n", + "INFO:__main__:93 \t32 \t6.87485\t7.61572\t1.72661\t40.0713\n", + "93 \t32 \t6.87485\t7.61572\t1.72661\t40.0713\n", + "INFO:__main__:94 \t41 \t195.507\t1880.46\t1.72661\t19000 \n", + "94 \t41 \t195.507\t1880.46\t1.72661\t19000 \n", + "INFO:__main__:95 \t40 \t15.933 \t101.562\t1.72661\t1029.4 \n", + "95 \t40 \t15.933 \t101.562\t1.72661\t1029.4 \n", + "INFO:__main__:96 \t32 \t6.75143\t4.49962\t1.72661\t27.9376\n", + "96 \t32 \t6.75143\t4.49962\t1.72661\t27.9376\n", + "INFO:__main__:97 \t36 \t383.838\t2645.99\t1.72661\t19000 \n", + "97 \t36 \t383.838\t2645.99\t1.72661\t19000 \n", + "INFO:__main__:98 \t33 \t193.072\t1880.7 \t1.72661\t19000 \n", + "98 \t33 \t193.072\t1880.7 \t1.72661\t19000 \n", + "INFO:__main__:99 \t31 \t3.60925\t4.58644\t1.72661\t32.936 \n", + "99 \t31 \t3.60925\t4.58644\t1.72661\t32.936 \n", + "INFO:__main__:100\t25 \t194.709\t1880.54\t1.72661\t19000 \n", + "100\t25 \t194.709\t1880.54\t1.72661\t19000 \n", + "INFO:__main__:101\t38 \t4.27315\t4.81541\t1.72661\t28.9983\n", + "101\t38 \t4.27315\t4.81541\t1.72661\t28.9983\n", + "INFO:__main__:102\t31 \t6.04346\t5.51657\t1.72661\t30.9692\n", + "102\t31 \t6.04346\t5.51657\t1.72661\t30.9692\n", + "INFO:__main__:103\t32 \t9.23728\t5.38594\t1.68621\t33.9197\n", + "103\t32 \t9.23728\t5.38594\t1.68621\t33.9197\n", + "INFO:__main__:104\t31 \t196.9 \t1880.32\t1.68621\t19000 \n", + "104\t31 \t196.9 \t1880.32\t1.68621\t19000 \n", + "INFO:__main__:105\t35 \t381.399\t2646.34\t1.68621\t19000 \n", + "105\t35 \t381.399\t2646.34\t1.68621\t19000 \n", + "INFO:__main__:106\t34 \t4.54683\t4.87413\t1.68621\t38.0106\n", + "106\t34 \t4.54683\t4.87413\t1.68621\t38.0106\n", + "INFO:__main__:107\t31 \t36.9686\t300.032\t1.68621\t3036.73\n", + "107\t31 \t36.9686\t300.032\t1.68621\t3036.73\n", + "INFO:__main__:108\t32 \t192.825\t1880.73\t1.68621\t19000 \n", + "108\t32 \t192.825\t1880.73\t1.68621\t19000 \n", + "INFO:__main__:109\t40 \t191.481\t1880.86\t1.56626\t19000 \n", + "109\t40 \t191.481\t1880.86\t1.56626\t19000 \n", + "INFO:__main__:110\t27 \t191.184\t1880.88\t1.56626\t19000 \n", + "110\t27 \t191.184\t1880.88\t1.56626\t19000 \n", + "INFO:__main__:111\t28 \t568.159\t3224.91\t1.56626\t19000 \n", + "111\t28 \t568.159\t3224.91\t1.56626\t19000 \n", + "INFO:__main__:112\t29 \t596.941\t3233.76\t1.56626\t19000 \n", + "112\t29 \t596.941\t3233.76\t1.56626\t19000 \n", + "INFO:__main__:113\t28 \t390.116\t2647.07\t1.56626\t19000 \n", + "113\t28 \t390.116\t2647.07\t1.56626\t19000 \n", + "INFO:__main__:114\t34 \t3.70622\t5.42211\t1.56626\t31.9989\n", + "114\t34 \t3.70622\t5.42211\t1.56626\t31.9989\n", + "INFO:__main__:115\t27 \t6.31164\t6.86416\t1.56626\t30.5129\n", + "115\t27 \t6.31164\t6.86416\t1.56626\t30.5129\n", + "INFO:__main__:116\t32 \t195.26 \t1880.48\t1.56626\t19000 \n", + "116\t32 \t195.26 \t1880.48\t1.56626\t19000 \n", + "INFO:__main__:117\t31 \t568.797\t3224.79\t1.56626\t19000 \n", + "117\t31 \t568.797\t3224.79\t1.56626\t19000 \n", + "INFO:__main__:118\t31 \t2.99558\t5.54231\t1.56626\t33.7639\n", + "118\t31 \t2.99558\t5.54231\t1.56626\t33.7639\n", + "INFO:__main__:119\t24 \t191.704\t1880.83\t1.56626\t19000 \n", + "119\t24 \t191.704\t1880.83\t1.56626\t19000 \n", + "INFO:__main__:120\t37 \t221.663\t1901.67\t1.56626\t19000 \n", + "120\t37 \t221.663\t1901.67\t1.56626\t19000 \n", + "INFO:__main__:121\t27 \t378.636\t2646.73\t1.56626\t19000 \n", + "121\t27 \t378.636\t2646.73\t1.56626\t19000 \n", + "INFO:__main__:122\t32 \t378.833\t2646.7 \t1.56626\t19000 \n", + "122\t32 \t378.833\t2646.7 \t1.56626\t19000 \n", + "INFO:__main__:123\t39 \t567.889\t3224.95\t1.56626\t19000 \n", + "123\t39 \t567.889\t3224.95\t1.56626\t19000 \n", + "INFO:__main__:124\t39 \t192.203\t1880.79\t1.56626\t19000 \n", + "124\t39 \t192.203\t1880.79\t1.56626\t19000 \n", + "INFO:__main__:125\t31 \t379.676\t2646.58\t1.56626\t19000 \n", + "125\t31 \t379.676\t2646.58\t1.56626\t19000 \n", + "INFO:__main__:126\t39 \t569.009\t3224.76\t1.55074\t19000 \n", + "126\t39 \t569.009\t3224.76\t1.55074\t19000 \n", + "INFO:__main__:127\t44 \t567.682\t3224.99\t1.55074\t19000 \n", + "127\t44 \t567.682\t3224.99\t1.55074\t19000 \n", + "INFO:__main__:128\t26 \t379.936\t2646.55\t1.55074\t19000 \n", + "128\t26 \t379.936\t2646.55\t1.55074\t19000 \n", + "INFO:__main__:129\t31 \t378.781\t2646.71\t1.55074\t19000 \n", + "129\t31 \t378.781\t2646.71\t1.55074\t19000 \n", + "INFO:__main__:130\t36 \t201.437\t1882.65\t1.55074\t19000 \n", + "130\t36 \t201.437\t1882.65\t1.55074\t19000 \n", + "INFO:__main__:131\t37 \t4.74798\t7.24384\t1.50779\t39.2776\n", + "131\t37 \t4.74798\t7.24384\t1.50779\t39.2776\n", + "INFO:__main__:132\t34 \t4.45703\t4.9062 \t1.50779\t29.582 \n", + "132\t34 \t4.45703\t4.9062 \t1.50779\t29.582 \n", + "INFO:__main__:133\t31 \t5.97246\t5.9442 \t1.50779\t35.8834\n", + "133\t31 \t5.97246\t5.9442 \t1.50779\t35.8834\n", + "INFO:__main__:134\t32 \t194.717\t1880.54\t1.50779\t19000 \n", + "134\t32 \t194.717\t1880.54\t1.50779\t19000 \n", + "INFO:__main__:135\t36 \t380.695\t2646.44\t1.50779\t19000 \n", + "135\t36 \t380.695\t2646.44\t1.50779\t19000 \n", + "INFO:__main__:136\t32 \t379.93 \t2646.55\t1.50779\t19000 \n", + "136\t32 \t379.93 \t2646.55\t1.50779\t19000 \n", + "INFO:__main__:137\t38 \t191.769\t1880.83\t1.50779\t19000 \n", + "137\t38 \t191.769\t1880.83\t1.50779\t19000 \n", + "INFO:__main__:138\t32 \t3.45599\t6.91112\t1.50779\t43.379 \n", + "138\t32 \t3.45599\t6.91112\t1.50779\t43.379 \n", + "INFO:__main__:139\t30 \t192.018\t1880.8 \t1.50779\t19000 \n", + "139\t30 \t192.018\t1880.8 \t1.50779\t19000 \n", + "INFO:__main__:140\t28 \t221.493\t1901.49\t1.50779\t19000 \n", + "140\t28 \t221.493\t1901.49\t1.50779\t19000 \n", + "INFO:__main__:141\t42 \t379.591\t2646.6 \t1.50779\t19000 \n", + "141\t42 \t379.591\t2646.6 \t1.50779\t19000 \n", + "INFO:__main__:142\t37 \t380.967\t2646.4 \t1.50779\t19000 \n", + "142\t37 \t380.967\t2646.4 \t1.50779\t19000 \n", + "INFO:__main__:143\t37 \t2.36003\t2.01325\t1.50779\t12.5181\n", + "143\t37 \t2.36003\t2.01325\t1.50779\t12.5181\n", + "INFO:__main__:144\t33 \t192.73 \t1880.73\t1.50779\t19000 \n", + "144\t33 \t192.73 \t1880.73\t1.50779\t19000 \n", + "INFO:__main__:145\t30 \t191.703\t1880.84\t1.50779\t19000 \n", + "145\t30 \t191.703\t1880.84\t1.50779\t19000 \n", + "INFO:__main__:146\t36 \t192.044\t1880.81\t1.50779\t19000 \n", + "146\t36 \t192.044\t1880.81\t1.50779\t19000 \n", + "INFO:__main__:147\t37 \t568.127\t3224.91\t1.50779\t19000 \n", + "147\t37 \t568.127\t3224.91\t1.50779\t19000 \n", + "INFO:__main__:148\t38 \t191.328\t1880.88\t1.50779\t19000 \n", + "148\t38 \t191.328\t1880.88\t1.50779\t19000 \n", + "INFO:__main__:149\t29 \t191.484\t1880.85\t1.50779\t19000 \n", + "149\t29 \t191.484\t1880.85\t1.50779\t19000 \n", + "INFO:__main__:150\t36 \t191.155\t1880.89\t1.50779\t19000 \n", + "150\t36 \t191.155\t1880.89\t1.50779\t19000 \n", + "INFO:__main__:151\t37 \t379.127\t2646.66\t1.50779\t19000 \n", + "151\t37 \t379.127\t2646.66\t1.50779\t19000 \n", + "INFO:__main__:152\t33 \t3.20972\t4.59496\t1.50779\t30.3355\n", + "152\t33 \t3.20972\t4.59496\t1.50779\t30.3355\n", + "INFO:__main__:153\t29 \t196.533\t1880.37\t1.50779\t19000 \n", + "153\t29 \t196.533\t1880.37\t1.50779\t19000 \n", + "INFO:__main__:154\t28 \t379.666\t2646.58\t1.50779\t19000 \n", + "154\t28 \t379.666\t2646.58\t1.50779\t19000 \n", + "INFO:__main__:155\t35 \t191.856\t1880.83\t1.50779\t19000 \n", + "155\t35 \t191.856\t1880.83\t1.50779\t19000 \n", + "INFO:__main__:156\t38 \t191.826\t1880.82\t1.50779\t19000 \n", + "156\t38 \t191.826\t1880.82\t1.50779\t19000 \n", + "INFO:__main__:157\t37 \t190.867\t1880.92\t1.50779\t19000 \n", + "157\t37 \t190.867\t1880.92\t1.50779\t19000 \n", + "INFO:__main__:158\t32 \t191.128\t1880.89\t1.50779\t19000 \n", + "158\t32 \t191.128\t1880.89\t1.50779\t19000 \n", + "INFO:__main__:159\t32 \t4.93149\t7.58699\t1.50779\t40.013 \n", + "159\t32 \t4.93149\t7.58699\t1.50779\t40.013 \n", + "INFO:__main__:160\t32 \t195.573\t1880.45\t1.50779\t19000 \n", + "160\t32 \t195.573\t1880.45\t1.50779\t19000 \n", + "INFO:__main__:161\t29 \t193.313\t1880.68\t1.50779\t19000 \n", + "161\t29 \t193.313\t1880.68\t1.50779\t19000 \n", + "INFO:__main__:162\t39 \t5.51052\t7.74086\t1.50779\t33.697 \n", + "162\t39 \t5.51052\t7.74086\t1.50779\t33.697 \n", + "INFO:__main__:163\t34 \t571.016\t3224.41\t1.50779\t19000 \n", + "163\t34 \t571.016\t3224.41\t1.50779\t19000 \n", + "INFO:__main__:164\t40 \t192.444\t1880.76\t1.50779\t19000 \n", + "164\t40 \t192.444\t1880.76\t1.50779\t19000 \n", + "INFO:__main__:165\t46 \t193.033\t1880.71\t1.50779\t19000 \n", + "165\t46 \t193.033\t1880.71\t1.50779\t19000 \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:166\t34 \t3.75564\t6.35912\t1.50779\t39.7429\n", + "166\t34 \t3.75564\t6.35912\t1.50779\t39.7429\n", + "INFO:__main__:167\t35 \t193.811\t1880.63\t1.50779\t19000 \n", + "167\t35 \t193.811\t1880.63\t1.50779\t19000 \n", + "INFO:__main__:168\t39 \t221.865\t1901.49\t1.50779\t19000 \n", + "168\t39 \t221.865\t1901.49\t1.50779\t19000 \n", + "INFO:__main__:169\t36 \t567.804\t3224.97\t1.50779\t19000 \n", + "169\t36 \t567.804\t3224.97\t1.50779\t19000 \n", + "INFO:__main__:170\t35 \t567.305\t3225.05\t1.50779\t19000 \n", + "170\t35 \t567.305\t3225.05\t1.50779\t19000 \n", + "INFO:__main__:171\t36 \t192.878\t1880.72\t1.50779\t19000 \n", + "171\t36 \t192.878\t1880.72\t1.50779\t19000 \n", + "INFO:__main__:172\t31 \t82.4174\t560.047\t1.50779\t4024.48\n", + "172\t31 \t82.4174\t560.047\t1.50779\t4024.48\n", + "INFO:__main__:173\t25 \t4.60657\t3.69739\t1.50779\t23.3729\n", + "173\t25 \t4.60657\t3.69739\t1.50779\t23.3729\n", + "INFO:__main__:174\t32 \t67.9702\t419.817\t1.50779\t3024.11\n", + "174\t32 \t67.9702\t419.817\t1.50779\t3024.11\n", + "INFO:__main__:175\t29 \t194.019\t1880.6 \t1.50779\t19000 \n", + "175\t29 \t194.019\t1880.6 \t1.50779\t19000 \n", + "INFO:__main__:176\t30 \t192.728\t1880.73\t1.50779\t19000 \n", + "176\t30 \t192.728\t1880.73\t1.50779\t19000 \n", + "INFO:__main__:177\t34 \t232.473\t1918.62\t1.50779\t19000 \n", + "177\t34 \t232.473\t1918.62\t1.50779\t19000 \n", + "INFO:__main__:178\t34 \t379.071\t2646.67\t1.50779\t19000 \n", + "178\t34 \t379.071\t2646.67\t1.50779\t19000 \n", + "INFO:__main__:179\t40 \t578.337\t3224.73\t1.50779\t19000 \n", + "179\t40 \t578.337\t3224.73\t1.50779\t19000 \n", + "INFO:__main__:180\t25 \t3.94436\t5.91992\t1.50779\t36.8783\n", + "180\t25 \t3.94436\t5.91992\t1.50779\t36.8783\n", + "INFO:__main__:181\t30 \t383.086\t2646.1 \t1.50779\t19000 \n", + "181\t30 \t383.086\t2646.1 \t1.50779\t19000 \n", + "INFO:__main__:182\t31 \t2.72234\t3.16068\t1.50779\t22.8325\n", + "182\t31 \t2.72234\t3.16068\t1.50779\t22.8325\n", + "INFO:__main__:183\t34 \t235.328\t1918.08\t1.50779\t19000 \n", + "183\t34 \t235.328\t1918.08\t1.50779\t19000 \n", + "INFO:__main__:184\t36 \t191.947\t1880.81\t1.50779\t19000 \n", + "184\t36 \t191.947\t1880.81\t1.50779\t19000 \n", + "INFO:__main__:185\t40 \t3.44722\t3.27554\t1.50779\t19.3701\n", + "185\t40 \t3.44722\t3.27554\t1.50779\t19.3701\n", + "INFO:__main__:186\t29 \t6.55225\t5.45182\t1.37485\t35.5492\n", + "186\t29 \t6.55225\t5.45182\t1.37485\t35.5492\n", + "INFO:__main__:187\t36 \t277.564\t2032.91\t1.37485\t19000 \n", + "187\t36 \t277.564\t2032.91\t1.37485\t19000 \n", + "INFO:__main__:188\t36 \t571.662\t3224.3 \t1.37485\t19000 \n", + "188\t36 \t571.662\t3224.3 \t1.37485\t19000 \n", + "INFO:__main__:189\t29 \t4.01621\t5.70514\t1.37485\t27.102 \n", + "189\t29 \t4.01621\t5.70514\t1.37485\t27.102 \n", + "INFO:__main__:190\t33 \t570.162\t3224.55\t1.37485\t19000 \n", + "190\t33 \t570.162\t3224.55\t1.37485\t19000 \n", + "INFO:__main__:191\t38 \t4.54542\t6.75639\t1.37485\t34.9347\n", + "191\t38 \t4.54542\t6.75639\t1.37485\t34.9347\n", + "INFO:__main__:192\t35 \t194.948\t1880.52\t1.37485\t19000 \n", + "192\t35 \t194.948\t1880.52\t1.37485\t19000 \n", + "INFO:__main__:193\t30 \t944.389\t4120.61\t1.37485\t19000 \n", + "193\t30 \t944.389\t4120.61\t1.37485\t19000 \n", + "INFO:__main__:194\t29 \t566.407\t3225.21\t1.37485\t19000 \n", + "194\t29 \t566.407\t3225.21\t1.37485\t19000 \n", + "INFO:__main__:195\t30 \t191.587\t1880.85\t1.37485\t19000 \n", + "195\t30 \t191.587\t1880.85\t1.37485\t19000 \n", + "INFO:__main__:196\t26 \t192.379\t1880.77\t1.37485\t19000 \n", + "196\t26 \t192.379\t1880.77\t1.37485\t19000 \n", + "INFO:__main__:197\t34 \t409.134\t2659.32\t1.37485\t19000 \n", + "197\t34 \t409.134\t2659.32\t1.37485\t19000 \n", + "INFO:__main__:198\t32 \t567.255\t3225.06\t1.37485\t19000 \n", + "198\t32 \t567.255\t3225.06\t1.37485\t19000 \n", + "INFO:__main__:199\t37 \t4.17055\t6.92122\t1.37485\t33.0583\n", + "199\t37 \t4.17055\t6.92122\t1.37485\t33.0583\n", + "INFO:__main__:200\t23 \t4.43211\t4.96431\t1.37485\t41.4036\n", + "200\t23 \t4.43211\t4.96431\t1.37485\t41.4036\n", + "INFO:__main__:201\t32 \t4.25799\t5.3007 \t1.37485\t36.4451\n", + "201\t32 \t4.25799\t5.3007 \t1.37485\t36.4451\n", + "INFO:__main__:202\t33 \t572.663\t3224.12\t1.37485\t19000 \n", + "202\t33 \t572.663\t3224.12\t1.37485\t19000 \n", + "INFO:__main__:203\t38 \t193.784\t1880.63\t1.37485\t19000 \n", + "203\t38 \t193.784\t1880.63\t1.37485\t19000 \n", + "INFO:__main__:204\t28 \t379.809\t2646.56\t1.37485\t19000 \n", + "204\t28 \t379.809\t2646.56\t1.37485\t19000 \n", + "INFO:__main__:205\t27 \t2.39786\t4.33316\t1.37485\t30.9178\n", + "205\t27 \t2.39786\t4.33316\t1.37485\t30.9178\n", + "INFO:__main__:206\t25 \t3.09766\t3.73429\t1.37485\t27.3509\n", + "206\t25 \t3.09766\t3.73429\t1.37485\t27.3509\n", + "INFO:__main__:207\t40 \t5.86895\t6.90564\t1.37485\t33.9289\n", + "207\t40 \t5.86895\t6.90564\t1.37485\t33.9289\n", + "INFO:__main__:208\t30 \t383.1 \t2646.1 \t1.37485\t19000 \n", + "208\t30 \t383.1 \t2646.1 \t1.37485\t19000 \n", + "INFO:__main__:209\t30 \t379.827\t2646.56\t1.37485\t19000 \n", + "209\t30 \t379.827\t2646.56\t1.37485\t19000 \n", + "INFO:__main__:210\t35 \t201.079\t1882.66\t1.37485\t19000 \n", + "210\t35 \t201.079\t1882.66\t1.37485\t19000 \n", + "INFO:__main__:211\t32 \t4.83254\t7.23284\t1.37485\t34.1827\n", + "211\t32 \t4.83254\t7.23284\t1.37485\t34.1827\n", + "INFO:__main__:212\t27 \t8.05307\t8.78935\t1.37485\t42.242 \n", + "212\t27 \t8.05307\t8.78935\t1.37485\t42.242 \n", + "INFO:__main__:213\t33 \t197.64 \t1880.25\t1.37485\t19000 \n", + "213\t33 \t197.64 \t1880.25\t1.37485\t19000 \n", + "INFO:__main__:214\t38 \t16.9567\t101.63 \t1.37485\t1031.78\n", + "214\t38 \t16.9567\t101.63 \t1.37485\t1031.78\n", + "INFO:__main__:215\t28 \t19.7516\t102.077\t1.37485\t1038.54\n", + "215\t28 \t19.7516\t102.077\t1.37485\t1038.54\n", + "INFO:__main__:216\t23 \t384.416\t2645.91\t1.37485\t19000 \n", + "216\t23 \t384.416\t2645.91\t1.37485\t19000 \n", + "INFO:__main__:217\t27 \t382.571\t2646.17\t1.37485\t19000 \n", + "217\t27 \t382.571\t2646.17\t1.37485\t19000 \n", + "INFO:__main__:218\t33 \t192.243\t1880.78\t1.37485\t19000 \n", + "218\t33 \t192.243\t1880.78\t1.37485\t19000 \n", + "INFO:__main__:219\t35 \t2.54 \t5.59678\t1.37485\t39.1172\n", + "219\t35 \t2.54 \t5.59678\t1.37485\t39.1172\n", + "INFO:__main__:220\t29 \t2.24014\t4.33531\t1.37485\t33.6826\n", + "220\t29 \t2.24014\t4.33531\t1.37485\t33.6826\n", + "INFO:__main__:221\t37 \t192.355\t1880.77\t1.37485\t19000 \n", + "221\t37 \t192.355\t1880.77\t1.37485\t19000 \n", + "INFO:__main__:222\t31 \t379.239\t2646.65\t1.37485\t19000 \n", + "222\t31 \t379.239\t2646.65\t1.37485\t19000 \n", + "INFO:__main__:223\t28 \t192.097\t1880.8 \t1.37485\t19000 \n", + "223\t28 \t192.097\t1880.8 \t1.37485\t19000 \n", + "INFO:__main__:224\t25 \t4.28061\t5.54821\t1.37485\t31.059 \n", + "224\t25 \t4.28061\t5.54821\t1.37485\t31.059 \n", + "INFO:__main__:225\t40 \t196.788\t1880.33\t1.37485\t19000 \n", + "225\t40 \t196.788\t1880.33\t1.37485\t19000 \n", + "INFO:__main__:226\t28 \t5.39078\t5.75681\t1.37485\t36.4561\n", + "226\t28 \t5.39078\t5.75681\t1.37485\t36.4561\n", + "INFO:__main__:227\t36 \t570.744\t3224.45\t1.37485\t19000 \n", + "227\t36 \t570.744\t3224.45\t1.37485\t19000 \n", + "INFO:__main__:228\t32 \t2.31308\t2.9898 \t1.37485\t26.415 \n", + "228\t32 \t2.31308\t2.9898 \t1.37485\t26.415 \n", + "INFO:__main__:229\t40 \t193.416\t1880.67\t1.37485\t19000 \n", + "229\t40 \t193.416\t1880.67\t1.37485\t19000 \n", + "INFO:__main__:230\t30 \t379.09 \t2646.66\t1.37485\t19000 \n", + "230\t30 \t379.09 \t2646.66\t1.37485\t19000 \n", + "INFO:__main__:231\t33 \t12.457 \t102.019\t1.37485\t1031.57\n", + "231\t33 \t12.457 \t102.019\t1.37485\t1031.57\n", + "INFO:__main__:232\t29 \t3.51841\t5.89698\t1.37485\t31.3845\n", + "232\t29 \t3.51841\t5.89698\t1.37485\t31.3845\n", + "INFO:__main__:233\t35 \t758.266\t3704.34\t1.37485\t19000 \n", + "233\t35 \t758.266\t3704.34\t1.37485\t19000 \n", + "INFO:__main__:234\t33 \t568.524\t3224.84\t1.37485\t19000 \n", + "234\t33 \t568.524\t3224.84\t1.37485\t19000 \n", + "INFO:__main__:235\t32 \t378.454\t2646.75\t1.37485\t19000 \n", + "235\t32 \t378.454\t2646.75\t1.37485\t19000 \n", + "INFO:__main__:236\t34 \t2.70277\t3.46394\t1.37485\t19.0919\n", + "236\t34 \t2.70277\t3.46394\t1.37485\t19.0919\n", + "INFO:__main__:237\t38 \t946.69 \t4120.09\t1.37485\t19000 \n", + "237\t38 \t946.69 \t4120.09\t1.37485\t19000 \n", + "INFO:__main__:238\t36 \t193.032\t1880.71\t1.37485\t19000 \n", + "238\t36 \t193.032\t1880.71\t1.37485\t19000 \n", + "INFO:__main__:239\t32 \t42.3368\t397.464\t1.37485\t4016.54\n", + "239\t32 \t42.3368\t397.464\t1.37485\t4016.54\n", + "INFO:__main__:240\t26 \t4.90128\t8.19539\t1.37485\t40.2414\n", + "240\t26 \t4.90128\t8.19539\t1.37485\t40.2414\n", + "INFO:__main__:241\t42 \t198.341\t1880.19\t1.37485\t19000 \n", + "241\t42 \t198.341\t1880.19\t1.37485\t19000 \n", + "INFO:__main__:242\t28 \t3.91902\t5.87351\t1.35859\t30.4619\n", + "242\t28 \t3.91902\t5.87351\t1.35859\t30.4619\n", + "INFO:__main__:243\t35 \t7.92393\t7.879 \t1.35859\t35.7487\n", + "243\t35 \t7.92393\t7.879 \t1.35859\t35.7487\n", + "INFO:__main__:244\t35 \t11.6934\t7.90023\t1.35859\t41.6816\n", + "244\t35 \t11.6934\t7.90023\t1.35859\t41.6816\n", + "INFO:__main__:245\t21 \t195.244\t1880.48\t1.35859\t19000 \n", + "245\t21 \t195.244\t1880.48\t1.35859\t19000 \n", + "INFO:__main__:246\t37 \t193.305\t1880.68\t1.35859\t19000 \n", + "246\t37 \t193.305\t1880.68\t1.35859\t19000 \n", + "INFO:__main__:247\t25 \t191.935\t1880.82\t1.35859\t19000 \n", + "247\t25 \t191.935\t1880.82\t1.35859\t19000 \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:248\t36 \t577.421\t3224.91\t1.35859\t19000 \n", + "248\t36 \t577.421\t3224.91\t1.35859\t19000 \n", + "INFO:__main__:249\t28 \t190.604\t1880.94\t1.35859\t19000 \n", + "249\t28 \t190.604\t1880.94\t1.35859\t19000 \n", + "INFO:__main__:250\t37 \t232.365\t1918.51\t1.35859\t19000 \n", + "250\t37 \t232.365\t1918.51\t1.35859\t19000 \n", + "INFO:__main__:251\t26 \t2.17773\t3.16395\t1.35859\t25.4461\n", + "251\t26 \t2.17773\t3.16395\t1.35859\t25.4461\n", + "INFO:__main__:252\t37 \t223.733\t1901.32\t1.35859\t19000 \n", + "252\t37 \t223.733\t1901.32\t1.35859\t19000 \n", + "INFO:__main__:253\t27 \t566.925\t3225.12\t1.35859\t19000 \n", + "253\t27 \t566.925\t3225.12\t1.35859\t19000 \n", + "INFO:__main__:254\t28 \t190.335\t1880.97\t1.35859\t19000 \n", + "254\t28 \t190.335\t1880.97\t1.35859\t19000 \n", + "INFO:__main__:255\t33 \t380.351\t2646.49\t1.35859\t19000 \n", + "255\t33 \t380.351\t2646.49\t1.35859\t19000 \n", + "INFO:__main__:256\t37 \t192.252\t1880.79\t1.35859\t19000 \n", + "256\t37 \t192.252\t1880.79\t1.35859\t19000 \n", + "INFO:__main__:257\t28 \t3.24569\t5.49768\t1.35859\t41.6883\n", + "257\t28 \t3.24569\t5.49768\t1.35859\t41.6883\n", + "INFO:__main__:258\t29 \t192.653\t1880.75\t1.35859\t19000 \n", + "258\t29 \t192.653\t1880.75\t1.35859\t19000 \n", + "INFO:__main__:259\t30 \t191.099\t1880.9 \t1.35859\t19000 \n", + "259\t30 \t191.099\t1880.9 \t1.35859\t19000 \n", + "INFO:__main__:260\t33 \t190.145\t1880.99\t1.35859\t19000 \n", + "260\t33 \t190.145\t1880.99\t1.35859\t19000 \n", + "INFO:__main__:261\t34 \t3.15486\t4.78813\t1.35859\t31.2722\n", + "261\t34 \t3.15486\t4.78813\t1.35859\t31.2722\n", + "INFO:__main__:262\t34 \t391.292\t2646.89\t1.35859\t19000 \n", + "262\t34 \t391.292\t2646.89\t1.35859\t19000 \n", + "INFO:__main__:263\t29 \t190.784\t1880.93\t1.35859\t19000 \n", + "263\t29 \t190.784\t1880.93\t1.35859\t19000 \n", + "INFO:__main__:264\t36 \t192.574\t1880.76\t1.35859\t19000 \n", + "264\t36 \t192.574\t1880.76\t1.35859\t19000 \n", + "INFO:__main__:265\t28 \t190.941\t1880.92\t1.35859\t19000 \n", + "265\t28 \t190.941\t1880.92\t1.35859\t19000 \n", + "INFO:__main__:266\t37 \t191.68 \t1880.84\t1.35859\t19000 \n", + "266\t37 \t191.68 \t1880.84\t1.35859\t19000 \n", + "INFO:__main__:267\t29 \t3.23033\t6.68062\t1.35859\t40.1223\n", + "267\t29 \t3.23033\t6.68062\t1.35859\t40.1223\n", + "INFO:__main__:268\t31 \t192.984\t1880.72\t1.35859\t19000 \n", + "268\t31 \t192.984\t1880.72\t1.35859\t19000 \n", + "INFO:__main__:269\t36 \t378.627\t2646.73\t1.35859\t19000 \n", + "269\t36 \t378.627\t2646.73\t1.35859\t19000 \n", + "INFO:__main__:270\t35 \t191.627\t1880.85\t1.35859\t19000 \n", + "270\t35 \t191.627\t1880.85\t1.35859\t19000 \n", + "INFO:__main__:271\t29 \t378.643\t2646.73\t1.35859\t19000 \n", + "271\t29 \t378.643\t2646.73\t1.35859\t19000 \n", + "INFO:__main__:272\t30 \t201.167\t1882.66\t1.35859\t19000 \n", + "272\t30 \t201.167\t1882.66\t1.35859\t19000 \n", + "INFO:__main__:273\t34 \t191.076\t1880.9 \t1.35859\t19000 \n", + "273\t34 \t191.076\t1880.9 \t1.35859\t19000 \n", + "INFO:__main__:274\t40 \t3.34038\t5.15685\t1.35859\t28.6745\n", + "274\t40 \t3.34038\t5.15685\t1.35859\t28.6745\n", + "INFO:__main__:275\t26 \t5.80349\t6.44141\t1.35859\t30.2437\n", + "275\t26 \t5.80349\t6.44141\t1.35859\t30.2437\n", + "INFO:__main__:276\t27 \t381.886\t2646.27\t1.35859\t19000 \n", + "276\t27 \t381.886\t2646.27\t1.35859\t19000 \n", + "INFO:__main__:277\t33 \t3.60008\t5.85274\t1.35859\t41.1695\n", + "277\t33 \t3.60008\t5.85274\t1.35859\t41.1695\n", + "INFO:__main__:278\t32 \t193.418\t1880.67\t1.35859\t19000 \n", + "278\t32 \t193.418\t1880.67\t1.35859\t19000 \n", + "INFO:__main__:279\t39 \t379.467\t2646.61\t1.35859\t19000 \n", + "279\t39 \t379.467\t2646.61\t1.35859\t19000 \n", + "INFO:__main__:280\t33 \t190.845\t1880.92\t1.35859\t19000 \n", + "280\t33 \t190.845\t1880.92\t1.35859\t19000 \n", + "INFO:__main__:281\t29 \t380.653\t2646.45\t1.35859\t19000 \n", + "281\t29 \t380.653\t2646.45\t1.35859\t19000 \n", + "INFO:__main__:282\t31 \t231.586\t1918.48\t1.35859\t19000 \n", + "282\t31 \t231.586\t1918.48\t1.35859\t19000 \n", + "INFO:__main__:283\t35 \t378.978\t2646.68\t1.35859\t19000 \n", + "283\t35 \t378.978\t2646.68\t1.35859\t19000 \n", + "INFO:__main__:284\t35 \t378.693\t2646.72\t1.35859\t19000 \n", + "284\t35 \t378.693\t2646.72\t1.35859\t19000 \n", + "INFO:__main__:285\t19 \t190.804\t1880.92\t1.03836\t19000 \n", + "285\t19 \t190.804\t1880.92\t1.03836\t19000 \n", + "INFO:__main__:286\t43 \t5.38857\t8.19787\t1.03836\t40.0713\n", + "286\t43 \t5.38857\t8.19787\t1.03836\t40.0713\n", + "INFO:__main__:287\t29 \t195.326\t1880.48\t1.03836\t19000 \n", + "287\t29 \t195.326\t1880.48\t1.03836\t19000 \n", + "INFO:__main__:288\t28 \t4.63499\t6.8954 \t1.03836\t31.2666\n", + "288\t28 \t4.63499\t6.8954 \t1.03836\t31.2666\n", + "INFO:__main__:289\t31 \t193.705\t1880.64\t1.03836\t19000 \n", + "289\t31 \t193.705\t1880.64\t1.03836\t19000 \n", + "INFO:__main__:290\t32 \t5.04453\t7.40035\t1.03836\t31.3269\n", + "290\t32 \t5.04453\t7.40035\t1.03836\t31.3269\n", + "INFO:__main__:291\t20 \t194.633\t1880.55\t1.03836\t19000 \n", + "291\t20 \t194.633\t1880.55\t1.03836\t19000 \n", + "INFO:__main__:292\t28 \t3.86975\t6.59075\t1.03836\t30.954 \n", + "292\t28 \t3.86975\t6.59075\t1.03836\t30.954 \n", + "INFO:__main__:293\t30 \t756.712\t3704.66\t1.03836\t19000 \n", + "293\t30 \t756.712\t3704.66\t1.03836\t19000 \n", + "INFO:__main__:294\t33 \t381.2 \t2646.37\t1.03836\t19000 \n", + "294\t33 \t381.2 \t2646.37\t1.03836\t19000 \n", + "INFO:__main__:295\t34 \t191.204\t1880.89\t1.03836\t19000 \n", + "295\t34 \t191.204\t1880.89\t1.03836\t19000 \n", + "INFO:__main__:296\t29 \t3.03369\t6.38506\t1.03836\t41.0489\n", + "296\t29 \t3.03369\t6.38506\t1.03836\t41.0489\n", + "INFO:__main__:297\t27 \t420.344\t2670.55\t1.03836\t19000 \n", + "297\t27 \t420.344\t2670.55\t1.03836\t19000 \n", + "INFO:__main__:298\t36 \t378.896\t2646.69\t1.03836\t19000 \n", + "298\t36 \t378.896\t2646.69\t1.03836\t19000 \n", + "INFO:__main__:299\t30 \t379.06 \t2646.67\t1.03836\t19000 \n", + "299\t30 \t379.06 \t2646.67\t1.03836\t19000 \n", + "INFO:__main__:300\t25 \t378.009\t2646.82\t1.03836\t19000 \n", + "300\t25 \t378.009\t2646.82\t1.03836\t19000 \n", + "INFO:__main__:301\t25 \t1.67497\t4.03974\t1.03836\t32.8184\n", + "301\t25 \t1.67497\t4.03974\t1.03836\t32.8184\n", + "INFO:__main__:302\t30 \t190.826\t1880.93\t1.03836\t19000 \n", + "302\t30 \t190.826\t1880.93\t1.03836\t19000 \n", + "INFO:__main__:303\t40 \t378.801\t2646.71\t1.03836\t19000 \n", + "303\t40 \t378.801\t2646.71\t1.03836\t19000 \n", + "INFO:__main__:304\t33 \t190.337\t1880.97\t1.03836\t19000 \n", + "304\t33 \t190.337\t1880.97\t1.03836\t19000 \n", + "INFO:__main__:305\t36 \t1.85887\t3.74699\t1.03836\t25.2025\n", + "305\t36 \t1.85887\t3.74699\t1.03836\t25.2025\n", + "INFO:__main__:306\t34 \t3.35651\t6.27241\t1.03836\t33.3791\n", + "306\t34 \t3.35651\t6.27241\t1.03836\t33.3791\n", + "INFO:__main__:307\t35 \t384.29 \t2645.93\t1.03836\t19000 \n", + "307\t35 \t384.29 \t2645.93\t1.03836\t19000 \n", + "INFO:__main__:308\t36 \t377.987\t2646.82\t1.03836\t19000 \n", + "308\t36 \t377.987\t2646.82\t1.03836\t19000 \n", + "INFO:__main__:309\t31 \t379.093\t2646.67\t1.03836\t19000 \n", + "309\t31 \t379.093\t2646.67\t1.03836\t19000 \n", + "INFO:__main__:310\t29 \t191.048\t1880.9 \t1.03836\t19000 \n", + "310\t29 \t191.048\t1880.9 \t1.03836\t19000 \n", + "INFO:__main__:311\t27 \t2.47585\t4.97756\t1.03836\t32.4089\n", + "311\t27 \t2.47585\t4.97756\t1.03836\t32.4089\n", + "INFO:__main__:312\t34 \t191.998\t1880.81\t1.03836\t19000 \n", + "312\t34 \t191.998\t1880.81\t1.03836\t19000 \n", + "INFO:__main__:313\t26 \t190.979\t1880.91\t1.03836\t19000 \n", + "313\t26 \t190.979\t1880.91\t1.03836\t19000 \n", + "INFO:__main__:314\t35 \t189.928\t1881.01\t1.03836\t19000 \n", + "314\t35 \t189.928\t1881.01\t1.03836\t19000 \n", + "INFO:__main__:315\t34 \t3.75026\t6.91529\t1.03836\t42.2383\n", + "315\t34 \t3.75026\t6.91529\t1.03836\t42.2383\n", + "INFO:__main__:316\t37 \t381.784\t2646.29\t1.03836\t19000 \n", + "316\t37 \t381.784\t2646.29\t1.03836\t19000 \n", + "INFO:__main__:317\t36 \t419.813\t2670.79\t1.03836\t19000 \n", + "317\t36 \t419.813\t2670.79\t1.03836\t19000 \n", + "INFO:__main__:318\t32 \t2.88371\t5.78554\t1.03836\t30.1001\n", + "318\t32 \t2.88371\t5.78554\t1.03836\t30.1001\n", + "INFO:__main__:319\t34 \t7.6443 \t9.21774\t1.03836\t33.5936\n", + "319\t34 \t7.6443 \t9.21774\t1.03836\t33.5936\n", + "INFO:__main__:320\t32 \t196.491\t1880.37\t1.03836\t19000 \n", + "320\t32 \t196.491\t1880.37\t1.03836\t19000 \n", + "INFO:__main__:321\t31 \t379.215\t2646.65\t1.03836\t19000 \n", + "321\t31 \t379.215\t2646.65\t1.03836\t19000 \n", + "INFO:__main__:322\t29 \t2.44638\t4.11545\t1.03836\t28.2097\n", + "322\t29 \t2.44638\t4.11545\t1.03836\t28.2097\n", + "INFO:__main__:323\t28 \t382.145\t2646.24\t1.03836\t19000 \n", + "323\t28 \t382.145\t2646.24\t1.03836\t19000 \n", + "INFO:__main__:324\t36 \t567.654\t3224.99\t1.03836\t19000 \n", + "324\t36 \t567.654\t3224.99\t1.03836\t19000 \n", + "INFO:__main__:325\t33 \t2.702 \t5.68917\t1.03836\t37.5238\n", + "325\t33 \t2.702 \t5.68917\t1.03836\t37.5238\n", + "INFO:__main__:326\t19 \t3.49056\t5.91939\t1.03836\t37.6413\n", + "326\t19 \t3.49056\t5.91939\t1.03836\t37.6413\n", + "INFO:__main__:327\t35 \t567.973\t3224.94\t1.03836\t19000 \n", + "327\t35 \t567.973\t3224.94\t1.03836\t19000 \n", + "INFO:__main__:328\t32 \t3.92183\t6.33617\t1.03836\t41.0642\n", + "328\t32 \t3.92183\t6.33617\t1.03836\t41.0642\n", + "INFO:__main__:329\t31 \t598.099\t3233.55\t1.02998\t19000 \n", + "329\t31 \t598.099\t3233.55\t1.02998\t19000 \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:330\t33 \t190.66 \t1880.94\t1.02998\t19000 \n", + "330\t33 \t190.66 \t1880.94\t1.02998\t19000 \n", + "INFO:__main__:331\t35 \t378.763\t2646.71\t1.02998\t19000 \n", + "331\t35 \t378.763\t2646.71\t1.02998\t19000 \n", + "INFO:__main__:332\t33 \t420.104\t2670.81\t1.02998\t19000 \n", + "332\t33 \t420.104\t2670.81\t1.02998\t19000 \n", + "INFO:__main__:333\t41 \t378.752\t2646.71\t1.02998\t19000 \n", + "333\t41 \t378.752\t2646.71\t1.02998\t19000 \n", + "INFO:__main__:334\t43 \t379.813\t2646.57\t1.02998\t19000 \n", + "334\t43 \t379.813\t2646.57\t1.02998\t19000 \n", + "INFO:__main__:335\t30 \t191.314\t1880.88\t1.02998\t19000 \n", + "335\t30 \t191.314\t1880.88\t1.02998\t19000 \n", + "INFO:__main__:336\t34 \t3.59693\t8.0299 \t1.02998\t43.0495\n", + "336\t34 \t3.59693\t8.0299 \t1.02998\t43.0495\n", + "INFO:__main__:337\t31 \t569.153\t3224.74\t1.02998\t19000 \n", + "337\t31 \t569.153\t3224.74\t1.02998\t19000 \n", + "INFO:__main__:338\t25 \t220.41 \t1901.83\t1.02998\t19000 \n", + "338\t25 \t220.41 \t1901.83\t1.02998\t19000 \n", + "INFO:__main__:339\t32 \t2.88984\t5.96804\t1.02998\t30.6345\n", + "339\t32 \t2.88984\t5.96804\t1.02998\t30.6345\n", + "INFO:__main__:340\t29 \t191.584\t1880.85\t0.802203\t19000 \n", + "340\t29 \t191.584\t1880.85\t0.802203\t19000 \n", + "INFO:__main__:341\t40 \t379.156\t2646.66\t0.802203\t19000 \n", + "341\t40 \t379.156\t2646.66\t0.802203\t19000 \n", + "INFO:__main__:342\t36 \t229.944\t1918.92\t0.802203\t19000 \n", + "342\t36 \t229.944\t1918.92\t0.802203\t19000 \n", + "INFO:__main__:343\t33 \t191.318\t1880.88\t0.802203\t19000 \n", + "343\t33 \t191.318\t1880.88\t0.802203\t19000 \n", + "INFO:__main__:344\t32 \t378.768\t2646.72\t0.802203\t19000 \n", + "344\t32 \t378.768\t2646.72\t0.802203\t19000 \n", + "INFO:__main__:345\t40 \t387.593\t2647.42\t0.802203\t19000 \n", + "345\t40 \t387.593\t2647.42\t0.802203\t19000 \n", + "INFO:__main__:346\t33 \t191.318\t1880.88\t0.802203\t19000 \n", + "346\t33 \t191.318\t1880.88\t0.802203\t19000 \n", + "INFO:__main__:347\t29 \t220.24 \t1901.8 \t0.802203\t19000 \n", + "347\t29 \t220.24 \t1901.8 \t0.802203\t19000 \n", + "INFO:__main__:348\t33 \t2.11866\t5.70421\t0.802203\t36.2914\n", + "348\t33 \t2.11866\t5.70421\t0.802203\t36.2914\n", + "INFO:__main__:349\t35 \t379.775\t2646.58\t0.802203\t19000 \n", + "349\t35 \t379.775\t2646.58\t0.802203\t19000 \n", + "INFO:__main__:350\t38 \t378.707\t2646.72\t0.802203\t19000 \n", + "350\t38 \t378.707\t2646.72\t0.802203\t19000 \n", + "INFO:__main__:Run stopped because of stopping criteria: Max ngen\n", + "Run stopped because of stopping criteria: Max ngen\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "efel_filter_iterable = [\n", + " \"ISI_log_slope\",\n", + " \"mean_frequency\",\n", + " \"adaptation_index2\",\n", + " \"first_isi\",\n", + " \"ISI_CV\",\n", + " \"median_isi\",\n", + " \"Spikecount\",\n", + " \"all_ISI_values\",\n", + " \"ISI_values\",\n", + " \"time_to_first_spike\",\n", + " \"time_to_last_spike\",\n", + " \"time_to_second_spike\",\n", + " ]\n", + "obs_preds,opt,target = test_opt_relative_diff(specimen_id = 325479788,model_type=\"IZHI\",efel_filter_iterable=efel_filter_iterable)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "check_bin_vm_soma(target,opt)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CkvrvtvPeakabcdcelltype
0129.211.47-68.07-45.044.980.010.47-57.78-10.967
\n", + "
" + ], + "text/plain": [ + " C k vr vt vPeak a b c d celltype\n", + "0 129.21 1.47 -68.07 -45.04 4.98 0.01 0.47 -57.78 -10.96 7" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "opt.attrs_to_params()\n", + "params = pd.DataFrame([opt.params])\n", + "params" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
EFEL_feature_NU_test_Namepredictionobservationneuronunit_score
0ISI_log_slope0.4857040.485422Relative Difference = 0.00
1mean_frequency10.08629410.084034Relative Difference = 0.00
2adaptation_index20.0919430.088318Relative Difference = 0.00
3ISI_CV0.4760550.397611Relative Difference = 0.08
4Spikecount9.0000009.000000Relative Difference = 0.00
5all_ISI_values102.212500102.250000Relative Difference = 0.04
6ISI_values108.400000108.471429Relative Difference = 0.07
7time_to_first_spike74.60000074.500000Relative Difference = 0.10
8time_to_last_spike892.300000892.500000Relative Difference = 0.20
9time_to_second_spike133.500000133.200000Relative Difference = 0.30
10spike_01.0743851.074500Relative Difference = 0.00
11spike_11.1332801.133250Relative Difference = 0.00
12spike_21.2030801.199000Relative Difference = 0.00
13spike_31.2744201.273250Relative Difference = 0.00
14spike_41.3507501.358250Relative Difference = 0.01
15spike_51.4403451.455000Relative Difference = 0.01
16spike_61.5417401.567000Relative Difference = 0.03
17spike_71.6796451.701750Relative Difference = 0.02
18spike_81.8919951.892500Relative Difference = 0.00
\n", + "
" + ], + "text/plain": [ + " EFEL_feature_NU_test_Name prediction observation \\\n", + "0 ISI_log_slope 0.485704 0.485422 \n", + "1 mean_frequency 10.086294 10.084034 \n", + "2 adaptation_index2 0.091943 0.088318 \n", + "3 ISI_CV 0.476055 0.397611 \n", + "4 Spikecount 9.000000 9.000000 \n", + "5 all_ISI_values 102.212500 102.250000 \n", + "6 ISI_values 108.400000 108.471429 \n", + "7 time_to_first_spike 74.600000 74.500000 \n", + "8 time_to_last_spike 892.300000 892.500000 \n", + "9 time_to_second_spike 133.500000 133.200000 \n", + "10 spike_0 1.074385 1.074500 \n", + "11 spike_1 1.133280 1.133250 \n", + "12 spike_2 1.203080 1.199000 \n", + "13 spike_3 1.274420 1.273250 \n", + "14 spike_4 1.350750 1.358250 \n", + "15 spike_5 1.440345 1.455000 \n", + "16 spike_6 1.541740 1.567000 \n", + "17 spike_7 1.679645 1.701750 \n", + "18 spike_8 1.891995 1.892500 \n", + "\n", + " neuronunit_score \n", + "0 Relative Difference = 0.00 \n", + "1 Relative Difference = 0.00 \n", + "2 Relative Difference = 0.00 \n", + "3 Relative Difference = 0.08 \n", + "4 Relative Difference = 0.00 \n", + "5 Relative Difference = 0.04 \n", + "6 Relative Difference = 0.07 \n", + "7 Relative Difference = 0.10 \n", + "8 Relative Difference = 0.20 \n", + "9 Relative Difference = 0.30 \n", + "10 Relative Difference = 0.00 \n", + "11 Relative Difference = 0.00 \n", + "12 Relative Difference = 0.00 \n", + "13 Relative Difference = 0.00 \n", + "14 Relative Difference = 0.01 \n", + "15 Relative Difference = 0.01 \n", + "16 Relative Difference = 0.03 \n", + "17 Relative Difference = 0.02 \n", + "18 Relative Difference = 0.00 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame(obs_preds)\n", + "df.rename(columns={0:'EFEL_feature_NU_test_Name',1:'prediction',2:'observation',3:'neuronunit_score'},inplace=True)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example 2\n", + "* Now fit Adaptive Exponential model to a single sweep from Allen specimen `325479788` sweep number `64`" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:gen\tnevals\tavg \tstd \tmin \tmax \n", + "1 \t100 \t4993.29\t7864.78\t22.1244\t22000\n", + "gen\tnevals\tavg \tstd \tmin \tmax \n", + "1 \t100 \t4993.29\t7864.78\t22.1244\t22000\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cac3d171dead4c51afa645cd2f2fd60c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=350.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:2 \t73 \t5147.03\t7810.2 \t17.7468\t22000\n", + "2 \t73 \t5147.03\t7810.2 \t17.7468\t22000\n", + "INFO:__main__:3 \t15 \t33.9109\t5.53879\t17.7468\t42.4067\n", + "3 \t15 \t33.9109\t5.53879\t17.7468\t42.4067\n", + "INFO:__main__:4 \t19 \t35.2288\t30.2101\t17.7468\t241.537\n", + "4 \t19 \t35.2288\t30.2101\t17.7468\t241.537\n", + "INFO:__main__:5 \t14 \t32.1176\t6.82149\t17.7468\t56.2628\n", + "5 \t14 \t32.1176\t6.82149\t17.7468\t56.2628\n", + "INFO:__main__:6 \t24 \t403.325\t2632.18\t17.7468\t19015.5\n", + "6 \t24 \t403.325\t2632.18\t17.7468\t19015.5\n", + "INFO:__main__:7 \t17 \t25.1445\t4.70049\t17.7468\t37.8188\n", + "7 \t17 \t25.1445\t4.70049\t17.7468\t37.8188\n", + "INFO:__main__:8 \t15 \t26.9418\t4.61367\t17.7468\t37.8188\n", + "8 \t15 \t26.9418\t4.61367\t17.7468\t37.8188\n", + "INFO:__main__:9 \t15 \t25.6146\t4.49005\t17.7468\t37.4018\n", + "9 \t15 \t25.6146\t4.49005\t17.7468\t37.4018\n", + "INFO:__main__:10 \t15 \t26.3376\t6.67404\t17.7468\t40.0658\n", + "10 \t15 \t26.3376\t6.67404\t17.7468\t40.0658\n", + "INFO:__main__:11 \t15 \t458.111\t3046.49\t16.0855\t22000 \n", + "11 \t15 \t458.111\t3046.49\t16.0855\t22000 \n", + "INFO:__main__:12 \t16 \t25.2596\t15.3379\t15.5056\t126.683\n", + "12 \t16 \t25.2596\t15.3379\t15.5056\t126.683\n", + "INFO:__main__:13 \t22 \t29.1571\t20.4241\t15.5056\t126.683\n", + "13 \t22 \t29.1571\t20.4241\t15.5056\t126.683\n", + "INFO:__main__:14 \t19 \t24.692 \t6.36958\t15.5056\t36.7751\n", + "14 \t19 \t24.692 \t6.36958\t15.5056\t36.7751\n", + "INFO:__main__:15 \t19 \t26.1575\t5.35583\t15.5056\t36.7751\n", + "15 \t19 \t26.1575\t5.35583\t15.5056\t36.7751\n", + "INFO:__main__:16 \t21 \t24.9209\t4.51952\t15.5056\t33.7603\n", + "16 \t21 \t24.9209\t4.51952\t15.5056\t33.7603\n", + "INFO:__main__:17 \t15 \t25.0509\t4.35881\t15.5056\t34.7892\n", + "17 \t15 \t25.0509\t4.35881\t15.5056\t34.7892\n", + "INFO:__main__:18 \t21 \t26.7833\t4.23549\t15.5056\t38.4576\n", + "18 \t21 \t26.7833\t4.23549\t15.5056\t38.4576\n", + "INFO:__main__:19 \t10 \t25.0629\t4.01027\t15.5056\t33.3078\n", + "19 \t10 \t25.0629\t4.01027\t15.5056\t33.3078\n", + "INFO:__main__:20 \t15 \t25.2318\t4.00989\t15.5056\t31.4021\n", + "20 \t15 \t25.2318\t4.00989\t15.5056\t31.4021\n", + "INFO:__main__:21 \t18 \t24.972 \t5.02909\t15.5056\t36.5044\n", + "21 \t18 \t24.972 \t5.02909\t15.5056\t36.5044\n", + "INFO:__main__:22 \t16 \t22.2684\t5.37511\t15.5056\t35.8465\n", + "22 \t16 \t22.2684\t5.37511\t15.5056\t35.8465\n", + "INFO:__main__:23 \t17 \t21.962 \t3.78435\t10.9169\t31.0757\n", + "23 \t17 \t21.962 \t3.78435\t10.9169\t31.0757\n", + "INFO:__main__:24 \t22 \t20.3464\t4.96548\t10.9169\t33.7638\n", + "24 \t22 \t20.3464\t4.96548\t10.9169\t33.7638\n", + "INFO:__main__:25 \t13 \t21.2207\t5.79887\t10.9169\t31.6782\n", + "25 \t13 \t21.2207\t5.79887\t10.9169\t31.6782\n", + "INFO:__main__:26 \t12 \t22.0916\t5.60648\t10.9169\t30.3612\n", + "26 \t12 \t22.0916\t5.60648\t10.9169\t30.3612\n", + "INFO:__main__:27 \t10 \t22.1579\t5.19481\t10.9169\t27.5224\n", + "27 \t10 \t22.1579\t5.19481\t10.9169\t27.5224\n", + "INFO:__main__:28 \t17 \t23.1702\t5.00512\t10.9169\t33.9941\n", + "28 \t17 \t23.1702\t5.00512\t10.9169\t33.9941\n", + "INFO:__main__:29 \t18 \t21.9409\t5.86139\t10.9169\t32.8155\n", + "29 \t18 \t21.9409\t5.86139\t10.9169\t32.8155\n", + "INFO:__main__:30 \t16 \t22.5283\t4.93536\t10.9169\t32.4032\n", + "30 \t16 \t22.5283\t4.93536\t10.9169\t32.4032\n", + "INFO:__main__:31 \t22 \t19.9665\t5.19876\t10.9169\t27.5203\n", + "31 \t22 \t19.9665\t5.19876\t10.9169\t27.5203\n", + "INFO:__main__:32 \t19 \t21.8285\t4.81429\t10.9169\t35.0582\n", + "32 \t19 \t21.8285\t4.81429\t10.9169\t35.0582\n", + "INFO:__main__:33 \t16 \t19.6392\t4.31209\t10.9169\t26.4032\n", + "33 \t16 \t19.6392\t4.31209\t10.9169\t26.4032\n", + "INFO:__main__:34 \t18 \t21.194 \t4.68349\t10.9169\t30.7778\n", + "34 \t18 \t21.194 \t4.68349\t10.9169\t30.7778\n", + "INFO:__main__:35 \t13 \t19.8057\t4.39257\t9.34575\t29.6548\n", + "35 \t13 \t19.8057\t4.39257\t9.34575\t29.6548\n", + "INFO:__main__:36 \t14 \t19.3317\t5.20491\t7.86881\t28.2588\n", + "36 \t14 \t19.3317\t5.20491\t7.86881\t28.2588\n", + "INFO:__main__:37 \t24 \t19.0843\t5.8155 \t7.86881\t31.2804\n", + "37 \t24 \t19.0843\t5.8155 \t7.86881\t31.2804\n", + "INFO:__main__:38 \t16 \t17.8303\t4.40964\t7.86881\t25.4987\n", + "38 \t16 \t17.8303\t4.40964\t7.86881\t25.4987\n", + "INFO:__main__:39 \t18 \t15.4962\t3.94409\t6.89347\t23.6402\n", + "39 \t18 \t15.4962\t3.94409\t6.89347\t23.6402\n", + "INFO:__main__:40 \t16 \t16.5904\t4.52643\t6.89347\t26.1806\n", + "40 \t16 \t16.5904\t4.52643\t6.89347\t26.1806\n", + "INFO:__main__:41 \t17 \t18.4749\t4.7331 \t6.89347\t26.6572\n", + "41 \t17 \t18.4749\t4.7331 \t6.89347\t26.6572\n", + "INFO:__main__:42 \t16 \t16.18 \t5.9718 \t6.89347\t31.4998\n", + "42 \t16 \t16.18 \t5.9718 \t6.89347\t31.4998\n", + "INFO:__main__:43 \t15 \t15.835 \t4.45899\t6.89347\t23.7569\n", + "43 \t15 \t15.835 \t4.45899\t6.89347\t23.7569\n", + "INFO:__main__:44 \t19 \t16.0141\t4.20365\t6.89347\t27.0263\n", + "44 \t19 \t16.0141\t4.20365\t6.89347\t27.0263\n", + "INFO:__main__:45 \t19 \t17.2093\t4.96691\t6.89347\t27.4359\n", + "45 \t19 \t17.2093\t4.96691\t6.89347\t27.4359\n", + "INFO:__main__:46 \t18 \t14.2644\t5.08986\t6.89347\t25.8029\n", + "46 \t18 \t14.2644\t5.08986\t6.89347\t25.8029\n", + "INFO:__main__:47 \t15 \t14.1627\t4.62326\t6.89347\t22.5205\n", + "47 \t15 \t14.1627\t4.62326\t6.89347\t22.5205\n", + "INFO:__main__:48 \t15 \t15.0254\t5.30791\t6.89347\t29.5048\n", + "48 \t15 \t15.0254\t5.30791\t6.89347\t29.5048\n", + "INFO:__main__:49 \t18 \t16.0708\t4.78928\t6.89347\t27.3486\n", + "49 \t18 \t16.0708\t4.78928\t6.89347\t27.3486\n", + "INFO:__main__:50 \t20 \t15.541 \t4.39462\t6.89347\t24.3044\n", + "50 \t20 \t15.541 \t4.39462\t6.89347\t24.3044\n", + "INFO:__main__:51 \t17 \t13.768 \t4.35027\t4.61939\t23.6212\n", + "51 \t17 \t13.768 \t4.35027\t4.61939\t23.6212\n", + "INFO:__main__:52 \t16 \t13.9228\t4.35495\t4.61939\t22.3437\n", + "52 \t16 \t13.9228\t4.35495\t4.61939\t22.3437\n", + "INFO:__main__:53 \t21 \t15.5708\t4.46663\t4.61939\t26.9562\n", + "53 \t21 \t15.5708\t4.46663\t4.61939\t26.9562\n", + "INFO:__main__:54 \t14 \t13.8217\t4.92886\t4.61939\t22.3437\n", + "54 \t14 \t13.8217\t4.92886\t4.61939\t22.3437\n", + "INFO:__main__:55 \t18 \t17.9502\t5.53579\t4.61939\t36.8398\n", + "55 \t18 \t17.9502\t5.53579\t4.61939\t36.8398\n", + "INFO:__main__:56 \t13 \t14.6065\t5.63223\t4.61939\t29.9723\n", + "56 \t13 \t14.6065\t5.63223\t4.61939\t29.9723\n", + "INFO:__main__:57 \t15 \t16.0192\t5.05655\t4.61939\t30.8449\n", + "57 \t15 \t16.0192\t5.05655\t4.61939\t30.8449\n", + "INFO:__main__:58 \t20 \t13.3422\t5.13769\t4.61939\t24.755 \n", + "58 \t20 \t13.3422\t5.13769\t4.61939\t24.755 \n", + "INFO:__main__:59 \t22 \t13.6624\t4.14858\t4.61939\t22.0855\n", + "59 \t22 \t13.6624\t4.14858\t4.61939\t22.0855\n", + "INFO:__main__:60 \t18 \t13.9514\t4.60197\t4.61939\t27.8278\n", + "60 \t18 \t13.9514\t4.60197\t4.61939\t27.8278\n", + "INFO:__main__:61 \t12 \t12.5412\t5.94077\t4.61939\t24.4608\n", + "61 \t12 \t12.5412\t5.94077\t4.61939\t24.4608\n", + "INFO:__main__:62 \t15 \t12.4789\t3.85717\t4.61939\t24.5392\n", + "62 \t15 \t12.4789\t3.85717\t4.61939\t24.5392\n", + "INFO:__main__:63 \t12 \t12.6837\t5.36335\t4.61939\t25.026 \n", + "63 \t12 \t12.6837\t5.36335\t4.61939\t25.026 \n", + "INFO:__main__:64 \t16 \t13.1753\t4.68385\t4.61939\t24.5392\n", + "64 \t16 \t13.1753\t4.68385\t4.61939\t24.5392\n", + "INFO:__main__:65 \t17 \t14.0181\t5.0416 \t4.61939\t24.5392\n", + "65 \t17 \t14.0181\t5.0416 \t4.61939\t24.5392\n", + "INFO:__main__:66 \t15 \t13.9969\t4.03041\t4.61939\t22.6943\n", + "66 \t15 \t13.9969\t4.03041\t4.61939\t22.6943\n", + "INFO:__main__:67 \t16 \t12.3743\t5.78623\t4.61939\t27.864 \n", + "67 \t16 \t12.3743\t5.78623\t4.61939\t27.864 \n", + "INFO:__main__:68 \t22 \t12.651 \t5.60971\t4.61939\t24.6961\n", + "68 \t22 \t12.651 \t5.60971\t4.61939\t24.6961\n", + "INFO:__main__:69 \t18 \t13.2029\t4.84896\t4.61939\t22.3461\n", + "69 \t18 \t13.2029\t4.84896\t4.61939\t22.3461\n", + "INFO:__main__:70 \t20 \t14.0813\t5.97279\t4.61939\t25.5926\n", + "70 \t20 \t14.0813\t5.97279\t4.61939\t25.5926\n", + "INFO:__main__:71 \t17 \t13.2428\t5.57523\t3.81506\t27.2353\n", + "71 \t17 \t13.2428\t5.57523\t3.81506\t27.2353\n", + "INFO:__main__:72 \t19 \t11.4909\t4.82862\t3.81506\t26.8038\n", + "72 \t19 \t11.4909\t4.82862\t3.81506\t26.8038\n", + "INFO:__main__:73 \t17 \t10.9337\t4.25343\t3.81506\t21.3887\n", + "73 \t17 \t10.9337\t4.25343\t3.81506\t21.3887\n", + "INFO:__main__:74 \t20 \t12.7148\t4.25964\t3.81506\t23.5894\n", + "74 \t20 \t12.7148\t4.25964\t3.81506\t23.5894\n", + "INFO:__main__:75 \t18 \t13.8983\t4.75679\t3.81506\t27.896 \n", + "75 \t18 \t13.8983\t4.75679\t3.81506\t27.896 \n", + "INFO:__main__:76 \t12 \t11.6618\t5.76269\t3.81506\t29.7554\n", + "76 \t12 \t11.6618\t5.76269\t3.81506\t29.7554\n", + "INFO:__main__:77 \t10 \t12.3319\t5.66494\t3.81506\t29.7554\n", + "77 \t10 \t12.3319\t5.66494\t3.81506\t29.7554\n", + "INFO:__main__:78 \t15 \t10.4074\t6.29807\t3.81506\t29.7554\n", + "78 \t15 \t10.4074\t6.29807\t3.81506\t29.7554\n", + "INFO:__main__:79 \t12 \t12.0504\t5.54279\t3.81506\t24.3578\n", + "79 \t12 \t12.0504\t5.54279\t3.81506\t24.3578\n", + "INFO:__main__:80 \t17 \t10.5464\t5.35203\t3.79337\t24.9819\n", + "80 \t17 \t10.5464\t5.35203\t3.79337\t24.9819\n", + "INFO:__main__:81 \t19 \t13.2975\t4.4624 \t3.79337\t23.175 \n", + "81 \t19 \t13.2975\t4.4624 \t3.79337\t23.175 \n", + "INFO:__main__:82 \t13 \t13.2431\t5.12042\t3.79337\t25.9044\n", + "82 \t13 \t13.2431\t5.12042\t3.79337\t25.9044\n", + "INFO:__main__:83 \t20 \t13.5578\t7.21953\t3.79337\t28.8879\n", + "83 \t20 \t13.5578\t7.21953\t3.79337\t28.8879\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:84 \t17 \t13.9902\t6.33988\t3.79337\t31.3994\n", + "84 \t17 \t13.9902\t6.33988\t3.79337\t31.3994\n", + "INFO:__main__:85 \t16 \t11.6638\t5.66169\t3.79337\t25.3727\n", + "85 \t16 \t11.6638\t5.66169\t3.79337\t25.3727\n", + "INFO:__main__:86 \t19 \t13.3594\t5.02917\t3.79337\t30.274 \n", + "86 \t19 \t13.3594\t5.02917\t3.79337\t30.274 \n", + "INFO:__main__:87 \t13 \t12.2091\t5.34863\t3.79337\t25.8418\n", + "87 \t13 \t12.2091\t5.34863\t3.79337\t25.8418\n", + "INFO:__main__:88 \t14 \t12.4301\t6.36375\t3.79337\t29.1587\n", + "88 \t14 \t12.4301\t6.36375\t3.79337\t29.1587\n", + "INFO:__main__:89 \t13 \t11.8401\t6.1103 \t3.79337\t22.7265\n", + "89 \t13 \t11.8401\t6.1103 \t3.79337\t22.7265\n", + "INFO:__main__:90 \t12 \t11.7446\t4.40185\t3.79337\t25.0518\n", + "90 \t12 \t11.7446\t4.40185\t3.79337\t25.0518\n", + "INFO:__main__:91 \t18 \t12.6258\t3.30856\t3.79337\t24.5053\n", + "91 \t18 \t12.6258\t3.30856\t3.79337\t24.5053\n", + "INFO:__main__:92 \t20 \t12.7655\t4.06947\t3.79337\t21.1901\n", + "92 \t20 \t12.7655\t4.06947\t3.79337\t21.1901\n", + "INFO:__main__:93 \t15 \t11.6513\t3.33182\t3.79337\t20.5275\n", + "93 \t15 \t11.6513\t3.33182\t3.79337\t20.5275\n", + "INFO:__main__:94 \t13 \t14.024 \t5.85127\t3.79337\t28.72 \n", + "94 \t13 \t14.024 \t5.85127\t3.79337\t28.72 \n", + "INFO:__main__:95 \t14 \t14.4502\t5.65111\t3.79337\t25.5329\n", + "95 \t14 \t14.4502\t5.65111\t3.79337\t25.5329\n", + "INFO:__main__:96 \t17 \t13.5365\t5.80823\t3.79337\t27.0981\n", + "96 \t17 \t13.5365\t5.80823\t3.79337\t27.0981\n", + "INFO:__main__:97 \t17 \t11.9051\t4.49403\t3.79337\t19.8267\n", + "97 \t17 \t11.9051\t4.49403\t3.79337\t19.8267\n", + "INFO:__main__:98 \t18 \t13.7425\t4.11066\t3.79337\t19.0244\n", + "98 \t18 \t13.7425\t4.11066\t3.79337\t19.0244\n", + "INFO:__main__:99 \t14 \t11.2793\t4.93788\t3.79337\t23.3162\n", + "99 \t14 \t11.2793\t4.93788\t3.79337\t23.3162\n", + "INFO:__main__:100\t18 \t12.4991\t4.33393\t3.79337\t26.7342\n", + "100\t18 \t12.4991\t4.33393\t3.79337\t26.7342\n", + "INFO:__main__:101\t17 \t10.6511\t4.70635\t3.79337\t26.3458\n", + "101\t17 \t10.6511\t4.70635\t3.79337\t26.3458\n", + "INFO:__main__:102\t20 \t11.9216\t2.95681\t3.79337\t17.4925\n", + "102\t20 \t11.9216\t2.95681\t3.79337\t17.4925\n", + "INFO:__main__:103\t12 \t12.3244\t3.38458\t3.79337\t22.4122\n", + "103\t12 \t12.3244\t3.38458\t3.79337\t22.4122\n", + "INFO:__main__:104\t18 \t12.4449\t4.61596\t3.79337\t24.6504\n", + "104\t18 \t12.4449\t4.61596\t3.79337\t24.6504\n", + "INFO:__main__:105\t20 \t12.1417\t4.02386\t3.79337\t24.5848\n", + "105\t20 \t12.1417\t4.02386\t3.79337\t24.5848\n", + "INFO:__main__:106\t19 \t12.6751\t4.49587\t3.79337\t26.3933\n", + "106\t19 \t12.6751\t4.49587\t3.79337\t26.3933\n", + "INFO:__main__:107\t14 \t12.0343\t3.27893\t3.79337\t19.1176\n", + "107\t14 \t12.0343\t3.27893\t3.79337\t19.1176\n", + "INFO:__main__:108\t13 \t11.5861\t4.79857\t3.79337\t25.6361\n", + "108\t13 \t11.5861\t4.79857\t3.79337\t25.6361\n", + "INFO:__main__:109\t16 \t12.5528\t5.17621\t3.79337\t23.0035\n", + "109\t16 \t12.5528\t5.17621\t3.79337\t23.0035\n", + "INFO:__main__:110\t15 \t11.1677\t3.03446\t3.79337\t18.8826\n", + "110\t15 \t11.1677\t3.03446\t3.79337\t18.8826\n", + "INFO:__main__:111\t16 \t12.6968\t4.49966\t3.79337\t19.5818\n", + "111\t16 \t12.6968\t4.49966\t3.79337\t19.5818\n", + "INFO:__main__:112\t14 \t12.2273\t4.37122\t3.79337\t27.6713\n", + "112\t14 \t12.2273\t4.37122\t3.79337\t27.6713\n", + "INFO:__main__:113\t19 \t11.8415\t5.38961\t3.79337\t25.5128\n", + "113\t19 \t11.8415\t5.38961\t3.79337\t25.5128\n", + "INFO:__main__:114\t19 \t11.6292\t4.19633\t3.79337\t21.4053\n", + "114\t19 \t11.6292\t4.19633\t3.79337\t21.4053\n", + "INFO:__main__:115\t13 \t9.89133\t5.11324\t3.79337\t22.7827\n", + "115\t13 \t9.89133\t5.11324\t3.79337\t22.7827\n", + "INFO:__main__:116\t15 \t10.2269\t3.46888\t3.79337\t21.9595\n", + "116\t15 \t10.2269\t3.46888\t3.79337\t21.9595\n", + "INFO:__main__:117\t16 \t11.2434\t3.79675\t3.79337\t21.9595\n", + "117\t16 \t11.2434\t3.79675\t3.79337\t21.9595\n", + "INFO:__main__:118\t22 \t11.2188\t3.78709\t3.79337\t20.1326\n", + "118\t22 \t11.2188\t3.78709\t3.79337\t20.1326\n", + "INFO:__main__:119\t18 \t10.446 \t3.67438\t3.79337\t19.2431\n", + "119\t18 \t10.446 \t3.67438\t3.79337\t19.2431\n", + "INFO:__main__:120\t16 \t10.5228\t4.04766\t3.79337\t28.2775\n", + "120\t16 \t10.5228\t4.04766\t3.79337\t28.2775\n", + "INFO:__main__:121\t19 \t11.1244\t3.97188\t3.79337\t23.2343\n", + "121\t19 \t11.1244\t3.97188\t3.79337\t23.2343\n", + "INFO:__main__:122\t15 \t10.4281\t4.70808\t3.79337\t23.6907\n", + "122\t15 \t10.4281\t4.70808\t3.79337\t23.6907\n", + "INFO:__main__:123\t16 \t13.045 \t4.8332 \t3.79337\t23.2343\n", + "123\t16 \t13.045 \t4.8332 \t3.79337\t23.2343\n", + "INFO:__main__:124\t19 \t13.3227\t4.98858\t3.79337\t25.4188\n", + "124\t19 \t13.3227\t4.98858\t3.79337\t25.4188\n", + "INFO:__main__:125\t15 \t11.6177\t4.05379\t3.79337\t23.4854\n", + "125\t15 \t11.6177\t4.05379\t3.79337\t23.4854\n", + "INFO:__main__:126\t19 \t11.7211\t4.98976\t3.79337\t27.2458\n", + "126\t19 \t11.7211\t4.98976\t3.79337\t27.2458\n", + "INFO:__main__:127\t21 \t11.3405\t3.57848\t3.79337\t20.8633\n", + "127\t21 \t11.3405\t3.57848\t3.79337\t20.8633\n", + "INFO:__main__:128\t16 \t10.0174\t5.03342\t3.79337\t23.2525\n", + "128\t16 \t10.0174\t5.03342\t3.79337\t23.2525\n", + "INFO:__main__:129\t18 \t11.3755\t3.50137\t3.79337\t23.2006\n", + "129\t18 \t11.3755\t3.50137\t3.79337\t23.2006\n", + "INFO:__main__:130\t10 \t11.0055\t4.28189\t3.79337\t20.7294\n", + "130\t10 \t11.0055\t4.28189\t3.79337\t20.7294\n", + "INFO:__main__:131\t17 \t12.0362\t5.70404\t3.79337\t26.3974\n", + "131\t17 \t12.0362\t5.70404\t3.79337\t26.3974\n", + "INFO:__main__:132\t14 \t11.7687\t5.03887\t3.79337\t28.1337\n", + "132\t14 \t11.7687\t5.03887\t3.79337\t28.1337\n", + "INFO:__main__:133\t11 \t10.1851\t4.89848\t3.79337\t22.8508\n", + "133\t11 \t10.1851\t4.89848\t3.79337\t22.8508\n", + "INFO:__main__:134\t12 \t11.5611\t4.75859\t3.79337\t22.8508\n", + "134\t12 \t11.5611\t4.75859\t3.79337\t22.8508\n", + "INFO:__main__:135\t16 \t12.4614\t6.59547\t3.79337\t24.7942\n", + "135\t16 \t12.4614\t6.59547\t3.79337\t24.7942\n", + "INFO:__main__:136\t14 \t11.1247\t3.35932\t3.79337\t20.1468\n", + "136\t14 \t11.1247\t3.35932\t3.79337\t20.1468\n", + "INFO:__main__:137\t16 \t11.1632\t4.79011\t3.17862\t27.7011\n", + "137\t16 \t11.1632\t4.79011\t3.17862\t27.7011\n", + "INFO:__main__:138\t16 \t9.30475\t4.52799\t3.17862\t19.9789\n", + "138\t16 \t9.30475\t4.52799\t3.17862\t19.9789\n", + "INFO:__main__:139\t14 \t11.6474\t3.56795\t3.17862\t18.286 \n", + "139\t14 \t11.6474\t3.56795\t3.17862\t18.286 \n", + "INFO:__main__:140\t12 \t9.20206\t4.62917\t3.17862\t19.9988\n", + "140\t12 \t9.20206\t4.62917\t3.17862\t19.9988\n", + "INFO:__main__:141\t13 \t10.4279\t2.05789\t3.17862\t17.5413\n", + "141\t13 \t10.4279\t2.05789\t3.17862\t17.5413\n", + "INFO:__main__:142\t17 \t10.9969\t4.08235\t3.17862\t23.1001\n", + "142\t17 \t10.9969\t4.08235\t3.17862\t23.1001\n", + "INFO:__main__:143\t16 \t10.4581\t2.71259\t3.17862\t16.5502\n", + "143\t16 \t10.4581\t2.71259\t3.17862\t16.5502\n", + "INFO:__main__:144\t14 \t9.97142\t3.31035\t3.17862\t16.3459\n", + "144\t14 \t9.97142\t3.31035\t3.17862\t16.3459\n", + "INFO:__main__:145\t10 \t10.3358\t3.84915\t3.17862\t20.4552\n", + "145\t10 \t10.3358\t3.84915\t3.17862\t20.4552\n", + "INFO:__main__:146\t17 \t9.85019\t4.4136 \t3.17862\t21.0886\n", + "146\t17 \t9.85019\t4.4136 \t3.17862\t21.0886\n", + "INFO:__main__:147\t20 \t10.7736\t4.36201\t3.17862\t19.8068\n", + "147\t20 \t10.7736\t4.36201\t3.17862\t19.8068\n", + "INFO:__main__:148\t11 \t11.7571\t5.52232\t3.17862\t34.3183\n", + "148\t11 \t11.7571\t5.52232\t3.17862\t34.3183\n", + "INFO:__main__:149\t13 \t11.5563\t4.48038\t3.17862\t26.0846\n", + "149\t13 \t11.5563\t4.48038\t3.17862\t26.0846\n", + "INFO:__main__:150\t20 \t12.1015\t5.89893\t3.17862\t30.8307\n", + "150\t20 \t12.1015\t5.89893\t3.17862\t30.8307\n", + "INFO:__main__:151\t17 \t11.4802\t4.29352\t3.17862\t20.7808\n", + "151\t17 \t11.4802\t4.29352\t3.17862\t20.7808\n", + "INFO:__main__:152\t17 \t10.7408\t3.9005 \t3.17862\t21.2462\n", + "152\t17 \t10.7408\t3.9005 \t3.17862\t21.2462\n", + "INFO:__main__:153\t19 \t11.6517\t3.89232\t3.17862\t22.7971\n", + "153\t19 \t11.6517\t3.89232\t3.17862\t22.7971\n", + "INFO:__main__:154\t20 \t9.98102\t3.04659\t3.17862\t21.7808\n", + "154\t20 \t9.98102\t3.04659\t3.17862\t21.7808\n", + "INFO:__main__:155\t10 \t9.78447\t2.50475\t3.17862\t18.1232\n", + "155\t10 \t9.78447\t2.50475\t3.17862\t18.1232\n", + "INFO:__main__:156\t18 \t10.2656\t5.01614\t3.17862\t29.4093\n", + "156\t18 \t10.2656\t5.01614\t3.17862\t29.4093\n", + "INFO:__main__:157\t15 \t10.943 \t3.62609\t3.17862\t20.1069\n", + "157\t15 \t10.943 \t3.62609\t3.17862\t20.1069\n", + "INFO:__main__:158\t14 \t13.2849\t4.56871\t3.17862\t26.248 \n", + "158\t14 \t13.2849\t4.56871\t3.17862\t26.248 \n", + "INFO:__main__:159\t16 \t11.4487\t4.21961\t3.17862\t21.1305\n", + "159\t16 \t11.4487\t4.21961\t3.17862\t21.1305\n", + "INFO:__main__:160\t14 \t13.9924\t4.56086\t3.17862\t25.2646\n", + "160\t14 \t13.9924\t4.56086\t3.17862\t25.2646\n", + "INFO:__main__:161\t11 \t13.3809\t5.21177\t3.17862\t25.2646\n", + "161\t11 \t13.3809\t5.21177\t3.17862\t25.2646\n", + "INFO:__main__:162\t16 \t12.0624\t3.97002\t3.17862\t21.401 \n", + "162\t16 \t12.0624\t3.97002\t3.17862\t21.401 \n", + "INFO:__main__:163\t19 \t12.1864\t4.10781\t3.17862\t22.7408\n", + "163\t19 \t12.1864\t4.10781\t3.17862\t22.7408\n", + "INFO:__main__:164\t16 \t10.9087\t3.55309\t3.17862\t20.351 \n", + "164\t16 \t10.9087\t3.55309\t3.17862\t20.351 \n", + "INFO:__main__:165\t18 \t9.89465\t3.56446\t3.17862\t18.3461\n", + "165\t18 \t9.89465\t3.56446\t3.17862\t18.3461\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:166\t20 \t10.9851\t3.81287\t3.17862\t24.3153\n", + "166\t20 \t10.9851\t3.81287\t3.17862\t24.3153\n", + "INFO:__main__:167\t17 \t10.7017\t5.72651\t3.17862\t27.5709\n", + "167\t17 \t10.7017\t5.72651\t3.17862\t27.5709\n", + "INFO:__main__:168\t16 \t10.1073\t3.78613\t3.17862\t20.6892\n", + "168\t16 \t10.1073\t3.78613\t3.17862\t20.6892\n", + "INFO:__main__:169\t17 \t11.7197\t5.61248\t3.17862\t31.8775\n", + "169\t17 \t11.7197\t5.61248\t3.17862\t31.8775\n", + "INFO:__main__:170\t19 \t11.0041\t4.89887\t3.17862\t25.0637\n", + "170\t19 \t11.0041\t4.89887\t3.17862\t25.0637\n", + "INFO:__main__:171\t13 \t10.0047\t3.40694\t3.17862\t17.4373\n", + "171\t13 \t10.0047\t3.40694\t3.17862\t17.4373\n", + "INFO:__main__:172\t15 \t12.1931\t3.74504\t3.17862\t24.447 \n", + "172\t15 \t12.1931\t3.74504\t3.17862\t24.447 \n", + "INFO:__main__:173\t14 \t10.5559\t5.12695\t3.17862\t31.2509\n", + "173\t14 \t10.5559\t5.12695\t3.17862\t31.2509\n", + "INFO:__main__:174\t19 \t11.5943\t3.59505\t3.17862\t23.0723\n", + "174\t19 \t11.5943\t3.59505\t3.17862\t23.0723\n", + "INFO:__main__:175\t12 \t10.7187\t4.60045\t3.17862\t28.1004\n", + "175\t12 \t10.7187\t4.60045\t3.17862\t28.1004\n", + "INFO:__main__:176\t20 \t12.2 \t3.70196\t3.17862\t26.0071\n", + "176\t20 \t12.2 \t3.70196\t3.17862\t26.0071\n", + "INFO:__main__:177\t17 \t10.8462\t4.31861\t3.17862\t19.2349\n", + "177\t17 \t10.8462\t4.31861\t3.17862\t19.2349\n", + "INFO:__main__:178\t17 \t11.5353\t3.58384\t3.17862\t22.3424\n", + "178\t17 \t11.5353\t3.58384\t3.17862\t22.3424\n", + "INFO:__main__:179\t15 \t11.9871\t5.12638\t3.17862\t31.4112\n", + "179\t15 \t11.9871\t5.12638\t3.17862\t31.4112\n", + "INFO:__main__:180\t15 \t11.4586\t3.58745\t3.17862\t21.9696\n", + "180\t15 \t11.4586\t3.58745\t3.17862\t21.9696\n", + "INFO:__main__:181\t14 \t12.6033\t3.58294\t3.17862\t25.1429\n", + "181\t14 \t12.6033\t3.58294\t3.17862\t25.1429\n", + "INFO:__main__:182\t13 \t13.0977\t6.08005\t3.17862\t25.1429\n", + "182\t13 \t13.0977\t6.08005\t3.17862\t25.1429\n", + "INFO:__main__:183\t18 \t11.1842\t4.87755\t3.17862\t25.2174\n", + "183\t18 \t11.1842\t4.87755\t3.17862\t25.2174\n", + "INFO:__main__:184\t15 \t10.9468\t3.71447\t3.17862\t18.9136\n", + "184\t15 \t10.9468\t3.71447\t3.17862\t18.9136\n", + "INFO:__main__:185\t12 \t12.3081\t3.24807\t3.17862\t21.9197\n", + "185\t12 \t12.3081\t3.24807\t3.17862\t21.9197\n", + "INFO:__main__:186\t6 \t12.268 \t3.29396\t3.17862\t19.0381\n", + "186\t6 \t12.268 \t3.29396\t3.17862\t19.0381\n", + "INFO:__main__:187\t14 \t11.1059\t4.1653 \t3.17862\t21.8907\n", + "187\t14 \t11.1059\t4.1653 \t3.17862\t21.8907\n", + "INFO:__main__:188\t21 \t12.004 \t3.65115\t3.17862\t21.0584\n", + "188\t21 \t12.004 \t3.65115\t3.17862\t21.0584\n", + "INFO:__main__:189\t19 \t12.1823\t4.14433\t3.17862\t21.8707\n", + "189\t19 \t12.1823\t4.14433\t3.17862\t21.8707\n", + "INFO:__main__:190\t23 \t11.7859\t4.52959\t3.17862\t23.7907\n", + "190\t23 \t11.7859\t4.52959\t3.17862\t23.7907\n", + "INFO:__main__:191\t9 \t10.5658\t3.9969 \t3.17862\t25.1831\n", + "191\t9 \t10.5658\t3.9969 \t3.17862\t25.1831\n", + "INFO:__main__:192\t12 \t10.0479\t3.48426\t3.17862\t21.3407\n", + "192\t12 \t10.0479\t3.48426\t3.17862\t21.3407\n", + "INFO:__main__:193\t15 \t10.0669\t4.68425\t3.17862\t21.5089\n", + "193\t15 \t10.0669\t4.68425\t3.17862\t21.5089\n", + "INFO:__main__:194\t20 \t11.8889\t5.048 \t3.17862\t29.8833\n", + "194\t20 \t11.8889\t5.048 \t3.17862\t29.8833\n", + "INFO:__main__:195\t13 \t11.208 \t4.87667\t3.17862\t19.5739\n", + "195\t13 \t11.208 \t4.87667\t3.17862\t19.5739\n", + "INFO:__main__:196\t13 \t12.8827\t4.67949\t3.17862\t23.3635\n", + "196\t13 \t12.8827\t4.67949\t3.17862\t23.3635\n", + "INFO:__main__:197\t13 \t12.7727\t3.81199\t3.17862\t19.9129\n", + "197\t13 \t12.7727\t3.81199\t3.17862\t19.9129\n", + "INFO:__main__:198\t12 \t12.335 \t5.61153\t3.17862\t26.8128\n", + "198\t12 \t12.335 \t5.61153\t3.17862\t26.8128\n", + "INFO:__main__:199\t16 \t9.83929\t4.97916\t3.17862\t29.7282\n", + "199\t16 \t9.83929\t4.97916\t3.17862\t29.7282\n", + "INFO:__main__:200\t15 \t10.7482\t3.89858\t3.17862\t24.2374\n", + "200\t15 \t10.7482\t3.89858\t3.17862\t24.2374\n", + "INFO:__main__:201\t20 \t12.2876\t5.20363\t3.17862\t26.1757\n", + "201\t20 \t12.2876\t5.20363\t3.17862\t26.1757\n", + "INFO:__main__:202\t15 \t11.2715\t3.48733\t3.17862\t19.1361\n", + "202\t15 \t11.2715\t3.48733\t3.17862\t19.1361\n", + "INFO:__main__:203\t12 \t11.952 \t4.25592\t3.17862\t26.6225\n", + "203\t12 \t11.952 \t4.25592\t3.17862\t26.6225\n", + "INFO:__main__:204\t15 \t11.7163\t3.96758\t3.17862\t21.2506\n", + "204\t15 \t11.7163\t3.96758\t3.17862\t21.2506\n", + "INFO:__main__:205\t21 \t12.6676\t4.72422\t3.17862\t26.0732\n", + "205\t21 \t12.6676\t4.72422\t3.17862\t26.0732\n", + "INFO:__main__:206\t18 \t11.929 \t3.4378 \t3.17862\t18.3708\n", + "206\t18 \t11.929 \t3.4378 \t3.17862\t18.3708\n", + "INFO:__main__:207\t14 \t11.5033\t4.94934\t3.17862\t22.3492\n", + "207\t14 \t11.5033\t4.94934\t3.17862\t22.3492\n", + "INFO:__main__:208\t14 \t11.5238\t3.10462\t3.17862\t17.9136\n", + "208\t14 \t11.5238\t3.10462\t3.17862\t17.9136\n", + "INFO:__main__:209\t12 \t10.0508\t3.69312\t3.17862\t22.9097\n", + "209\t12 \t10.0508\t3.69312\t3.17862\t22.9097\n", + "INFO:__main__:210\t17 \t10.6432\t3.59879\t3.17862\t18.8361\n", + "210\t17 \t10.6432\t3.59879\t3.17862\t18.8361\n", + "INFO:__main__:211\t13 \t10.4237\t3.70652\t3.17862\t18.426 \n", + "211\t13 \t10.4237\t3.70652\t3.17862\t18.426 \n", + "INFO:__main__:212\t19 \t11.8672\t4.38144\t3.17862\t24.9005\n", + "212\t19 \t11.8672\t4.38144\t3.17862\t24.9005\n", + "INFO:__main__:213\t16 \t11.5056\t4.67428\t3.17862\t25.118 \n", + "213\t16 \t11.5056\t4.67428\t3.17862\t25.118 \n", + "INFO:__main__:214\t13 \t11.3893\t3.98153\t3.17862\t24.9005\n", + "214\t13 \t11.3893\t3.98153\t3.17862\t24.9005\n", + "INFO:__main__:215\t12 \t11.5865\t2.73513\t3.17862\t23.0675\n", + "215\t12 \t11.5865\t2.73513\t3.17862\t23.0675\n", + "INFO:__main__:216\t20 \t10.9334\t4.18975\t3.17862\t24.9779\n", + "216\t20 \t10.9334\t4.18975\t3.17862\t24.9779\n", + "INFO:__main__:217\t15 \t10.5531\t3.48286\t3.17862\t16.1272\n", + "217\t15 \t10.5531\t3.48286\t3.17862\t16.1272\n", + "INFO:__main__:218\t19 \t10.6073\t2.95288\t3.17862\t16.3712\n", + "218\t19 \t10.6073\t2.95288\t3.17862\t16.3712\n", + "INFO:__main__:219\t13 \t9.97454\t3.14753\t3.17862\t18.4695\n", + "219\t13 \t9.97454\t3.14753\t3.17862\t18.4695\n", + "INFO:__main__:220\t10 \t11.232 \t3.94635\t3.17862\t25.2738\n", + "220\t10 \t11.232 \t3.94635\t3.17862\t25.2738\n", + "INFO:__main__:221\t18 \t11.6272\t4.14886\t3.17862\t22.0343\n", + "221\t18 \t11.6272\t4.14886\t3.17862\t22.0343\n", + "INFO:__main__:222\t13 \t10.551 \t4.17222\t3.17862\t19.9497\n", + "222\t13 \t10.551 \t4.17222\t3.17862\t19.9497\n", + "INFO:__main__:223\t16 \t12.0763\t3.9785 \t3.17862\t25.5186\n", + "223\t16 \t12.0763\t3.9785 \t3.17862\t25.5186\n", + "INFO:__main__:224\t16 \t12.5941\t4.47039\t3.17862\t22.9207\n", + "224\t16 \t12.5941\t4.47039\t3.17862\t22.9207\n", + "INFO:__main__:225\t17 \t11.5334\t4.28496\t3.17862\t24.7237\n", + "225\t17 \t11.5334\t4.28496\t3.17862\t24.7237\n", + "INFO:__main__:226\t16 \t12.396 \t4.15756\t3.17862\t21.2958\n", + "226\t16 \t12.396 \t4.15756\t3.17862\t21.2958\n", + "INFO:__main__:227\t9 \t10.8054\t3.07302\t3.17862\t20.0322\n", + "227\t9 \t10.8054\t3.07302\t3.17862\t20.0322\n", + "INFO:__main__:228\t15 \t11.4898\t3.46479\t3.17862\t21.6791\n", + "228\t15 \t11.4898\t3.46479\t3.17862\t21.6791\n", + "INFO:__main__:229\t10 \t9.10233\t4.11968\t3.17862\t21.3442\n", + "229\t10 \t9.10233\t4.11968\t3.17862\t21.3442\n", + "INFO:__main__:230\t16 \t11.123 \t4.79323\t3.17862\t24.6157\n", + "230\t16 \t11.123 \t4.79323\t3.17862\t24.6157\n", + "INFO:__main__:231\t16 \t9.4177 \t3.55884\t3.17862\t18.0431\n", + "231\t16 \t9.4177 \t3.55884\t3.17862\t18.0431\n", + "INFO:__main__:232\t16 \t9.72857\t3.80973\t3.17862\t22.8145\n", + "232\t16 \t9.72857\t3.80973\t3.17862\t22.8145\n", + "INFO:__main__:233\t9 \t8.18836\t2.84029\t3.17862\t20.5378\n", + "233\t9 \t8.18836\t2.84029\t3.17862\t20.5378\n", + "INFO:__main__:234\t13 \t9.23204\t4.0151 \t3.17862\t22.4637\n", + "234\t13 \t9.23204\t4.0151 \t3.17862\t22.4637\n", + "INFO:__main__:235\t13 \t9.46927\t2.44121\t3.17862\t15.0785\n", + "235\t13 \t9.46927\t2.44121\t3.17862\t15.0785\n", + "INFO:__main__:236\t18 \t9.30095\t4.26667\t3.17862\t25.0163\n", + "236\t18 \t9.30095\t4.26667\t3.17862\t25.0163\n", + "INFO:__main__:237\t19 \t10.6611\t5.58202\t3.17862\t25.4618\n", + "237\t19 \t10.6611\t5.58202\t3.17862\t25.4618\n", + "INFO:__main__:238\t20 \t10.5155\t3.84525\t3.17862\t21.6606\n", + "238\t20 \t10.5155\t3.84525\t3.17862\t21.6606\n", + "INFO:__main__:239\t18 \t10.1119\t3.23401\t3.17862\t17.5364\n", + "239\t18 \t10.1119\t3.23401\t3.17862\t17.5364\n", + "INFO:__main__:240\t19 \t10.2584\t5.09223\t3.17862\t31.6731\n", + "240\t19 \t10.2584\t5.09223\t3.17862\t31.6731\n", + "INFO:__main__:241\t20 \t9.29581\t4.71782\t3.17862\t25.3765\n", + "241\t20 \t9.29581\t4.71782\t3.17862\t25.3765\n", + "INFO:__main__:242\t14 \t14.2932\t7.62015\t3.17862\t32.0624\n", + "242\t14 \t14.2932\t7.62015\t3.17862\t32.0624\n", + "INFO:__main__:243\t23 \t10.5832\t4.50972\t3.17862\t20.9877\n", + "243\t23 \t10.5832\t4.50972\t3.17862\t20.9877\n", + "INFO:__main__:244\t17 \t10.3654\t4.15098\t3.17862\t27.5069\n", + "244\t17 \t10.3654\t4.15098\t3.17862\t27.5069\n", + "INFO:__main__:245\t15 \t10.9586\t4.67318\t3.17862\t28.1899\n", + "245\t15 \t10.9586\t4.67318\t3.17862\t28.1899\n", + "INFO:__main__:246\t13 \t10.7528\t4.66557\t3.17862\t29.8836\n", + "246\t13 \t10.7528\t4.66557\t3.17862\t29.8836\n", + "INFO:__main__:247\t13 \t9.52243\t4.38324\t3.17862\t19.2487\n", + "247\t13 \t9.52243\t4.38324\t3.17862\t19.2487\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:248\t16 \t9.03063\t3.85823\t3.17862\t18.0896\n", + "248\t16 \t9.03063\t3.85823\t3.17862\t18.0896\n", + "INFO:__main__:249\t15 \t9.57658\t2.79789\t3.17862\t15.6051\n", + "249\t15 \t9.57658\t2.79789\t3.17862\t15.6051\n", + "INFO:__main__:250\t18 \t11.0157\t3.76125\t3.17862\t21.05 \n", + "250\t18 \t11.0157\t3.76125\t3.17862\t21.05 \n", + "INFO:__main__:251\t17 \t11.2421\t5.19033\t3.17787\t28.9319\n", + "251\t17 \t11.2421\t5.19033\t3.17787\t28.9319\n", + "INFO:__main__:252\t15 \t10.422 \t3.74475\t3.17787\t19.9019\n", + "252\t15 \t10.422 \t3.74475\t3.17787\t19.9019\n", + "INFO:__main__:253\t16 \t12.2493\t4.45164\t3.17787\t25.8525\n", + "253\t16 \t12.2493\t4.45164\t3.17787\t25.8525\n", + "INFO:__main__:254\t20 \t10.0189\t2.91611\t3.17787\t17.1272\n", + "254\t20 \t10.0189\t2.91611\t3.17787\t17.1272\n", + "INFO:__main__:255\t12 \t9.08156\t4.06881\t3.17787\t26.1904\n", + "255\t12 \t9.08156\t4.06881\t3.17787\t26.1904\n", + "INFO:__main__:256\t13 \t10.8053\t5.74492\t3.17787\t26.1904\n", + "256\t13 \t10.8053\t5.74492\t3.17787\t26.1904\n", + "INFO:__main__:257\t19 \t11.2989\t5.6503 \t3.17787\t26.2963\n", + "257\t19 \t11.2989\t5.6503 \t3.17787\t26.2963\n", + "INFO:__main__:258\t15 \t10.5271\t6.40943\t3.17787\t26.2909\n", + "258\t15 \t10.5271\t6.40943\t3.17787\t26.2909\n", + "INFO:__main__:259\t17 \t10.5214\t4.74315\t3.17787\t27.5532\n", + "259\t17 \t10.5214\t4.74315\t3.17787\t27.5532\n", + "INFO:__main__:260\t15 \t13.5927\t8.36443\t3.17787\t29.4447\n", + "260\t15 \t13.5927\t8.36443\t3.17787\t29.4447\n", + "INFO:__main__:261\t16 \t10.2659\t5.26275\t3.17787\t27.5532\n", + "261\t16 \t10.2659\t5.26275\t3.17787\t27.5532\n", + "INFO:__main__:262\t17 \t9.03357\t4.50474\t3.17787\t26.3879\n", + "262\t17 \t9.03357\t4.50474\t3.17787\t26.3879\n", + "INFO:__main__:263\t19 \t9.54282\t5.21589\t3.17787\t26.3879\n", + "263\t19 \t9.54282\t5.21589\t3.17787\t26.3879\n", + "INFO:__main__:264\t18 \t10.789 \t4.89237\t2.64033\t26.7892\n", + "264\t18 \t10.789 \t4.89237\t2.64033\t26.7892\n", + "INFO:__main__:265\t15 \t9.81559\t4.31525\t2.64033\t21.5208\n", + "265\t15 \t9.81559\t4.31525\t2.64033\t21.5208\n", + "INFO:__main__:266\t11 \t10.4288\t5.46384\t2.64033\t22.3825\n", + "266\t11 \t10.4288\t5.46384\t2.64033\t22.3825\n", + "INFO:__main__:267\t17 \t8.03609\t4.92573\t2.64033\t19.518 \n", + "267\t17 \t8.03609\t4.92573\t2.64033\t19.518 \n", + "INFO:__main__:268\t19 \t11.1094\t5.5947 \t2.64033\t26.3016\n", + "268\t19 \t11.1094\t5.5947 \t2.64033\t26.3016\n", + "INFO:__main__:269\t17 \t10.5909\t4.66419\t2.64033\t21.3661\n", + "269\t17 \t10.5909\t4.66419\t2.64033\t21.3661\n", + "INFO:__main__:270\t14 \t10.9599\t3.71223\t2.64033\t22.4514\n", + "270\t14 \t10.9599\t3.71223\t2.64033\t22.4514\n", + "INFO:__main__:271\t18 \t10.7054\t4.86694\t2.64033\t21.1848\n", + "271\t18 \t10.7054\t4.86694\t2.64033\t21.1848\n", + "INFO:__main__:272\t23 \t10.7664\t3.45048\t2.64033\t24.0612\n", + "272\t23 \t10.7664\t3.45048\t2.64033\t24.0612\n", + "INFO:__main__:273\t17 \t10.2285\t4.46402\t2.64033\t25.1747\n", + "273\t17 \t10.2285\t4.46402\t2.64033\t25.1747\n", + "INFO:__main__:274\t16 \t10.2369\t3.01874\t2.64033\t18.7685\n", + "274\t16 \t10.2369\t3.01874\t2.64033\t18.7685\n", + "INFO:__main__:275\t20 \t10.6982\t4.07839\t2.64033\t22.8516\n", + "275\t20 \t10.6982\t4.07839\t2.64033\t22.8516\n", + "INFO:__main__:276\t19 \t10.7059\t3.7085 \t2.64033\t18.4413\n", + "276\t19 \t10.7059\t3.7085 \t2.64033\t18.4413\n", + "INFO:__main__:277\t18 \t9.92456\t3.88934\t2.64033\t18.1926\n", + "277\t18 \t9.92456\t3.88934\t2.64033\t18.1926\n", + "INFO:__main__:278\t15 \t10.3104\t4.70784\t2.64033\t27.8182\n", + "278\t15 \t10.3104\t4.70784\t2.64033\t27.8182\n", + "INFO:__main__:279\t17 \t9.9705 \t4.57115\t2.64033\t28.0065\n", + "279\t17 \t9.9705 \t4.57115\t2.64033\t28.0065\n", + "INFO:__main__:280\t13 \t10.6703\t3.63614\t2.64033\t23.6534\n", + "280\t13 \t10.6703\t3.63614\t2.64033\t23.6534\n", + "INFO:__main__:281\t18 \t10.9703\t5.67234\t2.31106\t23.6988\n", + "281\t18 \t10.9703\t5.67234\t2.31106\t23.6988\n", + "INFO:__main__:282\t20 \t9.20138\t4.01823\t2.31106\t17.716 \n", + "282\t20 \t9.20138\t4.01823\t2.31106\t17.716 \n", + "INFO:__main__:283\t18 \t8.59198\t3.83152\t2.31106\t18.6744\n", + "283\t18 \t8.59198\t3.83152\t2.31106\t18.6744\n", + "INFO:__main__:284\t19 \t10.7747\t4.21784\t2.31106\t21.0718\n", + "284\t19 \t10.7747\t4.21784\t2.31106\t21.0718\n", + "INFO:__main__:285\t14 \t9.52577\t4.33006\t2.31106\t21.3954\n", + "285\t14 \t9.52577\t4.33006\t2.31106\t21.3954\n", + "INFO:__main__:286\t13 \t9.41168\t4.95352\t2.31106\t33.9701\n", + "286\t13 \t9.41168\t4.95352\t2.31106\t33.9701\n", + "INFO:__main__:287\t17 \t11.9184\t5.02798\t2.31106\t29.6002\n", + "287\t17 \t11.9184\t5.02798\t2.31106\t29.6002\n", + "INFO:__main__:288\t13 \t12.5035\t3.37532\t2.31106\t21.4988\n", + "288\t13 \t12.5035\t3.37532\t2.31106\t21.4988\n", + "INFO:__main__:289\t15 \t12.0135\t4.26151\t2.31106\t22.2665\n", + "289\t15 \t12.0135\t4.26151\t2.31106\t22.2665\n", + "INFO:__main__:290\t10 \t12.1492\t3.49241\t2.31106\t22.8254\n", + "290\t10 \t12.1492\t3.49241\t2.31106\t22.8254\n", + "INFO:__main__:291\t11 \t10.7229\t3.17487\t2.31106\t24.4752\n", + "291\t11 \t10.7229\t3.17487\t2.31106\t24.4752\n", + "INFO:__main__:292\t21 \t10.8284\t4.50842\t2.31106\t26.8189\n", + "292\t21 \t10.8284\t4.50842\t2.31106\t26.8189\n", + "INFO:__main__:293\t17 \t12.5159\t5.06612\t2.31106\t26.8189\n", + "293\t17 \t12.5159\t5.06612\t2.31106\t26.8189\n", + "INFO:__main__:294\t19 \t10.9898\t3.4664 \t2.31106\t18.4258\n", + "294\t19 \t10.9898\t3.4664 \t2.31106\t18.4258\n", + "INFO:__main__:295\t12 \t10.972 \t2.90503\t2.31106\t16.4801\n", + "295\t12 \t10.972 \t2.90503\t2.31106\t16.4801\n", + "INFO:__main__:296\t12 \t10.8538\t4.02568\t2.31106\t16.4801\n", + "296\t12 \t10.8538\t4.02568\t2.31106\t16.4801\n", + "INFO:__main__:297\t14 \t10.9288\t4.10406\t2.31106\t26.3688\n", + "297\t14 \t10.9288\t4.10406\t2.31106\t26.3688\n", + "INFO:__main__:298\t16 \t11.5944\t4.6989 \t2.31106\t24.7227\n", + "298\t16 \t11.5944\t4.6989 \t2.31106\t24.7227\n", + "INFO:__main__:299\t22 \t11.4165\t4.31691\t2.31106\t20.9952\n", + "299\t22 \t11.4165\t4.31691\t2.31106\t20.9952\n", + "INFO:__main__:300\t12 \t13.0142\t4.82401\t2.31106\t21.886 \n", + "300\t12 \t13.0142\t4.82401\t2.31106\t21.886 \n", + "INFO:__main__:301\t18 \t10.5449\t4.93454\t2.31106\t22.3141\n", + "301\t18 \t10.5449\t4.93454\t2.31106\t22.3141\n", + "INFO:__main__:302\t12 \t9.46291\t3.2763 \t2.31106\t16.2756\n", + "302\t12 \t9.46291\t3.2763 \t2.31106\t16.2756\n", + "INFO:__main__:303\t18 \t11.2769\t4.53463\t2.31106\t32.1041\n", + "303\t18 \t11.2769\t4.53463\t2.31106\t32.1041\n", + "INFO:__main__:304\t16 \t11.4781\t4.5732 \t2.31106\t32.1041\n", + "304\t16 \t11.4781\t4.5732 \t2.31106\t32.1041\n", + "INFO:__main__:305\t12 \t9.13668\t4.05307\t2.31106\t14.7612\n", + "305\t12 \t9.13668\t4.05307\t2.31106\t14.7612\n", + "INFO:__main__:306\t14 \t10.6446\t3.04879\t2.31106\t19.9261\n", + "306\t14 \t10.6446\t3.04879\t2.31106\t19.9261\n", + "INFO:__main__:307\t17 \t11.7311\t3.65951\t2.31106\t23.7491\n", + "307\t17 \t11.7311\t3.65951\t2.31106\t23.7491\n", + "INFO:__main__:308\t23 \t11.116 \t4.78408\t2.31106\t33.1229\n", + "308\t23 \t11.116 \t4.78408\t2.31106\t33.1229\n", + "INFO:__main__:309\t14 \t11.2612\t2.8493 \t2.31106\t18.8069\n", + "309\t14 \t11.2612\t2.8493 \t2.31106\t18.8069\n", + "INFO:__main__:310\t21 \t11.1437\t3.9654 \t2.31106\t19.5804\n", + "310\t21 \t11.1437\t3.9654 \t2.31106\t19.5804\n", + "INFO:__main__:311\t14 \t12.1385\t4.56437\t2.31106\t22.9683\n", + "311\t14 \t12.1385\t4.56437\t2.31106\t22.9683\n", + "INFO:__main__:312\t17 \t9.99204\t3.94278\t2.31106\t22.2589\n", + "312\t17 \t9.99204\t3.94278\t2.31106\t22.2589\n", + "INFO:__main__:313\t14 \t11.325 \t4.29071\t2.31106\t20.7732\n", + "313\t14 \t11.325 \t4.29071\t2.31106\t20.7732\n", + "INFO:__main__:314\t15 \t10.6414\t4.55463\t2.31106\t20.2544\n", + "314\t15 \t10.6414\t4.55463\t2.31106\t20.2544\n", + "INFO:__main__:315\t17 \t12.1384\t5.29615\t2.31106\t29.1254\n", + "315\t17 \t12.1384\t5.29615\t2.31106\t29.1254\n", + "INFO:__main__:316\t16 \t10.6624\t4.57719\t2.31106\t18.9731\n", + "316\t16 \t10.6624\t4.57719\t2.31106\t18.9731\n", + "INFO:__main__:317\t18 \t11.6679\t4.18028\t1.74751\t25.1206\n", + "317\t18 \t11.6679\t4.18028\t1.74751\t25.1206\n", + "INFO:__main__:318\t10 \t9.47759\t4.17091\t1.74751\t20.4685\n", + "318\t10 \t9.47759\t4.17091\t1.74751\t20.4685\n", + "INFO:__main__:319\t14 \t11.2355\t4.46787\t1.74751\t22.3243\n", + "319\t14 \t11.2355\t4.46787\t1.74751\t22.3243\n", + "INFO:__main__:320\t20 \t11.7898\t4.48785\t1.74751\t21.9712\n", + "320\t20 \t11.7898\t4.48785\t1.74751\t21.9712\n", + "INFO:__main__:321\t19 \t12.8041\t4.87064\t1.74751\t27.5331\n", + "321\t19 \t12.8041\t4.87064\t1.74751\t27.5331\n", + "INFO:__main__:322\t16 \t11.7847\t4.69104\t1.74751\t23.2414\n", + "322\t16 \t11.7847\t4.69104\t1.74751\t23.2414\n", + "INFO:__main__:323\t14 \t12.4324\t4.50756\t1.74751\t22.3048\n", + "323\t14 \t12.4324\t4.50756\t1.74751\t22.3048\n", + "INFO:__main__:324\t12 \t12.635 \t3.80665\t1.74751\t19.6687\n", + "324\t12 \t12.635 \t3.80665\t1.74751\t19.6687\n", + "INFO:__main__:325\t11 \t12.0897\t5.57047\t1.74751\t23.7759\n", + "325\t11 \t12.0897\t5.57047\t1.74751\t23.7759\n", + "INFO:__main__:326\t14 \t14.7175\t5.46216\t1.74751\t23.3476\n", + "326\t14 \t14.7175\t5.46216\t1.74751\t23.3476\n", + "INFO:__main__:327\t19 \t11.8192\t5.58328\t1.74751\t27.7003\n", + "327\t19 \t11.8192\t5.58328\t1.74751\t27.7003\n", + "INFO:__main__:328\t12 \t12.9354\t4.98874\t1.74751\t23.3476\n", + "328\t12 \t12.9354\t4.98874\t1.74751\t23.3476\n", + "INFO:__main__:329\t22 \t11.301 \t4.66299\t1.74751\t19.9572\n", + "329\t22 \t11.301 \t4.66299\t1.74751\t19.9572\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:__main__:330\t13 \t11.4469\t4.13477\t1.74751\t20.0454\n", + "330\t13 \t11.4469\t4.13477\t1.74751\t20.0454\n", + "INFO:__main__:331\t23 \t13.1462\t5.08267\t1.74751\t27.3686\n", + "331\t23 \t13.1462\t5.08267\t1.74751\t27.3686\n", + "INFO:__main__:332\t16 \t12.3797\t6.60989\t1.74751\t27.3686\n", + "332\t16 \t12.3797\t6.60989\t1.74751\t27.3686\n", + "INFO:__main__:333\t17 \t11.1446\t6.82633\t1.73832\t27.3686\n", + "333\t17 \t11.1446\t6.82633\t1.73832\t27.3686\n", + "INFO:__main__:334\t13 \t9.01622\t5.74507\t1.73832\t27.3686\n", + "334\t13 \t9.01622\t5.74507\t1.73832\t27.3686\n", + "INFO:__main__:335\t16 \t13.051 \t7.18762\t1.73832\t29.4078\n", + "335\t16 \t13.051 \t7.18762\t1.73832\t29.4078\n", + "INFO:__main__:336\t8 \t7.76927\t3.7507 \t1.73832\t22.8513\n", + "336\t8 \t7.76927\t3.7507 \t1.73832\t22.8513\n", + "INFO:__main__:337\t15 \t10.9712\t5.18534\t1.73832\t22.8513\n", + "337\t15 \t10.9712\t5.18534\t1.73832\t22.8513\n", + "INFO:__main__:338\t18 \t9.49007\t4.6205 \t1.73832\t25.4293\n", + "338\t18 \t9.49007\t4.6205 \t1.73832\t25.4293\n", + "INFO:__main__:339\t20 \t8.98226\t5.38702\t1.73832\t31.2579\n", + "339\t20 \t8.98226\t5.38702\t1.73832\t31.2579\n", + "INFO:__main__:340\t17 \t6.71204\t3.50378\t1.73832\t16.4145\n", + "340\t17 \t6.71204\t3.50378\t1.73832\t16.4145\n", + "INFO:__main__:341\t22 \t10.7816\t4.03535\t1.73832\t24.9874\n", + "341\t22 \t10.7816\t4.03535\t1.73832\t24.9874\n", + "INFO:__main__:342\t16 \t8.29999\t2.48426\t1.73832\t17.5851\n", + "342\t16 \t8.29999\t2.48426\t1.73832\t17.5851\n", + "INFO:__main__:343\t13 \t9.66737\t3.26688\t1.73832\t17.5851\n", + "343\t13 \t9.66737\t3.26688\t1.73832\t17.5851\n", + "INFO:__main__:344\t16 \t9.24826\t4.48258\t1.73832\t26.6255\n", + "344\t16 \t9.24826\t4.48258\t1.73832\t26.6255\n", + "INFO:__main__:345\t15 \t12.1937\t8.07898\t1.73832\t30.3938\n", + "345\t15 \t12.1937\t8.07898\t1.73832\t30.3938\n", + "INFO:__main__:346\t17 \t10.8771\t7.87342\t1.73832\t30.7197\n", + "346\t17 \t10.8771\t7.87342\t1.73832\t30.7197\n", + "INFO:__main__:347\t11 \t9.96328\t4.67314\t1.73832\t23.693 \n", + "347\t11 \t9.96328\t4.67314\t1.73832\t23.693 \n", + "INFO:__main__:348\t16 \t8.94122\t4.28248\t1.73832\t24.5308\n", + "348\t16 \t8.94122\t4.28248\t1.73832\t24.5308\n", + "INFO:__main__:349\t17 \t7.45604\t3.85753\t1.73832\t21.8418\n", + "349\t17 \t7.45604\t3.85753\t1.73832\t21.8418\n", + "INFO:__main__:350\t23 \t9.05297\t4.15442\t1.73832\t22.9946\n", + "350\t23 \t9.05297\t4.15442\t1.73832\t22.9946\n", + "INFO:__main__:Run stopped because of stopping criteria: Max ngen\n", + "Run stopped because of stopping criteria: Max ngen\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "efel_filter_iterable = [\n", + " \"ISI_log_slope\",\n", + " \"mean_frequency\",\n", + " \"adaptation_index2\",\n", + " \"first_isi\",\n", + " \"ISI_CV\",\n", + " \"median_isi\",\n", + " \"Spikecount\",\n", + " \"all_ISI_values\",\n", + " \"ISI_values\",\n", + " \"time_to_first_spike\",\n", + " \"time_to_last_spike\",\n", + " \"time_to_second_spike\",\n", + " \"peak_voltage\",\n", + " \"AHP_depth\",\n", + " \"AHP_depth_abs\",\n", + " \"base_voltage\",\n", + " \"sag_amplitude\",\n", + " \"voltage_after_stim\",\n", + " \"spike_half_width\"\n", + " ]\n", + "obs_preds,opt,target = test_opt_relative_diff(specimen_id = 325479788,efel_filter_iterable=efel_filter_iterable)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
EFEL_feature_NU_test_Namepredictionobservationneuronunit_score
0ISI_log_slope0.4857040.504552Relative Difference = 0.02
1mean_frequency10.08629410.172940Relative Difference = 0.09
2adaptation_index20.0919430.093495Relative Difference = 0.00
3ISI_CV0.4760550.443410Relative Difference = 0.03
4Spikecount9.0000009.000000Relative Difference = 0.00
5all_ISI_values102.212500101.337500Relative Difference = 0.87
6ISI_values108.400000107.314286Relative Difference = 1.09
7time_to_first_spike74.60000074.000000Relative Difference = 0.60
8time_to_last_spike892.300000884.700000Relative Difference = 7.60
9time_to_second_spike133.500000133.500000Relative Difference = 0.00
10peak_voltage33.02777936.848803Relative Difference = 3.82
11AHP_depth24.57919924.499313Relative Difference = 0.08
12AHP_depth_abs-55.208334-54.865782Relative Difference = 0.34
13spike_01.0743851.074000Relative Difference = 0.00
14spike_11.1332801.133500Relative Difference = 0.00
15spike_21.2030801.198500Relative Difference = 0.00
16spike_31.2744201.270000Relative Difference = 0.00
17spike_41.3507501.350000Relative Difference = 0.00
18spike_51.4403451.441500Relative Difference = 0.00
19spike_61.5417401.549250Relative Difference = 0.01
20spike_71.6796451.683750Relative Difference = 0.00
21spike_81.8919951.884750Relative Difference = 0.01
\n", + "
" + ], + "text/plain": [ + " EFEL_feature_NU_test_Name prediction observation \\\n", + "0 ISI_log_slope 0.485704 0.504552 \n", + "1 mean_frequency 10.086294 10.172940 \n", + "2 adaptation_index2 0.091943 0.093495 \n", + "3 ISI_CV 0.476055 0.443410 \n", + "4 Spikecount 9.000000 9.000000 \n", + "5 all_ISI_values 102.212500 101.337500 \n", + "6 ISI_values 108.400000 107.314286 \n", + "7 time_to_first_spike 74.600000 74.000000 \n", + "8 time_to_last_spike 892.300000 884.700000 \n", + "9 time_to_second_spike 133.500000 133.500000 \n", + "10 peak_voltage 33.027779 36.848803 \n", + "11 AHP_depth 24.579199 24.499313 \n", + "12 AHP_depth_abs -55.208334 -54.865782 \n", + "13 spike_0 1.074385 1.074000 \n", + "14 spike_1 1.133280 1.133500 \n", + "15 spike_2 1.203080 1.198500 \n", + "16 spike_3 1.274420 1.270000 \n", + "17 spike_4 1.350750 1.350000 \n", + "18 spike_5 1.440345 1.441500 \n", + "19 spike_6 1.541740 1.549250 \n", + "20 spike_7 1.679645 1.683750 \n", + "21 spike_8 1.891995 1.884750 \n", + "\n", + " neuronunit_score \n", + "0 Relative Difference = 0.02 \n", + "1 Relative Difference = 0.09 \n", + "2 Relative Difference = 0.00 \n", + "3 Relative Difference = 0.03 \n", + "4 Relative Difference = 0.00 \n", + "5 Relative Difference = 0.87 \n", + "6 Relative Difference = 1.09 \n", + "7 Relative Difference = 0.60 \n", + "8 Relative Difference = 7.60 \n", + "9 Relative Difference = 0.00 \n", + "10 Relative Difference = 3.82 \n", + "11 Relative Difference = 0.08 \n", + "12 Relative Difference = 0.34 \n", + "13 Relative Difference = 0.00 \n", + "14 Relative Difference = 0.00 \n", + "15 Relative Difference = 0.00 \n", + "16 Relative Difference = 0.00 \n", + "17 Relative Difference = 0.00 \n", + "18 Relative Difference = 0.00 \n", + "19 Relative Difference = 0.01 \n", + "20 Relative Difference = 0.00 \n", + "21 Relative Difference = 0.01 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame(obs_preds)\n", + "df.rename(columns={0:'EFEL_feature_NU_test_Name',1:'prediction',2:'observation',3:'neuronunit_score'},inplace=True)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "check_bin_vm_soma(target,opt)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cmv_spikev_resetv_resttau_mabdelta_Ttau_wv_threshspike_delta
0911.98-34.31-55.09-79.3542.5810.6119.96.84352.52-22.641.15
\n", + "
" + ], + "text/plain": [ + " cm v_spike v_reset v_rest tau_m a b delta_T tau_w \\\n", + "0 911.98 -34.31 -55.09 -79.35 42.58 10.61 19.9 6.84 352.52 \n", + "\n", + " v_thresh spike_delta \n", + "0 -22.6 41.15 " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "opt.attrs_to_params()\n", + "params = pd.DataFrame([opt.params])\n", + "params\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Other EFEL features to try:\n", + "```\n", + "*\"peak_voltage\",\n", + "*\"AHP_depth\",\n", + "*\"AHP_depth_abs\",\n", + "*\"base_voltage\",\n", + "*\"sag_amplitude\",\n", + "*\"voltage_after_stim\",\n", + "*\"spike_half_width\"\n", + "*\"voltage_after_stim\"\n", + "These features all relate to spike shape.\n", + "```" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/neuronunit/nb_utils.py b/examples/neuronunit/nb_utils.py new file mode 100644 index 00000000..cc7e8f38 --- /dev/null +++ b/examples/neuronunit/nb_utils.py @@ -0,0 +1,81 @@ +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +import quantities as qt +import os + +from neuronunit.allenapi.allen_data_driven import opt_exec +from neuronunit.allenapi.allen_data_driven import opt_to_model, wrap_setups +from neuronunit.allenapi.utils import dask_map_function +from neuronunit.optimization.model_parameters import ( + MODEL_PARAMS, + BPO_PARAMS, + to_bpo_param, +) +from neuronunit.optimization.optimization_management import inject_and_plot_model + +#from neuronunit.optimization.data_transport_container import DataTC +from jithub.models import model_classes + +from sciunit.scores import RelativeDifferenceScore, ZScore +from sciunit.utils import config_set + +config_set("PREVALIDATE", False) + +SILENT = True +import warnings + +if SILENT: + warnings.filterwarnings("ignore") + + +def rounding(params): + for k,v in params.items(): + if np.round(v, 1) != 0: + params[k] = np.round(v, 1) + return params + +def optimize_job( + specimen_id, + model_type, + score_type=RelativeDifferenceScore, + efel_filter_iterable=None,NGEN = 100, MU=20 +): + find_sweep_with_n_spikes = 8 + + if model_type is str("ADEXP"): + from jithub.models.model_classes import ADEXPModel + model = ADEXPModel() + if model_type is str("IZHI"): + from jithub.models.model_classes import IzhiModel + model = IzhiModel() + + model.params = BPO_PARAMS[model_type] + fixed_current = 122 *qt.pA + + mapping_funct = dask_map_function + [ cell_evaluator, + simple_cell, + suite, + target_current, + spk_count ] = wrap_setups( + specimen_id, + model_type, + find_sweep_with_n_spikes, + template_model=model, + fixed_current=False, + cached=False, + score_type=score_type, + efel_filter_iterable=efel_filter_iterable + + ) + final_pop, hall_of_fame, logs, hist = opt_exec( + MU, NGEN, mapping_funct, cell_evaluator,neuronunit=True + ) + opt, target, scores, obs_preds, df = opt_to_model( + hall_of_fame, cell_evaluator, suite, target_current, spk_count + ) + best_ind = hall_of_fame[0] + fitnesses = cell_evaluator.evaluate_with_lists(best_ind) + target.vm_soma = suite.traces["vm_soma"] + return np.sum(fitnesses), scores, obs_preds, opt, target,hall_of_fame,cell_evaluator diff --git a/install_neuron.sh b/install_neuron.sh new file mode 100755 index 00000000..f0929a49 --- /dev/null +++ b/install_neuron.sh @@ -0,0 +1,42 @@ +#!/bin/sh + +set -e + +SRC_DIR=$1 +INSTALL_DIR=$2 +#PYTHON_BIN=$3 +PYTHON_BIN="$(which python)" + +if [ ! -e ${INSTALL_DIR}/.install_finished ] +then + echo 'Neuron was not fully installed in previous build, installing ...' + mkdir -p ${SRC_DIR} + cd ${SRC_DIR} + echo "Downloading NEURON ..." + rm -rf nrn + git clone --depth 1 https://github.com/neuronsimulator/nrn.git >download.log 2>&1 + cd nrn + echo "Preparing NEURON ..." + ./build.sh >prepare.log 2>&1 + echo "Configuring NEURON ..." + + PYTHON_BLD=${PYTHON_BIN} ./configure --prefix=${INSTALL_DIR} --without-x --with-nrnpython=${PYTHON_BIN} --disable-rx3d >configure.log 2>&1 + echo "Building NEURON ..." + make -j4 #>make.log 2>&1 + #cat make.log + echo "Installing NEURON ..." + make -j4 install #>install.log 2>&1 + #cat install.log + #export PATH="${INSTALL_DIR}/x86_64/bin":${PATH} + #export PYTHONPATH="${INSTALL_DIR}/lib/python":${PYTHONPATH} + #${PYTHON_BIN} -c "import neuron" + #${PYTHON_BIN}-c "from neuron import h" + + + #echo "Testing NEURON import ...." + #${PYTHON_BIN} -c 'import neuron' >testimport.log 2>&1 + #touch -f ${INSTALL_DIR}/.install_finished + #echo "NEURON successfully installed" +else + echo 'Neuron was successfully installed in previous build, not rebuilding' +fi diff --git a/reduced_cell_install.sh b/reduced_cell_install.sh new file mode 100644 index 00000000..946c9e59 --- /dev/null +++ b/reduced_cell_install.sh @@ -0,0 +1,21 @@ +apt-get update +apt-get install -y gcc +apt-get install -y libx11-6 python-dev git build-essential +apt-get install -y autoconf automake g++ make gfortran +apt-get install -y python-tables +# for hdf5 allensdk +apt-get install -y libhdf5-serial-dev +wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh +bash miniconda.sh -b -p $HOME/miniconda +export PATH="$HOME/miniconda/bin:$PATH" +conda config --set always_yes yes --set changeps1 no +conda update -q --all +conda config --add channels conda-forge +conda config --set always_yes true +conda config --set quiet true +conda install conda-build +conda install scipy; +conda install numpy; +conda install numba; +conda install dask; +conda install -c conda-forge pynwb diff --git a/requirements_docs.txt b/requirements_docs.txt new file mode 100644 index 00000000..72ef1d11 --- /dev/null +++ b/requirements_docs.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2016-2021, EPFL/Blue Brain Project +# +# This file is part of BluePyOpt +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License version 3.0 as published +# by the Free Software Foundation. +# This library 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 Lesser General Public License for more +# details. +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +sphinx>=2.0.0 +sphinx-bluebrain-theme +sphinx-autorun \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index f6818e5d..142da96c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -5,8 +5,6 @@ [versioneer] VCS = git -style = pep440-minor +style = pep440-minor versionfile_source = bluepyopt/_version.py versionfile_build = bluepyopt/_version.py -tag_prefix = -parentdir_prefix = diff --git a/setup.py b/setup.py index 1640d99a..402220a7 100644 --- a/setup.py +++ b/setup.py @@ -22,22 +22,42 @@ import setuptools import versioneer +#version=versioneer.get_version(), +#cmdclass=versioneer.get_cmdclass(), setuptools.setup( name="bluepyopt", - version=versioneer.get_version(), - cmdclass=versioneer.get_cmdclass(), install_requires=[ - 'numpy>=1.6', - 'pandas>=0.18', - 'deap', - 'efel>=2.13', - 'scoop>=0.7', - 'ipyparallel', - 'pickleshare>=0.7.3', - 'Jinja2>=2.8', - 'future', - 'Pebble>=4.3.10'], + "numpy>=1.6", + "pandas>=0.18", + "deap", + "pickleshare>=0.7.3", + "Jinja2>=2.8", + "future", + "Pebble>=4.3.10", + "scipy", + "numpy", + "cython", + "seaborn", + "sklearn", + "frozendict", + "efel"], + + extras_require={'neo': ['neo[neomatlabio]>=0.5.1'], + 'sciunit':['sciunit==0.2.3'], + 'numba':['numba==0.45.1'], + 'dask':['dask==2.5.2'], + 'streamlit':['streamlit'], + 'tqdm':['tqdm==4.48.2'], + 'neuronunit': ['neuronunit @ git+https://github.com/russelljjarvis/neuronunit@optimization'], + 'jithub': ['jithub @ git+https://github.com/russelljjarvis/jit_hub@neuronunit'], + 'sciunit': ['sciunit @ git+https://github.com/russelljjarvis/sciunit@dev'], + 'allensdk':['allensdk==0.16.3'], + 'pynwb':['pynwb']}, + + + + packages=setuptools.find_packages( exclude=( 'examples', diff --git a/tox.ini b/tox.ini index 67b809c0..18298a89 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,6 @@ [tox] envlist = py{27,3}-{unit,functional,style} + [gh-actions] python = 2.7: py27 @@ -7,16 +8,19 @@ python = 3.7: py3 3.8: py3 3.9: py3 + [testenv] envdir = py27{-unit,-functional,-style,-syntax}: {toxworkdir}/py27 py3{5,6,7,8,}{-unit,-functional,-style,-syntax}: {toxworkdir}/py3 + docs: {toxworkdir}/docs deps = coverage flake8 mock nose sh + pathlib download = true whitelist_externals = make @@ -30,14 +34,36 @@ setenv = TOX_ENVBINDIR={envbindir} TOX_NRNBINDIR=../.tox-neuronpy/local/x86_64/bin/ commands = - make clean - ./.install_neuron.sh {env:TOX_NRNDIR}/src {env:TOX_NRNDIR}/local {basepython} + #make clean + #./.install_neuron.sh {env:TOX_NRNDIR}/src {env:TOX_NRNDIR}/local {basepython} + bash tox_ci_build.sh + pip install pynwb + pip install git+https://github.com/russelljjarvis/jit_hub@neuronunit + pip install git+https://github.com/russelljjarvis/neuronunit@optimization + pip install git+https://github.com/russelljjarvis/sciunit@dev + # pip install git+https://github.com/russelljjarvis/eFEL + pip install . + pip install git+https://github.com/russelljjarvis/eFEL - make toxbinlinks + + syntax: flake8 . --count --select=E9,F63,F72,F82 --show-source --statistics + unit: python bluepyopt/tests/test_numba_models.py # --with-coverage --cover-xml --cover-xml-file=cov_reports/unit.coverage.xml --cover-html --cover-html-dir=cov_reports/html/unit --cover-package bluepyopt + unit: python bluepyopt/tests/test_rheobase_model.py # --with-coverage --cover-xml --cover-xml-file=cov_reports/unit.coverage.xml --cover-html --cover-html-dir=cov_reports/html/unit --cover-package bluepyopt + unit: python bluepyopt/tests/test_scores_unit.py # --with-coverage --cover-xml --cover-xml-file=cov_reports/unit.coverage.xml --cover-html --cover-html-dir=cov_reports/html/unit --cover-package bluepyopt + unit: python bluepyopt/tests/test_adexp_opt.py # --with-coverage --cover-xml --cover-xml-file=cov_reports/unit.coverage.xml --cover-html --cover-html-dir=cov_reports/html/unit --cover-package bluepyopt functional: make stochkv_prepare l5pc_prepare sc_prepare meta_prepare style: pycodestyle --ignore=E402,W503,W504 bluepyopt syntax: flake8 . --count --select=E9,F63,F72,F82 --show-source --statistics - unit: nosetests -vx -a unit --with-coverage --cover-package bluepyopt --cover-xml --cover-xml-file=cov_reports/unit.coverage.xml --cover-html --cover-html-dir=cov_reports/html/unit [] functional: nosetests -vx -a !unit --with-coverage --cover-package bluepyopt --cover-xml --cover-xml-file=cov_reports/functional.coverage.xml --cover-html --cover-html-dir=cov_reports/html/functional [] + + +[testenv:docs] +basepython = python3.6 +changedir = docs +deps = + sphinx + sphinx-bluebrain-theme +commands = make html SPHINXOPTS=-W +whitelist_externals = make