Repository: Total-RD/pymgrid Branch: master Commit: 7bf39516e1e9 Files: 181 Total size: 1.5 MB Directory structure: gitextract_21zgo62z/ ├── .gitattributes ├── .github/ │ └── workflows/ │ ├── build.yml │ ├── documentation-links.yaml │ └── garage-compat.yml ├── .gitignore ├── .readthedocs.yaml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── MANIFEST.in ├── README.md ├── docs/ │ ├── Makefile │ ├── make.bat │ ├── requirements.txt │ └── source/ │ ├── _templates/ │ │ └── autosummary/ │ │ ├── base.rst │ │ └── class.rst │ ├── conf.py │ ├── examples/ │ │ ├── index.rst │ │ ├── mpc-example.nblink │ │ ├── quick-start.nblink │ │ ├── rbc-example.nblink │ │ └── rl-example.nblink │ ├── getting_started.rst │ ├── index.rst │ └── reference/ │ ├── algos/ │ │ └── index.rst │ ├── envs/ │ │ └── index.rst │ ├── forecast/ │ │ └── index.rst │ ├── general/ │ │ └── index.rst │ ├── index.rst │ ├── microgrid.rst │ └── modules/ │ └── index.rst ├── pymgrid 25 - benchmarks.xlsx ├── pyproject.toml ├── requirements.txt ├── setup.cfg ├── setup.py ├── src/ │ ├── __init__.py │ └── pymgrid/ │ ├── MicrogridGenerator.py │ ├── __init__.py │ ├── _deprecated/ │ │ ├── Environments/ │ │ │ ├── Environment.py │ │ │ ├── Preprocessing.py │ │ │ ├── __init__.py │ │ │ ├── pymgrid_csca.py │ │ │ ├── pymgrid_csca_old.py │ │ │ ├── pymgrid_csda.py │ │ │ └── pymgrid_cspla.py │ │ ├── __init__.py │ │ └── non_modular_microgrid.py │ ├── algos/ │ │ ├── Control.py │ │ ├── __init__.py │ │ ├── example.log │ │ ├── mpc/ │ │ │ ├── __init__.py │ │ │ └── mpc.py │ │ ├── priority_list/ │ │ │ ├── __init__.py │ │ │ ├── priority_list.py │ │ │ └── priority_list_element.py │ │ ├── rbc/ │ │ │ ├── __init__.py │ │ │ ├── _nonmodular_rbc.py │ │ │ └── rbc.py │ │ └── saa/ │ │ ├── __init__.py │ │ └── saa.py │ ├── convert/ │ │ ├── __init__.py │ │ ├── convert.py │ │ ├── get_module.py │ │ └── to_nonmodular_ops.py │ ├── data/ │ │ ├── __init__.py │ │ ├── co2/ │ │ │ ├── __init__.py │ │ │ ├── co2_caiso.csv │ │ │ └── co2_duke.csv │ │ ├── load/ │ │ │ ├── RefBldgFullServiceRestaurantNew2004_v1.3_7.1_6A_USA_MN_MINNEAPOLIS.csv │ │ │ ├── RefBldgHospitalNew2004_7.1_5.0_3C_USA_CA_SAN_FRANCISCO.csv │ │ │ ├── RefBldgLargeHotelNew2004_v1.3_7.1_4A_USA_MD_BALTIMORE.csv │ │ │ ├── RefBldgLargeOfficeNew2004_v1.3_7.1_5A_USA_IL_CHICAGO-OHARE.csv │ │ │ ├── RefBldgPrimarySchoolNew2004_v1.3_7.1_2A_USA_TX_HOUSTON.csv │ │ │ └── __init__.py │ │ ├── pv/ │ │ │ ├── Houston_722430TYA.csv │ │ │ ├── Minneapolis_726580TYA.csv │ │ │ ├── NewYork_744860TYA.csv │ │ │ ├── Raleigh_723060TYA.csv │ │ │ ├── SanFrancisco_724940TYA.csv │ │ │ └── __init__.py │ │ └── scenario/ │ │ ├── __init__.py │ │ └── pymgrid25/ │ │ ├── microgrid_0/ │ │ │ └── microgrid_0.yaml │ │ ├── microgrid_1/ │ │ │ └── microgrid_1.yaml │ │ ├── microgrid_10/ │ │ │ └── microgrid_10.yaml │ │ ├── microgrid_11/ │ │ │ └── microgrid_11.yaml │ │ ├── microgrid_12/ │ │ │ └── microgrid_12.yaml │ │ ├── microgrid_13/ │ │ │ └── microgrid_13.yaml │ │ ├── microgrid_14/ │ │ │ └── microgrid_14.yaml │ │ ├── microgrid_15/ │ │ │ └── microgrid_15.yaml │ │ ├── microgrid_16/ │ │ │ └── microgrid_16.yaml │ │ ├── microgrid_17/ │ │ │ └── microgrid_17.yaml │ │ ├── microgrid_18/ │ │ │ └── microgrid_18.yaml │ │ ├── microgrid_19/ │ │ │ └── microgrid_19.yaml │ │ ├── microgrid_2/ │ │ │ └── microgrid_2.yaml │ │ ├── microgrid_20/ │ │ │ └── microgrid_20.yaml │ │ ├── microgrid_21/ │ │ │ └── microgrid_21.yaml │ │ ├── microgrid_22/ │ │ │ └── microgrid_22.yaml │ │ ├── microgrid_23/ │ │ │ └── microgrid_23.yaml │ │ ├── microgrid_24/ │ │ │ └── microgrid_24.yaml │ │ ├── microgrid_3/ │ │ │ └── microgrid_3.yaml │ │ ├── microgrid_4/ │ │ │ └── microgrid_4.yaml │ │ ├── microgrid_5/ │ │ │ └── microgrid_5.yaml │ │ ├── microgrid_6/ │ │ │ └── microgrid_6.yaml │ │ ├── microgrid_7/ │ │ │ └── microgrid_7.yaml │ │ ├── microgrid_8/ │ │ │ └── microgrid_8.yaml │ │ └── microgrid_9/ │ │ └── microgrid_9.yaml │ ├── envs/ │ │ ├── __init__.py │ │ ├── base/ │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ └── skip_init.py │ │ ├── continuous/ │ │ │ ├── __init__.py │ │ │ └── continuous.py │ │ └── discrete/ │ │ ├── __init__.py │ │ └── discrete.py │ ├── forecast/ │ │ ├── __init__.py │ │ └── forecaster.py │ ├── microgrid/ │ │ ├── __init__.py │ │ ├── microgrid.py │ │ ├── reward_shaping/ │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── battery_discharge_shaper.py │ │ │ └── pv_curtailment_shaper.py │ │ ├── trajectory/ │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── deterministic.py │ │ │ └── stochastic.py │ │ └── utils/ │ │ ├── __init__.py │ │ └── step.py │ ├── modules/ │ │ ├── __init__.py │ │ ├── base/ │ │ │ ├── __init__.py │ │ │ ├── base_module.py │ │ │ └── timeseries/ │ │ │ ├── __init__.py │ │ │ └── base_timeseries_module.py │ │ ├── battery_module.py │ │ ├── genset_module.py │ │ ├── grid_module.py │ │ ├── load_module.py │ │ ├── module_container.py │ │ ├── renewable_module.py │ │ └── unbalanced_energy_module.py │ ├── utils/ │ │ ├── DataGenerator.py │ │ ├── __init__.py │ │ ├── logger.py │ │ ├── ray.py │ │ ├── serialize.py │ │ └── space.py │ └── version.py └── tests/ ├── __init__.py ├── conftest.py ├── control/ │ ├── __init__.py │ ├── data_generation/ │ │ ├── __init__.py │ │ └── test_data_generator.py │ ├── test_control.py │ ├── test_mpc.py │ └── test_rbc.py ├── envs/ │ ├── __init__.py │ ├── test_discrete.py │ └── test_trajectory.py ├── helpers/ │ ├── __init__.py │ ├── genset_module_testing_utils.py │ ├── modular_microgrid.py │ └── test_case.py ├── microgrid/ │ ├── __init__.py │ ├── modules/ │ │ ├── __init__.py │ │ ├── container_tests/ │ │ │ ├── __init__.py │ │ │ └── test_container.py │ │ ├── conversion_test/ │ │ │ ├── __init__.py │ │ │ └── test_modular_conversion.py │ │ ├── forecaster_tests/ │ │ │ ├── __init__.py │ │ │ └── test_forecaster.py │ │ └── module_tests/ │ │ ├── test_genset_long_status_changes.py │ │ ├── test_genset_module.py │ │ ├── test_genset_module_start_up_1_wind_down_1.py │ │ ├── test_load_module.py │ │ ├── test_renewable_module.py │ │ └── timeseries_modules.py │ ├── serialize/ │ │ └── test_microgrid_serialization.py │ └── test_microgrid.py ├── test_microgridgenerator.py └── test_nonmodular_microgrid.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ *.ipynb linguist-vendored ================================================ FILE: .github/workflows/build.yml ================================================ # This workflow will install Python dependencies, run tests and lint with a variety of Python versions # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions name: build on: push: branches: [ "master" ] pull_request: branches: [ "master" ] jobs: build: runs-on: ubuntu-latest strategy: fail-fast: false matrix: python-version: ["3.8", "3.9", "3.10"] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v3 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip python -m pip install flake8 pytest if [ -f requirements.txt ]; then pip install -r requirements.txt; fi pip install -e .'[dev]' - name: Lint with flake8 run: | # stop the build if there are Python syntax errors or undefined names flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with pytest run: | pip install pytest pip install pytest-cov pip install pytest-subtests pytest tests/ --doctest-modules --junitxml=junit/test-results.xml --cov=com --cov-report=xml --cov-report=html ================================================ FILE: .github/workflows/documentation-links.yaml ================================================ # .github/workflows/documentation-links.yaml name: Read the Docs Pull Request Preview on: pull_request_target: types: - opened permissions: pull-requests: write jobs: documentation-links: runs-on: ubuntu-latest steps: - uses: readthedocs/actions/preview@v1 with: project-slug: "pymgrid" ================================================ FILE: .github/workflows/garage-compat.yml ================================================ # This workflow will install Python dependencies, run tests and lint with a variety of Python versions # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions name: garage-compat on: push: branches: [ "master" ] pull_request: branches: [ "master" ] jobs: build: runs-on: ubuntu-latest strategy: fail-fast: false matrix: python-version: ["3.8", "3.9"] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v3 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip python -m pip install flake8 pytest if [ -f requirements.txt ]; then pip install -r requirements.txt; fi pip install -e .'[dev]' - name: Get garage VERSION uses: wei/wget@v1 with: args: -O VERSION https://raw.githubusercontent.com/rlworkgroup/garage/master/VERSION - name: Get garage README.md uses: wei/wget@v1 with: args: -O README.md https://raw.githubusercontent.com/rlworkgroup/garage/master/README.md - name: Get garage setup.py uses: wei/wget@v1 with: args: -O garage_setup.py https://raw.githubusercontent.com/rlworkgroup/garage/master/setup.py - name: Extract garage dependencies run: | python -m garage_setup egg_info in_all=false while IFS= read -r line; do if [[ "$line" == *"[all]"* ]]; then in_all=true elif [[ "$line" == \[* ]]; then in_all=false elif [[ $in_all == true ]]; then echo $"$line" >> src/garage.egg-info/requires_all.txt fi done < "src/garage.egg-info/requires.txt" - name: Install garage dependencies run: | sudo apt install libopenmpi-dev cat src/garage.egg-info/requires_all.txt python -m pip install -r src/garage.egg-info/requires_all.txt - name: Lint with flake8 run: | # stop the build if there are Python syntax errors or undefined names flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with pytest run: | pip install pytest pip install pytest-cov pip install pytest-subtests pytest tests/ --doctest-modules --junitxml=junit/test-results.xml --cov=com --cov-report=xml --cov-report=html ================================================ FILE: .gitignore ================================================ #Ignore what is not python code notebooks/ .DS_STORE .idea *.pkl pymgrid/__pycache__/ *.ipynb .ipynb_checkpoints __pycache__/ .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ docs/source/reference/api/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST *sandbox.py ================================================ FILE: .readthedocs.yaml ================================================ # .readthedocs.yaml # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Set the version of Python and other tools you might need build: os: ubuntu-20.04 tools: python: "3.8" sphinx: configuration: docs/source/conf.py python: install: - method: pip path: . extra_requirements: - all formats: - pdf ================================================ FILE: CHANGELOG.md ================================================ ================================================ FILE: CONTRIBUTING.md ================================================ ================================================ FILE: LICENSE ================================================ GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. ================================================ FILE: MANIFEST.in ================================================ global-include *.csv global-include *.pkl ================================================ FILE: README.md ================================================ # pymgrid ## Important Notice ### The person that has been maintaining pymgrid since 2020 has moved future development to [python-microgrid](https://github.com/ahalev/python-microgrid) for the foreseeable future, a drop in replacement for pymgrid, and pymgrid may not be receiving any future updates. Please open any new issues in python-microgrid. ![Build](https://github.com/Total-RD/pymgrid/workflows/build/badge.svg?dummy=unused) pymgrid (PYthon MicroGRID) is a python library to generate and simulate a large number of microgrids. For more context, please see the [presentation](https://www.climatechange.ai/papers/neurips2020/3) done at Climate Change AI and the [documentation](https://pymgrid.readthedocs.io). ## Installation The easiest way to install pymgrid is with pip: `pip install -U pymgrid` Alternatively, you can install from source. First clone the repo: ```bash git clone https://github.com/Total-RD/pymgrid.git ``` Then navigate to the root directory of pymgrid and call ```bash pip install . ``` ## Getting Started Microgrids are straightforward to generate from scratch. Simply define some modules and pass them to a microgrid: ```python import numpy as np from pymgrid import Microgrid from pymgrid.modules import GensetModule, BatteryModule, LoadModule, RenewableModule genset = GensetModule(running_min_production=10, running_max_production=50, genset_cost=0.5) battery = BatteryModule(min_capacity=0, max_capacity=100, max_charge=50, max_discharge=50, efficiency=1.0, init_soc=0.5) # Using random data renewable = RenewableModule(time_series=50*np.random.rand(100)) load = LoadModule(time_series=60*np.random.rand(100), loss_load_cost=10) microgrid = Microgrid([genset, battery, ("pv", renewable), load]) ``` This creates a microgrid with the modules defined above, as well as an unbalanced energy module -- which reconciles situations when energy demand cannot be matched to supply. Printing the microgrid gives us its architecture: ```python >> microgrid Microgrid([genset x 1, load x 1, battery x 1, pv x 1, balancing x 1]) ``` A microgrid is contained of fixed modules and flex modules. Some modules can be both -- `GridModule`, for example -- but not at the same time. A *fixed* module has requires a request of a certain amount of energy ahead of time, and then attempts to produce or consume said amount. `LoadModule` is an example of this; you must tell it to consume a certain amount of energy and it will then do so. A *flex* module, on the other hand, is able to adapt to meet demand. `RenewableModule` is an example of this as it allows for curtailment of any excess renewable produced. A microgrid will tell you which modules are which: ```python >> microgrid.fixed_modules { "genset": "[GensetModule(running_min_production=10, running_max_production=50, genset_cost=0.5, co2_per_unit=0, cost_per_unit_co2=0, start_up_time=0, wind_down_time=0, allow_abortion=True, init_start_up=True, raise_errors=False, provided_energy_name=genset_production)]", "load": "[LoadModule(time_series=, loss_load_cost=10, forecaster=NoForecaster, forecast_horizon=0, forecaster_increase_uncertainty=False, raise_errors=False)]", "battery": "[BatteryModule(min_capacity=0, max_capacity=100, max_charge=50, max_discharge=50, efficiency=1.0, battery_cost_cycle=0.0, battery_transition_model=None, init_charge=None, init_soc=0.5, raise_errors=False)]" } >>microgrid.flex_modules { "pv": "[RenewableModule(time_series=, raise_errors=False, forecaster=NoForecaster, forecast_horizon=0, forecaster_increase_uncertainty=False, provided_energy_name=renewable_used)]", "balancing": "[UnbalancedEnergyModule(raise_errors=False, loss_load_cost=10, overgeneration_cost=2)]" } ``` Running the microgrid is straightforward. Simply pass an action for each fixed module to `microgrid.run`. The microgrid can also provide you a random action by calling `microgrid.sample_action.` Once the microgrid has been run for a certain number of steps, results can be viewed by calling microgrid.get_log. ```python >> for j in range(10): >> action = microgrid.sample_action(strict_bound=True) >> microgrid.run(action) >> microgrid.get_log(drop_singleton_key=True) genset ... balance reward ... fixed_absorbed_by_microgrid 0 -5.000000 ... 10.672095 1 -14.344353 ... 50.626726 2 -5.000000 ... 17.538018 3 -0.000000 ... 15.492778 4 -0.000000 ... 35.748724 5 -0.000000 ... 30.302300 6 -5.000000 ... 36.451662 7 -0.000000 ... 66.533872 8 -0.000000 ... 20.645077 9 -0.000000 ... 10.632957 ``` ## Benchmarking `pymgrid` also comes pre-packaged with a set of 25 microgrids for benchmarking. The config files for these microgrids are available in `data/scenario/pymgrid25`. Simply deserialize one of the yaml files to load one of the saved microgrids; for example, to load the zeroth microgrid: ```python import yaml from pymgrid import PROJECT_PATH yaml_file = PROJECT_PATH / 'data/scenario/pymgrid25/microgrid_0/microgrid_0.yaml' microgrid = yaml.safe_load(yaml_file.open('r')) ``` Alternatively, `Microgrid.load(yaml_file.open('r'))` will perform the same deserialization. ## Citation If you use this package for your research, please cite the following paper: @misc{henri2020pymgrid, title={pymgrid: An Open-Source Python Microgrid Simulator for Applied Artificial Intelligence Research}, author={Gonzague Henri, Tanguy Levent, Avishai Halev, Reda Alami and Philippe Cordier}, year={2020}, eprint={2011.08004}, archivePrefix={arXiv}, primaryClass={cs.AI} } You can find it on Arxiv here: https://arxiv.org/abs/2011.08004 ## Data Data in pymgrid are based on TMY3 (data based on representative weather). The PV data comes from DOE/NREL/ALLIANCE (https://nsrdb.nrel.gov/about/tmy.html) and the load data comes from OpenEI (https://openei.org/doe-opendata/dataset/commercial-and-residential-hourly-load-profiles-for-all-tmy3-locations-in-the-united-states) The CO2 data is from Jacque de Chalendar and his gridemissions API. ## Contributing Pull requests are welcome for bug fixes. For new features, please open an issue first to discuss what you would like to add. Please make sure to update tests as appropriate. ## License This repo is under a GNU LGPL 3.0 (https://github.com/total-sa/pymgrid/edit/master/LICENSE) ================================================ FILE: docs/Makefile ================================================ # Minimal makefile for Sphinx documentation # # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build SOURCEDIR = source BUILDDIR = build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) ================================================ FILE: docs/make.bat ================================================ @ECHO OFF pushd %~dp0 REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set SOURCEDIR=source set BUILDDIR=build %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.https://www.sphinx-doc.org/ exit /b 1 ) if "%1" == "" goto help %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% goto end :help %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% :end popd ================================================ FILE: docs/requirements.txt ================================================ nbsphinx==0.8.10 nbsphinx-link==1.3.0 numpydoc==1.5.0 pydata_sphinx_theme==0.12.0 Sphinx==5.3.0 ================================================ FILE: docs/source/_templates/autosummary/base.rst ================================================ {{ objname | escape | underline }} .. currentmodule:: {{ module }} .. auto{{ objtype }}:: {{ objname }} ================================================ FILE: docs/source/_templates/autosummary/class.rst ================================================ {{ fullname | escape | underline}} .. currentmodule:: {{ module }} .. autoclass:: {{ objname }} {% block methods %} {% if methods %} .. rubric:: {{ _('Methods') }} .. autosummary:: :toctree: generated/ {% for item in methods %} {% if item != "__init__" %} ~{{ name }}.{{ item }} {% endif %} {%- endfor %} {% endif %} {% endblock %} {% block attributes %} {% if attributes %} .. rubric:: {{ _('Attributes') }} .. autosummary:: :toctree: generated/ {% for item in attributes %} ~{{ name }}.{{ item }} {%- endfor %} {% endif %} {% endblock %} ================================================ FILE: docs/source/conf.py ================================================ # Configuration file for the Sphinx documentation builder. # # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html import inspect import os import sys from copy import deepcopy from builtins import object import pymgrid # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information project = 'pymgrid' copyright = '2022, TotalEnergies' author = 'Avishai Halev' release = pymgrid.__version__ version = pymgrid.__version__ # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration extensions = [ 'sphinx.ext.duration', 'sphinx.ext.autodoc', 'sphinx.ext.coverage', 'sphinx.ext.autosummary', 'sphinx.ext.doctest', 'sphinx.ext.linkcode', 'sphinx.ext.intersphinx', 'sphinx.ext.mathjax', 'nbsphinx', 'nbsphinx_link', 'IPython.sphinxext.ipython_console_highlighting' ] templates_path = ['_templates'] exclude_patterns = [] # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output html_theme = 'pydata_sphinx_theme' html_theme_options = { "primary_sidebar_end": ["indices.html", "sidebar-ethical-ads.html"], "logo": { "image_light": "logo-light.png", "image_dark": "logo-dark.png", }, "icon_links": [ { "name": "GitHub", "url": "https://github.com/Total-RD/pymgrid", "icon": "fa-brands fa-github", }, { "name": "PyPI", "url": "https://pypi.org/project/pymgrid/", "icon": "fa-solid fa-box", } ] } html_static_path = ['_static'] # These are attributes that don't have a __doc__ attribute to read ':meta private:' from. skip_members = [ 'yaml_flow_style', 'metadata', 'render_mode', 'reward_range', 'spec' ] def autodoc_skip_member(app, what, name, obj, skip, options): if name in skip_members: return True try: doc = obj.__doc__ except AttributeError: return None if doc is not None and ':meta private:' in doc: return True return None def autodoc_process_signature(app, what, name, obj, options, signature, return_annotation): """ If a class signature is being read from cls.__new__, we want to replace it with the signature from cls.__init__. """ if what == 'class' and signature[1:] in str(inspect.signature(obj.__new__)): obj_copy = deepcopy(obj) obj_copy.__new__ = object.__new__ signature = str(inspect.signature(obj_copy)) return signature, return_annotation def linkcode_resolve(domain, info): """ Determine the URL corresponding to Python object """ if domain != "py": return None modname = info["module"] fullname = info["fullname"] submod = sys.modules.get(modname) if submod is None: return None obj = submod for part in fullname.split("."): try: obj = getattr(obj, part) except AttributeError: return None try: fn = inspect.getsourcefile(inspect.unwrap(obj)) except TypeError: try: # property fn = inspect.getsourcefile(inspect.unwrap(obj.fget)) except (AttributeError, TypeError): fn = None if not fn: return None try: source, lineno = inspect.getsourcelines(obj) except TypeError: try: # property source, lineno = inspect.getsourcelines(obj.fget) except (AttributeError, TypeError): lineno = None except OSError: lineno = None if lineno: linespec = f"#L{lineno}-L{lineno + len(source) - 1}" else: linespec = "" fn = os.path.relpath(fn, start=os.path.dirname(pymgrid.__file__)) return f'https://github.com/Total-RD/pymgrid/tree/v{pymgrid.__version__}/src/pymgrid/{fn}{linespec}' intersphinx_mapping = { 'gym': ('https://www.gymlibrary.dev/', None) } def setup(app): app.connect('autodoc-skip-member', autodoc_skip_member) app.connect('autodoc-process-signature', autodoc_process_signature) ================================================ FILE: docs/source/examples/index.rst ================================================ Examples ======== To run the examples, clone the repository: .. code-block:: bash $ git clone https://github.com/Total-RD/pymgrid.git and use `Jupyter `_ to open any notebook in the :code:`notebooks` directory. .. toctree:: :maxdepth: 2 quick-start rbc-example mpc-example rl-example ================================================ FILE: docs/source/examples/mpc-example.nblink ================================================ { "path": "../../../notebooks/mpc-example.ipynb" } ================================================ FILE: docs/source/examples/quick-start.nblink ================================================ { "path": "../../../notebooks/quick-start.ipynb" } ================================================ FILE: docs/source/examples/rbc-example.nblink ================================================ { "path": "../../../notebooks/rbc-example.ipynb" } ================================================ FILE: docs/source/examples/rl-example.nblink ================================================ { "path": "../../../notebooks/rl-example.ipynb" } ================================================ FILE: docs/source/getting_started.rst ================================================ Getting Started =============== .. _installation: Installation ------------ The easiest way to install *pymgrid* is with pip: .. code-block:: console $ pip install -U pymgrid Alternatively, you can install from source. First clone the repo: .. code-block:: bash $ git clone https://github.com/Total-RD/pymgrid.git Then navigate to the root directory of pymgrid and call .. code-block:: bash $ pip install . Advanced Installation --------------------- To use the included model predictive control algorithm on microgrids containing gensets, additional dependencies are required as the optimization problem becomes mixed integer. The packages MOSEK and CVXOPT can both handle this case; you can install both by calling .. code-block:: bash $ pip install pymgrid[genset_mpc] Note that MOSEK requires a license; see https://www.mosek.com/ for details. Academic and trial licenses are available. Simple Example -------------- See :doc:`examples/quick-start` for a simple example to get started. ================================================ FILE: docs/source/index.rst ================================================ .. pymgrid documentation master file, created by sphinx-quickstart on Sat Nov 19 12:49:18 2022. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. ********************* pymgrid documentation ********************* Important Notice ---------------- **The person that has been maintaining pymgrid since 2020 has moved future development to** `python-microgrid `__ **for the foreseeable future, a drop in replacement for pymgrid, and pymgrid may not be receiving any future updates.** **Please open any new issues in python-microgrid. You can also view python-microgrid's documentation** `at this link `__. **Version**: |version| *pymgrid* is a Python library to simulate tertiary control of electrical microgrids. *pymgrid* allows users to create and customize microgrids of their choosing. These microgrids can then be controlled using a user-defined algorithm or one of the control algorithms contained in *pymgrid*: rule-based control and model predictive control. Environments corresponding to the OpenAI-Gym API are also provided, with both continuous and discrete action space environments available. These environments can be used with your choice of reinforcement learning algorithm to train a control algorithm. *pymgrid* attempts to offer the simplest and most intuitive API possible, allowing the user to focus on their particular application. See the :doc:`getting_started` section for further information, including instructions on how to :ref:`install ` the project. **Useful links**: `Binary Installers `__ | `Source Repository `__ .. note:: This project is under active development. Contents ======== .. toctree:: :maxdepth: 2 getting_started examples/index reference/index Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` ================================================ FILE: docs/source/reference/algos/index.rst ================================================ .. _api.control: Control Algorithms ================== .. currentmodule:: pymgrid.algos Control algorithms built into pymgrid, as well as references for external algorithms that can be deployed Rule Based Control ------------------ Heuristic Algorithm that deploys modules via a priority list. .. autosummary:: :toctree: ../api/algos/ RuleBasedControl Model Predictive Control ------------------------ Algorithm that depends on a future forecast as well as a model of state transitions to determine optimal controls. .. autosummary:: :toctree: ../api/algos/ ModelPredictiveControl Reinforcement Learning ---------------------- Algorithms that treat a microgrid as a Markov process, and train a black-box policy by repeated interactions with the environment. See :doc:`here <../../examples/rl-example>` for an example of using reinforcement learning to train such an algorithm. .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. Copied from pandas docs. .. currentmodule:: pymgrid.algos.priority_list .. autosummary:: :toctree: ../api/algos/priority_list/ PriorityListElement ================================================ FILE: docs/source/reference/envs/index.rst ================================================ .. _api.envs: Reinforcement Learning (RL) Environments ====================== .. currentmodule:: pymgrid.envs Environment classes using the `OpenAI Gym API `_ for reinforcement learning. Discrete -------- Environment with a discrete action space. .. autosummary:: :toctree: ../api/envs/ DiscreteMicrogridEnv Continuous ---------- Environment with a discrete action space. .. autosummary:: :toctree: ../api/envs/ ContinuousMicrogridEnv ================================================ FILE: docs/source/reference/forecast/index.rst ================================================ .. _api.forecast: Forecasting =========== .. currentmodule:: pymgrid.forecast Classes available to use for time-series forecasting, as well a class that allows users to define their own forecaster. .. autosummary:: :toctree: ../api/forecast/ get_forecaster OracleForecaster GaussianNoiseForecaster UserDefinedForecaster NoForecaster ================================================ FILE: docs/source/reference/general/index.rst ================================================ .. _api.general: General functions and objects ============================= .. currentmodule:: pymgrid.modules ModuleContainer --------------- Object that store's a microgrid's modules. .. autosummary:: :toctree: ../api/general/ ModuleContainer ModuleSpace ----------- Object for module action and observation spaces. .. currentmodule:: pymgrid.utils.space .. autosummary:: :toctree: ../api/general/ ModuleSpace ================================================ FILE: docs/source/reference/index.rst ================================================ API reference ============= This page contains an overview of all public *pymgrid* objects and functions. .. toctree:: :maxdepth: 2 microgrid modules/index forecast/index envs/index algos/index general/index ================================================ FILE: docs/source/reference/microgrid.rst ================================================ .. _api.microgrid: Microgrid ================= .. currentmodule:: pymgrid Constructor ----------- .. autosummary:: :toctree: api/microgrid/ Microgrid Methods ------- .. autosummary:: :toctree: api/microgrid/ Microgrid.run Microgrid.reset Microgrid.sample_action Microgrid.get_log Microgrid.get_forecast_horizon Microgrid.get_empty_action Serialization/IO/Conversion --------------------------- .. autosummary:: :toctree: api/microgrid/ Microgrid.load Microgrid.dump Microgrid.from_nonmodular Microgrid.from_scenario Microgrid.to_nonmodular ================================================ FILE: docs/source/reference/modules/index.rst ================================================ .. _api.modules: Modules ======= .. currentmodule:: pymgrid.modules The modules defined here are commonly found in microgrids. Pass any combination of modules to :ref:`Microgrid ` to define and run a microgrid. Timeseries Modules ------------------ Modules that are temporal in nature. .. autosummary:: :toctree: ../api/modules/ GridModule LoadModule RenewableModule Non-temporal Modules -------------------- Modules that do not depend on an underlying timeseries. .. autosummary:: :toctree: ../api/modules/ BatteryModule GensetModule Helper Module -------------- A module that cleans up after all the other modules are deployed. .. autosummary:: :toctree: ../api/modules/ UnbalancedEnergyModule ================================================ FILE: pyproject.toml ================================================ [tool.pytest.ini_options] log_cli = true log_cli_level = "INFO" log_cli_format = "%(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)" log_cli_date_format = "%Y-%m-%d %H:%M:%S" ================================================ FILE: requirements.txt ================================================ cufflinks>=0.17.3 cvxpy>=1.1.4 gym>=0.15.7 matplotlib>=3.1.1 numpy>=1.19.5 pandas>=1.0.3 plotly>=4.9.0 scipy>=1.5.3 statsmodels>=0.11.1 tqdm>=4.1.0 pyyaml>=1.5 ================================================ FILE: setup.cfg ================================================ [metadata] description-file = README.md [tool:pytest] norecursedirs=tests/helpers ================================================ FILE: setup.py ================================================ from pathlib import Path from setuptools import setup, find_packages v = {} exec(open('src/pymgrid/version.py').read(), v) # read __version__ VERSION = v['__version__'] DESCRIPTION = "A simulator for tertiary control of electrical microgrids" DOWNLOAD_URL = f"https://github.com/Total-RD/pymgrid/archive/refs/tags/v{VERSION}.tar.gz" MAINTAINER = "Avishai Halev" MAINTAINER_EMAIL = "avishaihalev@gmail.com" LICENSE = "GNU LGPL 3.0" PROJECT_URLS = {"Source Code": "https://github.com/Total-RD/pymgrid", "Documentation": "https://pymgrid.readthedocs.io/en/latest/"} EXTRAS = dict() EXTRAS["genset_mpc"] = ["Mosek", "cvxopt"] EXTRAS["dev"] = [ "pytest", "pytest-subtests", "flake8", "sphinx", "pydata_sphinx_theme", "numpydoc", "nbsphinx", "nbsphinx-link", *EXTRAS["genset_mpc"]] EXTRAS["rtd"] = ["ipython"] EXTRAS["all"] = list(set(sum(EXTRAS.values(), []))) setup( name="pymgrid", package_dir={"": "src"}, packages=find_packages("src"), python_requires=">=3.6", version=VERSION, maintainer=MAINTAINER, maintainer_email=MAINTAINER_EMAIL, download_url=DOWNLOAD_URL, project_urls=PROJECT_URLS, description=DESCRIPTION, license=LICENSE, long_description=(Path(__file__).parent / "README.md").read_text(), long_description_content_type="text/markdown", include_package_data=True, install_requires=[ "pandas", "numpy", "cvxpy", "statsmodels", "matplotlib", "plotly", "cufflinks", "gym", "tqdm", "pyyaml" ], extras_require=EXTRAS ) ================================================ FILE: src/__init__.py ================================================ ================================================ FILE: src/pymgrid/MicrogridGenerator.py ================================================ """ Copyright 2020 Total S.A., Tanguy Levent all rights reserved, Authors:Gonzague Henri , Tanguy Levent <> Permission to use, modify, and distribute this software is given under the terms of the pymgrid License. NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Date: 2020/06/04 14:54 $ Gonzague Henri """ """ Copyright (C) <2020> This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . """ import numpy as np import pandas as pd from pymgrid import NonModularMicrogrid, Microgrid, PROJECT_PATH from os import listdir from os.path import isfile, join import os import sys import pickle from IPython.display import display from pathlib import Path # MICROGRID_DEFAULT_CONFIG : { # 'load_type':'Folder', #or 'File' # 'load_path': 'default', # or a specific path # 'pv_type':'Folder', #or 'File' # 'pv_path': 'default', # or a specific path # 'co2_type':'Folder', #or 'File' # 'co2_path': 'default', # or a specific path # 'parameters':{ # }, #Dictionary # 'df_actions':df_actions, #Dataframe # 'architecture':architecture, #Dictionary # 'df_status':df_status, #Dictionary # 'df_actual_generation':df_actual_production,#Dataframe # 'grid_spec':grid_spec, #value = 0 # 'df_cost':df_cost, #Dataframe of 1 value = 0.0 # 'df_co2': df_co2, # 'pv':pv, #Dataframe # 'load': load, #Dataframe # 'grid_ts':grid_ts, #Dataframe # 'control_dict': column_actions, #dictionnary # 'grid_price_import' : grid_price_import_ts, # 'grid_price_export' : grid_price_export_ts, # 'grid_co2': grid_co2_ts, # } class MicrogridGenerator: """ The class MicrogridGenerator generates a number of microgrids with differerent and randomized paramters based on the load and renewable data files in the data folder. Parameters ---------- nb_microgrid: int, optional Number representing the number of microgrid to be generated. random_seed: int, optional Seed to be used to generate the needed random numbers to size microgrids. timestep: int, optional Timestep to be used in the time series. path: string The path to the pymgrid folder, used to get the data files needed. Attributes ---------- self.microgrids= [] # generate a list of microgrid object #self.annual_load self.nb_microgrids=nb_microgrid self.timestep=1 self.path=path microgrids: list List that contains all the generated microgrids nb_microgrid: int, optional Number representing the number of microgrid to be generated. this microgrid has one of them timestep: int, optional Timestep to be used in the time series. path: string The path to the pymgrid folder, used to get the data files needed. Notes ----- Due to the random nature of the implemented process, all the generated microgrids might not make the most sense economically or in term of generator sizing. The main idea is to generate realistic-ich microgrids to develop, test and compare control algorithms and advance AI research applied to microgrids. Examples -------- To create microgrids through MicrogridGenerator: >>> m_gen=mg.MicrogridGenerator(nb_microgrid=10) >>> m_gen.generate_microgrid() To plot informations about the generated microgrids: >>> m_gen.print_mg_parameters() """ def __init__(self, nb_microgrid=10, random_seed=42, timestep=1, path=str(Path(__file__).parent)): np.random.seed(random_seed) self.microgrids= [] # generate a list of microgrid object #self.annual_load self.nb_microgrids=nb_microgrid self.timestep=1 self.path=path ########################################### #utility functions ########################################### def _get_random_file(self, path): """ Based on a path, and a folder containing data files, return a file chosen randomly.""" from pathlib import Path _path = Path(path) data_files = list(_path.glob("*.csv")) if not len(data_files): raise NameError(f"Unable to find csv data files in {path}") return pd.read_csv(np.random.choice(data_files)) def _scale_ts(self, df_ts, size, scaling_method='sum'): """ Scales a time series based on either the sum or the maximum of the time series.""" actual_ratio=1 if scaling_method =='sum': actual_ratio = size/df_ts.sum()#.values[0] if scaling_method == 'max': actual_ratio=size / df_ts.max() df_ts = df_ts * actual_ratio return df_ts def _resize_timeseries(self, timeseries, current_time_step, new_time_step): """ Change the frequency of a time series. """ index = pd.date_range('1/1/2015 00:00:00', freq=str(int(current_time_step * 60)) + 'Min', periods=(len(timeseries))) # , freq='0.9S') try: timeseries = timeseries.squeeze() except AttributeError: pass try: timeseries = timeseries.values except AttributeError: pass unsampled = pd.Series(timeseries, index=index) resampled = unsampled.resample(rule=str(int(new_time_step * 60)) + 'Min').mean().interpolate(method='linear') return resampled.values ########################################### # methods to generate timeseries ########################################### # def load_generator(self, shape, annual_consumption=1): #consumption inMWh # ts_load = np.random(shape) # annual_consumption = annual_consumption def _get_pv_ts(self): """ Function to get a random PV file.""" #open pv folder # get list of file # select randomly rank if file to select in the list path = self.path+'/data/pv/' return self._get_random_file(path) def _get_load_ts(self): """ Function to get a random load file. """ #open load folder # get list of file # select randomly rank if file to select in the list path = self.path+'/data/load/' return self._get_random_file(path) def _get_wind_ts(self): """ Function to get a random wind file. """ #open load folder # get list of file # select randomly rank if file to select in the list path = self.path+'/data/wind/' return self._get_random_file(path) def _get_co2_ts(self): """ Function to get a random wind file. """ # open load folder # get list of file # select randomly rank if file to select in the list path = self.path + '/data/co2/' return self._get_random_file(path) def _get_genset(self, rated_power=1000, pmax=0.9, pmin=0.05): """ Function generates a dictionnary with the genset information. """ polynom=[np.random.rand()*10, np.random.rand(), np.random.rand()/10] #fuel consumption genset={ 'polynom':polynom, 'rated_power':rated_power, 'pmax':pmax, 'pmin':pmin, 'fuel_cost':0.4, 'co2':2, } return genset def _get_battery(self, capa=1000, duration=4, pcharge=100, pdischarge=100, soc_max=1, soc_min=0.2, efficiency=0.9): """ Function generates a dictionnary with the battery information. """ battery={ 'capa':capa, 'pcharge':int(np.ceil(capa/duration)), 'pdischarge':int(np.ceil(capa/duration)), 'soc_max':soc_max, 'soc_min':soc_min, 'efficiency':efficiency, 'soc_0':min(max(np.random.randn(), soc_min),soc_max), 'cost_cycle':0.02 } return battery def _get_grid_price_ts(self, nb_time_step_per_year, tou=0, rt=0, price=0): """ This functions is used to generate time series of import and export prices.""" if tou == 0 and rt ==0: price_ts = [price for i in range(nb_time_step_per_year)] return price_ts def _get_electricity_tariff(self, scenario): """ Function to generate price time series based on existing tariffs. scenario == 1 representes the TOU A-6 2020 summer from PG&E (https://www.pge.com/tariffs/electric.shtml) scenario == 2 represents the commercial tariff from France, with a Marseille TOU plage 5 ( times: https://www.fournisseurs-electricite.com/edf/tarifs/heures-creuses-heures-pleines, prices: https://www.cre.fr/Electricite/marche-de-detail-de-l-electricite ) """ price_import = [] price_export = np.zeros((8760,)) if scenario == 1: # PGE A-6 TOU 2020 summer for i in range(8760): if (i% 24 >= 12 and i%24 <18): price_import.append(0.59) elif (i% 24 < 8 or i%24 >=21): price_import.append(0.22) else: price_import.append(0.29) if scenario == 2: # France Commercial TOU Marseille plage 5 for i in range(8760): if (i% 24 >= 0 and i%24 <5) or (i%24>=14 and i%24<17): price_import.append(0.08) else: price_import.append(0.11) # if scenario == 3: Belgium return price_import, price_export def _get_grid(self, rated_power=1000, weak_grid=0, pmin=0.2, price_scenario=0, price_export = 0, price_import =0.3): """ Function generates a dictionnary with the grid information. """ if weak_grid == 1: rand_outage_per_day = np.random.randn()*3/4 +0.25 rand_duration = np.random.randint(low=1, high =8) grid_ts = self._generate_weak_grid_profile( rand_outage_per_day, rand_duration,8760/self.timestep) else: #grid_ts=pd.DataFrame([1+i*0 for i in range(int(np.floor(8760/self.timestep)))], columns=['grid_status']) grid_ts = pd.DataFrame(np.ones(int(np.floor(8760 / self.timestep))), columns=['grid_status']) # Make sure grid_ts is of length 8760 grid_ts = grid_ts.iloc[:8760] # price_export = pd.DataFrame(self._get_grid_price_ts(price_export,8760), # columns=['grid_price_export']) # price_import = pd.DataFrame(self._get_grid_price_ts(price_import, 8760), # columns=['grid_price_import']) price_import, price_export = self._get_electricity_tariff(price_scenario) grid={ 'grid_power_import':rated_power, 'grid_power_export':rated_power, 'grid_ts':grid_ts, 'grid_price_export':pd.DataFrame(price_export), 'grid_price_import': pd.DataFrame(price_import), } return grid def _generate_weak_grid_profile(self, outage_per_day, duration_of_outage,nb_time_step_per_year): """ Function generates an outage time series to be used in the microgrids with a weak grid. """ #weak_grid_timeseries = np.random.random_integers(0,1, int(nb_time_step_per_year+1) ) #for a number of time steps, value between 0 and 1 #generate a timeseries of 8760/timestep points based on np.random seed #profile of ones and zeros weak_grid_timeseries = np.random.random(int(nb_time_step_per_year+1) ) #for a number of time steps, value between 0 and 1 weak_grid_timeseries = [0 if weak_grid_timeseries[i] < outage_per_day/24 else 1 for i in range(len(weak_grid_timeseries))] timestep=8760/nb_time_step_per_year for i in range(len(weak_grid_timeseries)): if weak_grid_timeseries[i] == 0: for j in range(1, int(duration_of_outage/timestep)): if i-j > 0: weak_grid_timeseries[i-j] = 0 #print weak_grid_timeseries return pd.DataFrame(weak_grid_timeseries, columns=['grid_status']) #[0 if weak_grid_timeseries[i] < h_outage_per_day/24 else 1 for i in range(len(weak_grid_timeseries))] ########################################### # sizing functions ########################################### def _size_mg(self, load, size_load=1): ''' Function that returns a dictionnary with the size of each component of a microgrid. We chose to define PV penetration as defined by NREL (https://www.nrel.gov/docs/fy12osti/55094.pdf) PV penetration = peak PV power / peak load power ''' # generate a list of size based on the number of architecture generated # 2 size the other generators based on the load #PV penetration definition by NREL: https: // www.nrel.gov/docs/fy12osti/55094.pdf # penetragion = peak pv / peak load pv=load.max().values[0]*(np.random.randint(low=30, high=151)/100) #battery_size = self._size_battery(load) # return a dataframe with the power of each generator, and if applicable the number of generator size={ 'pv': pv, 'load': size_load, 'battery': self._size_battery(load), 'genset': self._size_genset(load), 'grid': int(max(load.values)*2), } return size def _size_genset(self, load, max_operating_loading = 0.9): """ Function that returns the maximum power a genset. """ #random number > 3 < 20 # polynomial for fuel consumption _size_genset = int(np.ceil(np.max(load)/max_operating_loading)) return _size_genset def _size_battery(self, load): """ Function that returns the capacity of the battery, equivalent to 3 to 5 hours of mean load. """ #energy duration battery = int(np.ceil(np.random.randint(low=3,high=6)*np.mean(load).item())) return battery ########################################### #generate the microgrid ########################################### def generate_microgrid(self, modular=True, verbose=False): """ Function used to generate the nb_microgrids to append them to the microgrids list. """ convert = lambda x: x.to_modular() if modular else x for i in range(self.nb_microgrids): #size=self._size_mg() self.microgrids.append(convert(self._create_microgrid())) if verbose and not modular: self.print_mg_parameters() return self @classmethod def load(cls, scenario): instance = cls() instance.microgrids = [ Microgrid.load( (PROJECT_PATH/ f'data/scenario/{scenario}/microgrid_{j}/microgrid_{j}.yaml').open('r') ) for j in range(25)] return instance def _bin_genset_grid(self): rand = np.random.rand() bin_genset = 0 bin_grid = 0 if rand < 0.33: bin_genset = 1 elif rand >= 0.33 and rand < 0.66: bin_grid = 1 else: bin_genset = 1 bin_grid = 1 return bin_genset, bin_grid def _size_load(self, size_load=None): if size_load is None: return np.random.randint(low=100,high=100001) else: return size_load def _create_microgrid(self): """ Function used to create one microgrid. First selecting a load file, and a load size and a randome architecture and then size the other components of the microgrid depending on the load size. This function also initializes the tracking dataframes to be used in microgrid. """ # get the sizing data # create microgrid object and append # return the list bin_genset, bin_grid = self._bin_genset_grid() architecture = {'PV':1, 'battery':1, 'genset':bin_genset, 'grid':bin_grid} size_load = self._size_load() load = self._scale_ts(self._get_load_ts(), size_load, scaling_method='max') #obtain dataframe of loads size = self._size_mg(load, size_load) #obtain a dictionary of mg sizing components column_actions=[] column_actual_production=[] column_cost = [] grid_ts=[] grid_price_export_ts = [] grid_price_import_ts = [] grid_co2_ts = [] df_parameters = pd.DataFrame() # df_cost = {'cost':[]} df_status = {} df_co2 = {'co2':[]} df_parameters['load'] = [size_load] df_parameters['cost_loss_load'] = 10 df_parameters['cost_overgeneration'] = 1 df_parameters['cost_co2'] = 0.1 #df_cost['cost'] = [0.0] df_status['load'] = [np.around(load.iloc[0,0],1)]# --> il y a doublon pour l'instant avec l'architecture PV, -> non si pas de pv la net load est juste la load df_status['hour'] = [0] column_actual_production.append('loss_load') column_actual_production.append('overgeneration') column_actions.append('load') column_cost.append('loss_load') column_cost.append('overgeneration') column_cost.append('co2') if architecture['PV'] == 1: df_parameters['PV_rated_power'] = np.around(size['pv'],2) column_actual_production.append('pv_consummed') column_actual_production.append('pv_curtailed') column_actions.append('pv_consummed') column_actions.append('pv_curtailed') column_actions.append('pv') pv = pd.DataFrame(self._scale_ts(self._get_pv_ts(), size['pv'], scaling_method='max')) df_status['pv'] = [np.around( pv.iloc[0].values[0],1)] if architecture['battery']==1: battery = self._get_battery(capa=size['battery']) #return a dictionary of battery characteristic df_parameters['battery_soc_0'] = battery['soc_0'] df_parameters['battery_power_charge'] = battery['pcharge'] df_parameters['battery_power_discharge'] = battery['pdischarge'] df_parameters['battery_capacity'] = battery['capa'] df_parameters['battery_efficiency'] = battery['efficiency'] df_parameters['battery_soc_min'] = battery['soc_min'] df_parameters['battery_soc_max'] = battery['soc_max'] df_parameters['battery_cost_cycle'] = battery['cost_cycle'] column_actual_production.append('battery_charge') column_actual_production.append('battery_discharge') column_actions.append('battery_charge') column_actions.append('battery_discharge') column_cost.append('battery') df_status['battery_soc'] = [battery['soc_0']] capa_to_charge = max( (df_parameters['battery_soc_max'].values[0] * df_parameters['battery_capacity'].values[0] - df_parameters['battery_soc_0'].iloc[-1] * df_parameters['battery_capacity'].values[0] ) / df_parameters['battery_efficiency'].values[0], 0) capa_to_discharge = max((df_parameters['battery_soc_0'].iloc[-1] * df_parameters['battery_capacity'].values[0] - df_parameters['battery_soc_min'].values[0] * df_parameters['battery_capacity'].values[0]) * df_parameters['battery_efficiency'].values[0], 0) df_status['capa_to_charge'] = [np.around(capa_to_charge,1)] df_status['capa_to_discharge'] = [np.around(capa_to_discharge,1)] grid_spec=0 if architecture['grid']==1: rand_weak_grid = np.random.randint(low=0, high=2) price_scenario = np.random.randint(low=1, high=3) if rand_weak_grid == 1: architecture['genset'] = 1 grid = self._get_grid(rated_power=size['grid'], weak_grid=rand_weak_grid, price_scenario=price_scenario) df_parameters['grid_weak'] = rand_weak_grid df_parameters['grid_power_import'] = grid['grid_power_import'] df_parameters['grid_power_export'] = grid['grid_power_export'] grid_ts = grid['grid_ts'] #df_parameters['grid_price_import'] = grid['grid_price_import'] #df_parameters['grid_price_export'] = grid['grid_price_export'] column_actual_production.append('grid_import') column_actual_production.append('grid_export') column_actions.append('grid_import') column_actions.append('grid_export') column_cost.append('grid_import') column_cost.append('grid_export') df_status['grid_status'] = [grid_ts.iloc[0,0]] #todo Switch back to random file to generate the new version of pymgrid25 grid_co2_ts = self._get_co2_ts() df_status['grid_co2'] = [grid_co2_ts.iloc[0, 0]] grid_price_import_ts = grid['grid_price_import'] grid_price_export_ts = grid['grid_price_export'] df_status['grid_price_import'] = [grid_price_import_ts.iloc[0, 0]] df_status['grid_price_export'] = [grid_price_export_ts.iloc[0, 0]] if architecture['genset']==1: genset = self._get_genset(rated_power=size['genset']) df_parameters['genset_polynom_order'] = len(genset['polynom']) for i in range(len(genset['polynom'])): df_parameters['genset_polynom_'+str(i)]=genset['polynom'][i] df_parameters['genset_rated_power'] = genset['rated_power'] df_parameters['genset_pmin'] = genset['pmin'] df_parameters['genset_pmax'] = genset['pmax'] df_parameters['fuel_cost'] = genset['fuel_cost'] df_parameters['genset_co2'] = genset['co2'] column_actual_production.append('genset') column_actions.append('genset') column_cost.append('genset') column_cost.append('total_cost') df_actions= {key:[] for key in column_actions}#pd.DataFrame(columns = column_actions, ) df_actual_production = {key:[] for key in column_actual_production}#pd.DataFrame(columns=column_actual_production) df_cost = {key: [] for key in column_cost} microgrid_spec={ 'parameters':df_parameters, #Dictionary 'df_actions':df_actions, #Dataframe 'architecture':architecture, #Dictionary 'df_status':df_status, #Dictionary 'df_actual_generation':df_actual_production,#Dataframe 'grid_spec':grid_spec, #value = 0 'df_cost':df_cost, #Dataframe of 1 value = 0.0 'df_co2': df_co2, 'pv':pv, #Dataframe 'load': load, #Dataframe 'grid_ts':grid_ts, #Dataframe 'control_dict': column_actions, #dictionnary 'grid_price_import' : grid_price_import_ts, 'grid_price_export' : grid_price_export_ts, 'grid_co2': grid_co2_ts, } microgrid = NonModularMicrogrid(microgrid_spec) return microgrid ######################################################## # PRINT / PLOT FUNCTIONS ######################################################## # function to plot the parameters of all the microgrid generated def print_mg_parameters(self, id='all'): """ This function is used to print the parameters of all the generated microgrids.""" if id == 'all': if self.microgrids != []: parameters = pd.DataFrame() for i in range(self.nb_microgrids): parameters = parameters.append(self.microgrids[i].parameters, ignore_index=True) pd.options.display.max_columns = None display(parameters) elif isinstance(id, int) and id < self.nb_microgrids: display(self.microgrids[id].parameters) def print_all_costs(self): #one column ID, one run cost, one rule based, one mpc #if train test split, for each train and test df_cost = pd.DataFrame() for i in range(self.nb_microgrids): if self.microgrids[i]._has_train_test_split == False: cost_run = self.microgrids[i]._df_record_cost.sum().values cost_mpc = np.nan cost_rule_based = np.nan if self.microgrids[i]._has_run_mpc_baseline == True: cost_mpc = np.around(self.microgrids[i]._baseline_linprog_cost.sum().values[0], 1) if self.microgrids[i]._has_run_rule_based_baseline == True: cost_rule_based = np.around(self.microgrids[i]._baseline_priority_list_cost.sum().values[0],1) else: cost_run = self.microgrids[i]._df_record_cost.sum().values cost_mpc = np.nan cost_rule_based = np.nan if self.microgrids[i]._has_run_mpc_baseline == True: cost_mpc = np.around(self.microgrids[i]._baseline_linprog_cost.iloc[self.microgrids[i]._limit_index:].sum().values[0],1) if self.microgrids[i]._has_run_rule_based_baseline == True: cost_rule_based = np.around(self.microgrids[i]._baseline_priority_list_cost.iloc[self.microgrids[i]._limit_index:].sum().values[0],1) df_cost =df_cost.append({'ID':i, 'Cost': cost_run, 'Cost (MPC)': cost_mpc, 'Cost (rule-based)':cost_rule_based}, ignore_index=True) display(df_cost) ================================================ FILE: src/pymgrid/__init__.py ================================================ from pathlib import Path from .version import __version__ PROJECT_PATH = Path(__file__).parent from ._deprecated.non_modular_microgrid import NonModularMicrogrid from .microgrid import Microgrid from .MicrogridGenerator import MicrogridGenerator from .utils import add_pymgrid_yaml_representers import pymgrid.envs __all__ = [ 'Microgrid', 'MicrogridGenerator', 'NonModularMicrogrid', 'envs' ] ================================================ FILE: src/pymgrid/_deprecated/Environments/Environment.py ================================================ """ Copyright 2020 Total S.A Authors:Gonzague Henri Permission to use, modify, and distribute this software is given under the terms of the pymgrid License. NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Date: 2020/10/21 07:43 $ Gonzague Henri """ """ Copyright (C) <2020> This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . """ import numpy as np import gym from gym.utils import seeding from gym.spaces import Space, Discrete, Box from . import Preprocessing from pymgrid.algos.saa.saa import SampleAverageApproximation DEFAULT_CONFIG={ 'microgrid': None, #need to be passed by user 'training_reward_smoothing':'sqrt', #'peak_load' 'resampling_on_reset':True, 'forecast_args':None, #used to init the SAA for resampling on reset 'baseline_sampling_args':None, } def generate_sampler(microgrid, forecast_args): """ Generates an instance of SampleAverageApproximate to use in future sampling. :param microgrid: :param forecast_args: :return: """ if forecast_args is None: forecast_args = dict() return SampleAverageApproximation(microgrid, **forecast_args) class Environment(gym.Env): """ Markov Decision Process associated to the microgrid. Parameters ---------- microgrid: microgrid, mandatory The controlled microgrid. random_seed: int, optional Seed to be used to generate the needed random numbers to size microgrids. """ def __init__(self, env_config, seed = 42): # Set seed np.random.seed(seed) self.states_normalization = Preprocessing.normalize_environment_states(env_config['microgrid']) self.TRAIN = True # Microgrid self.env_config = env_config self.mg = env_config['microgrid'] # State space self.mg.train_test_split() #np.zeros(2+self.mg.architecture['grid']*3+self.mg.architecture['genset']*1) # Number of states self.Ns = len(self.mg._df_record_state.keys())+1 # Number of actions #training_reward_smoothing try: self.training_reward_smoothing = env_config['training_reward_smoothing'] except: self.training_reward_smoothing = 'sqrt' try: self.resampling_on_reset = env_config['resampling_on_reset'] except: self.resampling_on_reset = False if self.resampling_on_reset == True: self.forecast_args = env_config['forecast_args'] self.baseline_sampling_args = env_config['baseline_sampling_args'] self.saa = generate_sampler(self.mg, self.forecast_args) self.observation_space = Box(low=-1, high=np.float('inf'), shape=(self.Ns,), dtype=np.float) #np.zeros(len(self.mg._df_record_state.keys())) # Action space self.metadata = {"render.modes": [ "human"]} self.state, self.reward, self.done, self.info, self.round = None, None, None, None, None self.round = None # Start the first round self.seed() self.reset() try: assert (self.observation_space.contains(self.state)) except AssertionError: print("ERROR : INVALID STATE", self.state) def get_reward(self): if self.TRAIN == True: if self.training_reward_smoothing == 'sqrt': return -(self.mg.get_cost()**0.5) if self.training_reward_smoothing == 'peak_load': return -self.mg.get_cost()/self.mg.parameters['load'].values[0] return -self.mg.get_cost() def get_cost(self): return sum(self.mg._df_record_cost['cost']) def step(self, action): # CONTROL if self.done: print("WARNING : EPISODE DONE") # should never reach this point return self.state, self.reward, self.done, self.info try: assert (self.observation_space.contains(self.state)) except AssertionError: print("ERROR : INVALID STATE", self.state) try: assert (self.action_space.contains(action)) except AssertionError: print("ERROR : INVALD ACTION", action) # UPDATE THE MICROGRID control_dict = self.get_action(action) self.mg.run(control_dict) # COMPUTE NEW STATE AND REWARD self.state = self.transition() self.reward = self.get_reward() self.done = self.mg.done self.info = {} self.round += 1 return self.state, self.reward, self.done, self.info # control_dict = self.get_action(action) # self.mg.run(control_dict) # reward = self.reward() # s_ = self.transition() # self.state = s_ # done = self.mg.done # self.round += 1 # return s_, reward, done, {} def reset(self, testing=False): if "testing" in self.env_config: testing = self.env_config["testing"] self.round = 1 # Reseting microgrid self.mg.reset(testing=testing) if testing == True: self.TRAIN = False elif self.resampling_on_reset == True: Preprocessing.sample_reset(self.mg.architecture['grid'] == 1, self.saa, self.mg, sampling_args=self.sampling_args) self.state, self.reward, self.done, self.info = self.transition(), 0, False, {} return self.state def get_action(self, action): """ :param action: current action :return: control_dict : dicco of controls """ ''' States are: binary variable whether charging or dischargin battery power, normalized to 1 binary variable whether importing or exporting grid power, normalized to 1 binary variable whether genset is on or off genset power, normalized to 1 ''' control_dict=[] return control_dict def states(self): # soc, price, load, pv 'df status?' observation_space = [] return observation_space # Transition function def transition(self): # net_load = round(self.mg.load - self.mg.pv) # soc = round(self.mg.battery.soc,1) # s_ = (net_load, soc) # next state updated_values = self.mg.get_updated_values() updated_values = {x:float(updated_values[x])/self.states_normalization[x] for x in self.states_normalization} updated_values['hour_sin'] = np.sin(2*np.pi*updated_values['hour']) # the hour is already divided by 24 in the line above updated_values['hour_cos'] = np.cos(2*np.pi*updated_values['hour']) updated_values.pop('hour', None) s_ = np.array(list(updated_values.values())) #np.array(self.mg.get_updated_values().values)#.astype(np.float)#self.mg.get_updated_values() #s_ = [ s_[key] for key in s_.keys()] return s_ def seed (self, seed=None): self.np_random, seed = seeding.np_random(seed) return [seed] def render(self, mode="human"): txt = "state: " + str(self.state) + " reward: " + str(self.reward) + " info: " + str(self.info) print(txt) # Mapping between action and the control_dict def get_action_continuous(self, action): """ :param action: current action :return: control_dict : dicco of controls """ ''' Actions are: binary variable whether charging or dischargin battery power, normalized to 1 binary variable whether importing or exporting grid power, normalized to 1 binary variable whether genset is on or off genset power, normalized to 1 ''' mg = self.mg pv = mg.pv load = mg.load net_load = load - pv capa_to_charge = mg.battery.capa_to_charge p_charge_max = mg.battery.p_charge_max p_charge = max(0, min(-net_load, capa_to_charge, p_charge_max)) capa_to_discharge = mg.battery.capa_to_discharge p_discharge_max = mg.battery.p_discharge_max p_discharge = max(0, min(net_load, capa_to_discharge, p_discharge_max)) control_dict = {} if mg.architecture['battery'] == 1: control_dict['battery_charge'] = max(0, action[0] * min(action[1] * mg.battery.capacity, mg.battery.capa_to_charge, mg.battery.p_charge_max)) control_dict['battery_discharge'] = max(0, (1 - action[0]) * min(action[1] * mg.battery.capacity, mg.battery.capa_to_discharge, mg.battery.p_discharge_max)) if mg.architecture['grid'] == 1: if mg.grid.status == 1: control_dict['grid_import'] = max(0, action[2] * min(action[3] * mg.grid.power_import, mg.grid.power_import)) control_dict['grid_export'] = max(0, (1 - action[2]) * min(action[3] * mg.grid.power_export, mg.grid.power_export)) else: # avoid warnings control_dict['grid_import'] = 0 control_dict['grid_export'] = 0 if mg.architecture['genset'] == 1: control_dict['genset'] = max(0, action[4] * min(action[5] * mg.genset.rated_power, mg.genset.rated_power)) return control_dict def get_action_discrete(self, action): """ :param action: current action :return: control_dict : dicco of controls """ ''' Actions are: binary variable whether charging or dischargin battery power, normalized to 1 binary variable whether importing or exporting grid power, normalized to 1 binary variable whether genset is on or off genset power, normalized to 1 ''' control_dict={} control_dict['pv_consumed'] = action[0] if self.mg.architecture['battery'] == 1: control_dict['battery_charge'] = action[1] * action[3] control_dict['battery_discharge'] = action[2] * (1- action[3]) if self.mg.architecture['genset'] == 1: control_dict['genset'] = action[4] if self.mg.architecture['grid'] == 1: control_dict['grid_import'] = action[5] * action[7] control_dict['grid_export'] = action[6] * (1- action[7]) elif self.mg.architecture['grid'] == 1: control_dict['grid_import'] = action[4] * action[6] control_dict['grid_export'] = action[5] * (1 - action[6]) return control_dict # Mapping between action and the control_dict def get_action_priority_list(self, action): """ :param action: current action :return: control_dict : dicco of controls """ ''' States are: binary variable whether charging or dischargin battery power, normalized to 1 binary variable whether importing or exporting grid power, normalized to 1 binary variable whether genset is on or off genset power, normalized to 1 ''' mg = self.mg pv = mg.pv load = mg.load net_load = load - pv capa_to_charge = mg.battery.capa_to_charge p_charge_max = mg.battery.p_charge_max p_charge = max(0, min(-net_load, capa_to_charge, p_charge_max)) capa_to_discharge = mg.battery.capa_to_discharge p_discharge_max = mg.battery.p_discharge_max p_discharge = max(0, min(net_load, capa_to_discharge, p_discharge_max)) control_dict = {} control_dict = self.actions_agent_discret(mg, action) return control_dict def actions_agent_discret(self, mg, action): if mg.architecture['genset'] == 1 and mg.architecture['grid'] == 1: control_dict = self.action_grid_genset(mg, action) elif mg.architecture['genset'] == 1 and mg.architecture['grid'] == 0: control_dict = self.action_genset(mg, action) else: control_dict = self.action_grid(mg, action) return control_dict def action_grid(self, mg, action): # slack is grid pv = mg.pv load = mg.load net_load = load - pv capa_to_charge = mg.battery.capa_to_charge p_charge_max = mg.battery.p_charge_max p_charge_pv = max(0, min(-net_load, capa_to_charge, p_charge_max)) p_charge_grid = max(0, min( capa_to_charge, p_charge_max)) capa_to_discharge = mg.battery.capa_to_discharge p_discharge_max = mg.battery.p_discharge_max p_discharge = max(0, min(net_load, capa_to_discharge, p_discharge_max)) # Charge if action == 0: control_dict = {'pv_consummed': min(pv, load), 'battery_charge': p_charge_pv, 'battery_discharge': 0, 'grid_import': 0, 'grid_export': max(0, pv - min(pv, load) - p_charge_pv), 'genset': 0 } if action == 4: load = load + p_charge_grid control_dict = {'pv_consummed': min(pv, load), 'battery_charge': p_charge_grid, 'battery_discharge': 0, 'grid_import': max(0, load - min(pv, load)), 'grid_export': max(0, pv - min(pv, load) - p_charge_grid) , 'genset': 0 } # décharger full elif action == 1: control_dict = {'pv_consummed': min(pv, load), 'battery_charge': 0, 'battery_discharge': p_discharge, 'grid_import': max(0, load - min(pv, load) - p_discharge), 'grid_export': 0, 'genset': 0 } # Import elif action == 2: control_dict = {'pv_consummed': min(pv, load), 'battery_charge': 0, 'battery_discharge': 0, 'grid_import': max(0, net_load), 'grid_export': 0, 'genset': 0 } # Export elif action == 3: control_dict = {'pv_consummed': min(pv, load), 'battery_charge': 0, 'battery_discharge': 0, 'grid_import': 0, 'grid_export': abs(min(net_load, 0)), 'genset': 0 } return control_dict def action_grid_genset(self, mg, action): # slack is grid pv = mg.pv load = mg.load net_load = load - pv status = mg.grid.status # whether there is an outage or not capa_to_charge = mg.battery.capa_to_charge p_charge_max = mg.battery.p_charge_max p_charge_pv = max(0, min(-net_load, capa_to_charge, p_charge_max)) p_charge_grid = max(0, min( capa_to_charge, p_charge_max)) capa_to_discharge = mg.battery.capa_to_discharge p_discharge_max = mg.battery.p_discharge_max p_discharge = max(0, min(net_load, capa_to_discharge, p_discharge_max)) capa_to_genset = mg.genset.rated_power * mg.genset.p_max p_genset = max(0, min(net_load, capa_to_genset)) # Charge if action == 0: control_dict = {'pv_consummed': min(pv, load), 'battery_charge': p_charge_pv, 'battery_discharge': 0, 'grid_import': 0, 'grid_export': max(0, pv - min(pv, load) - p_charge_pv) * status, 'genset': 0 } if action == 5: load = load+p_charge_grid control_dict = {'pv_consummed': min(pv, load), 'battery_charge': p_charge_grid, 'battery_discharge': 0, 'grid_import': max(0, load - min(pv, load)) * status, 'grid_export': max(0, pv - min(pv, load) - p_charge_grid) * status, 'genset': 0 } # décharger full elif action == 1: control_dict = {'pv_consummed': min(pv, load), 'battery_charge': 0, 'battery_discharge': p_discharge, 'grid_import': max(0, load - min(pv, load) - p_discharge) * status, 'grid_export': 0, 'genset': 0 } # Import elif action == 2: control_dict = {'pv_consummed': min(pv, load), 'battery_charge': 0, 'battery_discharge': 0, 'grid_import': max(0, net_load) * status, 'grid_export': 0, 'genset': 0 } # Export elif action == 3: control_dict = {'pv_consummed': min(pv, load), 'battery_charge': 0, 'battery_discharge': 0, 'grid_import': 0, 'grid_export': abs(min(net_load, 0)) * status, 'genset': 0 } # Genset elif action == 4: control_dict = {'pv_consummed': min(pv, load), 'battery_charge': 0, 'battery_discharge': 0, 'grid_import': 0, 'grid_export': 0, 'genset': max(net_load, 0) } elif action == 6: control_dict = {'pv_consummed': min(pv, load), 'battery_charge': 0, 'battery_discharge': p_discharge, 'grid_import': 0, 'grid_export': 0, 'genset': max(0, load - min(pv, load) - p_discharge), } return control_dict def action_genset(self, mg, action): # slack is genset pv = mg.pv load = mg.load net_load = load - pv capa_to_charge = mg.battery.capa_to_charge p_charge_max = mg.battery.p_charge_max p_charge = max(0, min(-net_load, capa_to_charge, p_charge_max)) capa_to_discharge = mg.battery.capa_to_discharge p_discharge_max = mg.battery.p_discharge_max p_discharge = max(0, min(net_load, capa_to_discharge, p_discharge_max)) capa_to_genset = mg.genset.rated_power * mg.genset.p_max p_genset = max(0, min(net_load, capa_to_genset)) # Charge if action == 0: control_dict = {'pv_consummed': min(pv, load), 'battery_charge': p_charge, 'battery_discharge': 0, 'grid_import': 0, 'grid_export': 0, 'genset': 0 } # décharger full elif action == 1: control_dict = {'pv_consummed': min(pv, load), 'battery_charge': 0, 'battery_discharge': p_discharge, 'grid_import': 0, 'grid_export': 0, 'genset': max(0, load - min(pv, load) - p_discharge) } # Genset elif action == 2: control_dict = {'pv_consummed': min(pv, load), 'battery_charge': 0, 'battery_discharge': 0, 'grid_import': 0, 'grid_export': 0, 'genset': max(0, load - min(pv, load)) } return control_dict ================================================ FILE: src/pymgrid/_deprecated/Environments/Preprocessing.py ================================================ import pandas as pd def normalize_environment_states(mg): max_values = {} for keys in mg._df_record_state: if keys == 'hour': max_values[keys] = 24 elif keys == 'capa_to_charge' or keys == 'capa_to_discharge' : max_values[keys] = mg.parameters.battery_capacity.values[0] elif keys == 'grid_status' or keys == 'battery_soc': max_values[keys] = 1 elif keys == 'grid_co2': max_values[keys] = max(mg._grid_co2.values[0]) elif keys == 'grid_price_import': max_values[keys] = max(mg._grid_price_import.values[0]) elif keys == 'grid_price_export': max_values[keys] = max(mg._grid_price_import.values[0]) elif keys == 'load': max_values[keys] = mg.parameters.load.values[0] elif keys == 'pv': max_values[keys] = mg.parameters.PV_rated_power.values[0] else: max_values[keys] = mg.parameters[keys].values[0] return max_values def sample_reset(has_grid, saa, microgrid, sampling_args=None): """ Generates a new sample using an instance of SampleAverageApproximation and :param has_grid: bool, whether the microgrid has a grid. :param saa:, SampleAverageApproximation :param microgrid: Microgrid :param sampling_args: arguments to be passed to saa.sample_from_forecasts(). :return: """ if sampling_args is None: sampling_args = dict() sample = saa.sample_from_forecasts(n_samples=1, **sampling_args) sample = sample[0] microgrid._load_ts = pd.DataFrame(sample['load']) microgrid._pv_ts = pd.DataFrame(sample['pv']) microgrid._df_record_state['load'] = [sample['load'].iloc[0].squeeze()] microgrid._df_record_state['pv'] = [sample['pv'].iloc[0].squeeze()] if has_grid: microgrid._grid_status_ts = pd.DataFrame(sample['grid']) microgrid._df_record_state['grid_status'] = [sample['grid'].iloc[0].squeeze()] ================================================ FILE: src/pymgrid/_deprecated/Environments/__init__.py ================================================ ================================================ FILE: src/pymgrid/_deprecated/Environments/pymgrid_csca.py ================================================ from abc import ABC import gym, logging, numpy as np, pandas as pd from gym import Env from pymgrid._deprecated.non_modular_microgrid import NonModularMicrogrid from pymgrid.MicrogridGenerator import MicrogridGenerator from copy import deepcopy from pymgrid.algos.saa.saa import SampleAverageApproximation from pymgrid.algos import ModelPredictiveControl logger = logging.getLogger(__name__) LOG = False DEBUG = True # If you get a JSON serializable error, turn this on: JSON_ERROR = False def sample_reset(has_grid, saa, microgrid, sampling_args=None): """ Generates a new sample using an instance of SampleAverageApproximation and :param has_grid: bool, whether the microgrid has a grid. :param saa:, SampleAverageApproximation :param microgrid: Microgrid :param sampling_args: arguments to be passed to saa.sample_from_forecasts(). :return: """ if sampling_args is None: sampling_args = dict() sample = saa.sample_from_forecasts(n_samples=1, **sampling_args) sample = sample[0] microgrid._load_ts = pd.DataFrame(sample['load']) microgrid._pv_ts = pd.DataFrame(sample['pv']) microgrid._df_record_state['load'] = [sample['load'].iloc[0].squeeze()] microgrid._df_record_state['pv'] = [sample['pv'].iloc[0].squeeze()] if has_grid: microgrid._grid_status_ts = pd.DataFrame(sample['grid']) microgrid._df_record_state['grid_status'] = [sample['grid'].iloc[0].squeeze()] def generate_sampler(microgrid, forecast_args): """ Generates an instance of SampleAverageApproximate to use in future sampling. :param microgrid: :param forecast_args: :return: """ if forecast_args is None: forecast_args = dict() return SampleAverageApproximation(microgrid, **forecast_args) class MicrogridEnv(Env, ABC): metadata = {'render.modes': ['human']} def __init__(self, microgrid, trajectory_len=None, max_episode_len=None): """ :param max_episode_len: :param microgrid: Microgrid, the underlying microgrid. :param trajectory_len: int, length of a trajectory (to be started at a random index). Default None, runs an entire year """ super().__init__() if isinstance(microgrid, int) and 0<=microgrid<=25: print('Initializing microgrid {} of 25 using 25 microgrids from MicrogridGenerator'.format(microgrid)) m_gen = MicrogridGenerator(nb_microgrid=25) m_gen.generate_microgrid(verbose=False) self.microgrid = deepcopy(m_gen.microgrids[microgrid]) elif isinstance(microgrid, NonModularMicrogrid): self.microgrid = deepcopy(microgrid) else: raise ValueError('microgrid must be of type Microgrid, is {}'.format(type(microgrid))) assert self.microgrid._data_length == 8760, 'Microgrid data length should be 8760, is {}'.format(self.microgrid._data_length) self.has_grid = self.microgrid.architecture['grid'] == 1 self.has_genset = self.microgrid.architecture['genset'] == 1 observation_dim = len(self.microgrid._df_record_state) self.observation_space = gym.spaces.Box(low=0, high=np.float('inf'), shape=(observation_dim,), dtype=np.float64) self.action_space = None self.current_action = None self.current_obs = None if max_episode_len is None: self.microgrid.horizon = 0 else: self.microgrid.horizon = self.microgrid._data_length - max_episode_len self.trajectory_len = trajectory_len self._short_trajectory_set() def _short_trajectory_set(self): trajectory_len = self.trajectory_len if trajectory_len is not None: assert isinstance(trajectory_len, int) from numpy.random import randint high_range = self.microgrid._data_length - self.microgrid.horizon - trajectory_len start_index = randint(low=0, high=high_range) self.microgrid._tracking_timestep = start_index self.microgrid._data_length = start_index + trajectory_len + self.microgrid.horizon def reset(self): self.microgrid.reset() self._short_trajectory_set() initial_state = self.microgrid.get_updated_values() observations = np.array(list(initial_state.values())) self.current_obs = observations return observations def step(self, action, **kwargs): """ :param **kwargs: :param action: :return: observation, np.ndarray If self.has_grid, shape (10,), with values [load, hour, pv, battery_soc, capa_to_charge, capa_to_discharge, grid_status, grid_co2, grid_price_import, grid_price_export] Else, shape (6,), with values [load, hour, pv, battery_soc, capa_to_charge, capa_to_discharge] reward, float The reward (negative cost) of the step done, bool Whether the episode is complete info, dict Info """ control_dict = self.get_control_dict(action) observation = self.run_control(control_dict) reward = -1.0 * self.microgrid.get_cost() done = self.microgrid.done info = dict() self.current_obs = observation self.current_action = action return observation, reward, done, info def get_control_dict(self, action): """ A function that takes an action (discrete or continuous) and returns a control_dict. See ContinuousMicrogridEnv for an example. """ return NotImplemented def run_control(self, control_dict): """ Given a control_dict, calls microgrid.run(_) and returns the observations. :param control_dict: :return: observations, np.ndarray """ updated_vals = self.microgrid.run(control_dict) observations = np.array(list(updated_vals.values())) assert len(observations) == self.observation_space.shape[0] return observations class ContinuousMicrogridEnv(MicrogridEnv): """ Class to run a Microgrid in the format of a gym env. Continuous states, continuous actions. """ def __init__(self, microgrid, standardization=True, trajectory_len=None, max_episode_len=None, **kwargs): """ :param microgrid: Microgrid, the underlying microgrid. :param standardization: bool, default True. whether to scale the actions to a factor determined by a run of MPC. """ super().__init__(microgrid, trajectory_len=trajectory_len, max_episode_len=max_episode_len) self.logger = kwargs['logger'] if 'logger' in kwargs else None action_dim = 5+self.has_genset upper_bound, lower_bound = self._get_action_ub_lb() self.action_space = gym.spaces.Box(low=lower_bound, high=upper_bound, shape=(action_dim,), dtype=np.float64) self.standardization = standardization if not JSON_ERROR and self.standardization: self.standardizations = self.pre_compute_standardizations() # Rescale the action space low_new = self.standardize(self.action_space.low, use_proxy='action') self.action_space.low = low_new high_new = self.standardize(self.action_space.high, use_proxy='action') high_new[1] = 0.1 # This is a hard-coded grid_export bound self.action_space.high = high_new else: self.standardizations = None def _get_action_ub_lb(self): # Upper Bound p_max_import = self.microgrid.parameters['grid_power_import'].values[0] p_max_export = self.microgrid.parameters['grid_power_export'].values[0] p_max_charge = self.microgrid.parameters['battery_power_charge'].values[0] p_max_discharge = self.microgrid.parameters['battery_power_discharge'].values[0] pv_max = self.microgrid.parameters.PV_rated_power.squeeze() upper_bound = [p_max_import, p_max_export, p_max_charge, p_max_discharge, pv_max] if self.has_genset: p_genset_max = self.microgrid.parameters['genset_rated_power'].values[0] * self.microgrid.parameters['genset_pmax'].values[0] upper_bound.insert(0,p_genset_max) upper_bound = np.array(upper_bound) # Lower Bound lower_bound = [0]*5 if self.has_genset: action_dim = 6 p_genset_min = self.microgrid.parameters['genset_rated_power'].values[0] * \ self.microgrid.parameters['genset_pmin'].values[0] lower_bound.insert(0, p_genset_min) lower_bound = np.array(lower_bound) return upper_bound, lower_bound def get_values(self, *value_names): # TODO Speed this up. Refactor standardizations. nan_to_num takes significant time. """ Helper function. Given a list of value names (e.g., the names of components of the state/actions), returns their values in the same order. Note: if the env standardizes values, this function returns the unstandarized values. :param value_names: :return: """ genset_actions = ['genset', 'grid_import', 'grid_export', 'battery_charge', 'battery_discharge', 'pv_consummed'] no_genset_actions = ['grid_import', 'grid_export', 'battery_charge', 'battery_discharge', 'pv_consummed'] grid_observations = ['load', 'hour', 'pv', 'battery_soc', 'capa_to_charge', 'capa_to_discharge', 'grid_status', 'grid_co2', 'grid_price_import', 'grid_price_export'] no_grid_observations = ['load', 'hour', 'pv', 'battery_soc', 'capa_to_charge', 'capa_to_discharge'] if self.current_action is None: print('Warning: current_action is None, should only happen on first iteration') if self.has_genset: self.current_action = np.array([0]*len(genset_actions)) else: self.current_action = np.array([0]*len(no_genset_actions)) action = self.current_action obs = self.current_obs elif self.standardization: obs_mean, obs_std, action_mean, action_std = self.standardizations action = self.standardize(self.current_action, action_mean, action_std, direction='backward') obs = self.standardize(self.current_obs, obs_mean, obs_std, direction='backward') else: action = self.current_action obs = self.current_obs if self.has_genset: actions_dict = dict(zip(genset_actions, action)) else: actions_dict = dict(zip(no_genset_actions, action)) if self.has_grid: obs_dict = dict(zip(grid_observations, obs)) else: obs_dict = dict(zip(no_grid_observations, obs)) values = [] for name in value_names: if name in actions_dict.keys(): values.append(actions_dict[name]) elif name in obs_dict.keys(): values.append(obs_dict[name]) else: raise ValueError('Value \'{}\' not recognized with current architecture'.format(name)) return values def reset(self): observation = super().reset() if self.standardization: obs_mean, obs_std, action_mean, action_std = self.standardizations observation = self.standardize(observation, obs_mean, obs_std, direction='forward') self.current_obs = observation return observation def step(self, action, **kwargs): """ :param **kwargs: :param action: np.ndarray If self.has_genset: shape (6,), with values [genset, grid_import, grid_export, battery_charge, battery_discharge, pv_consummed] Else: shape (5,), with values [grid_import, grid_export, battery_charge, battery_discharge, pv_consummed] :return: observation, np.ndarray If self.has_grid, shape (10,), with values [load, hour, pv, battery_soc, capa_to_charge, capa_to_discharge, grid_status, grid_co2, grid_price_import, grid_price_export] Else, shape (6,), with values [load, hour, pv, battery_soc, capa_to_charge, capa_to_discharge] reward, float The reward (negative cost) of the step done, bool Whether the episode is complete info, dict Info """ # Actions must be passed in order as defined in pymgrid25 paper assert isinstance(action, np.ndarray) unscaled_action = action.copy() if self.standardization: if not isinstance(action, np.ndarray): raise TypeError('action must be of type np.ndarray') obs_mean, obs_std, action_mean, action_std = self.standardizations action = self.standardize(action, action_mean, action_std, direction='backward') observation, reward, done, info = super().step(action) if self.standardization: observation = self.standardize(observation, obs_mean, obs_std, direction='forward') self.current_obs = observation self.current_action = unscaled_action # Do you want to deal w everything in normalized space or unnormalized space return observation, reward, done, info def standardize(self, data, mean_proxy=None, std_proxy=None, direction='forward', use_proxy=None): """ :param data: np.ndarray, shape (observation_dim,) or (action_dim), observation or action to rescale :param mean_proxy: np.ndarray, shape (observation_dim,) or (action_dim), mean to use in rescaling :param std_proxy: np.ndarray, shape (observation_dim,) or (action_dim), standard deviation to use in rescaling :param direction: str, default 'forward'. One of 'forward' or 'backward', whether to scale to or from standard normal :return: np.ndarray, rescaled values. """ if (mean_proxy is None and std_proxy is None and use_proxy is None) or (mean_proxy is not None and use_proxy is not None): raise ValueError('Must pass mean_proxy and std_proxy, or use_proxy must be a str in (\'action\', \'obs\'), but not both') if mean_proxy is None and std_proxy is None: if use_proxy == 'action': mean_proxy, std_proxy = [x for x in self.standardizations[2:]] elif use_proxy == 'obs': mean_proxy, std_proxy = [x for x in self.standardizations[:2]] else: raise NameError('Unable to recognize use_proxy {}, must be one of \'action\' or \'obs\''.format(use_proxy)) names = ('data', 'mean_proxy', 'std_proxy') vals = (data, mean_proxy, std_proxy) dirs = ('forward', 'backward') for name, v in zip(names, vals): if not isinstance(v, np.ndarray): raise TypeError('{} must be of type numpy.ndarray, is {}'.format(name, type(v))) if not (data.shape == mean_proxy.shape and mean_proxy.shape == std_proxy.shape): raise ValueError('Incompatible shapes of data, mean_proxy, std_proxy. Must be equal, are: {}'.format( dict(zip(names, [v.shape for v in vals])))) if direction not in dirs: raise ValueError('direction must be one of {}'.format(dirs)) if direction == 'forward': return (data-mean_proxy)/std_proxy else: return data*std_proxy+mean_proxy def pre_compute_standardizations(self,alg_to_use='mpc'): """ Runs a control algorithm to pre compute the standardizations for actions/observations to rescale to standard normal (ish). :param alg_to_use: str, default 'mpc'. What algorithm to run to compute the standardizations :return: tuple len(4,): obs_mean, obs_std, action_mean, action_std """ action_mean = [0]*self.action_space.shape[0] action_std = [0]*self.action_space.shape[0] obs_mean = [0]*self.observation_space.shape[0] obs_std = [0]*self.observation_space.shape[0] if alg_to_use == 'mpc': old_horizon = self.microgrid.horizon self.microgrid.horizon = 24 MPC = ModelPredictiveControl(self.microgrid) mpc_output = MPC.run(max_steps=1000) self.microgrid.horizon = old_horizon if self.has_genset: action_keys = 'genset', 'grid_import, grid_export, battery_charge, battery_discharge, pv_consummed' for j, name in enumerate(action_keys): action_mean[j] = np.mean(mpc_output['action'][name]) action_std[j] = np.std(mpc_output['action'][name]) obs_keys = list(self.microgrid._df_record_state.keys()) for j, name in enumerate(obs_keys): obs_mean[j] = np.mean(mpc_output['status'][name]) obs_std[j] = np.std(mpc_output['status'][name]) else: action_keys = 'grid_import', 'grid_export', 'battery_charge', 'battery_discharge', 'pv_consummed' for j, name in enumerate(action_keys): action_mean[j] = np.mean(mpc_output['action'][name]) action_std[j] = np.std(mpc_output['action'][name]) obs_keys = list(self.microgrid._df_record_state.keys()) for j, name in enumerate(obs_keys): obs_mean[j] = np.mean(mpc_output['status'][name]) obs_std[j] = np.std(mpc_output['status'][name]) else: raise RuntimeError('algorithm name {} not currently supported'.format(alg_to_use)) for j in range(len(obs_std)): if obs_std[j] < 1.0: obs_std[j] = 1.0 for j in range(len(action_std)): if action_std[j] < 1.0: action_std[j] = 1.0 names = ('obs_mean', 'obs_std', 'action_mean', 'action_std') outputs = obs_mean, obs_std, action_mean, action_std outputs = tuple(np.array(output) for output in outputs) for name, output in zip(names,outputs): if (output == 0).sum() != 0: for j,val in enumerate(output): if val == 0: print('Warning: Zero value in pos {} in {}, may not have been filled properly'.format(j,name)) return outputs def get_control_dict(self, action): """ Given an np.ndarray of actions, parses into a control_dict. :param action: np.ndarray, shape (action_dim,) :return: dict, control_dict """ if not isinstance(action, np.ndarray): raise TypeError('action must be an ndarray, is {}'.format(type(action))) if self.has_genset: control_dict = {'battery_charge': action[3], 'battery_discharge': action[4], 'genset': action[0], 'grid_import': action[1], 'grid_export': action[2], 'pv_consummed': action[5]} else: control_dict = {'battery_charge': action[2], 'battery_discharge': action[3], 'grid_import': action[0], 'grid_export': action[1], 'pv_consummed': action[4]} return control_dict class ContinuousMicrogridSampleEnv(ContinuousMicrogridEnv): """ Same as ContinuousMicrogridEnv but uses samples generated from SampleAverageApproximation as states. """ metadata = {'render.modes': ['human']} def __init__(self, microgrid, standardization=True, forecast_args=None, baseline_sampling_args=None, max_episode_len=None): super().__init__(microgrid, standardization=standardization, max_episode_len=max_episode_len) self.forecast_args = forecast_args self.baseline_sampling_args = baseline_sampling_args self.saa = generate_sampler(self.microgrid, forecast_args) def reset(self, sampling_args=None): """ Generates a new sample to use as load/pv/grid data. Then calls parent reset function. :param sampling_args: :return: """ sample_reset(self.has_grid, self.saa, self.microgrid, sampling_args=sampling_args) observations = super().reset() return observations class SafeExpMicrogridEnv(ContinuousMicrogridEnv): """ ContinuousMicrogridEnv but with constraint functionality for safety layer. """ def __init__(self, microgrid, standardization=True, balance_tolerance=1., scale_constraints=True, only_inequality_constr=True, trajectory_len=None, max_episode_len=None): super().__init__(microgrid, standardization=standardization, trajectory_len=trajectory_len, max_episode_len=max_episode_len) self.balance_tolerance=balance_tolerance self.scale_constraints = scale_constraints self.only_inequality_constr = only_inequality_constr self.n_constraints = 9 if self.has_genset else 7 if only_inequality_constr: self.n_constraints -= 1 def get_num_constraints(self): """ Two for energy balance (one equality) One each p_charge, p_discharge, p_import, p_export Two p_genset if genset TODO: do you need pv_curtail and loss_load :return: """ return self.n_constraints def get_constraint_values(self): """ All constraints are set up here such that we return c_i for constraints of the form c_i<0 :return: """ inequality_constraints = self._get_inequality_constraints() energy_balance = self._get_energy_balance() if self.only_inequality_constr: constraints = inequality_constraints return constraints return np.append(inequality_constraints, energy_balance) def _get_energy_balance(self): if self.has_genset: p_import, p_export, p_charge, p_discharge, p_genset, load, pv, pv_consumed = \ self.get_values('grid_import','grid_export', 'battery_charge', 'battery_discharge','genset','load','pv','pv_consummed') else: p_import, p_export, p_charge, p_discharge, load, pv, pv_consumed = \ self.get_values('grid_import', 'grid_export', 'battery_charge', 'battery_discharge', 'load', 'pv', 'pv_consummed') p_genset = 0 pv_curtailed = pv-pv_consumed energy_balance = np.array(p_import-p_export-p_charge+p_discharge+p_genset-pv_curtailed-load+pv) if self.scale_constraints: charge_scale_factor = float(self.microgrid.parameters.battery_capacity.squeeze()) energy_balance /= charge_scale_factor return energy_balance def _get_inequality_constraints(self): constraints = [] p_charge, p_discharge, p_max_charge, p_max_discharge = self.get_values('battery_charge','battery_discharge', 'capa_to_charge','capa_to_discharge') if self.scale_constraints: charge_scale_factor = float(self.microgrid.parameters.battery_capacity.squeeze()) constraints.append((p_charge-p_max_charge)/charge_scale_factor) constraints.append((p_discharge-p_max_discharge)/charge_scale_factor) else: constraints.append(p_charge - p_max_charge) constraints.append(p_discharge - p_max_discharge) p_max_import = self.microgrid.parameters['grid_power_import'].values[0] p_max_export = self.microgrid.parameters['grid_power_export'].values[0] p_import, p_export, grid_status = self.get_values('grid_import','grid_export','grid_status') if self.scale_constraints: constraints.append((p_import - p_max_import * grid_status)/p_max_import) constraints.append((p_export - p_max_export * grid_status)/p_max_export) else: constraints.append(p_import-p_max_import*grid_status) constraints.append(p_export-p_max_export*grid_status) battery_max = self.microgrid.parameters['battery_soc_max'].values[0] battery_min = self.microgrid.parameters['battery_soc_min'].values[0] battery_soc, = self.get_values('battery_soc') if self.scale_constraints: constraints.append((battery_soc - battery_max)/battery_max) constraints.append((battery_min - battery_soc)/battery_min) else: constraints.append(battery_soc-battery_max) constraints.append(battery_min-battery_soc) if self.has_genset: p_genset_max = self.microgrid.parameters['genset_rated_power'].values[0] * self.microgrid.parameters['genset_pmax'].values[0] p_genset_min = self.microgrid.parameters['genset_rated_power'].values[0] * self.microgrid.parameters['genset_pmin'].values[0] p_genset, = self.get_values('genset') # TODO what if we want it to be off? For now, this: if p_genset<1: if self.scale_constraints: constraints.append((p_genset-1)/p_genset_max) constraints.append((-p_genset-self.balance_tolerance)/p_genset_max) else: constraints.append(p_genset - 1) constraints.append(-p_genset - self.balance_tolerance) else: if self.scale_constraints: constraints.append((p_genset - p_genset_max)/p_genset_max) constraints.append((p_genset_min - p_genset)/p_genset_min) else: constraints.append(p_genset-p_genset_max) constraints.append(p_genset_min-p_genset) constraints = np.array(constraints) return constraints class SafeExpMicrogridSampleEnv(SafeExpMicrogridEnv): def __init__(self, microgrid, standardization=True, balance_tolerance=1., scale_constraints=True, only_inequality_constr=True, forecast_args=None, baseline_sampling_args=None, trajectory_len=None, max_episode_len=None): super().__init__(microgrid, standardization=standardization, balance_tolerance=balance_tolerance, scale_constraints=scale_constraints, only_inequality_constr=only_inequality_constr, trajectory_len=trajectory_len, max_episode_len=max_episode_len) self.forecast_args = forecast_args self.forecast_args = forecast_args self.baseline_sampling_args = baseline_sampling_args self.saa = generate_sampler(self.microgrid, forecast_args) def reset(self, sampling_args=None): sample_reset(self.has_grid, self.saa, self.microgrid, sampling_args=sampling_args) observations = super().reset() return observations ================================================ FILE: src/pymgrid/_deprecated/Environments/pymgrid_csca_old.py ================================================ from pymgrid.Environments.Environment import Environment import numpy as np import gym from gym.utils import seeding from gym.spaces import Space, Discrete, Box class MicroGridEnv(Environment): """ Markov Decision Process associated to the microgrid. Parameters ---------- microgrid: microgrid, mandatory The controlled microgrid. random_seed: int, optional Seed to be used to generate the needed random numbers to size microgrids. """ def __init__(self, env_config, seed=42): super().__init__(env_config, seed) self.Na = 4 + self.mg.architecture['grid'] * 3 + self.mg.architecture['genset'] * 1 action_limits = [int(self.mg._pv_ts.max().values[0]), int(self.mg.parameters['battery_power_charge'].values[0]), int(self.mg.parameters['battery_power_discharge'].values[0]), 2, ] if self.mg.architecture['genset'] ==1: action_limits.append(int(self.mg.parameters['genset_rated_power'].values[0]* self.mg.parameters['genset_pmax'].values[0])) if self.mg.architecture['grid'] == 1: action_limits.append(int(self.mg.parameters['grid_power_import'].values[0])) action_limits.append(int(self.mg.parameters['grid_power_export'].values[0])) action_limits.append(2) self.action_space = gym.spaces.Tuple([gym.spaces.Discrete(x) for x in action_limits]) def get_action(self, action): return self.get_action_continuous(action) ================================================ FILE: src/pymgrid/_deprecated/Environments/pymgrid_csda.py ================================================ from pymgrid.Environments.Environment import Environment import numpy as np import gym from gym.utils import seeding from gym.spaces import Space, Discrete, Box class MicroGridEnv(Environment): """ Markov Decision Process associated to the microgrid. Parameters ---------- microgrid: microgrid, mandatory The controlled microgrid. random_seed: int, optional Seed to be used to generate the needed random numbers to size microgrids. """ def __init__(self, env_config, seed=42): super().__init__(env_config, seed) self.Na = 4 + self.mg.architecture['grid'] * 3 + self.mg.architecture['genset'] * 1 action_limits = [int(self.mg._pv_ts.max().values[0]), int(self.mg.parameters['battery_power_charge'].values[0]), int(self.mg.parameters['battery_power_discharge'].values[0]), 2, ] if self.mg.architecture['genset'] ==1: action_limits.append(int(self.mg.parameters['genset_rated_power'].values[0]* self.mg.parameters['genset_pmax'].values[0])) if self.mg.architecture['grid'] == 1: action_limits.append(int(self.mg.parameters['grid_power_import'].values[0])) action_limits.append(int(self.mg.parameters['grid_power_export'].values[0])) action_limits.append(2) self.action_space = gym.spaces.Tuple([gym.spaces.Discrete(x) for x in action_limits]) def get_action(self, action): return self.get_action_discrete(action) ================================================ FILE: src/pymgrid/_deprecated/Environments/pymgrid_cspla.py ================================================ """ Copyright 2020 Total S.A Authors:Gonzague Henri Permission to use, modify, and distribute this software is given under the terms of the pymgrid License. NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Date: 2020/10/21 07:43 $ Gonzague Henri """ """ Copyright (C) <2020> This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . """ from pymgrid.Environments.Environment import Environment import numpy as np import gym from gym.utils import seeding from gym.spaces import Space, Discrete, Box class MicroGridEnv(Environment): """ Markov Decision Process associated to the microgrid. Parameters ---------- microgrid: microgrid, mandatory The controlled microgrid. random_seed: int, optional Seed to be used to generate the needed random numbers to size microgrids. """ def __init__(self, env_config, seed=42): super().__init__(env_config, seed) self.Na = 2 + self.mg.architecture['grid'] * 3 + self.mg.architecture['genset'] * 1 if self.mg.architecture['grid'] == 1 and self.mg.architecture['genset'] == 1: self.Na += 1 self.action_space = Discrete(self.Na) def get_action(self, action): return self.get_action_priority_list(action) ================================================ FILE: src/pymgrid/_deprecated/__init__.py ================================================ ================================================ FILE: src/pymgrid/_deprecated/non_modular_microgrid.py ================================================ """ Copyright 2020 Total S.A., Tanguy Levent all rights reserved, Authors:Gonzague Henri , Tanguy Levent <> Permission to use, modify, and distribute this software is given under the terms of the pymgrid License. NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Date: 2020/06/04 14:54 $ Gonzague Henri """ """ Copyright (C) <2020> This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . """ import pandas as pd import numpy as np from copy import copy from plotly.offline import init_notebook_mode, iplot import matplotlib.pyplot as plt from IPython.display import display from IPython import get_ipython def in_ipynb(): try: cfg = get_ipython().config if cfg['IPKernelApp']['parent_appname'] == 'ipython-notebook': return True else: return False except (NameError, AttributeError): return False if in_ipynb(): init_notebook_mode(connected=False) np.random.seed(123) #cf.set_config_file(offline=True, theme='pearl') #commented for now, issues with parallel processes DEFAULT_HORIZON = 24 #in hours DEFAULT_TIMESTEP = 1 #in hours ZERO = 10**-5 ''' The following classes are used to contain the information related to the different components of the microgrid. Their main use is for easy access in a notebook. ''' class Battery: """ The class battery is used to store the information related to the battery in a microgrid. One of the main use for this class is for an easy access to information in a notebook using the battery object contained in a microgrid. Parameters ---------- param_battery : dataframe All the data to initialize the battery. capa_to_charge : float Represents the amount of energy that a battery can charge before being full. capa_to_discharge : float Represents the amount of energy available that a battery can discharge before being empty. Attributes ---------- soc: float Value between 0 and 1 representing the state of charge of the battery (1 being full, 0 being empty) capacity: int Total energy capacity of the battery (kWh). soc_max: float Value representing the maximum SOC that a battery can reach soc_min: float Value representing the minimum SOC that a battery can reach p_charge_max: float Value representing the maximum charging rate of the battery (kW) p_discharge_max: float Value representing the maximum discharging rate of the battery (kW) efficiency: float Value between 0 and 1 representing a one-way efficiency of the battery (considering same efficiency for charging and discharging). cost_cycle: float Value representing the cost of using the battery in $/kWh. capa_to_charge : float Represents the amount of energy that a battery can charge before being full. capa_to_discharge : float Represents the amount of energy available that a battery can discharge before being empty. Notes ----- Another way to use this information in a notebook is to use /tab/ after /microgrid.battery./ so you can see all the battery attributes. Examples -------- >>> m_gen=mg.MicrogridGenerator(nb_microgrid=1,path='your_path') >>> m_gen.generate_microgrid() >>> m_gen.microgrids[0].battery You can then add a point and use tab to have suggestion of the different paramterers You can access state of charge for example with: >>> m_gen.microgrids[0].battery.soc """ def __init__(self, param_battery, capa_to_charge, capa_to_discharge): self.soc = param_battery['battery_soc_0'].values[0] self.capacity = param_battery['battery_capacity'].values[0] self.soc_max = param_battery['battery_soc_max'].values[0] self.soc_min = param_battery['battery_soc_min'].values[0] self.p_charge_max = param_battery['battery_power_charge'].values[0] self.p_discharge_max = param_battery['battery_power_discharge'].values[0] self.efficiency = param_battery['battery_efficiency'].values[0] self.cost_cycle = param_battery['battery_cost_cycle'].values[0] self.capa_to_charge = capa_to_charge self.capa_to_discharge = capa_to_discharge class Genset: """ The class Genset is used to store the information related to the genset in a microgrid. One of the main use for this class is for an easy access to information in a notebook using the genset object contained in a microgrid. Parameters ---------- param : dataframe All the data to initialize the genset. Attributes ---------- rated_power: int Maximum rater power of the genset. p_min: float Value representing the minimum operating power of the genset (kW) p_max: float Value representing the maximum operating power of the genset (kW) fuel_cost: float Value representing the cost of using the genset in $/kWh. Notes ----- Another way to use this information in a notebook is to use /tab/ after /microgrid.genset./ so you can see all the genset attributes. Examples -------- >>> m_gen=mg.MicrogridGenerator(nb_microgrid=1,path='your_path') >>> m_gen.generate_microgrid() >>> m_gen.microgrids[0].genset You can then add a point and use tab to have suggestion of the different paramaterers You can access the maximum power max for example with: >>> m_gen.microgrids[0].genset.p_max """ def __init__(self, param): self.rated_power = param['genset_rated_power'].values[0] self.p_min = param['genset_pmin'].values[0] self.p_max = param['genset_pmax'].values[0] self.fuel_cost = param['fuel_cost'].values[0] self.co2 = param['genset_co2'].values[0] class Grid: """ The class Grid is used to store the information related to the grid in a microgrid. One of the main use for this class is for an easy access to information in a notebook using the grid object contained in a microgrid. Parameters ---------- param : dataframe All the data to initialize the grid. status: int Whether the grid is connected or not at the first time step. Attributes ---------- power_export: float Value representing the maximum export power to the grid (kW) power_import: float Value representing the maximum import power from the grid (kW) price_export: float Value representing the cost of exporting to the grid in $/kWh. price_import: float Value representing the cost of importing to the grid in $/kWh. status: int, binary Binary value representing whether the grid is connected or not (for example 0 represent a black-out of the main grid). Notes ----- Another way to use this information in a notebook is to use /tab/ after /microgrid.grid./ so you can see all the grid attributes. Examples -------- >>> m_gen=mg.MicrogridGenerator(nb_microgrid=1,path='your_path') >>> m_gen.generate_microgrid() >>> m_gen.microgrids[0].grid You can then add a point and use tab to have suggestion of the different paramaterers You can access the status of the grid for example with: >>> m_gen.microgrids[0].grid.status """ def __init__(self, param, status, price_import, price_export, co2): self.power_export = param['grid_power_export'].values[0] self.power_import = param['grid_power_import'].values[0] self.price_export = price_export #param['grid_price_export'].values[0] self.price_import = price_import # param['grid_price_import'].values[0] self.status = status self.co2 = co2 class NonModularMicrogrid: """ The class microgrid implement a microgrid. It is also used to run the simulation and different benchmarks. Parameters ---------- parameters : dataframe In parameters we find: -'parameters': a dataframe containing all the fixed (not changing with time ) parameters of the microgrid -'architecture': a dictionnary containing a binary variable for each possible generator and indicating if this microgrid has one of them -'load': the load time series -'pv': the pv time series -'grid_ts': a time series of 1 and 0 indicating whether the grid is available -'df_actions': an empty dataframe representing the actions that the microgrid can take -'df_status': a dataframe representing the parameters of the microgrid that change with time, with the information for the first time step -'df_actual_generation': an empty dataframe that is used to store what actually happens in the microgrid after control actions are taken -'df_cost': dataframe to track the cost of operating the microgrid at each time step -'control_dict': an example of the control dictionnary that needs to be passed in run to operate the microgrid horizon : int, optional The horizon considered to control the microgrid, mainly used in the MPC function and to return the forecasting values (in hour). timestep : int, optional Time step the microgrid is operating at (in hour). Attributes ---------- parameters: dataframe A dataframe containing all the fixed (not changing with time ) parameters of the microgrid architecture : dictionary A dictionary containing a binary variable for each possible generator and indicating if this microgrid has one of them _load_ts: dataframe The time series of load _pv_ts: dataframe Time series of PV generation pv: float The PV production at _run_timestep load: float The load consumption at _run_timestep _next_pv: float The PV production at _run_timestep +1 _next_load: float The load consumption at _run_timestep + 1 _grid_status_ts: dataframe A timeseries of binary values indicating whether the grid is connected or not. _df_record_control_dict: dataframe This dataframe is used to record the control actions taked at each time step. _df_record_state : dataframe This dataframe is used to record the variable parameters of the microgrid at each time step. _df_record_actual_production : dataframe This dataframe is used to record the actual generation of the microgrid at each time step. _df_record_cost : dataframe This dataframe is used to record the cost of operating the microgrid at each time step. _df_cost_per_epochs : dataframe In the case we run the simulation through multiple epochs, this dataframe is used to record the cost of operating the microgrid at each time step of each epoch. horizon : int, optional The horizon considered to control the microgrid, mainly used in the MPC function and to return the forecasting values (in hour). _run_timestep : int Time step the microgrid is operating at (in hour). _data_length: int Represents the number of time steps in PV/Load files (minimum between the 2) that will be used to run the simulation. done: True or False Indicates whether a simulation is done or not _has_run_rule_based_baseline: True or False Indicates whether the rule based benchmark has already been run or not. _has_run_mpc_baseline: True or False Indicates whether the MPC benchmark has already been run or not. _epoch: int Tracks what epoch the microgrid is at _zero: float Approximate value to 0, used in some comparisons control_dict: dictionnary Represents the list of control actions to pass in the run function battery: object Represents all the parameter of the battery, including the value changing with time (in this case it is the value at _run_timestep). genset: object Represents all the parameter of the genset, including the value changing with time (in this case it is the value at _run_timestep). grid: object Represents all the parameter of the grid, including the value changing with time (in this case it is the value at _run_timestep). benchmarks: algos.Control.Benchmarks Benchmark object with the ability to run benchmark algorithms and store/print the results. Notes ----- We are trying to keep hidden a lot of what is happening under the hood to simplify using this class for control or RL research at the maximum. A few notes, in this class parameters refer to the fixed parameters of the microgrid, meaning they don't vary with time. The varying parameters can be found in either the other classes or _df_record_state. Examples -------- To create microgrids through MicrogridGenerator: >>> m_gen=mg.MicrogridGenerator(nb_microgrid=1,path='your_path') >>> m_gen.generate_microgrid() >>>microgrid = m_gen.microgrid[0] To plot informations about the microgrid: >>> microgrid.print_info() >>> microgrid.print_control_info() To compute the benchmarks: >>> microgrid.compute_benchmark() # to compute them all >>> microgrid.compute_benchmark('mpc_linprog') #to compute only the MPC For example, a simple control loop: >>> while m_gen.microgrids[0].done == False: >>> load = mg_data['load'] >>> pv = mg_data['pv'] >>> control_dict = {'battery_charge': 0, 'battery_discharge': 0,'grid_import': max(0, load-pv),'grid_export':0,'pv': min(pv, load),} >>> mg_data = m_gen.microgrids[0].run(control_dict) """ def __init__(self, parameters, horizon=DEFAULT_HORIZON, timestep=DEFAULT_TIMESTEP): #list of parameters #this is a static dataframe: parameters of the microgrid that do not change with time #self._param_check(parameters) self.parameters = parameters['parameters'] self.architecture = parameters['architecture'] #different timeseries self._load_ts=parameters['load'] self._pv_ts=parameters['pv'] self.pv = self._pv_ts.iloc[0,0] self.load = self._load_ts.iloc[0, 0] self._next_load = self._load_ts.iloc[1,0] self._next_pv = self._pv_ts.iloc[1,0] if parameters['architecture']['grid']==1: self._grid_status_ts=parameters['grid_ts'] #time series of outages #self.grid_status = self._grid_status_ts.iloc[0, 0] self._grid_price_import=parameters['grid_price_import'] self._grid_price_export=parameters['grid_price_export'] self._grid_co2 = parameters['grid_co2'] self._next_grid_status = self._grid_status_ts.iloc[0, 0] self._next_grid_price_export = self._grid_price_export.iloc[0, 0] self._next_grid_price_import = self._grid_price_import.iloc[0, 0] self._next_grid_co2 = self._grid_co2.iloc[0, 0] # those dataframe record what is happening at each time step self._df_record_control_dict=parameters['df_actions'] self._df_record_state = parameters['df_status'] self._df_record_actual_production = parameters['df_actual_generation'] self._df_record_cost = parameters['df_cost'] self._df_record_co2 = parameters['df_co2'] self._df_cost_per_epochs = [] self.horizon = horizon self._tracking_timestep = 0 self._data_length = min(self._load_ts.shape[0], self._pv_ts.shape[0]) self.done = False self._has_run_rule_based_baseline = False self._has_run_mpc_baseline = False self._has_train_test_split = False self._epoch=0 self._zero = ZERO self.control_dict = parameters['control_dict'] self._data_set_to_use_default = 'all' self._data_set_to_use = 'all' if self.architecture['battery'] == 1: self.battery = Battery(self.parameters, self._df_record_state['capa_to_charge'][0], self._df_record_state['capa_to_discharge'][0]) if self.architecture['genset'] == 1: self.genset = Genset(self.parameters) if self.architecture['grid'] == 1: self.grid = Grid(self.parameters, self._grid_status_ts.iloc[0,0], self._grid_price_import.iloc[0, 0], self._grid_price_export.iloc[0, 0], self._grid_co2.iloc[0, 0]) def _param_check(self, parameters): """Simple parameter checks""" # Check parameters if not isinstance(parameters, dict): raise TypeError('parameters must be of type dict, is ({})'.format(type(parameters))) # Check architecture try: architecture = parameters['architecture'] except KeyError: print('Dict of parameters does not appear to contain architecture key') raise if not isinstance(architecture, dict): raise TypeError('parameters[\'architecture\'] must be of type dict, is ({})'.format(type(architecture))) for key, val in architecture.items(): if isinstance(val,bool): continue elif isinstance(val,int) and (val == 0 or val == 1): continue else: raise TypeError('Value ({}) of key ({}) in architecture is of unrecognizable type, ' 'must be bool or in {{0,1}}, is ({})'.format(val, key, type(val))) # Ensure various DataFrames exist and are in fact DataFrames keys = ('parameters', 'load', 'pv', 'df_actions', 'df_status', 'df_actual_generation', 'df_cost') for key in keys: try: df = parameters[key] except KeyError: print('Dict of parameters does not appear to contain {} key'.format(key)) raise if not isinstance(df, pd.DataFrame): raise TypeError('parameters[\'{}\'] must be of type pd.DataFrame, is ({})'.format(key, type(df))) def set_horizon(self, horizon): """Function used to change the horizon of the simulation.""" self.horizon = horizon def set_cost_co2(self, co2_cost): """Function used to change the horizon of the simulation.""" self.parameters['cost_co2'] = co2_cost def get_data(self): """Function to return the time series used in the microgrid""" return self._load_ts, self._pv_ts def get_training_testing_data(self): if self._has_train_test_split == True: return self._limit_index, self._load_train, self._pv_train, self._load_test, self._pv_test else: print('You have not split the dataset into training and testing sets') def get_control_dict(self): """ Function that returns the control_dict. """ return self.control_dict def get_parameters(self): """ Function that returns the parameters of the microgrid. """ return self.parameters def get_cost(self): """ Function that returns the cost associated the operation of the last time step. """ return self._df_record_cost['total_cost'][-1] def get_co2(self): """ Function that returns the co2 emissions associated to the operation of the last time step. """ return self._df_record_co2['co2'][-1] def get_updated_values(self): """ Function that returns microgrid parameters that change with time. Depending on the architecture we have: - PV production - Load - Battery state of charge - Battery capacity to charge - Battery capacity to discharge - Whether the grid is connected or not - CO2 intensity of the grid """ mg_data = {} for i in self._df_record_state: mg_data[i] = self._df_record_state[i][-1] return mg_data def forecast_all(self): """ Function that returns the PV, load and grid_status forecasted values for the next horizon. """ forecast = { 'pv': self.forecast_pv(), 'load': self.forecast_load(), } if self.architecture['grid'] == 1: forecast['grid_status'] = self.forecast_grid_status() forecast['grid_import'], forecast['grid_export'] = self.forecast_grid_prices() forecast['grid_co2'] = self.forecast_grid_co2() return forecast def forecast_pv(self): """ Function that returns the PV forecasted values for the next horizon. """ forecast = np.nan if self._data_set_to_use == 'training': forecast=self._pv_train.iloc[self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() if self._data_set_to_use == 'testing': forecast = self._pv_test.iloc[ self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() if self._data_set_to_use == 'all': forecast = self._pv_ts.iloc[self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() return forecast def forecast_load(self): """ Function that returns the load forecasted values for the next horizon. """ forecast = np.nan if self._data_set_to_use == 'training': forecast = self._load_train.iloc[self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() if self._data_set_to_use == 'testing': forecast = self._load_test.iloc[self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() if self._data_set_to_use == 'all': forecast = self._load_ts.iloc[self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() return forecast def forecast_grid_status(self): """ Function that returns the grid_status forecasted values for the next horizon. """ forecast = np.nan if self._data_set_to_use == 'training': forecast = self._grid_status_train.iloc[ self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() if self._data_set_to_use == 'testing': forecast = self._grid_status_test.iloc[ self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() if self._data_set_to_use == 'all': forecast = self._grid_status_ts.iloc[ self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() return forecast def forecast_grid_co2(self): """ Function that returns the grid_status forecasted values for the next horizon. """ forecast = np.nan if self._data_set_to_use == 'training': forecast = self._grid_co2_train.iloc[ self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() if self._data_set_to_use == 'testing': forecast = self._grid_co2_test.iloc[ self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() if self._data_set_to_use == 'all': forecast = self._grid_co2.iloc[ self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() return forecast def forecast_grid_prices(self): """ Function that returns the forecasted import and export prices for the next horizon. """ forecast_import = np.nan forecast_export = np.nan if self._data_set_to_use == 'training': forecast_import = self._grid_price_import_train.iloc[ self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() forecast_export = self._grid_price_export_train.iloc[ self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() if self._data_set_to_use == 'testing': forecast_import = self._grid_price_import_test.iloc[ self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() forecast_export = self._grid_price_export_test.iloc[ self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() if self._data_set_to_use == 'all': forecast_import = self._grid_price_import.iloc[ self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() forecast_export = self._grid_price_export.iloc[ self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten() return forecast_import, forecast_export #if return whole pv and load ts, the time can be counted in notebook def run(self, control_dict): """ Function to 'run' the microgrid and iterate over the dataset. Parameters ---------- control_dict : dictionnary Dictionnary containing the different control actions we want to apply to the microgrid. Its fields depend on the architecture of the microgrid Return ---------- self.get_updated_values(): dictionnary Return all the parameters that change with time in the microgrid. CF this function for more details. Notes ---------- This loop is the main connexion with a user in a notebook. That is where the simulation is ran and where the control actions are recorder and applied. """ control_dict['load'] = self.load control_dict['pv'] = self.pv self._df_record_control_dict = self._record_action(control_dict, self._df_record_control_dict) self._df_record_actual_production = self._record_production(control_dict, self._df_record_actual_production, self._df_record_state) if self.architecture['grid'] == 1: self._df_record_co2 = self._record_co2({ i:self._df_record_actual_production[i][-1] for i in self._df_record_actual_production}, self._df_record_co2, self.grid.co2) self._df_record_cost = self._record_cost({ i:self._df_record_actual_production[i][-1] for i in self._df_record_actual_production}, self._df_record_cost, self._df_record_co2, self.grid.price_import, self.grid.price_export) self._df_record_state = self._update_status({key: value[-1] for key, value in self._df_record_actual_production.items()}, self._df_record_state, self._next_load, self._next_pv, self._next_grid_status, self._next_grid_price_import, self._next_grid_price_export, self._next_grid_co2) else: self._df_record_co2 = self._record_co2({ i:self._df_record_actual_production[i][-1] for i in self._df_record_actual_production}, self._df_record_co2) self._df_record_cost = self._record_cost({ i:self._df_record_actual_production[i][-1] for i in self._df_record_actual_production}, self._df_record_cost, self._df_record_co2) self._df_record_state = self._update_status(control_dict, self._df_record_state, self._next_load, self._next_pv) if self._tracking_timestep == self._data_length - self.horizon or self._tracking_timestep == self._data_length - 1: self.done = True return self.get_updated_values() self._tracking_timestep += 1 self.update_variables() return self.get_updated_values() def train_test_split(self, train_size=0.67, shuffle = False, cancel=False): """ Function to split our data between a training and testing set. Parameters ---------- train_size : float, optional Value between 0 and 1 reflecting the percentage of the dataset that should be in the training set. shuffle: boolean Variable to know if the training and testing sets should be shuffled or in the 'temporal' order Not implemented yet for shuffle = True cancel: boolean Variable indicating if the split needs to be reverted, and the data brought back into one dataset Attributes ---------- _limit_index : int Index that delimit the training and testing sets in the time series load_train : dataframe Timeseries of load in training set pv_train: dataframe Timeseries of PV in training set load_test : dataframe Timeseries of load in testing set pv_test: dataframe Timeseries of PV in testing set grid_status_train: dataframe Timeseries of grid_status in training set grid_status_test: dataframe Timeseries of grid_status in testing set grid_price_import_train: dataframe Timeseries of price_import in training set grid_price_import_test: dataframe Timeseries of price_import in testing set grid_price_export_train: dataframe Timeseries of price_export in training set grid_price_export_test: dataframe Timeseries of price_export in testing set """ if self._has_train_test_split == False: self._limit_index = int(np.ceil(self._data_length*train_size)) self._load_train = self._load_ts.iloc[:self._limit_index] self._pv_train = self._pv_ts.iloc[:self._limit_index] self._load_test = self._load_ts.iloc[self._limit_index:] self._pv_test = self._pv_ts.iloc[self._limit_index:] if self.architecture['grid'] == 1: self._grid_status_train = self._grid_status_ts.iloc[:self._limit_index] self._grid_status_test = self._grid_status_ts.iloc[self._limit_index:] self._grid_price_import_train = self._grid_price_import.iloc[:self._limit_index] self._grid_price_import_test = self._grid_price_import.iloc[self._limit_index:] self._grid_price_export_train = self._grid_price_export.iloc[:self._limit_index] self._grid_price_export_test = self._grid_price_export.iloc[self._limit_index:] self._grid_co2_train = self._grid_co2.iloc[:self._limit_index] self._grid_co2_test = self._grid_co2.iloc[self._limit_index:] self._has_train_test_split = True self._data_set_to_use_default = 'training' self._data_set_to_use = 'training' elif self._has_train_test_split == True and cancel == True: self._has_train_test_split = False self._data_set_to_use_default = 'all' self._data_set_to_use = 'all' self.reset() def update_variables(self): """ Function that updates the variablers containing the parameters of the microgrid changing with time. """ if self._data_set_to_use == 'training': self.pv = self._pv_train.iloc[self._tracking_timestep, 0] self.load = self._load_train.iloc[self._tracking_timestep, 0] self._next_pv = self._pv_train.iloc[self._tracking_timestep +1, 0] self._next_load = self._load_train.iloc[self._tracking_timestep+1, 0] if self._data_set_to_use == 'testing': self.pv = self._pv_test.iloc[self._tracking_timestep, 0] self.load = self._load_test.iloc[self._tracking_timestep, 0] self._next_pv = self._pv_test.iloc[self._tracking_timestep+1, 0] self._next_load = self._load_test.iloc[self._tracking_timestep+1, 0] if self._data_set_to_use == 'all': self.pv = self._pv_ts.iloc[self._tracking_timestep, 0] self.load = self._load_ts.iloc[self._tracking_timestep, 0] if self._tracking_timestep < self._data_length - 1: self._next_pv = self._pv_ts.iloc[self._tracking_timestep+1, 0] self._next_load = self._load_ts.iloc[self._tracking_timestep+1, 0] else: self._next_pv, self._next_load = None, None if self.architecture['grid']==1: if self._data_set_to_use == 'training': self.grid.status = self._grid_status_train.iloc[self._tracking_timestep, 0] self.grid.price_import = self._grid_price_import_train.iloc[self._tracking_timestep,0] self.grid.price_export = self._grid_price_export_train.iloc[self._tracking_timestep,0] self.grid.co2 = self._grid_co2_train.iloc[self._tracking_timestep, 0] self._next_grid_status = self._grid_status_train.iloc[self._tracking_timestep +1, 0] self._next_grid_price_import = self._grid_price_import_train.iloc[self._tracking_timestep +1, 0] self._next_grid_price_export = self._grid_price_export_train.iloc[self._tracking_timestep +1, 0] self._next_grid_co2 = self._grid_co2_train.iloc[self._tracking_timestep + 1, 0] if self._data_set_to_use == 'testing': self.grid.status = self._grid_status_test.iloc[self._tracking_timestep, 0] self.grid.price_import = self._grid_price_import_test.iloc[self._tracking_timestep, 0] self.grid.price_export = self._grid_price_export_test.iloc[self._tracking_timestep, 0] self.grid.co2 = self._grid_co2_test.iloc[self._tracking_timestep, 0] self._next_grid_status = self._grid_status_test.iloc[self._tracking_timestep + 1, 0] self._next_grid_price_import = self._grid_price_import_test.iloc[self._tracking_timestep + 1, 0] self._next_grid_price_export = self._grid_price_export_test.iloc[self._tracking_timestep + 1, 0] self._next_grid_co2 = self._grid_co2_test.iloc[self._tracking_timestep + 1, 0] if self._data_set_to_use == 'all': self.grid.status = self._grid_status_ts.iloc[self._tracking_timestep, 0] self.grid.price_import = self._grid_price_import.iloc[self._tracking_timestep, 0] self.grid.price_export = self._grid_price_export.iloc[self._tracking_timestep, 0] self.grid.co2 = self._grid_co2.iloc[self._tracking_timestep, 0] if self._tracking_timestep < self._data_length - 1: self._next_grid_status = self._grid_status_ts.iloc[self._tracking_timestep + 1, 0] self._next_grid_price_import = self._grid_price_import.iloc[self._tracking_timestep + 1, 0] self._next_grid_price_export = self._grid_price_export.iloc[self._tracking_timestep + 1, 0] self._next_grid_co2 = self._grid_co2.iloc[self._tracking_timestep + 1, 0] else: self._next_grid_status, self._next_grid_price_import, self._next_grid_price_export, \ self._next_grid_co2 = None, None, None, None if self.architecture['battery'] == 1: self.battery.soc = self._df_record_state['battery_soc'][-1] self.battery.capa_to_discharge = self._df_record_state['capa_to_discharge'][-1] self.battery.capa_to_charge = self._df_record_state['capa_to_charge'][-1] def reset(self, testing=False): """This function is used to reset the dataframes that track what is happening in simulation. Mainly used in RL.""" if self._data_set_to_use == 'training': temp_cost = copy(self._df_record_cost) temp_cost['epoch'] = self._epoch self._df_cost_per_epochs.append(temp_cost) self._df_record_control_dict = {i:[] for i in self._df_record_control_dict} self._df_record_state = {i:[self._df_record_state[i][0]] for i in self._df_record_state} self._df_record_actual_production = {i:[] for i in self._df_record_actual_production} self._df_record_cost = {i:[] for i in self._df_record_cost} self._df_record_co2 = {i:[] for i in self._df_record_co2} self._tracking_timestep = 0 if testing == True and self._data_set_to_use_default == 'training': self._data_set_to_use = 'testing' self._data_length = min(self._load_test.shape[0], self._pv_test.shape[0]) else: self._data_set_to_use = self._data_set_to_use_default if self._data_set_to_use == 'training': self._data_length = min(self._load_train.shape[0], self._pv_train.shape[0]) else: self._data_length = min(self._load_ts.shape[0], self._pv_ts.shape[0]) self.update_variables() self.done = False self._epoch+=1 ######################################################## # FUNCTIONS TO UPDATE THE INTERNAL DICTIONARIES ######################################################## def _record_action(self, control_dict, df): """ This function is used to record the actions taken, before being checked for feasability. """ if not isinstance(df, dict): raise TypeError('We know this should be named differently but df needs to be dict, is {}'.format(type(df))) for j in df: if j in control_dict.keys(): df[j].append(control_dict[j]) else: df[j].append({j:0}) #df = df.append(control_dict,ignore_index=True) return df def _update_status(self, production_dict, df, next_load, next_pv, next_grid = 0, next_price_import =0, next_price_export = 0, next_co2 = 0): """ This function update the parameters of the microgrid that change with time. """ #self.df_status = self.df_status.append(self.new_row, ignore_index=True) if not isinstance(df, dict): raise TypeError('We know this should be named differently but df needs to be dict, is {}'.format(type(df))) new_dict = { 'load': next_load, 'pv': next_pv, 'hour':self._tracking_timestep%24, } new_soc =np.nan if self.architecture['battery'] == 1: new_soc = df['battery_soc'][-1] + (production_dict['battery_charge'] * self.parameters['battery_efficiency'].values[0] - production_dict['battery_discharge'] / self.parameters['battery_efficiency'].values[0]) / self.parameters['battery_capacity'].values[0] #if col == 'net_load': capa_to_charge = max( (self.parameters['battery_soc_max'].values[0] * self.parameters['battery_capacity'].values[0] - new_soc * self.parameters['battery_capacity'].values[0] ) * self.parameters['battery_efficiency'].values[0], 0) capa_to_discharge = max((new_soc * self.parameters['battery_capacity'].values[0] - self.parameters['battery_soc_min'].values[0] * self.parameters['battery_capacity'].values[0] ) * self.parameters['battery_efficiency'].values[0], 0) new_dict['battery_soc']=new_soc new_dict['capa_to_discharge'] = capa_to_discharge new_dict['capa_to_charge'] = capa_to_charge if self.architecture['grid'] == 1 : new_dict['grid_status'] = next_grid new_dict['grid_price_import'] = next_price_import new_dict['grid_price_export'] = next_price_export new_dict['grid_co2'] = next_co2 for j in df: df[j].append(new_dict[j]) #df = df.append(dict,ignore_index=True) return df #now we consider all the generators on all the time (mainly concern genset) def _check_constraints_genset(self, p_genset): """ This function checks that the constraints of the genset are respected.""" if p_genset < 0: p_genset =0 print('error, genset power cannot be lower than 0') if p_genset < self.parameters['genset_rated_power'].values[0] * self.parameters['genset_pmin'].values[0] and p_genset >1: p_genset = self.parameters['genset_rated_power'].values[0] * self.parameters['genset_pmin'].values[0] if p_genset > self.parameters['genset_rated_power'].values[0] * self.parameters['genset_pmax'].values[0]: p_genset = self.parameters['genset_rated_power'].values[0] * self.parameters['genset_pmax'].values[0] return p_genset def _check_constraints_grid(self, p_import, p_export): """ This function checks that the constraints of the grid are respected.""" if p_import < 0: p_import = 0 if p_export <0: p_export = 0 if p_import > self._zero and p_export > self._zero: pass #print ('cannot import and export at the same time') #todo how to deal with that? if p_import > self.parameters['grid_power_import'].values[0]: p_import = self.parameters['grid_power_import'].values[0] if p_export > self.parameters['grid_power_export'].values[0]: p_export = self.parameters['grid_power_export'].values[0] return p_import, p_export def _check_constraints_battery(self, p_charge, p_discharge, status): """ This function checks that the constraints of the battery are respected.""" if p_charge < 0: p_charge = 0 if p_discharge < 0: p_discharge = 0 if p_charge > self._zero and p_discharge > self._zero: pass capa_to_charge = max( (self.parameters['battery_soc_max'].values[0] * self.parameters['battery_capacity'].values[0] - status['battery_soc'][-1] * self.parameters['battery_capacity'].values[0] ) * self.parameters['battery_efficiency'].values[0], 0) capa_to_discharge = max((status['battery_soc'][-1] * self.parameters['battery_capacity'].values[0] - self.parameters['battery_soc_min'].values[0] * self.parameters['battery_capacity'].values[0] ) * self.parameters['battery_efficiency'].values[0], 0) if p_charge > capa_to_charge or p_charge > self.parameters['battery_power_charge'].values[0]: p_charge = min (capa_to_charge, self.parameters['battery_power_charge'].values[0]) if p_discharge > capa_to_discharge or p_discharge > self.parameters['battery_power_discharge'].values[0]: p_discharge = min (capa_to_discharge, self.parameters['battery_power_discharge'].values[0]) return p_charge, p_discharge def _record_production(self, control_dict, production_dict, status): """ This function records the actual production occuring in the microgrid. Based on the control actions and the parameters of the microgrid. This function will check that the control actions respect the constraints of the microgrid and then record what generators have produced energy. Parameters ---------- control_dict : dictionnary Dictionnary representing the control actions taken by an algorithm (either benchmark or in the run function). df: dataframe Previous version of the record_production dataframe (coming from the run loop, or benchmarks). status: dataframe One line dataframe representing the changing parameters of the microgrid. Notes ----- The mechanism to incure a penalty in case of over-generation is not yet in its final version. """ assert isinstance(production_dict, dict) try: control_dict.pop('pv_consummed') except KeyError: pass has_grid = self.architecture['grid'] == 1 has_genset = self.architecture['genset'] == 1 has_battery = self.architecture['battery'] == 1 sources = 0.0 sinks = control_dict['load'] # Battery if has_battery: p_charge, p_discharge = self._check_constraints_battery(control_dict['battery_charge'], control_dict['battery_discharge'], status) production_dict['battery_charge'].append(p_charge) production_dict['battery_discharge'].append(p_discharge) sources += p_discharge sinks += p_charge if has_grid: p_import, p_export = self._check_constraints_grid(control_dict['grid_import'], control_dict['grid_export']) production_dict['grid_import'].append(p_import) production_dict['grid_export'].append(p_export) sources += p_import sinks += p_export if has_genset: p_genset = self._check_constraints_genset(control_dict['genset']) production_dict['genset'].append(p_genset) sources += p_genset pv_required = sinks-sources pv_available = control_dict['pv'] if np.abs(pv_required-pv_available) < 1e-3: # meeting demand pv_consumed = pv_available loss_load = 0 pv_curtailed = 0 overgeneration = 0 elif pv_required > pv_available: # loss load pv_consumed = pv_available loss_load = pv_required-pv_available pv_curtailed = 0 overgeneration = 0 elif 0 < pv_required < pv_available: # curtail pv pv_consumed = pv_required loss_load = 0 pv_curtailed = pv_available-pv_required overgeneration = 0 else: # overgeneration. Requires NO pv whatsoever assert pv_required < 0 pv_consumed = 0 loss_load = 0 pv_curtailed = pv_available if pv_available > 0 else 0 overgeneration = -pv_required production_dict['pv_consummed'].append(pv_consumed) production_dict['loss_load'].append(loss_load) production_dict['pv_curtailed'].append(pv_curtailed) production_dict['overgeneration'].append(overgeneration) return production_dict def _record_co2(self, control_dict, df, grid_co2=0): """ This function record the cost of operating the microgrid at each time step.""" co2 = 0 if self.architecture['genset'] == 1: co2 += control_dict['genset'] * self.parameters['genset_co2'].values[0] if self.architecture['grid'] == 1: co2 += grid_co2 * control_dict['grid_import'] cost_dict = {'co2': co2} df['co2'].append( co2) return df def _record_cost(self, control_dict, df, df_co2, cost_import=0, cost_export=0): """ This function record the cost of operating the microgrid at each time step.""" if not isinstance(df, dict): raise TypeError('We know this should be named differently but df needs to be dict, is {}'.format(type(df))) cost_loss_load = control_dict['loss_load'] * self.parameters['cost_loss_load'].values[0] cost_overgeneration = control_dict['overgeneration'] * self.parameters['cost_overgeneration'].values[0] df['loss_load'].append(cost_loss_load) df['overgeneration'].append(cost_overgeneration) # cost += control_dict['loss_load'] * self.parameters['cost_loss_load'].values[0] # cost += control_dict['overgeneration'] * self.parameters['cost_overgeneration'].values[0] if self.architecture['genset'] == 1: genset_cost = control_dict['genset'] * self.parameters['fuel_cost'].values[0] df['genset'].append(genset_cost) if self.architecture['grid'] ==1: grid_import_cost = cost_import * control_dict['grid_import'] grid_export_cost = - cost_export * control_dict['grid_export'] df['grid_import'].append(grid_import_cost) df['grid_export'].append(grid_export_cost) if self.architecture['battery'] ==1 : battery_cost = (control_dict['battery_charge']+control_dict['battery_discharge'])*self.parameters['battery_cost_cycle'].values[0] df['battery'].append(battery_cost) co2_cost = self.parameters['cost_co2'].values[0] * df_co2['co2'][-1] df['co2'].append(co2_cost) total_cost = np.sum([val[-1] for key, val in df.items() if key != 'total_cost']) df['total_cost'].append(total_cost) return df ######################################################## # PRINT FUNCTIONS ######################################################## def print_load_pv(self): print('Load') fig1 = self._load_ts.iplot(asFigure=True) iplot(fig1) print('PV') fig2 =self._pv_ts.iplot(asFigure=True) iplot(fig2) def print_actual_production(self): if self._df_record_actual_production != type(pd.DataFrame()): df = pd.DataFrame(self._df_record_actual_production) fig1 = df.iplot(asFigure=True) iplot(fig1) else: fig1 = self._df_record_actual_production.iplot(asFigure=True) iplot(fig1) def print_control(self): if self._df_record_control_dict != type(pd.DataFrame()): df = pd.DataFrame(self._df_record_control_dict) fig1 = df.iplot(asFigure=True) iplot(fig1) else: fig1 = self._df_record_control_dict.iplot(asFigure=True) iplot(fig1) def print_co2(self): if self._df_record_co2 != type(pd.DataFrame()): df = pd.DataFrame(self._df_record_co2) fig1 = df.iplot(asFigure=True) iplot(fig1) else: fig1 = self._df_record_co2.iplot(asFigure=True) iplot(fig1) def print_cumsum_cost(self): if self._df_record_cost != type(pd.DataFrame()): df = pd.DataFrame(self._df_record_cost) plt.plot(df.cumsum()) plt.show() else: plt.plot(self._df_record_cost.cumsum()) plt.show() def print_benchmark_cost(self): """ This function prints the cumulative cost of the different benchmark ran and different part of the dataset depending on if split it in train/test or not. """ from pymgrid.algos.Control import Benchmarks benchmarks = Benchmarks(self) if len(benchmarks.outputs_dict) == 0: print('No benchmark algorithms have been run, running all.') #self.benchmarks.run_benchmarks() if self._has_train_test_split: benchmarks.describe_benchmarks(test_split=self._has_train_test_split, test_index=self._limit_index) else: benchmarks.describe_benchmarks(test_split=False) def print_info(self): """ This function prints the main information regarding the microgrid.""" print('Microgrid parameters') display(self.parameters) print('Architecture:') print(self.architecture) print('Actions: ') print(self._df_record_control_dict.keys()) print('Control dictionnary:') print(self.control_dict) print('Status: ') print(self._df_record_state.keys()) print('Has run mpc baseline:') print(self._has_run_mpc_baseline) print('Has run rule based baseline:') print(self._has_run_rule_based_baseline) def print_control_info(self): """ This function prints the control_dict that needs to be used to control the microgrid""" print('you should fill this dictionnary at each time step') print('it is included in the mg_data object') print('you can copy it by: ctrl = mg_data.control_dict') print('or you can use self.get_conrol_dict()') print('Control dictionnary:') print(self.control_dict) def print_updated_parameters(self): """ This function prints the last values for the parameters of the microgrid changing with time.""" state={} for i in self._df_record_state: state[i] = self._df_record_state[i][-1] print(state) ######################################################## # RL UTILITY FUNCTIONS ######################################################## #todo add a forecasting function that add noise to the time series #todo forecasting function can be used for both mpc benchmart and rl loop #todo verbose def penalty(self, coef = 1): """Penalty that represents discrepancies between control dict and what really happens. """ penalty = 0 for i in self._df_record_control_dict: penalty += abs(self._df_record_control_dict[i][-1] - self._df_record_actual_production[i][-1]) return penalty*coef @classmethod def from_modular(cls, modular): from pymgrid.convert.convert import to_nonmodular return to_nonmodular(modular) def to_modular(self): from pymgrid.convert.convert import to_modular return to_modular(self) ================================================ FILE: src/pymgrid/algos/Control.py ================================================ """ Copyright 2020 Total S.A. Authors:Gonzague Henri , Avishai Halev <> Permission to use, modify, and distribute this software is given under the terms of the pymgrid License. NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Date: 2020/08/27 08:04 $ Gonzague Henri """ """ Copyright (C) <2020> This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . """ import pandas as pd import numpy as np from copy import deepcopy class HorizonOutput: def __init__(self,control_dicts, microgrid, current_step): self.df = pd.DataFrame(control_dicts) self.microgrid = microgrid self.current_step = current_step self.cost = self.compute_cost_over_horizon(current_step) self.first_dict = control_dicts[0] def compute_cost_over_horizon(self, current_step): horizon = self.microgrid.horizon cost = 0.0 cost += self.df['loss_load'].sum()*self.microgrid.parameters['cost_loss_load'].values[0] # loss load if self.microgrid.architecture['genset'] == 1: cost += self.df['genset'].sum() * self.microgrid.parameters['fuel_cost'].values[0] if self.microgrid.architecture['grid'] == 1: price_import = self.microgrid._grid_price_import.iloc[current_step:current_step + horizon].values price_export = self.microgrid._grid_price_export.iloc[current_step:current_step + horizon].values import_cost_vec = price_import.reshape(-1)*self.df['grid_import'] export_cost_vec = price_export.reshape(-1)*self.df['grid_export'] grid_cost = import_cost_vec.sum()-export_cost_vec.sum() cost += grid_cost return cost def __eq__(self, other): if type(self) != type(other): return NotImplemented return self.cost == other.cost def __lt__(self, other): if type(self) != type(other): return NotImplemented return self.cost < other.cost def __gt__(self, other): if type(self) != type(other): return NotImplemented return self.cost > other.cost class ControlOutput(dict): """ Helper class that allows comparisons between controls by comparing the sum of their resultant costs Parameters: names: tuple, len 4 names of each of the dataframes output in MPC dfs: tuple, len 4 DataFrames of the outputs of MPC alg_name: str Name of the algorithm that produced the output Usage: dict-like, e.g.: >>> names = ('action', 'status', 'production', 'cost', 'co2') >>> dfs = (baseline_linprog_action, baseline_linprog_update_status, >>> baseline_linprog_record_production, baseline_linprog_cost) # From MPC >>> M = ControlOutput(names, dfs,'mpc') >>> actions = M['action'] # returns the dataframe baseline_linprog_action """ def __init__(self, names=None, dfs=None, alg_name=None, empty=False, microgrid=None): if not empty: if names is None: raise TypeError('names cannot be None unless initializing empty and empty=True') if dfs is None: raise TypeError('dfs cannot be None unless initializing empty and empty=True') if alg_name is None: raise TypeError('alg_name cannot be None unless initializing empty and empty=True') # else: # if not isinstance(microgrid,Microgrid.Microgrid): # raise TypeError('microgrid must be a Microgrid if empty is True') if not empty: names_needed = ('action', 'status', 'production', 'cost', 'co2') if any([needed not in names for needed in names_needed]): raise ValueError('Names must contain {}, currently contains {}'.format(names,names_needed)) super(ControlOutput, self).__init__(zip(names, dfs)) self.alg_name = alg_name self.microgrid = microgrid else: names = ('action', 'status', 'production', 'cost', 'co2') baseline_linprog_action = deepcopy(microgrid._df_record_control_dict) baseline_linprog_update_status = deepcopy(microgrid._df_record_state) baseline_linprog_record_production = deepcopy(microgrid._df_record_actual_production) baseline_linprog_cost = deepcopy(microgrid._df_record_cost) baseline_linprog_co2 = deepcopy(microgrid._df_record_co2) dfs = (baseline_linprog_action, baseline_linprog_update_status, baseline_linprog_record_production, baseline_linprog_cost, baseline_linprog_co2) super(ControlOutput, self).__init__(zip(names, dfs)) self.alg_name = alg_name self.microgrid = microgrid def append(self, other_output, actual_load=None, actual_pv=None, actual_grid = None, slice_to_use=0): if isinstance(other_output, ControlOutput): for name in self.keys(): if name not in other_output.keys(): raise KeyError('name {} not founds in other_output keys'.format(name)) self[name].append(other_output[name].iloc[slice_to_use], ignore_index=True) elif isinstance(other_output, HorizonOutput): action = self['action'] production = self['production'] cost = self['cost'] status = self['status'] co2 = self['co2'] action = self.microgrid._record_action(other_output.first_dict, action) production = self.microgrid._record_production(other_output.first_dict, production, status) last_prod = dict([(key, production[key][-1]) for key in production]) i = other_output.current_step if self.microgrid.architecture['grid'] == 1: co2 = self.microgrid._record_co2( last_prod, co2, self.microgrid._grid_co2.iloc[i].values[0] ) status = self.microgrid._update_status( last_prod, status, actual_load, actual_pv, actual_grid, self.microgrid._grid_price_import.iloc[i + 1].values[0], self.microgrid._grid_price_export.iloc[i + 1].values[0], self.microgrid._grid_co2.iloc[i + 1].values[0] ) cost = self.microgrid._record_cost( last_prod, cost, co2, self.microgrid._grid_price_import.iloc[i, 0], self.microgrid._grid_price_export.iloc[i, 0]) else: co2 = self.microgrid._record_co2( last_prod, co2, ) status = self.microgrid._update_status( last_prod, status, actual_load, actual_pv ) cost = self.microgrid._record_cost( last_prod, cost, co2 ) self['action'] = action self['production'] = production self['cost'] = cost self['status'] = status self['co2'] = co2 def to_frame(self): d = dict() max_len = -np.inf for k_1, v_1 in self.items(): for k_2, v_2 in v_1.items(): if len(v_2) > max_len: max_len = len(v_2) d[(k_1, k_2)] = v_2 for _, v in d.items(): if len(v) < max_len: v.extend([np.nan]*(max_len-len(v))) return pd.DataFrame(d) def __eq__(self, other): if type(self) != type(other): return NotImplemented return np.sum(self['cost']) == np.sum(other['cost']) def __lt__(self, other): if type(self) != type(other): return NotImplemented return np.sum(self['cost']) < np.sum(other['cost']) def __gt__(self, other): if type(self) != type(other): return NotImplemented return np.sum(self['cost']) > np.sum(other['cost']) class Benchmarks: """ Class to run various control algorithms. Currently supports MPC and rule-based control. Parameters ----------- microgrid: Microgrid.Microgrid microgrid on which to run the benchmarks Attributes ----------- microgrid, Microgrid.Microgrid microgrid on which to run the benchmarks mpc_output: ControlOutput or None, default None output of MPC if it has been run, otherwise None outputs_dict: dict Dictionary of the outputs of all run algorithm. Keys are names of algorithms, any or all of 'mpc' or 'rbc' as of now. has_mpc_benchmark: bool, default False whether the MPC benchmark has been run or not rule_based_output: ControlOutput or None, default None output of rule basded control if it has been run, otherwise None has_rule_based_benchmark: bool, default False whether the rule based benchmark has been run or not """ def __init__(self, microgrid): # if not isinstance(microgrid, Microgrid.Microgrid): # raise TypeError('microgrid must be of type Microgrid, is {}'.format(type(microgrid))) self.microgrid = microgrid self.outputs_dict = dict() self.mpc_output = None self.has_mpc_benchmark = False self.rule_based_output = None self.has_rule_based_benchmark = False self.saa_output = None self.has_saa_benchmark = False def run_mpc_benchmark(self, verbose=False, **kwargs): """ Run the MPC benchmark and store the output in self.mpc_output :return: None """ from pymgrid.algos import ModelPredictiveControl MPC = ModelPredictiveControl(self.microgrid) self.mpc_output = MPC.run(verbose=verbose, **kwargs) self.has_mpc_benchmark = True self.outputs_dict[self.mpc_output.alg_name] = self.mpc_output def run_rule_based_benchmark(self): """ Run the rule based benchmark and store the output in self.rule_based_output :return: None """ from pymgrid.algos import RuleBasedControl RBC = RuleBasedControl(self.microgrid) self.rule_based_output = RBC.run_rule_based() self.has_rule_based_benchmark = True self.outputs_dict[self.rule_based_output.alg_name] = self.rule_based_output def run_saa_benchmark(self, preset_to_use=85, **kwargs): from pymgrid.algos.saa import SampleAverageApproximation SAA = SampleAverageApproximation(self.microgrid, preset_to_use=preset_to_use, **kwargs) self.saa_output = SAA.run(**kwargs) self.has_saa_benchmark = True self.outputs_dict[self.saa_output.alg_name] = self.saa_output def run_benchmarks(self, algo=None, verbose=False, preset_to_use=85, **kwargs): """ Runs both run_mpc_benchmark() and self.run_mpc_benchmark() and stores the results. :param verbose: bool, default False Whether to describe benchmarks after running. :return: None """ if algo == 'mpc': self.run_mpc_benchmark(verbose=verbose, **kwargs) elif algo == 'rbc': self.run_rule_based_benchmark() elif algo == 'saa': self.run_saa_benchmark(preset_to_use=preset_to_use, **kwargs) else: self.run_mpc_benchmark(verbose=verbose, **kwargs) self.run_rule_based_benchmark() self.run_saa_benchmark(preset_to_use=preset_to_use, **kwargs) if verbose: self.describe_benchmarks() def describe_benchmarks(self, test_split=False, test_ratio=None, test_index=None, algorithms=None): """ Prints the cost of any and all benchmarks that have been run. If test_split==True, must have either a test_ratio or a test_index but not both. :param test_split: bool, default False Whether to report the cost of the partial tail (e.g. the last third steps) or all steps. :param test_ratio: float, default None If test_split, the percentage of the data set to report on. :param test_index: int, default None If test_split, the index to split the data into train/test sets :return: None """ possible_benchmarks = ('saa', 'mpc', 'rbc') if algorithms is not None: if any([b_name not in possible_benchmarks for b_name in algorithms]): raise ValueError('Unable to recognize one or multiple of list_of_benchmarks: {}, can only contain {}'.format( algorithms, possible_benchmarks)) else: algorithms = possible_benchmarks t_vals = [] for key in self.outputs_dict: t_vals.append(len(self.outputs_dict[key]['cost']['total_cost'])) if not all([t_val == t_vals[0] for t_val in t_vals]): raise ValueError('Outputs are of different lengths') T = t_vals[0] if test_split: if test_ratio is None and test_index is None: raise ValueError('If test_split, must have either a test_ratio or test_index') elif test_ratio is not None and test_index is not None: raise ValueError('Cannot have both test_ratio and test_split') elif test_ratio is not None and not (0 <= test_ratio <= 1): raise ValueError('test_ratio must be in [0,1], is {}'.format(test_ratio)) elif test_index is not None and test_index > T: raise ValueError('test_index cannot be larger than length of output') if T != 8736: print('length of MPCOutput cost is {}, not 8736, may be invalid'.format(T)) if not test_split or test_ratio is not None: if not test_split: test_ratio = 1 steps = T - int(np.ceil(T * (1 - test_ratio))) percent = round(test_ratio * 100, 1) if self.has_mpc_benchmark and 'mpc' in algorithms: cost = round(np.sum(self.mpc_output['cost']['total_cost'][int(np.ceil(T*(1-test_ratio))):]), 2) print('Cost of the last {} steps ({} percent of all steps) using MPC: {}'.format(steps, percent, cost)) if self.has_rule_based_benchmark and 'rbc' in algorithms: cost = round(np.sum(self.rule_based_output['cost']['total_cost'][int(np.ceil(T*(1-test_ratio))):]), 2) print('Cost of the last {} steps ({} percent of all steps) using rule-based control: {}'.format(steps, percent, cost)) if self.has_saa_benchmark and 'saa' in algorithms: cost = round(np.sum(self.saa_output['cost']['total_cost'][int(np.ceil(T*(1-test_ratio))):]), 2) print('Cost of the last {} steps ({} percent of all steps) using sample-average MPC control: {}'.format(steps, percent, cost)) else: if self.has_mpc_benchmark and 'mpc' in algorithms: cost_train = round(np.sum(self.mpc_output['cost']['total_cost'][:test_index]), 2) cost_test = round(np.sum(self.mpc_output['cost']['total_cost'][test_index:]), 2) print('Test set cost using MPC: {}'.format(cost_test)) print('Train set cost using MPC: {}'.format(cost_train)) if self.has_rule_based_benchmark and 'rbc' in algorithms: cost_train = round(np.sum(self.rule_based_output['cost']['total_cost'][:test_index]), 2) cost_test = round(np.sum(self.rule_based_output['cost']['total_cost'][test_index:]), 2) print('Test set cost using RBC: {}'.format(cost_test)) print('Train set cost using RBC: {}'.format(cost_train)) if self.has_saa_benchmark and 'saa' in algorithms: cost_train = round(np.sum(self.saa_output['cost']['total_cost'][:test_index]), 2) cost_test = round(np.sum(self.saa_output['cost']['total_cost'][test_index:]), 2) print('Test set cost using SAA: {}'.format(cost_test)) print('Train set cost using SAA: {}'.format(cost_train)) ================================================ FILE: src/pymgrid/algos/__init__.py ================================================ from .mpc.mpc import ModelPredictiveControl from .rbc.rbc import RuleBasedControl ================================================ FILE: src/pymgrid/algos/example.log ================================================ ================================================ FILE: src/pymgrid/algos/mpc/__init__.py ================================================ ================================================ FILE: src/pymgrid/algos/mpc/mpc.py ================================================ import time from copy import deepcopy from tqdm import tqdm import cvxpy as cp import numpy as np import pandas as pd from warnings import warn from scipy.sparse import csr_matrix try: import mosek except ImportError: mosek = None from pymgrid.algos.Control import ControlOutput, HorizonOutput from pymgrid.utils.DataGenerator import return_underlying_data import logging logger = logging.getLogger(__name__) """ Attributes: -------------- microgrid: Union[Microgrid.Microgrid, modular_microgrid.ModularMicrogrid] The underlying microgrid horizon: int The forecast horizon being used in MPC has_genset: bool Whether the microgrid has a genset or not p_vars: cvxpy.Variable, shape ((7+self.has_genset)*horizon,) Vector of all of the controls, at all timesteps. See P in pymgrid paper for details. u_genset: None or cvxpy.Variable, shape (self.horizon,) Boolean vector variable denoting the status of the genset (on or off) at each timestep if the genset exists. If not genset, u_genset = None. costs: cvxpy.Parameter, shape ((7+self.has_genset)*self.horizon,) Parameter vector of all of the respective costs, at all timesteps. See C in pymgrid paper for details. equality_rhs: cvxpy.Parameter, shape (2 * self.horizon,) Parameter vector contraining the RHS of the equality constraint equation. See b in pymgrid paper for details. inequality_rhs: cvxpy.Parameter, shape (8 * self.horizon,) Parameter vector contraining the RHS of the inequality constraint equation. See d in pymgrid paper for details. problem: cvxpy.problems.problem.Problem The constraint optimization problem to solve """ class ModelPredictiveControl: """ Run a model predictive control algorithm on a microgrid. In model predictive control, a model of the microgrid is used to predict the microgrid's response to taking certain actions. Armed with this prediction model, we can predict the microgrid's response to simulating forward a certain number of steps (the forecast "horizon"). This results in an objective function -- with the objective being the cost of running the microgrid over the entire horizon. Given the solution of this optimization problem, we apply the control we found at the current step (ignoring the rest) and then repeat. The specifics of the model implementation can be seen in the accompanying paper. .. warning:: This implementation of model predictive control does not support arbitrary microgrid components. One each of load, renewable, battery, grid, and genset are allowed. Microgrids are not required to have both grid and genset but they must have one; they also must have one each of load, renewable, and battery. Parameters ---------- microgrid : :class:`pymgrid.Microgrid` Microgrid on which to run model predictive control. """ def __init__(self, microgrid, solver=None): self.microgrid, self.is_modular, self.microgrid_module_names = self._verify_microgrid(microgrid) self.horizon = self._get_horizon() if self.has_genset: self.p_vars = cp.Variable((8*self.horizon,), pos=True) self.u_genset = cp.Variable((self.horizon,), boolean=True) self.costs = cp.Parameter(8 * self.horizon) self.inequality_rhs = cp.Parameter(9 * self.horizon) else: self.p_vars = cp.Variable((7*self.horizon,), pos=True) self.u_genset = None self.costs = cp.Parameter(7 * self.horizon, nonneg=True) self.inequality_rhs = cp.Parameter(8 * self.horizon) self.equality_rhs = cp.Parameter(2 * self.horizon) # rhs parameters = self._parse_microgrid() self.problem = self._create_problem(*parameters) self._passed_solver = solver self._solver = self._get_solver() @property def has_genset(self): """ :meta private: """ if self.is_modular: return "genset" in self.microgrid_module_names.keys() else: return self.microgrid.architecture["genset"] == 1 def _verify_microgrid(self, microgrid): try: microgrid.to_modular() return microgrid, False, {} except AttributeError: try: microgrid.to_nonmodular() return microgrid, True, self._get_modules(microgrid) except Exception as e: if isinstance(e, AttributeError) and "to_nonmodular" in e.args[0]: raise TypeError(f"Unable to verify microgrid as modular or nonmodular.") from e raise ValueError(f"Modular microgrid must be convertable to nonmodular. " f"Is not due to:\n{type(e)}: {e}") from e def _get_modules(self, modular_microgrid): def remove_suffix(s, suf): if suf and s.endswith(suf): return s[:-len(suf)] return s return {remove_suffix(module.item().__class__.__name__, "Module").lower(): name for name, module in modular_microgrid.modules.iterdict()} def _get_horizon(self): if self.is_modular: horizon = self.microgrid.get_forecast_horizon() + 1 if horizon == 0: raise ValueError("Microgrid has horizon=0. Do your timeseries modules have a forecaster?") return horizon return self.microgrid.horizon def _parse_microgrid(self): """ Protected helper function. Parses the microgrid in self.microgrid to extract the parameters necessary to run MPC. :return: eta: float battery efficiency battery_capacity: float battery capacity for normalization fuel_cost: float fuel cost for the genset cost_battery_cycle: float cost of cycling the battery cost_loss_load: float cost of loss load p_genset_min: float minimum production of the genset p_genset_max: float maximum production of the genset """ if self.is_modular: return self._parse_modular_microgrid() else: return self._parse_nonmodular_microgrid() def _parse_nonmodular_microgrid(self): parameters = self.microgrid.parameters eta = parameters['battery_efficiency'].values[0] battery_capacity = parameters['battery_capacity'].values[0] if self.microgrid.architecture['genset'] == 1: fuel_cost = parameters['fuel_cost'].values[0] else: fuel_cost = 0 cost_battery_cycle = parameters['battery_cost_cycle'].values[0] cost_loss_load = parameters['cost_loss_load'].values[0] cost_co2 = parameters['cost_co2'].values[0] if self.has_genset: p_genset_min = parameters['genset_pmin'].values[0] * parameters['genset_rated_power'].values[0] p_genset_max = parameters['genset_pmax'].values[0] * parameters['genset_rated_power'].values[0] genset_co2 = parameters['genset_co2'].values[0] else: p_genset_min = 0 p_genset_max = 0 genset_co2 = 0 return eta, battery_capacity, fuel_cost, cost_battery_cycle, cost_loss_load, p_genset_min, p_genset_max, cost_co2, genset_co2 def _parse_modular_microgrid(self): battery = self.microgrid.battery.item() eta = battery.efficiency battery_capacity = battery.max_capacity cost_battery_cycle = battery.battery_cost_cycle cost_loss_load = self.microgrid.modules[self.microgrid_module_names["unbalancedenergy"]].item().loss_load_cost if self.has_genset: genset = self.microgrid.modules[self.microgrid_module_names["genset"]].item() fuel_cost = genset.genset_cost p_genset_min = genset.running_min_production p_genset_max = genset.running_max_production cost_co2 = genset.cost_per_unit_co2 genset_co2 = genset.co2_per_unit else: fuel_cost, p_genset_min, p_genset_max, cost_co2, genset_co2 = 0, 0, 0, 0, 0 return ( eta, battery_capacity, fuel_cost, cost_battery_cycle, cost_loss_load, p_genset_min, p_genset_max, cost_co2, genset_co2 ) def _create_problem(self, eta, battery_capacity, fuel_cost, cost_battery_cycle, cost_loss_load, p_genset_min, p_genset_max, cost_co2, genset_co2): """ Protected, automatically called on initialization. Defines the constrainted optimization problem to be stored in self.problem. The parameters defined here do not change between timesteps. :param eta: float battery efficiency :param battery_capacity: float battery capacity for normalization :param fuel_cost: float fuel cost for the genset :param cost_battery_cycle: float cost of cycling the battery :param cost_loss_load: float cost of loss load :param p_genset_min: float minimum production of the genset :param p_genset_max: float maximum production of the genset :return : problem: cvxpy.problems.problem.Problem The constrainted optimization problem to be solved at each step of the MPC. """ delta_t = 1 # Define matrix Y if self.has_genset: Y = np.zeros((self.horizon, self.horizon * 8)) Y[0, 3] = -1.0 * eta * delta_t/battery_capacity Y[0, 4] = delta_t / (eta * battery_capacity) Y[0, 7] = 1 gamma = np.zeros(16) gamma[7] = -1 gamma[11] = -1.0 * eta * delta_t/battery_capacity gamma[12] = delta_t / (eta * battery_capacity) gamma[15] = 1 for j in range(1, self.horizon): start = (j - 1) * 8 Y[j, start:start + 16] = gamma else: Y = np.zeros((self.horizon, self.horizon * 7)) Y[0, 2] = -1.0 * eta * delta_t / battery_capacity Y[0, 3] = delta_t / (eta * battery_capacity) Y[0, 6] = 1 gamma = np.zeros(14) gamma[6] = -1 gamma[9] = -1.0 * eta * delta_t/battery_capacity gamma[10] = delta_t / (eta * battery_capacity) gamma[13] = 1 for j in range(1, self.horizon): start = (j - 1) * 7 Y[j, start:start + 14] = gamma # done with Y if self.has_genset: X = np.zeros((self.horizon, self.horizon * 8)) alpha = np.ones(8) alpha[2] = -1 alpha[3] = -1 alpha[5] = -1 alpha[7] = 0 for j in range(self.horizon): start = j * 8 X[j, start:start + 8] = alpha else: X = np.zeros((self.horizon, self.horizon * 7)) alpha = np.ones(7) alpha[1] = -1 alpha[2] = -1 alpha[4] = -1 alpha[6] = 0 for j in range(self.horizon): start = j * 7 X[j, start:start + 7] = alpha A = np.concatenate((X, Y)) # lhs A = csr_matrix(A) # Define inequality constraints # Inequality lhs # This is for one timestep C_block = np.zeros((9, 8)) C_block[0, 0] = 1 C_block[1, 7] = 1 C_block[2, 7] = -1 C_block[3, 3] = 1 C_block[4, 4] = 1 C_block[5, 1] = 1 C_block[6, 2] = 1 C_block[7, 5] = 1 C_block[8, 6] = 1 if not self.has_genset: # drop the first column if no genset C_block = C_block[1:, 1:] # For all timesteps block_lists = [[C_block if i == j else np.zeros(C_block.shape) for i in range(self.horizon)] for j in range(self.horizon)] C = np.block(block_lists) C = csr_matrix(C) # Inequality rhs constraints = [A @ self.p_vars == self.equality_rhs, C @ self.p_vars <= self.inequality_rhs] if self.has_genset: constraints.extend((p_genset_min * self.u_genset <= self.p_vars[:: 8], self.p_vars[:: 8] <= p_genset_max * self.u_genset)) # Define objective if self.has_genset: cost_vector = np.array([fuel_cost + cost_co2 * genset_co2, 0, 0, cost_battery_cycle, cost_battery_cycle, 0, cost_loss_load, 0]) else: cost_vector = np.array([0, 0, cost_battery_cycle, cost_battery_cycle, 0, cost_loss_load, 0]) costs_vector = np.concatenate([cost_vector] * self.horizon) self.costs.value = costs_vector objective = cp.Minimize(self.costs @ self.p_vars) return cp.Problem(objective, constraints) def _get_solver(self, mosek_failure=None): if self._passed_solver is not None: return self._passed_solver elif "MOSEK" in cp.installed_solvers() and mosek_failure is None: solver = cp.MOSEK elif "GLPK_MI" in cp.installed_solvers(): solver = cp.GLPK_MI elif self.problem.is_mixed_integer(): assert self.has_genset raise RuntimeError("If microgrid has a genset, the cvxpy problem becomes mixed integer. Either MOSEK or " "CVXOPT must be installed.\n" "You can install both by calling pip install -e .'[genset_mpc]' in the root folder of " "pymgrid. Note that MOSEK requires a license; see https://www.mosek.com/ for details.\n" "Academic and trial licenses are available.") else: solver = None if mosek_failure is not None: logger.info(f"MOSEK Solver failed due to {mosek_failure}. Retrying with solver={solver}") else: logger.info("Using default solver." if solver is None else f"Using {solver} solver.") return solver def _set_parameters(self, load_vector, pv_vector, grid_vector, import_price, export_price, e_max, e_min, p_max_charge, p_max_discharge, p_max_import, p_max_export, soc_0, p_genset_max, cost_co2, grid_co2, genset_co2,): """ Protected, called by _set_and_solve. Sets the time-varying (and some static) parameters in the optimization problem at any given timestep. :param load_vector: np.ndarray, shape (self.horizon,) load values over the horizon :param pv_vector: np.ndarray, shape (self.horizon,) pv values over the horizon :param grid_vector: np.ndarray, shape (self.horizon,) grid values (boolean) over the horizon :param import_price: np.ndarray, shape (self.horizon,) import prices over the horizon :param export_price: np.ndarray, shape (self.horizon,) export prices over the horizon :param e_max: float maximum state of charge of the battery :param e_min: float minimum state of charge of the battery :param p_max_charge: float maximum amount of power the battery can charge in one timestep :param p_max_discharge: float maximum amount of power the battery can discharge in one timestep :param p_max_import: float maximum amount of power that can be imported in one timestep :param p_max_export: float maximum amount of power that can be exported in one timestep :param soc_0: float state of charge of the battery at the timestep just preceding the current horizon :return: None """ vector_dict = dict(load_vector=load_vector, pv_vector=pv_vector, grid_vector=grid_vector, import_price=import_price, export_price=export_price) for name, vector in vector_dict.items(): if not isinstance(vector, np.ndarray): raise TypeError(f'Vector {name} must be ndarray, is {type(vector)}.') if len(vector.shape) != 1 and load_vector.shape[0] != self.horizon: raise ValueError(f'Invalid {name} shape {vector.shape}, must have shape ({self.horizon}, ).') # Set equality rhs equality_rhs_vals = np.zeros(self.equality_rhs.shape) equality_rhs_vals[:self.horizon] = load_vector-pv_vector equality_rhs_vals[self.horizon] = soc_0 self.equality_rhs.value = equality_rhs_vals # Set inequality rhs if self.has_genset: inequality_rhs_block = np.array([p_genset_max, e_max, -e_min, p_max_charge, p_max_discharge, np.nan, np.nan, np.nan, np.nan]) else: inequality_rhs_block = np.array([e_max, -e_min, p_max_charge, p_max_discharge, np.nan, np.nan, np.nan, np.nan]) inequality_rhs_vals = np.concatenate([inequality_rhs_block]*self.horizon) # set d7-d10 if self.has_genset: inequality_rhs_vals[5::9] = p_max_import * grid_vector inequality_rhs_vals[6::9] = p_max_export * grid_vector inequality_rhs_vals[7::9] = pv_vector inequality_rhs_vals[8::9] = load_vector else: inequality_rhs_vals[4::8] = p_max_import * grid_vector inequality_rhs_vals[5::8] = p_max_export * grid_vector inequality_rhs_vals[6::8] = pv_vector inequality_rhs_vals[7::8] = load_vector if np.isnan(inequality_rhs_vals).any(): raise RuntimeError('There are still nan values in inequality_rhs_vals, something is wrong') self.inequality_rhs.value = inequality_rhs_vals # Set costs if self.has_genset: self.costs.value[1::8] = import_price.reshape(-1) + grid_co2.reshape(-1) * cost_co2 self.costs.value[2::8] = export_price.reshape(-1) else: self.costs.value[0::7] = import_price.reshape(-1) + grid_co2.reshape(-1) * cost_co2 self.costs.value[1::7] = export_price.reshape(-1) if np.isnan(self.costs.value).any(): raise RuntimeError('There are still nan values in self.costs.value, something is wrong') def run(self, max_steps=None, verbose=False): """ Run the model prediction control algorithm. Parameters --------- max_steps : int or None, default None Maximum number of MPC steps. If None, run until the microgrid terminates. verbose : bool, default False Whether to display a progress bar. Returns ------- log : pd.DataFrame Results of running the rule-based control algorithm. """ if self.is_modular: return self._run_mpc_on_modular(forecast_steps=max_steps, verbose=verbose) else: return self._run_mpc_on_nonmodular(forecast_steps=max_steps, verbose=verbose) def _run_mpc_on_nonmodular(self, forecast_steps=None, verbose=False): """ Function that allows MPC to be run on self.microgrid by first parsing its data :param forecast_steps: int, default None Number of steps to run MPC on. If None, runs over 8760-self.horizon steps :param verbose: bool Whether to discuss progress :return: output, ControlOutput dict-like containing the DataFrames ('action', 'status', 'production', 'cost'), but with an ordering defined via comparing the costs. """ sample = return_underlying_data(self.microgrid) sample = sample.reset_index(drop=True) return self._run_mpc_on_sample(sample, forecast_steps=forecast_steps, verbose=verbose) def _run_mpc_on_modular(self, forecast_steps=None, verbose=False): num_iter = self._get_num_iter(forecast_steps) self.microgrid.reset() for i in tqdm(range(num_iter), desc="MPC Progress", disable=(not verbose)): control = self._set_and_solve(*self._get_modular_state_values(), iteration=i, total_iterations=num_iter, verbose=verbose>1) _, _, done, _ = self.microgrid.run(control, normalized=False) if done: break return self.microgrid.get_log() def _get_num_iter(self, forecast_steps=None): if forecast_steps is not None: assert forecast_steps <= len(self.microgrid), 'forecast steps cannot be longer than data length.' return forecast_steps elif not self.is_modular: return len(self.microgrid) - self.horizon return self.microgrid.final_step - self.microgrid.initial_step def _run_mpc_on_sample(self, sample, forecast_steps=None, verbose=False): """ Runs MPC on a sample over a number of iterations :param sample: pd.DataFrame, shape (8760,3) sample to run the MPC on. Must contain columns 'load', 'pv', and 'grid'. :param forecast_steps: int, default None Number of steps to run MPC on. If None, runs over 8760-self.horizon steps :param verbose: bool Whether to discuss progress :return: output, ControlOutput dict-like containing the DataFrames ('action', 'status', 'production', 'cost'), but with an ordering defined via comparing the costs. """ if not isinstance(sample, pd.DataFrame): raise TypeError('sample must be of type pd.DataFrame, is {}'.format(type(sample))) sample = sample.iloc[:self.microgrid._data_length] # dataframes, copied API from _baseline_linprog self.microgrid.reset() baseline_linprog_action = deepcopy(self.microgrid._df_record_control_dict) baseline_linprog_update_status = deepcopy(self.microgrid._df_record_state) baseline_linprog_record_production = deepcopy(self.microgrid._df_record_actual_production) baseline_linprog_cost = deepcopy(self.microgrid._df_record_cost) baseline_linprog_co2 = deepcopy(self.microgrid._df_record_co2) T = len(sample) horizon = self.microgrid.horizon if forecast_steps is None: num_iter = T - horizon else: assert forecast_steps <= T - horizon, 'forecast steps can\'t look past horizon' num_iter = forecast_steps t0 = time.time() old_control_dict = None for i in tqdm(range(num_iter), desc="MPC Progress", disable=(not verbose)): if self.microgrid.architecture['grid'] == 0: temp_grid = np.zeros(horizon) price_import = np.zeros(horizon) price_export = np.zeros(horizon) p_max_import = 0 p_max_export = 0 grid_co2 = np.zeros(horizon) else: temp_grid = sample.loc[i:i + horizon - 1, 'grid'].values price_import = self.microgrid._grid_price_import.iloc[i:i + horizon].values price_export = self.microgrid._grid_price_export.iloc[i:i + horizon].values grid_co2 = self.microgrid._grid_co2.iloc[i:i + horizon].values p_max_import = self.microgrid.parameters['grid_power_import'].values[0] p_max_export = self.microgrid.parameters['grid_power_export'].values[0] if temp_grid.shape != price_export.shape and price_export.shape != price_import.shape: raise RuntimeError('I think this is a problem') e_min = self.microgrid.parameters['battery_soc_min'].values[0] e_max = self.microgrid.parameters['battery_soc_max'].values[0] p_max_charge = self.microgrid.parameters['battery_power_charge'].values[0] p_max_discharge = self.microgrid.parameters['battery_power_discharge'].values[0] soc_0 = baseline_linprog_update_status['battery_soc'][-1] cost_co2 = self.microgrid.parameters['cost_co2'].values[0] if self.has_genset: p_genset_max = self.microgrid.parameters['genset_pmax'].values[0] *\ self.microgrid.parameters['genset_rated_power'].values[0] genset_co2 = self.microgrid.parameters['genset_co2'].values[0] else: p_genset_max = None genset_co2 = None # Solve one step of MPC control_dict = self._set_and_solve(sample.loc[i:i + horizon - 1, 'load'].values, sample.loc[i:i + horizon - 1, 'pv'].values, temp_grid, price_import, price_export, e_max, e_min, p_max_charge, p_max_discharge, p_max_import, p_max_export, soc_0, p_genset_max, cost_co2, grid_co2, genset_co2, iteration = i, total_iterations = num_iter) if control_dict is not None: baseline_linprog_action = self.microgrid._record_action(control_dict, baseline_linprog_action) baseline_linprog_record_production = self.microgrid._record_production(control_dict, baseline_linprog_record_production, baseline_linprog_update_status) old_control_dict = control_dict.copy() elif old_control_dict is not None: print('Using previous controls') baseline_linprog_action = self.microgrid._record_action(old_control_dict, baseline_linprog_action) baseline_linprog_record_production = self.microgrid._record_production(old_control_dict, baseline_linprog_record_production, baseline_linprog_update_status) else: raise RuntimeError('Fell through, was unable to solve for control_dict and could not find previous control dict') if self.microgrid.architecture['grid'] == 1: baseline_linprog_co2 = self.microgrid._record_co2( {i: baseline_linprog_record_production[i][-1] for i in baseline_linprog_record_production}, baseline_linprog_co2, self.microgrid._grid_co2.iloc[i].values[0], ) baseline_linprog_update_status = self.microgrid._update_status( {i: baseline_linprog_record_production[i][-1] for i in baseline_linprog_record_production}, baseline_linprog_update_status, sample.at[i + 1, 'load'], sample.at[i + 1, 'pv'], sample.at[i + 1, 'grid'], self.microgrid._grid_price_import.iloc[i + 1].values[0], self.microgrid._grid_price_export.iloc[i + 1].values[0], self.microgrid._grid_co2.iloc[i + 1].values[0], ) baseline_linprog_cost = self.microgrid._record_cost( {i: baseline_linprog_record_production[i][-1] for i in baseline_linprog_record_production}, baseline_linprog_cost, baseline_linprog_co2, self.microgrid._grid_price_import.iloc[i, 0], self.microgrid._grid_price_export.iloc[i, 0]) else: baseline_linprog_co2 = self.microgrid._record_co2( {i: baseline_linprog_record_production[i][-1] for i in baseline_linprog_record_production}, baseline_linprog_co2, ) baseline_linprog_update_status = self.microgrid._update_status( {i: baseline_linprog_record_production[i][-1] for i in baseline_linprog_record_production}, baseline_linprog_update_status, sample.at[i + 1, 'load'], sample.at[i + 1, 'pv'] ) baseline_linprog_cost = self.microgrid._record_cost( {i: baseline_linprog_record_production[i][-1] for i in baseline_linprog_record_production}, baseline_linprog_cost, baseline_linprog_co2, ) names = ('action', 'status', 'production', 'cost', 'co2') dfs = (baseline_linprog_action, baseline_linprog_update_status, baseline_linprog_record_production, baseline_linprog_cost, baseline_linprog_co2) if verbose: print('Total time: {} minutes'.format(round((time.time()-t0)/60, 2))) return ControlOutput(names, dfs, 'mpc') def _set_and_solve(self, load_vector, pv_vector, grid_vector, import_price, export_price, e_max, e_min, p_max_charge, p_max_discharge, p_max_import, p_max_export, soc_0, p_genset_max, cost_co2, grid_co2, genset_co2, iteration=None, total_iterations=None, return_steps=0, verbose=False): """ Sets the parameters in the problem and then solves the problem. Specifically, sets the right-hand sides b and d from the paper of the equality and inequality equations, respectively, and the costs vector by calling _set_parameters, then solves the problem and returns a control dictionary :param load_vector: np.ndarray, shape (self.horizon,) load values over the horizon :param pv_vector: np.ndarray, shape (self.horizon,) pv values over the horizon :param grid_vector: np.ndarray, shape (self.horizon,) grid values (boolean) over the horizon :param import_price: np.ndarray, shape (self.horizon,) import prices over the horizon :param export_price: np.ndarray, shape (self.horizon,) export prices over the horizon :param e_max: float maximum state of charge of the battery :param e_min: float minimum state of charge of the battery :param p_max_charge: float maximum amount of power the battery can charge in one timestep :param p_max_discharge: float maximum amount of power the battery can discharge in one timestep :param p_max_import: float maximum amount of power that can be imported in one timestep :param p_max_export: float maximum amount of power that can be exported in one timestep :param soc_0: float state of charge of the battery at the timestep just preceding the current horizon :param p_genset_max: float maximum amount of production of the genset :param iteration: int Current iteration, used for verbosity :param total_iterations: Total iterations, used for verbosity :return: control_dict, dict dictionary of the controls of the first timestep, as MPC does. """ self._set_parameters(load_vector, pv_vector, grid_vector, import_price, export_price, e_max, e_min, p_max_charge, p_max_discharge, p_max_import, p_max_export, soc_0, p_genset_max, cost_co2, grid_co2, genset_co2,) if mosek is not None: try: self.problem.solve(warm_start=True, solver=self._solver) except mosek.Error as e: self._solver = self._get_solver(mosek_failure=e) self.problem.solve(warm_start=True, solver=self._solver) else: self.problem.solve(warm_start=True, solver=self._solver) if self.problem.status == 'infeasible': warn("Infeasible problem") if self.is_modular: return self._extract_modular_control(load_vector, verbose) else: return self._extract_control_dict(return_steps, pv_vector, load_vector) def _extract_control_dict(self, return_steps, pv_vector, load_vector): if return_steps == 0: if self.has_genset: control_dict = {'battery_charge': self.p_vars.value[3], 'battery_discharge': self.p_vars.value[4], 'genset': self.p_vars.value[0], 'grid_import': self.p_vars.value[1], 'grid_export': self.p_vars.value[2], 'loss_load': self.p_vars.value[6], 'pv_consummed': pv_vector[0] - self.p_vars.value[5], 'pv_curtailed': self.p_vars.value[5], 'load': load_vector[0], 'pv': pv_vector[0]} else: control_dict = {'battery_charge': self.p_vars.value[2], 'battery_discharge': self.p_vars.value[3], 'grid_import': self.p_vars.value[0], 'grid_export': self.p_vars.value[1], 'loss_load': self.p_vars.value[5], 'pv_consummed': pv_vector[0] - self.p_vars.value[4], 'pv_curtailed': self.p_vars.value[4], 'load': load_vector[0], 'pv': pv_vector[0]} return control_dict else: if return_steps > self.horizon: raise ValueError('return_steps cannot be greater than horizon') control_dicts = [] if self.has_genset: for j in range(return_steps): start_index = j*8 control_dict = {'battery_charge': self.p_vars.value[start_index+3], 'battery_discharge': self.p_vars.value[start_index+4], 'genset': self.p_vars.value[start_index], 'grid_import': self.p_vars.value[start_index+1], 'grid_export': self.p_vars.value[start_index+2], 'loss_load': self.p_vars.value[start_index+6], 'pv_consummed': pv_vector[j] - self.p_vars.value[start_index+5], 'pv_curtailed': self.p_vars.value[start_index+5], 'load': load_vector[j], 'pv': pv_vector[j]} control_dicts.append(control_dict) else: for j in range(return_steps): start_index = j * 7 control_dict = {'battery_charge': self.p_vars.value[start_index + 2], 'battery_discharge': self.p_vars.value[start_index + 3], 'grid_import': self.p_vars.value[start_index], 'grid_export': self.p_vars.value[start_index + 1], 'loss_load': self.p_vars.value[start_index + 5], 'pv_consummed': pv_vector[j] - self.p_vars.value[start_index + 4], 'pv_curtailed': self.p_vars.value[start_index + 4], 'load': load_vector[j], 'pv': pv_vector[j]} control_dicts.append(control_dict) return control_dicts def _extract_modular_control(self, load_vector, verbose): control = dict() control_vals = list(self.p_vars.value) if self.has_genset: genset = control_vals.pop(0) genset_status = self.u_genset.value[0] control[self.microgrid_module_names["genset"]] = [np.array([genset_status, genset])] battery_charge, battery_discharge = control_vals[2:4] battery_diff = battery_discharge - battery_charge grid_import, grid_export = control_vals[0:2] grid_diff = grid_import - grid_export if battery_charge > 0 and battery_discharge > 0: if verbose and not np.isclose([battery_charge, battery_discharge], 0, atol=1e-4).any(): warn(f"battery_charge={battery_charge} and battery_discharge={battery_discharge} are both nonzero. " f"Flattening to the difference, leading to a {'discharge' if battery_diff > 0 else 'charge'} of {battery_diff}.") if grid_import > 0 and grid_export > 0: if verbose and not np.isclose([grid_import, grid_export], 0, atol=1e-4).any(): warn(f"grid_import={grid_import} and grid_export={grid_export} are both nonzero. " f"Flattening to the difference, leading to a {'import' if grid_diff > 0 else 'export'} of {grid_diff}.") if "grid" in self.microgrid_module_names.keys(): control.update({self.microgrid_module_names["grid"]: grid_diff}) control.update({self.microgrid_module_names["battery"]: battery_diff}) return control def _get_modular_state_values(self): load_state = -1.0 * self.microgrid.modules[self.microgrid_module_names["load"]].item().state # state is negative, want positive values. pv_state = self.microgrid.modules[self.microgrid_module_names["renewable"]].item().state try: grid = self.microgrid.modules[self.microgrid_module_names["grid"]].item() except KeyError: grid_status = np.zeros(self.horizon) price_import = np.zeros(self.horizon) price_export = np.zeros(self.horizon) grid_co2_per_kwh = np.zeros(self.horizon) cost_co2 = [] grid_max_import, grid_max_export = 0, 0 else: grid_status = np.ones(self.horizon) price_import = grid.import_price price_export = grid.export_price grid_co2_per_kwh = grid.co2_per_kwh cost_co2 = [grid.cost_per_unit_co2] grid_max_import, grid_max_export = grid.max_import, grid.max_export try: battery = self.microgrid.battery.item() except AttributeError: raise ValueError(f"Microgrid {self.microgrid} has no battery.") else: e_min = battery.min_soc e_max = battery.max_soc battery_max_charge = battery.max_charge battery_max_discharge = battery.max_discharge soc_0 = battery.soc try: genset = self.microgrid.modules[self.microgrid_module_names["genset"]].item() except KeyError: genset_max_prod, genset_co2_per_kwh = None, None else: genset_max_prod = genset.running_max_production genset_co2_per_kwh = genset.co2_per_unit cost_co2.append(genset.cost_per_unit_co2) cost_co2 = np.mean(cost_co2) return ( load_state, pv_state, grid_status, price_import, price_export, e_max, e_min, battery_max_charge, battery_max_discharge, grid_max_import, grid_max_export, soc_0, genset_max_prod, cost_co2, grid_co2_per_kwh, genset_co2_per_kwh ) def mpc_single_step(self, sample, previous_output, current_step): """ :meta private: Parameters ---------- sample previous_output current_step Returns ------- """ if not isinstance(previous_output, ControlOutput): raise TypeError('previous_output must be ControlOutput, unless first_step is True') # baseline_linprog_update_status = pd.DataFrame(previous_output['status'].iloc[-1].squeeze()).transpose() horizon = self.microgrid.horizon if self.microgrid.architecture['grid'] == 0: temp_grid = np.zeros(horizon) price_import = np.zeros(horizon) price_export = np.zeros(horizon) grid_co2 = np.zeros(horizon) p_max_import = 0 p_max_export = 0 else: temp_grid = sample.loc[current_step:current_step + horizon - 1, 'grid'].values price_import = self.microgrid._grid_price_import.iloc[current_step:current_step + horizon].values price_export = self.microgrid._grid_price_export.iloc[current_step:current_step + horizon].values grid_co2 = self.microgrid._grid_co2.iloc[current_step:current_step + horizon].values p_max_import = self.microgrid.parameters['grid_power_import'].values[0] p_max_export = self.microgrid.parameters['grid_power_export'].values[0] if temp_grid.shape != price_export.shape and price_export.shape != price_import.shape: raise RuntimeError('I think this is a problem') e_min = self.microgrid.parameters['battery_soc_min'].values[0] e_max = self.microgrid.parameters['battery_soc_max'].values[0] p_max_charge = self.microgrid.parameters['battery_power_charge'].values[0] p_max_discharge = self.microgrid.parameters['battery_power_discharge'].values[0] soc_0 = previous_output['status']['battery_soc'][-1] cost_co2 = self.microgrid.parameters['cost_co2'].values[0] if self.has_genset: p_genset_max = self.microgrid.parameters['genset_pmax'].values[0] * \ self.microgrid.parameters['genset_rated_power'].values[0] genset_co2 = self.microgrid.parameters['genset_co2'].values[0] else: p_genset_max = None genset_co2 = 0 # Solve one step of MPC control_dicts = self._set_and_solve(sample.loc[current_step:current_step + horizon - 1, 'load'].values, sample.loc[current_step:current_step + horizon - 1, 'pv'].values, temp_grid, price_import, price_export, e_max, e_min, p_max_charge, p_max_discharge, p_max_import, p_max_export, soc_0, p_genset_max, cost_co2, grid_co2, genset_co2, iteration=current_step, return_steps=self.microgrid.horizon) if any([d is None for d in control_dicts]): for j, d in enumerate(control_dicts): if d is None: raise TypeError('control_dict number {} is None'.format(j)) return HorizonOutput(control_dicts, self.microgrid, current_step) ================================================ FILE: src/pymgrid/algos/priority_list/__init__.py ================================================ from .priority_list_element import PriorityListElement from .priority_list import PriorityListAlgo ================================================ FILE: src/pymgrid/algos/priority_list/priority_list.py ================================================ import numpy as np import pandas as pd from abc import abstractmethod from itertools import permutations from gym.spaces import Discrete from pymgrid.algos.priority_list import PriorityListElement as Element from pymgrid.modules import GensetModule class PriorityListAlgo: def get_priority_lists(self, remove_redundant_gensets): """ Get all of the priority lists for the microgrid. A priority list is an order in which to deploy all of the controllable modules of the microgrid. Returns ------- priority_lists : list of list of :class:`.PriorityListElement` List of all priority lists. """ controllable_sources = [Element(module.name, module.action_space.shape[0], n_actions, module.marginal_cost) for module in self.modules.controllable.sources.iterlist() for n_actions in range(module.action_space.shape[0])] controllable_sources.extend([Element(module.name, module.action_space.shape[0], n_actions, module.marginal_cost) for module in self.modules.controllable.source_and_sinks.iterlist() for n_actions in range(module.action_space.shape[0])]) all_permutations = permutations(controllable_sources) priority_lists = self._remove_redundant_actions(all_permutations, gensets=remove_redundant_gensets) return priority_lists def _remove_redundant_actions(self, priority_lists, gensets=False): pls = [] for pl in priority_lists: is_redundant = pd.DataFrame(el.module for el in pl).duplicated() pls.append(tuple(el for j, el in enumerate(pl) if not is_redundant.iloc[j])) unique_pls = list(dict.fromkeys(pls)) if gensets: unique_pls = self._remove_redundant_gensets(unique_pls) return unique_pls def _remove_redundant_gensets(self, priority_lists): redundant_genset_actions = [] for module_name, module_list in self.modules.iterdict(): for module_n, module in enumerate(module_list): if isinstance(module, GensetModule): if module.running_min_production == 0: removable_element = Element( module=(module_name, module_n), module_actions=2, action=0, marginal_cost=module.marginal_cost ) redundant_genset_actions.append(removable_element) return [el for el in priority_lists if not any(redundant in el for redundant in redundant_genset_actions)] def _populate_action(self, priority_list): action = self.get_empty_action() loads, total_load = self._get_load() renewable = self._get_renewable() assert total_load >= 0 and renewable >= 0 remaining_load = (total_load-renewable).item() for element in priority_list: module_name, module_number = element.module total_module_actions = element.module_actions module_action_number = element.action module_to_deploy = self.modules[module_name][module_number] if total_module_actions > 1: if action[module_name][module_number] is not None: # Already hit this module in the priority list (as it has multiple elements) continue else: action[module_name][module_number] = [module_action_number] if np.isclose(remaining_load, 0.0, atol=1e-4): # Don't need to do anything module_energy = 0.0 elif remaining_load > 0: # Need to produce module_energy = self._produce_from_module(module_action_number, module_to_deploy, remaining_load) else: # Need to consume. These are sources and sources_and_sinks, so need to only use sources_and_sinks. module_energy = self._consume_in_module(module_to_deploy, remaining_load) try: action[module_name][module_number].append(module_energy) except AttributeError: action[module_name][module_number] = module_energy remaining_load -= module_energy if total_module_actions > 1: # If we have, e.g. a genset (with two actions) action[module_name][module_number] = np.array(action[module_name][module_number]) bad_keys = [k for k, v in action.items() if v is None] if len(bad_keys): raise RuntimeError(f'None values found in action, corresponding to keys\n\t{bad_keys}') return action def _consume_in_module(self, module_to_deploy, remaining_load): module_max_consumption = module_to_deploy.max_consumption assert remaining_load <= 0.0 if module_to_deploy.is_sink: assert module_max_consumption >= 0 if -1 * remaining_load > module_to_deploy.max_consumption: # Can't consume it all module_consumption = -1.0 * module_to_deploy.max_consumption else: # Can consume all module_consumption = remaining_load else: # Not a sink module_consumption = 0.0 assert module_consumption <= 0 return module_consumption def _produce_from_module(self, module_action_number, module_to_deploy, remaining_load): try: max_production = module_to_deploy.next_max_production(module_action_number) min_production = module_to_deploy.next_min_production(module_action_number) except AttributeError: max_production, min_production = module_to_deploy.max_production, module_to_deploy.min_production if min_production <= remaining_load <= max_production: # Module can meet demand module_production = remaining_load elif remaining_load < min_production: # Module production too much module_production = min_production else: # Module production not enough module_production = max_production assert module_production >= 0 return module_production def _get_load(self): loads = dict() total_load = 0.0 for fixed_sink in self.fixed.sinks.iterlist(): loads[fixed_sink.name] = fixed_sink.max_consumption total_load += fixed_sink.max_consumption return loads, total_load def _get_renewable(self): return np.sum([flex_source.max_production for flex_source in self.flex.sources.iterlist()]) @property @abstractmethod def modules(self): pass @property @abstractmethod def fixed(self): pass @property @abstractmethod def flex(self): pass @abstractmethod def get_empty_action(self): pass ================================================ FILE: src/pymgrid/algos/priority_list/priority_list_element.py ================================================ from dataclasses import dataclass from functools import total_ordering from typing import Tuple, Optional @total_ordering @dataclass(frozen=True) class PriorityListElement: """ A dataclass that acts as a representation of a module's position in a deployment order. Used in :class:`.RuleBasedControl` and :class:`.DiscreteMicrogridEnv` to define actions given a specific order of module deployment. In :class:`.RuleBasedControl`, one list of these elements is used at every step to define actions. In :class:`.DiscreteMicrogridEnv`, each action in the environment's action space corresponds to a distinct priority list. See :attr:`.PriorityListElement.module_actions` and :attr:`.PriorityListElement.action` for further details of how these elements are incorporated in algorithms. """ module: Tuple[str, int] """ Module name. """ module_actions: int """ Number of possible action classes. * If one, actions generated with this element will be scalar. * If greater than one, actions generated this element will be a length-2 array. The first element is the action number (defined by `action`) and the second is a float corresponding to the scalar case. See :attr:`.PriorityListElement.action` for additional details. """ action: int """ Action number in {0, ..., :attr:`.PriorityListElement.module_actions`-1}. This is most relevant to :class:`GensetModule` and other elements with an action space with more than one dimension. Specifically, :class:`GensetModules` have a two-dimensional action space: the first element defines whether to turn the module on or off, and the second is an amount of energy to draw -- assuming the module is on. See :meth:`.GensetModule.step` and :meth:`.GensetModule.update_status` for details. """ marginal_cost: Optional[float] = None """ Marginal cost of using the module. Defines an ordering on elements. """ def __eq__(self, other): if type(self) != type(other): return NotImplemented return ( self.module == other.module and self.module_actions == other.module_actions and self.action == other.action and self.marginal_cost == other.marginal_cost ) def __lt__(self, other): if type(self) != type(other) or self.marginal_cost is None or other.marginal_cost is None: return NotImplemented return ( self.marginal_cost < other.marginal_cost or (self.marginal_cost == other.marginal_cost and self.action > other.action) ) ================================================ FILE: src/pymgrid/algos/rbc/__init__.py ================================================ ================================================ FILE: src/pymgrid/algos/rbc/_nonmodular_rbc.py ================================================ import operator import sys from copy import deepcopy from pymgrid.algos.Control import ControlOutput class NonModularRuleBasedControl: def __init__(self, microgrid): # if not isinstance(microgrid, Microgrid.Microgrid): # raise TypeError('microgrid must be of type Microgrid, is {}'.format(type(microgrid))) self.microgrid = microgrid def _generate_priority_list(self, architecture, parameters, grid_status=0, price_import=0, price_export=0): """ Depending on the architecture of the microgrid and grid related import/export costs, this function generates a priority list to be run in the rule based benchmark. """ # compute marginal cost of each resource # construct priority list # should receive fuel cost and cost curve, price of electricity if architecture['grid'] == 1: if price_export / (parameters['battery_efficiency'].values[0]**2) < price_import: # should return something like ['gen', starting at in MW]? priority_dict = {'PV': 1 * architecture['PV'], 'battery': 2 * architecture['battery'], 'grid': int(3 * architecture['grid'] * grid_status), 'genset': 4 * architecture['genset']} else: # should return something like ['gen', starting at in MW]? priority_dict = {'PV': 1 * architecture['PV'], 'battery': 3 * architecture['battery'], 'grid': int(2 * architecture['grid'] * grid_status), 'genset': 4 * architecture['genset']} else: priority_dict = {'PV': 1 * architecture['PV'], 'battery': 2 * architecture['battery'], 'grid': 0, 'genset': 4 * architecture['genset']} return priority_dict def _run_priority_based(self, load, pv, parameters, status, priority_dict): """ This function runs one loop of rule based control, based on a priority list, load and pv, dispatch the generators Parameters ---------- load: float Demand value PV: float PV generation parameters: dataframe The fixed parameters of the mircrogrid status: dataframe The parameters of the microgrid changing with time. priority_dict: dictionnary Dictionnary representing the priority with which run each generator. """ temp_load = load excess_gen = 0 p_charge = 0 p_discharge = 0 p_import = 0 p_export = 0 p_genset = 0 load_not_matched = 0 pv_not_curtailed = 0 self_consumed_pv = 0 sorted_priority = priority_dict min_load = 0 if self.microgrid.architecture['genset'] == 1: #load - pv - min(capa_to_discharge, p_discharge) > 0: then genset on and min load, else genset off grid_first = 0 capa_to_discharge = max(min((status['battery_soc'][-1] * parameters['battery_capacity'].values[0] - parameters['battery_soc_min'].values[0] * parameters['battery_capacity'].values[0] ) * parameters['battery_efficiency'].values[0], self.microgrid.battery.p_discharge_max), 0) if self.microgrid.architecture['grid'] == 1 and sorted_priority['grid'] < sorted_priority['genset'] and sorted_priority['grid']>0: grid_first=1 if temp_load > pv + capa_to_discharge and grid_first ==0: min_load = self.microgrid.parameters['genset_rated_power'].values[0] * self.microgrid.parameters['genset_pmin'].values[0] if min_load <= temp_load: temp_load = temp_load - min_load else: temp_load = min_load priority_dict = {'PV': 0, 'battery': 0, 'grid': 0, 'genset': 1} sorted_priority = sorted(priority_dict.items(), key=operator.itemgetter(1)) # for gen with prio i in 1:max(priority_dict) # we sort the priority list # probably we should force the PV to be number one, the min_power should be absorbed by genset, grid? # print (sorted_priority) for gen, priority in sorted_priority: # .iteritems(): if priority > 0: if gen == 'PV': self_consumed_pv = min(temp_load, pv) # self.maximum_instantaneous_pv_penetration, temp_load = max(0, temp_load - self_consumed_pv) excess_gen = pv - self_consumed_pv pv_not_curtailed = pv_not_curtailed + pv - excess_gen if gen == 'battery': capa_to_charge = max( (parameters['battery_soc_max'].values[0] * parameters['battery_capacity'].values[0] - status['battery_soc'][-1] * parameters['battery_capacity'].values[0] ) / self.microgrid.parameters['battery_efficiency'].values[0], 0) capa_to_discharge = max((status['battery_soc'][-1] * parameters['battery_capacity'].values[0] - parameters['battery_soc_min'].values[0] * parameters['battery_capacity'].values[0] ) * parameters['battery_efficiency'].values[0], 0) if temp_load > 0: p_discharge = max(0, min(capa_to_discharge, parameters['battery_power_discharge'].values[0], temp_load)) temp_load = temp_load - p_discharge elif excess_gen > 0: p_charge = max(0, min(capa_to_charge, parameters['battery_power_charge'].values[0], excess_gen)) excess_gen = excess_gen - p_charge pv_not_curtailed = pv_not_curtailed + p_charge if gen == 'grid': if temp_load > 0: p_import = temp_load temp_load = 0 elif excess_gen > 0: p_export = excess_gen excess_gen = 0 pv_not_curtailed = pv_not_curtailed + p_export if gen == 'genset': if temp_load > 0: p_genset = temp_load + min_load temp_load = 0 min_load = 0 if temp_load > 0: load_not_matched = 1 control_dict = {'battery_charge': p_charge, 'battery_discharge': p_discharge, 'genset': p_genset, 'grid_import': p_import, 'grid_export': p_export, 'loss_load': load_not_matched, 'pv_consummed': pv_not_curtailed, 'pv_curtailed': pv - pv_not_curtailed, 'load': load, 'pv': pv} return control_dict def run_rule_based(self, priority_list=0, length=None): """ This function runs the rule based benchmark over the datasets (load and pv profiles) in the microgrid.""" baseline_priority_list_action = deepcopy(self.microgrid._df_record_control_dict) baseline_priority_list_update_status = deepcopy(self.microgrid._df_record_state) baseline_priority_list_record_production = deepcopy(self.microgrid._df_record_actual_production) baseline_priority_list_cost = deepcopy(self.microgrid._df_record_cost) baseline_priority_list_co2 = deepcopy(self.microgrid._df_record_co2) if length is None or length >= self.microgrid._data_length: length = self.microgrid._data_length-1 n = length - self.microgrid.horizon print_ratio = n/100 for i in range(length - self.microgrid.horizon): e = i if e == (n-1): e = n e = e/print_ratio sys.stdout.write("\rIn Progress %d%% " % e) sys.stdout.flush() if e == 100: sys.stdout.write("\nRules Based Calculation Finished") sys.stdout.flush() sys.stdout.write("\n") if self.microgrid.architecture['grid'] == 1: priority_dict = self._generate_priority_list(self.microgrid.architecture, self.microgrid.parameters, self.microgrid._grid_status_ts.iloc[i].values[0], self.microgrid._grid_price_import.iloc[i].values[0], self.microgrid._grid_price_export.iloc[i].values[0]) else: priority_dict = self._generate_priority_list(self.microgrid.architecture, self.microgrid.parameters) control_dict = self._run_priority_based(self.microgrid._load_ts.iloc[i].values[0], self.microgrid._pv_ts.iloc[i].values[0], self.microgrid.parameters, baseline_priority_list_update_status, priority_dict) baseline_priority_list_action = self.microgrid._record_action(control_dict, baseline_priority_list_action) baseline_priority_list_record_production = self.microgrid._record_production(control_dict, baseline_priority_list_record_production, baseline_priority_list_update_status) if self.microgrid.architecture['grid']==1: baseline_priority_list_co2 = self.microgrid._record_co2( {i: baseline_priority_list_record_production[i][-1] for i in baseline_priority_list_record_production}, baseline_priority_list_co2, self.microgrid._grid_co2.iloc[i].values[0], ) baseline_priority_list_update_status = self.microgrid._update_status( {i: baseline_priority_list_record_production[i][-1] for i in baseline_priority_list_record_production}, baseline_priority_list_update_status, self.microgrid._load_ts.iloc[i + 1].values[0], self.microgrid._pv_ts.iloc[i + 1].values[0], self.microgrid._grid_status_ts.iloc[i + 1].values[0], self.microgrid._grid_price_import.iloc[i + 1].values[0], self.microgrid._grid_price_export.iloc[i + 1].values[0], self.microgrid._grid_co2.iloc[i + 1].values[0], ) baseline_priority_list_cost = self.microgrid._record_cost( {i: baseline_priority_list_record_production[i][-1] for i in baseline_priority_list_record_production}, baseline_priority_list_cost, baseline_priority_list_co2, self.microgrid._grid_price_import.iloc[i,0], self.microgrid._grid_price_export.iloc[i,0]) else: baseline_priority_list_co2 = self.microgrid._record_co2( {i: baseline_priority_list_record_production[i][-1] for i in baseline_priority_list_record_production}, baseline_priority_list_co2, ) baseline_priority_list_update_status = self.microgrid._update_status( {i: baseline_priority_list_record_production[i][-1] for i in baseline_priority_list_record_production}, baseline_priority_list_update_status, self.microgrid._load_ts.iloc[i + 1].values[0], self.microgrid._pv_ts.iloc[i + 1].values[0]) baseline_priority_list_cost = self.microgrid._record_cost( {i: baseline_priority_list_record_production[i][-1] for i in baseline_priority_list_record_production}, baseline_priority_list_cost, baseline_priority_list_co2) names = ('action', 'status', 'production', 'cost', 'co2') dfs = (baseline_priority_list_action, baseline_priority_list_update_status, baseline_priority_list_record_production, baseline_priority_list_cost, baseline_priority_list_co2) return ControlOutput(names, dfs, 'rbc') ================================================ FILE: src/pymgrid/algos/rbc/rbc.py ================================================ from copy import deepcopy from tqdm import tqdm from pymgrid.algos.priority_list import PriorityListAlgo class RuleBasedControl(PriorityListAlgo): """ Run a rule-based (heuristic) control algorithm on a microgrid. In rule-based control, modules are deployed in a preset order. You can either define this order by passing a priority list or the order will be defined automatically from the module with the lowest marginal cost to the highest. Parameters ---------- microgrid : :class:`pymgrid.Microgrid` Microgrid on which to run rule-based control. priority_list : list of :class:`.PriorityListElement` or None, default None. Priority list to use. If None, the order will be defined automatically from the module with the lowest marginal cost to the highest. """ def __init__(self, microgrid, priority_list=None, remove_redundant_gensets=True): super().__init__() self._microgrid = deepcopy(microgrid) self._priority_list = self._get_priority_list(priority_list, remove_redundant_gensets) def _get_priority_list(self, priority_list, remove_redundant_gensets): """ Given a microgrid, return the optimal order of module deployment. """ priority_lists = self.get_priority_lists(remove_redundant_gensets=remove_redundant_gensets) if priority_list is None: return sorted(priority_lists[0]) if priority_list not in priority_lists: raise ValueError('Invalid priority list. Use RuleBasedControl.get_priority_lists to view all ' 'valid priority lists.') return priority_list def _get_action(self): """ Given the priority list, define an action. """ return self._populate_action(self._priority_list) def reset(self): """ Reset the underlying microgrid. Returns ------- obs : dict[str, list[float]] Observations from resetting the modules as well as the flushed balance log. """ return self._microgrid.reset() def run(self, max_steps=None, verbose=False): """ Get the priority list and then deploy on the microgrid for some number of steps. Parameters --------- max_steps : int or None, default None Maximum number of RBC steps. If None, run until the microgrid terminates. verbose : bool, default False Whether to display a progress bar. Returns ------- log : pd.DataFrame Results of running the rule-based control algorithm. """ if max_steps is None: max_steps = len(self.microgrid) self.reset() for _ in tqdm(range(max_steps), desc="RBC Progress", disable=(not verbose)): action = self._get_action() _, _, done, _ = self._microgrid.run(action, normalized=False) if done: break return self._microgrid.get_log(as_frame=True) def get_empty_action(self): """ :meta private: """ return self._microgrid.get_empty_action() @property def microgrid(self): """ View of the microgrid. Returns ------- microgrid : :class:`pymgrid.Microgrid` The microgrid that RBC is being run on. """ return self._microgrid @property def fixed(self): """:meta private:""" return self._microgrid.fixed @property def flex(self): """:meta private:""" return self._microgrid.flex @property def modules(self): """:meta private:""" return self._microgrid.modules @property def priority_list(self): """ Order in which to deploy controllable modules. Returns ------- priority_list: list of :class:`.PriorityListElement` Priority list. """ return self._priority_list ================================================ FILE: src/pymgrid/algos/saa/__init__.py ================================================ from .saa import SampleAverageApproximation ================================================ FILE: src/pymgrid/algos/saa/saa.py ================================================ import time import numpy as np import pandas as pd from pymgrid.algos.Control import ControlOutput from pymgrid.utils.DataGenerator import SampleGenerator from pymgrid.algos import ModelPredictiveControl class SampleAverageApproximation(SampleGenerator): """ A class to run a Sample Average Approximation version of Stochastic MPC. Parameters microgrid: pymgrid.Microgrid.Microgrid the underlying microgrid control_duration: int number of iterations to learn over Attributes: microgrid: pymgrid.Microgrid.Microgrid the underlying microgrid control_duration: int number of iterations to learn over mpc: algos.Control.ModelPredictiveControl An instance of MPC class to run MPC over for each sample NPV: utils.DataGenerator.NoisyPVData An instance of NoisyPVData to produce pv forecast and samples NL: utils.DataGenerator.NoisyLoadData An instance of NoisyLoadData to produce initial load forecast NG: utils.DataGenerator.NoisyGridData or None An instance of NoisyGridData to produce initial grid forecast. None if there is no grid forecasts: pd.DataFrame, shape (8760,3) load, pv, grid forecasts. See create_forecasts for details. samples: list of pd.DataFrame of shape (8760,3), or None list of samples created from sampling from distributions defined in forecasts. See sample_from_forecasts for details. None if sample_from_forecasts hasn't been called """ def __init__(self, microgrid, control_duration=8760, **forecast_args): if control_duration > 8760: raise ValueError('control_duration must be less than 8760') # if not isinstance(microgrid, Microgrid.Microgrid): # raise TypeError('microgrid must be of type \'pymgrid.Microgrid.Microgrid\', is {}'.format(type(microgrid))) super().__init__(microgrid, **forecast_args) self.control_duration = control_duration self.mpc = ModelPredictiveControl(self.microgrid) def run(self, n_samples=10, forecast_steps=None, optimal_percentile=0.5, use_previous_samples=True, verbose=False, **kwargs): """ Runs MPC over a number of samples for to average out for SAA :param n_samples: int, default 25 number of samples to run :param forecast_steps: int or None, default None number of steps to use in forecast. If None, uses 8760-self.horizon :param use_previous_samples: bool, default True whether to use previous previous stored in self.samples if they are available :param verbose: bool, default False verbosity :return: outputs, list of ControlOutput list of ControlOutputs for each sample. See ControlOutput or run_mpc_on_sample for details. """ if self.samples is None or not use_previous_samples: self.samples = self.sample_from_forecasts(n_samples=n_samples, **kwargs) outputs = [] t0 = time.time() output = self.run_mpc_on_group(self.samples, forecast_steps=forecast_steps, optimal_percentile=optimal_percentile, verbose=verbose) if verbose: print('Running time: {}'.format(round(time.time()-t0))) return output def determine_optimal_actions(self, outputs=None, percentile=0.5, verbose=False): """ Given a list of samples from run(), determines which one has cost at the percentile in percentile. :param outputs: list of ControlOutput list of ControlOutputs from run() :param percentile: float, default 0.5 which percentile to return as optimal. :return: optimal_output, ControlOutput output at optimal percentile """ if percentile < 0. or percentile > 1.: raise ValueError('percentile must be in [0,1]') partition_val = int(np.floor(len(outputs)*percentile)) partition = np.partition(outputs, partition_val) if verbose: sorted_outputs = np.sort(outputs) selected_output = partition[partition_val] print() for j, output in enumerate(sorted_outputs): print('Output {}, cost: {}, battery charge {}, discharge {}:'.format( j, round(output.cost,2) , round(output.first_dict['battery_charge'],2), round(output.first_dict['battery_discharge'],2))) if output is selected_output: print('Selected output {} with percentile {}'.format(j, percentile)) return partition[partition_val] def run_mpc_on_group(self, samples, forecast_steps=None, optimal_percentile=0.5, verbose=False): columns_needed = ('pv', 'load', 'grid') output = ControlOutput(alg_name='saa', empty=True, microgrid=self.microgrid) T = min([len(sample) for sample in samples]) if forecast_steps is None: forecast_steps = T-self.microgrid.horizon elif forecast_steps>T-self.microgrid.horizon: raise ValueError('forecast steps must be less than length of samples minus horizon') for j in range(forecast_steps): if verbose: print('iter {}'.format(j)) horizon_outputs = [] for sample in samples: if not isinstance(sample, pd.DataFrame): raise TypeError('samples must be pd.DataFrame') if not all([needed in sample.columns.values for needed in columns_needed]): raise KeyError('samples must contain columns {}, currently contains {}'.format( columns_needed, sample.columns.values)) sample.iloc[j] = self.underlying_data.iloc[j] # overwrite with actual data horizon_output = self.mpc.mpc_single_step(sample, output, j) horizon_outputs.append(horizon_output) # return horizon_outputs optimal_output = self.determine_optimal_actions(outputs=horizon_outputs, percentile=optimal_percentile) output.append(optimal_output, actual_load=self.underlying_data.loc[j,'load'], actual_pv=self.underlying_data.loc[j,'pv'], actual_grid=self.underlying_data.loc[j,'grid']) return output def run_deterministic_on_forecast(self, forecast_steps=None, verbose=False): sample = self.forecasts.copy() output = ControlOutput(alg_name='mpc', empty=True, microgrid=self.microgrid) T = len(sample) if forecast_steps is None: forecast_steps = T - self.microgrid.horizon elif forecast_steps > T - self.microgrid.horizon: raise ValueError('forecast steps must be less than length of samples minus horizon') for j in range(forecast_steps): if verbose: print('iter {}'.format(j)) sample.iloc[j] = self.underlying_data.iloc[j] # overwrite with actual data horizon_output = self.mpc.mpc_single_step(sample, output, j) output.append(horizon_output) return output ================================================ FILE: src/pymgrid/convert/__init__.py ================================================ ================================================ FILE: src/pymgrid/convert/convert.py ================================================ from pymgrid._deprecated.non_modular_microgrid import NonModularMicrogrid from pymgrid.microgrid.microgrid import Microgrid from pymgrid.convert.get_module import get_module from pymgrid.convert.to_nonmodular_ops import check_viability, add_params_from_module, get_empty_params, finalize_params def to_modular(nonmodular, raise_errors=False): modules = [('load', get_module('load', nonmodular, raise_errors)), ('unbalanced_energy', get_module('unbalanced_energy', nonmodular, raise_errors))] for component, exists in nonmodular.architecture.items(): if exists: module = get_module(component, nonmodular, raise_errors) modules.append((component, module)) return Microgrid(modules, add_unbalanced_module=False) def to_nonmodular(modular): """ microgrid_params needs to contain the following: parameters: ('DataFrame', (1, 16)) df_actions: ('dict', {'load': [], 'pv_consummed': [], 'pv_curtailed': [], 'pv': [], 'battery_charge': [], 'battery_discharge': [], 'grid_import': [], 'grid_export': []}) architecture: ('dict', {'PV': 1, 'battery': 1, 'genset': 0, 'grid': 1}) df_status: ('dict', {'load': [304.4], 'hour': [0], 'pv': [0.0], 'battery_soc': [0.2], 'capa_to_charge': [1290.7], 'capa_to_discharge': [0.0], 'grid_status': [1.0], 'grid_co2': [0.23975790800000002], 'grid_price_import': [0.22], 'grid_price_export': [0.0]}) df_actual_generation: ('dict', {'loss_load': [], 'overgeneration': [], 'pv_consummed': [], 'pv_curtailed': [], 'battery_charge': [], 'battery_discharge': [], 'grid_import': [], 'grid_export': []}) grid_spec: ('int', 0) df_cost: ('dict', {'loss_load': [], 'overgeneration': [], 'co2': [], 'battery': [], 'grid_import': [], 'grid_export': [], 'total_cost': []}) df_co2: ('dict', {'co2': []}) pv: ('DataFrame', (8760, 1)) load: ('DataFrame', (8760, 1)) grid_ts: ('DataFrame', (8760, 1)) control_dict: ('list', ['load', 'pv_consummed', 'pv_curtailed', 'pv', 'battery_charge', 'battery_discharge', 'grid_import', 'grid_export']) grid_price_import: ('DataFrame', (8760, 1)) grid_price_export: ('DataFrame', (8760, 1)) grid_co2: ('DataFrame', (8760, 1)) :param modular: :return: """ check_viability(modular) microgrid_params = get_empty_params() for _, module_list in modular.modules.iterdict(): add_params_from_module(module_list[0], microgrid_params) finalize_params(microgrid_params) return NonModularMicrogrid(parameters=microgrid_params, horizon=modular.get_forecast_horizon() + 1) ================================================ FILE: src/pymgrid/convert/get_module.py ================================================ import pandas as pd from pymgrid.modules import LoadModule, RenewableModule, BatteryModule, GridModule, GensetModule, UnbalancedEnergyModule def get_module(component, nonmodular, raise_errors): if component == 'load': return get_load_module(nonmodular, raise_errors) elif component == 'PV': return get_pv_module(nonmodular, raise_errors) elif component == 'battery': return get_battery_module(nonmodular, raise_errors) elif component == 'genset': return get_genset_module(nonmodular, raise_errors) elif component == 'grid': return get_grid_module(nonmodular, raise_errors) elif component == 'unbalanced_energy': return get_unbalanced_energy_module(nonmodular, raise_errors) else: raise ValueError(f'Cannot parse component {component}.') def get_load_module(nonmodular, raise_errors): time_series = nonmodular._load_ts return LoadModule(time_series=time_series, forecaster='oracle', forecast_horizon=nonmodular.horizon-1, raise_errors=raise_errors) def get_pv_module(nonmodular, raise_errors): time_series = nonmodular._pv_ts return RenewableModule(time_series=time_series, raise_errors=raise_errors, forecaster='oracle', forecast_horizon=nonmodular.horizon-1 ) def get_battery_module(nonmodular, raise_errors): battery = nonmodular.battery max_capacity = battery.capacity min_capacity = max_capacity*battery.soc_min max_charge = battery.p_charge_max max_discharge = battery.p_discharge_max efficiency = battery.efficiency battery_cost_cycle = battery.cost_cycle init_soc = battery.soc return BatteryModule(min_capacity=min_capacity, max_capacity=max_capacity, max_charge=max_charge, max_discharge=max_discharge, efficiency=efficiency, battery_cost_cycle=battery_cost_cycle, init_soc=init_soc, raise_errors=raise_errors) def get_genset_module(nonmodular, raise_errors): genset = nonmodular.genset min_production = genset.p_min*genset.rated_power max_production = genset.p_max*genset.rated_power genset_cost = genset.fuel_cost co2_per_unit = nonmodular.parameters.genset_co2.item() cost_per_unit_co2 = nonmodular.parameters.cost_co2.item() return GensetModule(running_min_production=min_production, running_max_production=max_production, genset_cost=genset_cost, co2_per_unit=co2_per_unit, cost_per_unit_co2=cost_per_unit_co2, start_up_time=0, wind_down_time=0, raise_errors=raise_errors) def get_grid_module(nonmodular, raise_errors): max_import = nonmodular.grid.power_import max_export = nonmodular.grid.power_export cost_per_unit_co2 = nonmodular.parameters.cost_co2.item() cost_import = nonmodular._grid_price_import.squeeze() cost_import.name = 'cost_import' cost_export = nonmodular._grid_price_export.squeeze() cost_export.name = 'cost_export' co2_per_unit = nonmodular._grid_co2.squeeze() co2_per_unit.name = 'co2_per_unit_production' grid_status = nonmodular._grid_status_ts.squeeze() grid_status.name = 'grid_status' time_series = pd.concat([cost_import, cost_export, co2_per_unit, grid_status], axis=1) return GridModule(max_import=max_import, max_export=max_export, time_series=time_series, forecaster='oracle', forecast_horizon=nonmodular.horizon - 1, cost_per_unit_co2=cost_per_unit_co2, raise_errors=raise_errors) def get_unbalanced_energy_module(nonmodular, raise_errors): return UnbalancedEnergyModule(raise_errors=raise_errors, loss_load_cost=nonmodular.parameters['cost_loss_load'].item(), overgeneration_cost=nonmodular.parameters['cost_overgeneration'].item() ) ================================================ FILE: src/pymgrid/convert/to_nonmodular_ops.py ================================================ from pymgrid.modules import LoadModule, RenewableModule, BatteryModule, GridModule, GensetModule, UnbalancedEnergyModule from copy import deepcopy import pandas as pd import numpy as np from warnings import warn _empty_params = dict(parameters=dict(), df_actions=dict(), architecture=dict(PV=0, battery=0, genset=0, grid=0), df_status=dict(hour=[0]), df_actual_generation=dict(loss_load=[], overgeneration=[]), df_cost=dict(loss_load=[], overgeneration=[], total_cost=[]), df_co2=dict(co2=[]), pv=None, load=None, grid_ts=None, control_dict=[], grid_price_import=None, grid_price_export=None, grid_co2=None, ) def get_empty_params(): return deepcopy(_empty_params) def check_viability(modular): classes = LoadModule, RenewableModule, BatteryModule, GridModule, GensetModule, UnbalancedEnergyModule classes_str = '\n'.join([str(x) for x in classes]) n_modules_by_cls = dict(zip(classes, [0]*len(classes))) for name, module_list in modular.modules.iterdict(): if len(module_list) > 1: raise ValueError('Cannot convert modular microgrid with multiple modules of same type. ' f'The following module name has multiple modules: {name}') module = module_list[0] if not isinstance(module, classes): raise TypeError(f'Unable to parse module {name} of type {module.__class__.__name__}.' f'Must be one of:\n{classes_str}') n_modules_by_cls[module.__class__] += 1 invalid = [] for cls, n_modules in n_modules_by_cls.items(): if n_modules > 1: invalid.append((cls, n_modules)) if len(invalid): raise ValueError('Cannot convert modular microgrid with multiple modules of same type. ' f'The following module types conflict: {invalid}') if n_modules_by_cls[LoadModule] != 1: raise ValueError('Cannot convert modular microgrid that has no LoadModule.') def finalize_params(params_dict): params_dict['parameters'] = pd.DataFrame(params_dict['parameters']) def add_params_from_module(module, params_dict): if isinstance(module, LoadModule): add_load_params(module, params_dict) elif isinstance(module, RenewableModule): add_pv_params(module, params_dict) elif isinstance(module, BatteryModule): add_battery_params(module, params_dict) elif isinstance(module, GridModule): add_grid_params(module, params_dict) elif isinstance(module, GensetModule): add_genset_params(module, params_dict) elif isinstance(module, UnbalancedEnergyModule): add_unbalanced_energy_params(module, params_dict) else: raise ValueError(f'Cannot parse module {module}.') def add_load_params(load_module, params_dict): params_dict['load'] = pd.DataFrame(load_module.time_series) _add_to_parameters(params_dict, load=-1 * load_module.min_act) _add_to_control_dict(params_dict, 'load') _add_to_df_actual_generation(params_dict, 'loss_load') _add_to_df_actions(params_dict, 'load') _add_to_df_status(params_dict, load=round(load_module.current_load, 1)) def add_pv_params(pv_module, params_dict): params_dict['pv'] = pd.DataFrame(pv_module.time_series) _add_to_architecture(params_dict, 'PV') _add_to_parameters(params_dict, PV_rated_power=pv_module.max_act) _add_to_df_actions(params_dict, 'pv_consummed','pv_curtailed','pv') _add_to_df_status(params_dict, pv=[pv_module.current_renewable]) _add_to_df_actual_generation(params_dict, 'pv_consummed','pv_curtailed') _add_to_control_dict(params_dict, 'pv_consummed', 'pv_curtailed', 'pv') def add_battery_params(battery_module, params_dict): _add_to_architecture(params_dict, 'battery') _add_to_parameters(params_dict, battery_soc_0=battery_module.soc, battery_power_charge=battery_module.max_charge, battery_power_discharge=battery_module.max_discharge, battery_capacity=battery_module.max_capacity, battery_efficiency=battery_module.efficiency, battery_soc_min=battery_module.min_soc, battery_soc_max=battery_module.max_soc, battery_cost_cycle=battery_module.battery_cost_cycle) _add_to_df_actions(params_dict, 'battery_charge', 'battery_discharge') _add_to_df_status(params_dict, battery_soc=battery_module.soc, capa_to_charge=round((battery_module.max_soc-battery_module.soc) * battery_module.max_capacity/battery_module.efficiency, 1), capa_to_discharge=round((battery_module.soc-battery_module.min_soc) * battery_module.max_capacity/battery_module.efficiency, 1) ) _add_to_df_actual_generation(params_dict, 'battery_charge', 'battery_discharge') _add_to_df_cost(params_dict, 'battery') _add_to_control_dict(params_dict, 'battery_charge','battery_discharge') def add_grid_params(grid_module, params_dict): time_series_df = pd.DataFrame(grid_module.time_series, columns=['grid_price_import', 'grid_price_export', 'grid_co2', 'grid_status']) params_dict['grid_price_import'] = time_series_df['grid_price_import'].to_frame() params_dict['grid_price_export'] = time_series_df['grid_price_export'].to_frame() params_dict['grid_co2'] = time_series_df['grid_co2'].to_frame() params_dict['grid_ts'] = time_series_df['grid_status'].to_frame() _add_to_architecture(params_dict, 'grid') _add_to_parameters(params_dict, grid_weak=(time_series_df['grid_status'].min() < 1).item(), grid_power_import=grid_module.max_import, grid_power_export=grid_module.max_export) _add_to_df_actions(params_dict, 'grid_import','grid_export') _add_to_df_status(params_dict, grid_status=time_series_df['grid_status'].iloc[0], grid_co2=time_series_df['grid_co2'].iloc[0], grid_price_import=time_series_df['grid_price_import'].iloc[0], grid_price_export=time_series_df['grid_price_export'].iloc[0] ) _add_to_df_actual_generation(params_dict, 'grid_import', 'grid_export') _add_to_df_cost(params_dict, 'grid_import', 'grid_export') _add_to_control_dict(params_dict, 'grid_import', 'grid_export') _add_cost_co2(params_dict, grid_module.cost_per_unit_co2) def add_genset_params(genset_module, params_dict): warn('GensetModules does not contain separate rated_power and p_max information.' 'Assuming p_max=0.9.') genset_pmax=0.9 genset_rated_power = genset_module.running_max_production/genset_pmax _add_to_architecture(params_dict, 'genset') _add_genset_polynom(params_dict) if genset_rated_power == 0: raise RuntimeError _add_to_parameters(params_dict, genset_rated_power=genset_rated_power, genset_pmin=genset_module.running_min_production/genset_rated_power, genset_pmax=genset_pmax, fuel_cost=genset_module.genset_cost, genset_co2=genset_module.co2_per_unit) _add_to_df_actions(params_dict, 'genset') _add_to_df_actual_generation(params_dict, 'genset') _add_to_df_cost(params_dict, 'genset') _add_to_control_dict(params_dict, 'genset') _add_cost_co2(params_dict, genset_module.cost_per_unit_co2) def add_unbalanced_energy_params(unbalanced_energy_module, params_dict): _add_to_parameters(params_dict, cost_overgeneration=unbalanced_energy_module.overgeneration_cost, cost_loss_load=unbalanced_energy_module.loss_load_cost ) _add_to_df_actual_generation(params_dict, 'overgeneration') _add_to_df_cost(params_dict, 'overgeneration') def _add_empty(params_dict, subdict_name, *keys): params_dict[subdict_name].update({k: [] for k in keys}) def _add_to_architecture(params_dict, component): if component not in params_dict['architecture']: raise NameError(f'Component {component} not viable member of architecture') params_dict['architecture'][component] = 1 def _add_to_parameters(params_dict, **parameters): params_dict['parameters'].update({key: [value] if not isinstance(value, list) else value for key, value in parameters.items()}) def _add_to_df_actions(params_dict, *keys): _add_empty(params_dict, 'df_actions', *keys) def _add_to_df_status(params_dict, **init_status_values): params_dict['df_status'].update({key: [value] if not isinstance(value, list) else value for key, value in init_status_values.items()}) def _add_to_df_actual_generation(params_dict, *keys): _add_empty(params_dict, 'df_actual_generation', *keys) def _add_to_df_cost(params_dict, *keys): _add_empty(params_dict, 'df_cost', *keys) def _add_to_control_dict(params_dict, *keys): params_dict['control_dict'].extend(list(keys)) def _add_cost_co2(params_dict, cost_co2): from warnings import warn if 'cost_co2' in params_dict['parameters']: existing_cost_co2 = params_dict['parameters']['cost_co2'] if cost_co2 != existing_cost_co2: warn(f'cost_co2 value {cost_co2} being added is different from existing cost_co2 value {existing_cost_co2}. Using mean.') params_dict['parameters']['cost_co2'] = np.mean([cost_co2, existing_cost_co2]) else: params_dict['parameters']['cost_co2'] = cost_co2 _add_to_df_cost(params_dict, 'co2') def _add_genset_polynom(params_dict): np.random.seed(0) warn('Getting genset_polynom parameters randomly') polynom = [np.random.rand() * 10, np.random.rand(), np.random.rand() / 10] to_add = dict(genset_polynom_order= len(polynom)) to_add.update({f'genset_polynom_{i}': pn for i, pn in enumerate(polynom)}) _add_to_parameters(params_dict, **to_add) ================================================ FILE: src/pymgrid/data/__init__.py ================================================ ================================================ FILE: src/pymgrid/data/co2/__init__.py ================================================ ================================================ FILE: src/pymgrid/data/co2/co2_caiso.csv ================================================ CO2_CISO_I_kwh 0.239757908 0.273658597 0.270383127 0.263688693 0.263670279 0.256445238 0.267006115 0.274550944 0.267613187 0.266741336 0.26746132 0.269173428 0.269990956 0.271028271 0.270058934 0.268036139 0.236242171 0.177314676 0.154404466 0.147119995 0.147060657 0.150619718 0.156484683 0.184585793 0.250248606 0.289011446 0.288417659 0.288337825 0.289301535 0.29418243 0.296393424 0.304166993 0.303465012 0.295390834 0.296951475 0.295942991 0.295578139 0.286425806 0.280217876 0.275590509 0.246901798 0.217547715 0.208005751 0.211882361 0.203469985 0.201741889 0.195967453 0.214437429 0.272056768 0.300616844 0.296783156 0.291532829 0.290556598 0.294955075 0.294574193 0.300728842 0.302722491 0.31236428 0.307939541 0.309055794 0.308309809 0.307864263 0.300942505 0.296042317 0.268257638 0.226625768 0.207230953 0.20124007 0.196122838 0.193176453 0.193404135 0.213004368 0.263539846 0.296691293 0.296315322 0.294381326 0.297044876 0.302081347 0.305479609 0.310128117 0.3087233 0.311700663 0.308973918 0.305551591 0.304476064 0.297371264 0.299913497 0.295400355 0.267633036 0.226043798 0.211563169 0.202177586 0.19741457 0.193169566 0.197307382 0.205310133 0.26027688 0.296469681 0.291818727 0.289371423 0.294616941 0.29810709 0.295023839 0.295312882 0.302571943 0.3064725 0.314152679 0.314814876 0.31099023 0.308228761 0.301228412 0.298608843 0.291481056 0.28382679 0.276813705 0.27215815 0.269548695 0.27827998 0.285880613 0.285613037 0.285879447 0.276830807 0.276983058 0.283877005 0.289039287 0.294354531 0.299135418 0.298177954 0.298434138 0.288398424 0.274751799 0.266503639 0.260859738 0.256843409 0.247924097 0.248441845 0.224745492 0.19997862 0.184211314 0.176089131 0.185706524 0.18716479 0.184938979 0.191200436 0.235093704 0.262553323 0.261442654 0.257232605 0.26336575 0.263390475 0.254297935 0.24922211 0.239186685 0.221383891 0.239144654 0.246095055 0.256867884 0.256266396 0.276982553 0.277780968 0.264251235 0.240382014 0.215846656 0.204254314 0.204438407 0.199814001 0.201097036 0.206934874 0.254798077 0.28379816 0.286879008 0.293273746 0.299146513 0.297468135 0.292119332 0.292816583 0.296064021 0.309215463 0.30795091 0.303655574 0.299185975 0.30368989 0.30999528 0.310459026 0.288029279 0.264054668 0.245802917 0.242450294 0.246569765 0.245003934 0.242895616 0.261746669 0.300528152 0.308113662 0.304507821 0.306886278 0.30784345 0.308000762 0.304480517 0.297069873 0.301870789 0.298644395 0.293790601 0.29257514 0.298759163 0.290674402 0.289286699 0.296318156 0.270860182 0.245242306 0.227650263 0.225549414 0.228970894 0.227340897 0.222231727 0.23718597 0.24752179 0.253513386 0.274696309 0.28317075 0.284807118 0.28676015 0.294430183 0.299458195 0.282361503 0.276856841 0.276543346 0.284446476 0.276600614 0.27593708 0.283849531 0.288986152 0.261484853 0.227273266 0.206685845 0.200077955 0.198170793 0.196673081 0.197639861 0.212373207 0.259574403 0.285245258 0.284041993 0.289488008 0.294485007 0.294491703 0.299462772 0.302219863 0.296677723 0.300466822 0.297550391 0.293607297 0.294575633 0.29540649 0.314645385 0.308760999 0.284136374 0.24901169 0.233212481 0.219375824 0.21633989 0.211687978 0.227549396 0.24164401 0.265387961 0.285720046 0.288836207 0.281938519 0.284619624 0.290527869 0.291229428 0.2903171 0.286878894 0.287712043 0.290639367 0.295219632 0.294903689 0.29677747 0.301869033 0.290040336 0.29080052 0.270403696 0.24074526 0.239169997 0.230958929 0.236281289 0.233596045 0.234476814 0.260798573 0.278059207 0.277062158 0.285013042 0.287431558 0.298817415 0.297423703 0.298965968 0.304437182 0.305210932 0.305708366 0.304586211 0.301210209 0.300977316 0.297289366 0.29834836 0.255318771 0.205694763 0.191123325 0.186391081 0.188492211 0.194467404 0.213983098 0.239654552 0.268720494 0.288166495 0.291908119 0.291220485 0.291112717 0.294619867 0.292544121 0.303157442 0.299930709 0.289089098 0.286683668 0.28801689 0.282436345 0.286037533 0.282509017 0.28584748 0.281566589 0.267533537 0.267105939 0.271656947 0.27467654 0.274951508 0.287504228 0.291146696 0.293029198 0.298818765 0.29958442 0.29811917 0.300452644 0.303957922 0.308718698 0.308404081 0.303055313 0.304915423 0.309794754 0.307246616 0.308226092 0.290359959 0.29078798 0.293509778 0.294085084 0.291878054 0.291335556 0.28861339 0.29291906 0.291469217 0.282315479 0.280383603 0.288773582 0.300469536 0.301123947 0.290266672 0.292052738 0.299621366 0.306632885 0.309048478 0.304509266 0.299546356 0.295770292 0.293245807 0.284652792 0.269175712 0.277998221 0.285923552 0.280911866 0.26000099 0.24530869 0.240835942 0.244462439 0.241290986 0.244892955 0.248222642 0.269538705 0.284642533 0.28782122 0.282783345 0.283958973 0.288480498 0.286778957 0.280874885 0.277714428 0.27155806 0.263505278 0.274230182 0.281320168 0.284298723 0.282245343 0.284427584 0.274034176 0.268983783 0.245622054 0.246097374 0.251443004 0.2330393 0.237100168 0.261204409 0.270864238 0.273008109 0.269360972 0.263255035 0.266460752 0.257097678 0.252981547 0.238657124 0.244103853 0.238549324 0.231298485 0.233569998 0.237429261 0.24596879 0.265024705 0.270160199 0.238020386 0.198571153 0.190180678 0.172310065 0.176016274 0.189252673 0.184591422 0.191440152 0.23826288 0.281826049 0.283582191 0.279801369 0.287715024 0.288370007 0.300276535 0.303813142 0.296220458 0.285982617 0.283505685 0.279979635 0.275873267 0.281196944 0.284024478 0.288190638 0.248072063 0.191139183 0.166132555 0.161205241 0.156898483 0.158121836 0.161050217 0.176920117 0.220687197 0.274090617 0.282792257 0.278886008 0.276441224 0.285837232 0.292709299 0.29756951 0.296333837 0.291700887 0.286073605 0.285815858 0.280577598 0.281277263 0.278984249 0.27311252 0.249829131 0.213140538 0.189302364 0.169661603 0.164082823 0.163978443 0.167174857 0.201524328 0.225719917 0.238469175 0.237091638 0.224886695 0.241525958 0.248268502 0.248032563 0.237085082 0.215552734 0.210476759 0.204419293 0.201762415 0.222034753 0.226771043 0.236646807 0.246461318 0.220421048 0.172756348 0.152905082 0.138163191 0.137943822 0.145783818 0.154621152 0.168482805 0.20392132 0.245275921 0.254625274 0.246621814 0.243137776 0.243008593 0.23804854 0.224705783 0.230690448 0.238218818 0.245077431 0.254307791 0.261653374 0.262301757 0.274810794 0.283274262 0.251084019 0.200169504 0.174988042 0.176280122 0.185695184 0.188150848 0.195138729 0.193984571 0.235543079 0.297165953 0.296303288 0.302084244 0.302609727 0.305662015 0.301709971 0.300524776 0.303140363 0.305882221 0.30640477 0.30283904 0.304976255 0.295654257 0.297735372 0.30354639 0.274230175 0.220862074 0.202261871 0.199072068 0.200770167 0.198011678 0.202312177 0.19707774 0.246677497 0.286786294 0.29600396 0.291290288 0.297712547 0.303765275 0.309478804 0.313160015 0.319873955 0.320999244 0.314892421 0.312461606 0.311102283 0.312967207 0.304993108 0.296619996 0.261405896 0.221898449 0.19645611 0.189428507 0.186308033 0.186740677 0.1903907 0.196764491 0.249002787 0.299872471 0.300776787 0.301971974 0.303616382 0.308073829 0.305795191 0.319078154 0.308677112 0.303238619 0.302882028 0.302225557 0.300175635 0.302058122 0.294319626 0.293461474 0.257545986 0.210445467 0.203274088 0.188858586 0.184517972 0.182872382 0.193682779 0.193910012 0.227571199 0.28079727 0.285639027 0.289297885 0.288217747 0.28825648 0.292190847 0.294808485 0.294409547 0.288514775 0.286463394 0.286408078 0.281812532 0.288816359 0.285509316 0.274558727 0.232483986 0.175982872 0.157226765 0.1573535 0.157375119 0.157627785 0.158949981 0.178966117 0.221597772 0.263830432 0.272169739 0.277909814 0.280713961 0.281524323 0.288478188 0.294320744 0.28922656 0.295416368 0.295799638 0.290363077 0.289672312 0.285821702 0.280274424 0.278283157 0.236736266 0.192880508 0.162624785 0.147700798 0.143451938 0.151215277 0.156577766 0.175946423 0.205708731 0.273283565 0.280965822 0.280830608 0.284503661 0.288192285 0.290274864 0.299478504 0.296822096 0.297521401 0.302390438 0.308260154 0.308504267 0.303102605 0.295941296 0.290123014 0.269012324 0.239412028 0.235451945 0.229822754 0.224692518 0.214965787 0.226326674 0.250583648 0.277712114 0.297069617 0.297851144 0.293361402 0.295601433 0.300183667 0.303205963 0.307199453 0.318123539 0.325253201 0.325321103 0.324879659 0.315874189 0.304346116 0.297644763 0.297072063 0.281625062 0.260635144 0.23817746 0.228955177 0.221926803 0.23309094 0.239342342 0.251371977 0.280077998 0.293088745 0.294562904 0.295937775 0.29481502 0.299234457 0.304371478 0.305918108 0.302219399 0.316226418 0.316833001 0.317749284 0.31848051 0.311327261 0.301546433 0.300184496 0.285512763 0.260475427 0.244907938 0.223766183 0.205275547 0.204728475 0.209616619 0.223696081 0.253166748 0.293809161 0.294736719 0.298319273 0.298843517 0.29748615 0.29935798 0.300612417 0.308271715 0.309087519 0.308737162 0.305583225 0.303104123 0.293815657 0.288355168 0.292556669 0.279469662 0.272296401 0.262849822 0.237455359 0.244593333 0.247057884 0.241296991 0.237685984 0.255236139 0.282819255 0.290187325 0.29310424 0.297165857 0.295050849 0.302791037 0.309110101 0.306176029 0.308693441 0.306791032 0.308310548 0.307272475 0.292965176 0.295065011 0.289385775 0.263237682 0.228610443 0.224262183 0.227246914 0.225453494 0.225867338 0.230432162 0.249851857 0.272646919 0.275293026 0.270633781 0.264383355 0.267371791 0.270095794 0.274443267 0.277826271 0.269461575 0.269006788 0.272827567 0.270131226 0.275554513 0.272653884 0.265203366 0.269202301 0.272089266 0.253559876 0.237704242 0.225775459 0.244841469 0.234610093 0.223883657 0.231113507 0.245674691 0.26035349 0.265307183 0.269682419 0.275129803 0.2705953 0.271785278 0.262687858 0.249557574 0.241104832 0.241425326 0.235939697 0.231793116 0.234940998 0.240945216 0.242132671 0.212297882 0.194885097 0.173234968 0.174585247 0.167060392 0.157021555 0.159883053 0.182609267 0.202751925 0.239927402 0.261541839 0.263884926 0.268205612 0.277034471 0.27787268 0.274959917 0.276465012 0.271225721 0.271467913 0.266526407 0.265762079 0.262608702 0.250434007 0.254786723 0.24698362 0.231221313 0.218578962 0.229141696 0.212938 0.218873776 0.213465245 0.214793904 0.238936117 0.271645336 0.286728694 0.289543449 0.280967917 0.278318811 0.279102665 0.280247245 0.274266881 0.274828942 0.278914715 0.291625769 0.285611238 0.282240126 0.287167695 0.292047823 0.253416263 0.232241427 0.215083877 0.211042015 0.221740035 0.219843423 0.213815986 0.238960301 0.259922564 0.289983279 0.302528629 0.293800967 0.299814451 0.290152492 0.282037608 0.268155776 0.259310481 0.257985781 0.265357926 0.274943148 0.27520478 0.263718358 0.303526135 0.289833658 0.24035198 0.209247896 0.186735461 0.180366697 0.179185009 0.180485666 0.178364241 0.187066064 0.210388113 0.285334608 0.312915613 0.31657332 0.30985729 0.313468071 0.313807399 0.322799516 0.318197377 0.324084721 0.316970966 0.315276008 0.31662613 0.321639185 0.327308509 0.327719143 0.271699736 0.219411035 0.193930386 0.206189246 0.196511476 0.190893128 0.197550705 0.196699431 0.230305963 0.288547205 0.310923279 0.314118334 0.313650959 0.313937909 0.305010781 0.314770847 0.306678459 0.308040928 0.318941478 0.317304101 0.316382194 0.324152769 0.329246542 0.315310655 0.261613879 0.218318071 0.201688044 0.200355965 0.196487774 0.193661213 0.189134648 0.196370769 0.22449376 0.283504901 0.294998878 0.298106427 0.296994785 0.296759054 0.294614669 0.297180357 0.296315642 0.300094814 0.297326959 0.296879395 0.289844299 0.285451361 0.287431175 0.280011117 0.245314994 0.213693749 0.208433646 0.183525534 0.173897234 0.169558901 0.160796084 0.164335159 0.18825557 0.233640631 0.258860483 0.269589684 0.276068933 0.281912342 0.289555807 0.294566412 0.296398928 0.30451099 0.312045723 0.318120037 0.321928896 0.311195314 0.306779929 0.290079755 0.250550227 0.209513338 0.197663016 0.178103996 0.16757904 0.180777074 0.182044868 0.18954705 0.206324333 0.246681506 0.273943652 0.274019724 0.275831366 0.287304092 0.283743057 0.27308146 0.289089406 0.294066187 0.295803057 0.301512333 0.317688204 0.294863069 0.294512124 0.291852527 0.25142998 0.211031239 0.193231874 0.198377575 0.19826369 0.195282436 0.203190939 0.205209096 0.239564515 0.305621105 0.319791013 0.320215822 0.313928562 0.313694187 0.317423813 0.331571241 0.345517877 0.353570008 0.354682946 0.351972681 0.342605281 0.325687225 0.328030819 0.313974853 0.273935179 0.25386512 0.243783248 0.237873018 0.232120944 0.242450091 0.258076809 0.280005873 0.297333485 0.310978046 0.32280456 0.315001609 0.319272524 0.31811851 0.320772293 0.31929064 0.320913187 0.305677563 0.295115401 0.293303481 0.282329472 0.290440579 0.289024174 0.301531426 0.299973797 0.296647314 0.289481638 0.264280783 0.260064953 0.272460748 0.298633403 0.283883166 0.297302999 0.305195648 0.316977928 0.301796178 0.30616785 0.305391142 0.298878665 0.296106211 0.289644004 0.284864368 0.272792295 0.270534401 0.276245956 0.286340108 0.294416321 0.297374877 0.292748185 0.288272319 0.270666635 0.241935542 0.255140626 0.24466004 0.242033048 0.24355977 0.255739853 0.29069038 0.278710045 0.281019535 0.292682846 0.29367582 0.287623685 0.290491605 0.272945855 0.251074921 0.258751196 0.254747796 0.254329162 0.263685873 0.278763012 0.289152956 0.272855741 0.254986381 0.220222001 0.212775858 0.193605763 0.202900583 0.208754876 0.231414572 0.249307441 0.293041384 0.289773224 0.283574889 0.289338721 0.294569379 0.289646871 0.281154877 0.279110191 0.26362303 0.251848014 0.252123604 0.243376125 0.236255978 0.23777045 0.233480111 0.186110806 0.142440492 0.125218694 0.123967665 0.123066969 0.128734398 0.12667051 0.125960602 0.13868468 0.215105743 0.255203682 0.26380107 0.261340224 0.248742035 0.241277416 0.248993582 0.24925303 0.262902418 0.279261221 0.281201464 0.276251019 0.255778997 0.26544994 0.248618008 0.19940242 0.171037516 0.16079153 0.154639901 0.162537154 0.15576435 0.16547999 0.168059284 0.1868575 0.263045705 0.296925712 0.286121001 0.278728906 0.264797399 0.26781444 0.278297894 0.267415845 0.264203204 0.265518714 0.267509671 0.266329819 0.255894572 0.259010348 0.25157632 0.208221266 0.168193021 0.165788438 0.17083624 0.176918172 0.176677014 0.179729394 0.179883104 0.195469266 0.25101253 0.294084025 0.281833216 0.282290386 0.286712403 0.286036417 0.287552098 0.285255296 0.291088631 0.296627415 0.30413612 0.30488006 0.308802548 0.32177939 0.314296214 0.253490018 0.231094643 0.212346627 0.213136241 0.211160221 0.210006626 0.207079184 0.209580115 0.241444195 0.290475197 0.303612784 0.29098914 0.290048604 0.284406636 0.281675296 0.281692871 0.272873703 0.272241069 0.273368235 0.262707348 0.272823863 0.27942716 0.277761111 0.259541666 0.220405029 0.208783209 0.193445477 0.186803253 0.186986423 0.207288724 0.227138154 0.23451609 0.249257723 0.279915415 0.290848852 0.292264936 0.296598928 0.296404636 0.294712251 0.299505329 0.298241241 0.301934551 0.302592735 0.30452505 0.291698679 0.289778752 0.286800257 0.285073392 0.282692634 0.259471459 0.225164121 0.231117202 0.225993317 0.208887983 0.212371596 0.233088108 0.23778107 0.26182127 0.28537153 0.281257711 0.277707308 0.292307166 0.2877074 0.27916233 0.278272933 0.277794779 0.279946654 0.281930267 0.281948779 0.284844687 0.281912456 0.280121965 0.234188222 0.195735379 0.19145066 0.191592778 0.181657022 0.174613863 0.169450394 0.181555682 0.198236189 0.241014234 0.275810129 0.273816387 0.28365418 0.294124801 0.289956618 0.29403173 0.293056596 0.293795315 0.290424767 0.292386816 0.296773342 0.291349328 0.302747717 0.274887117 0.213513408 0.170390756 0.151109221 0.144769596 0.147055823 0.145676727 0.154387232 0.182784828 0.199214186 0.255087656 0.280659615 0.282271674 0.285604876 0.289520801 0.296242531 0.297569442 0.296993314 0.29955948 0.306740269 0.308774155 0.312500526 0.310345367 0.311089462 0.297818202 0.222074725 0.18011658 0.15389691 0.148084653 0.145560227 0.144017764 0.14639527 0.16703183 0.180146751 0.250914879 0.287311804 0.283534427 0.293004646 0.295919603 0.300382362 0.30025567 0.31027629 0.31407984 0.316318958 0.314869827 0.308575157 0.301331728 0.304070144 0.297665679 0.241667151 0.203358388 0.185345436 0.181034974 0.175973519 0.186888237 0.184185896 0.180499593 0.213560279 0.27542321 0.303231981 0.301431861 0.300635819 0.302851429 0.302829623 0.29532811 0.288908246 0.286228211 0.296736115 0.302457373 0.306164421 0.301621634 0.305317607 0.289107429 0.238346004 0.215236286 0.202495945 0.1979963 0.232408425 0.229045882 0.246741745 0.261317844 0.299152588 0.312988816 0.327087788 0.323988726 0.320015078 0.315438784 0.306832753 0.300180332 0.293875978 0.278950809 0.281274057 0.281630875 0.269245785 0.270557464 0.285236199 0.289540791 0.254460237 0.230687764 0.21293961 0.220206637 0.215798014 0.213629756 0.231621603 0.230363253 0.235459313 0.279769549 0.309490844 0.310444845 0.310461329 0.303137278 0.291167227 0.289985278 0.287846874 0.274768476 0.275231056 0.281851168 0.292585778 0.28604985 0.289503179 0.275778873 0.221412402 0.185951206 0.169787025 0.173485724 0.169813599 0.16792857 0.164205926 0.170791501 0.181703326 0.24311847 0.283848528 0.300037145 0.300672777 0.296956912 0.289797939 0.282528197 0.266299799 0.266236292 0.267729067 0.259787212 0.255293089 0.261224288 0.285090654 0.285213495 0.26017402 0.218276959 0.196027118 0.199423427 0.206340105 0.212765552 0.218930416 0.213476116 0.226985702 0.273617111 0.300178303 0.31151733 0.309442011 0.30453572 0.311430149 0.306052419 0.293783553 0.282932595 0.275569916 0.276162873 0.272587823 0.267296831 0.265340099 0.263584755 0.258138035 0.23201566 0.211985772 0.186357129 0.184492581 0.186178023 0.172634254 0.163513248 0.170056457 0.239239628 0.286638595 0.285364822 0.279102768 0.277000639 0.277124334 0.277067089 0.272465148 0.275273118 0.2653433 0.264853693 0.264964359 0.257272741 0.256669961 0.235203233 0.175929619 0.164033262 0.15336813 0.14697741 0.134648142 0.144527246 0.148218005 0.148055716 0.171107184 0.220425876 0.265198384 0.276352117 0.275855951 0.268647003 0.263812178 0.249249115 0.253330452 0.246505431 0.251798915 0.245942035 0.24699277 0.257241953 0.27234824 0.262792065 0.217442473 0.180994243 0.181964664 0.194659242 0.191607245 0.189205903 0.185801076 0.205450639 0.221233724 0.275651156 0.31659283 0.318837425 0.315345311 0.31173576 0.312561423 0.306502375 0.303186011 0.299568005 0.302555092 0.29802956 0.30276376 0.297715303 0.314630431 0.304178273 0.271797725 0.246116191 0.237368062 0.232694667 0.231849423 0.223231286 0.228478636 0.211186426 0.233275796 0.270545366 0.300113039 0.29439914 0.295928579 0.297500394 0.293759632 0.302101782 0.283121884 0.261557811 0.257130117 0.24894512 0.242111019 0.249840359 0.261642988 0.270348043 0.251466566 0.238907355 0.213950524 0.208711117 0.209465943 0.195763716 0.18223482 0.19706215 0.21574018 0.250751514 0.282681226 0.28406371 0.277450628 0.266561864 0.261881429 0.25855219 0.248318313 0.234048882 0.227825699 0.221026195 0.225381767 0.233303475 0.245473945 0.230990274 0.173853577 0.14576115 0.135089108 0.132177654 0.138017788 0.138745347 0.150066905 0.159060272 0.182574182 0.228293651 0.267493407 0.276184001 0.25981139 0.25532205 0.254513484 0.244904098 0.235117525 0.219954072 0.207895017 0.211935327 0.212647182 0.208537349 0.216807252 0.212518025 0.161357191 0.123175695 0.117174319 0.117627664 0.112405308 0.114758616 0.11081695 0.126721159 0.146731427 0.193098592 0.246079472 0.259124201 0.257968848 0.251645148 0.238304373 0.233424324 0.225858856 0.211630912 0.223705931 0.232262127 0.228933156 0.233864768 0.23264082 0.205877005 0.145449808 0.112870729 0.117391918 0.123626096 0.121630928 0.123947976 0.134277427 0.154097879 0.169786241 0.223146531 0.262093375 0.265002531 0.266094983 0.258996581 0.260801149 0.258420087 0.262123432 0.253525401 0.244024225 0.257157488 0.254536672 0.263653865 0.274098978 0.247832927 0.19172375 0.160038082 0.152299163 0.159503323 0.160119564 0.165393086 0.173881067 0.180808361 0.196633187 0.243557653 0.280791633 0.281396456 0.276511992 0.268714743 0.265156181 0.265541292 0.273651811 0.271821282 0.276379094 0.281917075 0.280217239 0.2927716 0.312029434 0.285591576 0.23257987 0.205017401 0.186357201 0.197813994 0.201377721 0.211709824 0.219487436 0.215711439 0.227150883 0.261340985 0.295833749 0.291920446 0.281632876 0.274008085 0.265805278 0.270071345 0.265705654 0.248336949 0.235553327 0.232118151 0.223433846 0.246466403 0.268220298 0.250735312 0.195523747 0.154498054 0.13737063 0.134259101 0.134637974 0.135125196 0.13371177 0.137926135 0.140651203 0.17583704 0.233311558 0.233647052 0.235525005 0.231310993 0.230630365 0.222923778 0.21747511 0.204671057 0.200717063 0.200236188 0.193743105 0.211801985 0.23192354 0.198738867 0.155613546 0.143391078 0.138234744 0.146518213 0.142718083 0.136751792 0.138311145 0.135926199 0.139914006 0.181285549 0.240648632 0.254278055 0.258965981 0.259905754 0.25977508 0.259857042 0.253181534 0.251728487 0.249428854 0.252540316 0.259020564 0.281197827 0.302811347 0.246024563 0.179798136 0.140202082 0.134591514 0.139104176 0.135063634 0.137874197 0.140773957 0.146660618 0.158966749 0.208898874 0.282300894 0.28948646 0.282632615 0.276823484 0.274603803 0.267560595 0.253440038 0.252314976 0.2453012 0.241998643 0.243985513 0.260053278 0.27591586 0.238913584 0.17175661 0.130800823 0.131285392 0.127555848 0.127835964 0.125326167 0.125802106 0.135460014 0.154063773 0.19427281 0.27108263 0.277631019 0.271785957 0.26234833 0.262552907 0.263444911 0.265763606 0.259533287 0.253646193 0.255815159 0.259670179 0.257733727 0.26135533 0.218289246 0.14067884 0.11964535 0.111229142 0.10624024 0.106599669 0.108187636 0.118086075 0.123999054 0.128531651 0.182299794 0.256421484 0.270075952 0.259316475 0.25162149 0.255571365 0.254718971 0.255998472 0.251188178 0.246818703 0.247874985 0.250440164 0.246408067 0.246429735 0.198177136 0.132670638 0.116889786 0.108752564 0.108294593 0.10857278 0.106230943 0.108777511 0.115495433 0.133338194 0.20141101 0.258280536 0.26255252 0.254772058 0.250881801 0.249960866 0.253760901 0.255933737 0.247232554 0.250348481 0.244118814 0.243092868 0.257039666 0.280024067 0.234019143 0.17429702 0.155274462 0.145343269 0.145626311 0.139082769 0.134053783 0.148267318 0.161270612 0.17513562 0.21856528 0.268964733 0.275424363 0.264663212 0.255125535 0.25354379 0.245191229 0.233944293 0.233124847 0.235465098 0.236248392 0.238867054 0.241763345 0.256197376 0.23007811 0.19036636 0.177808434 0.166379479 0.156144148 0.162806857 0.170828096 0.191561014 0.209973468 0.215010635 0.223970167 0.239608867 0.230959924 0.227864805 0.218815544 0.20178846 0.197739806 0.206783678 0.197618439 0.190030924 0.19467084 0.205616 0.220812116 0.23314162 0.233566908 0.235439728 0.217275116 0.184748495 0.166680802 0.1644454 0.173487685 0.163702151 0.174008532 0.175966656 0.208316412 0.221843599 0.228039028 0.219880723 0.220371576 0.215706556 0.195617495 0.187526611 0.19056371 0.181553403 0.185327154 0.193723926 0.217150736 0.223806268 0.201591066 0.181667625 0.144075461 0.14162859 0.139563595 0.136521046 0.121246857 0.124155834 0.120747192 0.130089124 0.16204288 0.198721547 0.202968799 0.193965932 0.182213154 0.17770825 0.172612545 0.171323857 0.16913323 0.164777238 0.165650239 0.173310477 0.189939537 0.200281766 0.176012106 0.12873841 0.11842347 0.117894217 0.117495866 0.111265059 0.109699796 0.115562854 0.111926174 0.127310038 0.151545251 0.189479936 0.201969244 0.200525208 0.193229801 0.195684683 0.191372496 0.177729916 0.172398919 0.164273316 0.181959257 0.184748153 0.166873713 0.163217901 0.153292321 0.107746184 0.113312241 0.104852906 0.090046503 0.086217546 0.0834232 0.079542164 0.078820527 0.083324438 0.111686719 0.138721929 0.154382537 0.160599888 0.160251192 0.16061279 0.157562014 0.154730936 0.14834522 0.140277591 0.137877751 0.143561392 0.150214018 0.155353478 0.133650304 0.120265161 0.106586701 0.10484715 0.112523352 0.112508364 0.106786024 0.109243313 0.113447698 0.115817944 0.160930438 0.21935548 0.235372964 0.222390991 0.213683217 0.213764574 0.211993528 0.218292193 0.219102293 0.220529033 0.223436365 0.215953486 0.225318765 0.235612772 0.196713044 0.151756121 0.135108651 0.118730359 0.125181993 0.133176102 0.132903828 0.131471537 0.141331705 0.142515423 0.185666865 0.244572712 0.253397148 0.237807009 0.234364386 0.2305106 0.216946811 0.215824976 0.209830419 0.2034194 0.202622809 0.205889767 0.213202426 0.228698528 0.200858391 0.157479407 0.133747612 0.122915084 0.116258766 0.116182958 0.118889686 0.112852306 0.132796631 0.149059605 0.189279641 0.242116492 0.250551248 0.242067305 0.230308921 0.215234095 0.20734963 0.205829163 0.19263939 0.199124337 0.192279936 0.205075759 0.209753037 0.220928362 0.218103852 0.185691009 0.165407643 0.156658661 0.151877173 0.146365453 0.142950818 0.145869073 0.143948348 0.145387628 0.164452821 0.20473647 0.222356907 0.21977601 0.207536876 0.192350042 0.18732028 0.18074839 0.178363251 0.179484068 0.181092965 0.183070651 0.192432527 0.202689066 0.167661177 0.125740267 0.113283017 0.10541492 0.102230455 0.104537038 0.102231116 0.106652092 0.122881232 0.135761818 0.156029332 0.203429186 0.206177128 0.204950246 0.199113861 0.185774781 0.172916058 0.178209933 0.177713544 0.173010183 0.167635824 0.178843122 0.189238162 0.196790772 0.159761467 0.124482139 0.11215947 0.118513942 0.115855089 0.11487758 0.110409836 0.111028825 0.114057471 0.119632811 0.139499419 0.174918376 0.187462354 0.182978367 0.1855865 0.177558902 0.174668217 0.173459888 0.17048875 0.169791064 0.165405202 0.173775124 0.182234927 0.190124598 0.155588587 0.114784077 0.109495934 0.112559466 0.113669631 0.119447186 0.126658053 0.124375169 0.109813859 0.115095273 0.158866087 0.207708922 0.215359359 0.218674683 0.225376537 0.22369999 0.222103665 0.221988194 0.218697281 0.214480939 0.217629592 0.215838202 0.21260311 0.216637139 0.158627486 0.118902823 0.099997893 0.100674746 0.097974339 0.099968362 0.09665369 0.10503652 0.120450188 0.127230106 0.187801589 0.239513111 0.249058995 0.241332511 0.234674006 0.231863489 0.225050799 0.219986408 0.210803537 0.215602991 0.217952746 0.219430478 0.234095962 0.238529909 0.203496965 0.165508244 0.155663665 0.146756782 0.143221786 0.145442796 0.144198586 0.15824393 0.17794414 0.193372656 0.236215863 0.254590929 0.254731924 0.243212932 0.236744241 0.234151657 0.220138816 0.210906985 0.207231686 0.201599866 0.192158391 0.197083012 0.215534855 0.212516308 0.185670517 0.149161513 0.136058139 0.118503337 0.122477198 0.123671588 0.112414 0.115937546 0.125805022 0.138609611 0.165233332 0.203133842 0.22030554 0.213262266 0.214416477 0.208496264 0.196816825 0.170913755 0.171639712 0.178313028 0.182984812 0.192012377 0.195378575 0.204331832 0.169732542 0.153094888 0.142996168 0.126839762 0.12285828 0.128711551 0.123879198 0.131555459 0.142036335 0.150523493 0.188806001 0.217054778 0.228378551 0.224669181 0.222339537 0.21692243 0.210306298 0.209842131 0.206806712 0.207645876 0.203560887 0.218104971 0.232205773 0.23513942 0.217113799 0.200301312 0.167413446 0.163462193 0.146454204 0.14875447 0.14240372 0.143338043 0.166348614 0.186402119 0.199922155 0.230025709 0.242893324 0.229754962 0.229763093 0.221813077 0.210426283 0.198418105 0.188297088 0.180447378 0.176094444 0.185337885 0.204708352 0.21213912 0.179000499 0.149838414 0.148152319 0.141109225 0.138762734 0.137600495 0.13227985 0.135685588 0.132873285 0.138250248 0.159099061 0.196040993 0.207630966 0.202454668 0.200778727 0.186693384 0.161262982 0.161896979 0.152245619 0.156840945 0.159151652 0.171448354 0.184263752 0.183556139 0.14587093 0.112991731 0.109134261 0.107381616 0.108211923 0.106679411 0.111063179 0.108015466 0.102626875 0.106836859 0.132336425 0.166014471 0.181708757 0.183107165 0.182611991 0.178041048 0.165946921 0.156137387 0.15070673 0.142170786 0.143416459 0.143215936 0.149249448 0.155184556 0.121311046 0.104572883 0.104498483 0.110513916 0.110341929 0.106417071 0.108681219 0.104331994 0.114940883 0.116136428 0.151827071 0.186110336 0.203369654 0.196959976 0.189511526 0.181755689 0.174076792 0.173971026 0.171396337 0.171601998 0.172377321 0.176465898 0.189624534 0.202054448 0.178990927 0.154515924 0.14336657 0.130949939 0.134426802 0.134407355 0.138604242 0.128073632 0.140413925 0.158438693 0.191014343 0.219862359 0.223430184 0.213127146 0.209089963 0.197722511 0.17712586 0.16380645 0.156268623 0.147946544 0.142595014 0.152142797 0.168481786 0.175238163 0.147732317 0.121954035 0.117932776 0.110577306 0.109595124 0.109242991 0.105368532 0.10375334 0.105323348 0.113538881 0.138098058 0.168212359 0.200311681 0.192461767 0.170635336 0.140955429 0.126595941 0.121148333 0.118422969 0.121077394 0.126824835 0.129080168 0.148900461 0.143238691 0.116237872 0.099774841 0.086432545 0.083900991 0.086258367 0.088392467 0.082055107 0.077903292 0.070227218 0.097241719 0.126278319 0.173366714 0.183009676 0.172779975 0.166248524 0.150544316 0.1464552 0.153684809 0.156005763 0.145343631 0.147131343 0.152986728 0.182404284 0.192806235 0.145345499 0.129839732 0.116907582 0.109579938 0.094690727 0.114365181 0.103749748 0.123814325 0.127844167 0.135364336 0.147597191 0.182127667 0.197092831 0.18527132 0.17943881 0.160506887 0.147659172 0.140560104 0.141953828 0.135682589 0.136239424 0.148573224 0.173861977 0.19325687 0.15710335 0.123336024 0.111490269 0.108380494 0.11396232 0.11516691 0.114855137 0.109699749 0.113736839 0.118371482 0.143405969 0.197065297 0.210688834 0.199540445 0.192620621 0.198507477 0.191384144 0.192041227 0.195857549 0.19464364 0.194984331 0.197465013 0.2038644 0.201210806 0.146373262 0.11141612 0.102832311 0.090080682 0.09139255 0.098459152 0.093853697 0.095154657 0.09927143 0.117840045 0.155714806 0.220293174 0.234090673 0.220555343 0.204546982 0.179029908 0.159764565 0.151685024 0.142422821 0.132886224 0.12933583 0.133283825 0.135294312 0.12517522 0.098238597 0.085819295 0.085944921 0.083603536 0.081394096 0.082249218 0.088607166 0.087579126 0.090352875 0.107237723 0.132330557 0.174147162 0.200100464 0.187997118 0.177791887 0.156445942 0.142230951 0.135991322 0.136116265 0.136726474 0.136014739 0.149063152 0.160594685 0.1595041 0.135558121 0.10307481 0.093128486 0.099162118 0.088815037 0.090065743 0.08698484 0.09071188 0.101870899 0.132017234 0.165981067 0.206002651 0.220355986 0.219482089 0.211769721 0.188615431 0.15985196 0.153792227 0.151517909 0.152932731 0.147089223 0.151151472 0.15960833 0.163628813 0.145101488 0.133115831 0.112940149 0.121141052 0.1185276 0.121226663 0.113432171 0.101551888 0.11172575 0.110597063 0.132560625 0.172601986 0.186990121 0.180208579 0.168476006 0.158292834 0.148214421 0.138880296 0.138175962 0.135699188 0.13344158 0.134270896 0.153108434 0.149024063 0.115463354 0.103466491 0.096699366 0.092922364 0.09792645 0.105161599 0.103458609 0.113459231 0.120061856 0.131690848 0.156553691 0.210331012 0.227707386 0.211841595 0.201140559 0.191429879 0.184131971 0.175308862 0.172284995 0.168499193 0.168095208 0.178552508 0.198988533 0.196177533 0.13320543 0.111587289 0.108605487 0.10646233 0.113366945 0.107274989 0.105525041 0.109364768 0.131422568 0.146153189 0.187453882 0.246928603 0.254120241 0.242255975 0.230244582 0.219487613 0.212123019 0.215702008 0.200237532 0.196283213 0.193588816 0.198344536 0.205669187 0.194631241 0.160793953 0.140025199 0.141673447 0.13853085 0.135330131 0.147022698 0.133834394 0.133276097 0.138199775 0.154045084 0.177917073 0.213206431 0.217418752 0.205506658 0.198666418 0.177310383 0.159556974 0.168591162 0.161773652 0.153238826 0.145648698 0.143088241 0.143185045 0.138429854 0.102869763 0.087657533 0.07749207 0.076728898 0.075241492 0.086159086 0.092280187 0.072910544 0.081069245 0.086065713 0.110537487 0.145304308 0.159581743 0.16170071 0.165800784 0.161193642 0.162821698 0.164653893 0.159190242 0.147173423 0.153846169 0.156609219 0.15003484 0.134761995 0.100320661 0.0883758 0.082504161 0.082010681 0.081285129 0.079228163 0.076243918 0.079213213 0.081131034 0.081915824 0.102672257 0.145421411 0.153710618 0.148103208 0.146172584 0.141865559 0.149225069 0.158060145 0.166791818 0.156479969 0.154519096 0.160497415 0.172744717 0.162419463 0.124317408 0.102607923 0.094178885 0.092595813 0.086458854 0.087596566 0.092379929 0.099370154 0.10478606 0.125138919 0.149980444 0.194891803 0.215213984 0.21483534 0.202623041 0.187148294 0.187912997 0.179005463 0.169886655 0.168334444 0.167320086 0.176735637 0.192543984 0.17496089 0.13650195 0.119471114 0.121920365 0.122932226 0.125468415 0.126765235 0.130748549 0.131341743 0.138887701 0.146059026 0.168846605 0.226395578 0.238084285 0.225628965 0.209223938 0.205092552 0.196245966 0.18684256 0.172487075 0.170114052 0.170552653 0.18042068 0.201229028 0.192136036 0.149040997 0.141237288 0.137105502 0.132140283 0.129980873 0.128001669 0.128083289 0.129879924 0.146054603 0.153046723 0.187953923 0.23796886 0.24932536 0.238213932 0.21965554 0.200010354 0.174961134 0.163118729 0.155008868 0.150773297 0.148252299 0.157151668 0.176957696 0.169911604 0.138485607 0.123289805 0.124428781 0.121303623 0.12695815 0.122685548 0.123475685 0.130551849 0.135503778 0.147417765 0.188133191 0.233763112 0.239095147 0.233564103 0.214640348 0.19414909 0.181483582 0.169616672 0.160161945 0.140296242 0.131562369 0.144578622 0.167623497 0.152144894 0.114533466 0.104475573 0.101085546 0.098016751 0.099599412 0.10229161 0.09761565 0.105195983 0.121921825 0.129988418 0.158844899 0.207959963 0.216283721 0.20991625 0.192826466 0.17011509 0.146479822 0.13339186 0.115593989 0.112546931 0.110216472 0.112471359 0.120686581 0.116560289 0.103789665 0.089964686 0.090653824 0.091721677 0.093295899 0.09058358 0.09038538 0.08284901 0.099849626 0.111983036 0.12906638 0.151880295 0.17147746 0.176318552 0.169557355 0.14976506 0.140136214 0.136327223 0.133878393 0.132421422 0.130563617 0.141339171 0.152926035 0.142252401 0.105644197 0.086851382 0.083499119 0.086754172 0.085315834 0.084617692 0.091103101 0.087078968 0.114136286 0.14590842 0.197518197 0.22403241 0.218637573 0.206869285 0.198919241 0.187119252 0.176423393 0.157689157 0.149481351 0.142916259 0.135689639 0.14562584 0.152481739 0.159333112 0.140508198 0.107812241 0.102024192 0.107491269 0.115655776 0.11959107 0.126249109 0.128360957 0.129916031 0.145371536 0.156049498 0.182629799 0.192085548 0.189210146 0.185118227 0.173487039 0.15893718 0.155472166 0.153958219 0.155322018 0.151473687 0.161902795 0.179459213 0.164160374 0.133561498 0.113691341 0.107353401 0.106127101 0.104721796 0.099055999 0.098213046 0.103237433 0.112236595 0.119868733 0.147044692 0.193046654 0.213608905 0.211715358 0.207417228 0.202007723 0.184496417 0.171128199 0.16427359 0.162642709 0.163981556 0.168335959 0.183428913 0.173064832 0.134862432 0.125056638 0.116789499 0.122550142 0.125192218 0.12697656 0.126415853 0.123484032 0.136674673 0.141594732 0.162932792 0.197665302 0.208300363 0.206695697 0.187948499 0.182976603 0.164896753 0.176481145 0.165998696 0.156865291 0.154643075 0.176827853 0.180177986 0.16048862 0.131698236 0.13076613 0.130870339 0.127948778 0.131963989 0.138851256 0.135791677 0.138638135 0.143652557 0.142621848 0.164345076 0.194526833 0.207493047 0.211274942 0.194130154 0.17912295 0.18282025 0.178856751 0.180859693 0.184313368 0.18357476 0.183704428 0.188907669 0.167499405 0.13987903 0.125056972 0.122374705 0.125039666 0.125340217 0.121790976 0.117142828 0.120381164 0.127756851 0.124902382 0.153375109 0.197831354 0.216745586 0.209396156 0.199787231 0.189442467 0.183512398 0.163282692 0.155705377 0.162905634 0.167795005 0.174791364 0.172032197 0.136558173 0.102552698 0.092340563 0.090568529 0.088672071 0.087455186 0.084439955 0.080751989 0.078296241 0.09445608 0.101238468 0.138025762 0.187616105 0.197736639 0.196953763 0.188951752 0.191283285 0.175967829 0.154011172 0.145180223 0.141042638 0.141437585 0.147202649 0.156944053 0.128998775 0.092374987 0.081355013 0.079734054 0.077543019 0.07650882 0.069534614 0.063050744 0.06264452 0.079840231 0.102096865 0.128032863 0.178064427 0.197894301 0.200543364 0.197346063 0.182800655 0.169765914 0.166500393 0.168716815 0.165072224 0.159260092 0.167178745 0.173489514 0.162825136 0.147289702 0.128607781 0.121532531 0.119142949 0.111916185 0.10831462 0.102465508 0.112034029 0.117363421 0.112588126 0.145718553 0.183693071 0.197237085 0.204598946 0.191409841 0.17509774 0.173576143 0.168248671 0.167511059 0.172773437 0.159859994 0.159524213 0.169126092 0.164078125 0.13900896 0.121030872 0.114227017 0.123095422 0.116838613 0.108929576 0.106119778 0.109709827 0.116680197 0.114951207 0.144490542 0.190617574 0.203057751 0.195044148 0.187789672 0.180339799 0.165066441 0.169774759 0.158494897 0.148125215 0.133609265 0.138580762 0.156599139 0.151401395 0.135396269 0.134683602 0.134549318 0.137268732 0.133226149 0.133936535 0.12368963 0.134409233 0.131391625 0.129436443 0.142449672 0.190928736 0.220234238 0.211534203 0.201165383 0.181517621 0.165174936 0.16206553 0.154999561 0.146261367 0.150504583 0.156334174 0.166915777 0.166923791 0.156537329 0.141484268 0.134478953 0.114066997 0.123131628 0.123223088 0.112149933 0.122271777 0.128288847 0.132312521 0.151318056 0.198280977 0.209437178 0.205875767 0.200040097 0.196892532 0.197340452 0.171558026 0.161653526 0.165360451 0.165554884 0.175989105 0.195769452 0.19033386 0.180012284 0.182004733 0.1696117 0.153341854 0.145648325 0.146400199 0.15552287 0.164435706 0.174329234 0.180526142 0.19582368 0.216864185 0.231602449 0.235316795 0.226479735 0.216067721 0.209630225 0.188349631 0.178378884 0.171076927 0.169487312 0.170711295 0.173144881 0.174616615 0.144504955 0.129837079 0.116443056 0.114995292 0.118792068 0.115614056 0.117493687 0.114907587 0.120667384 0.12634812 0.147636885 0.179583467 0.196154885 0.201634576 0.190755459 0.17541704 0.172206242 0.159849434 0.150009612 0.144438072 0.138241673 0.142690654 0.148494153 0.137108267 0.116622419 0.110368777 0.111672512 0.113523714 0.112713853 0.107831036 0.10412646 0.099757935 0.108866209 0.112083905 0.130792352 0.151545909 0.165809107 0.165232405 0.153296429 0.147062376 0.144889725 0.142615711 0.144592536 0.141081119 0.142803113 0.14813133 0.154628625 0.149615403 0.121130558 0.12453457 0.121016123 0.124603645 0.12164862 0.116907833 0.122898966 0.131875966 0.130883679 0.138345944 0.156315349 0.188806084 0.201595693 0.201472922 0.192205714 0.183563555 0.16080061 0.155087228 0.149167244 0.143482852 0.141209377 0.148510424 0.166129563 0.160682912 0.141986428 0.129582639 0.132941228 0.135651448 0.139711033 0.137805316 0.135513413 0.132501161 0.151250191 0.163671421 0.180755119 0.210617579 0.243598334 0.237860448 0.218731973 0.209540989 0.18875323 0.181923635 0.16846915 0.167386817 0.163146298 0.173533304 0.195810131 0.203611582 0.204392777 0.189969565 0.157914763 0.145912745 0.139765933 0.139115076 0.142741912 0.149423841 0.172841192 0.181792362 0.205404461 0.217316816 0.225108995 0.212246025 0.198855763 0.183082993 0.158731185 0.15381733 0.149859656 0.140666398 0.145656202 0.151344098 0.165502866 0.174951769 0.159088509 0.127434259 0.121519885 0.11699355 0.106465823 0.112996856 0.115179015 0.111047299 0.126368202 0.12512697 0.12964928 0.160463662 0.188822148 0.170788421 0.168332062 0.162677075 0.158514411 0.127201816 0.124448744 0.126877103 0.124975657 0.118309883 0.124695395 0.118725563 0.110627959 0.112532051 0.109523117 0.106549529 0.104910092 0.106562995 0.111579872 0.109927398 0.114809483 0.122167319 0.125077405 0.12660864 0.131554578 0.134087859 0.124996278 0.121105191 0.120042799 0.113405 0.12197942 0.122911019 0.120417431 0.123548617 0.128103597 0.123532122 0.105132639 0.106426105 0.10476174 0.103691588 0.101951139 0.114896653 0.112485913 0.106107571 0.105781472 0.109868751 0.129932729 0.141293603 0.151375275 0.158743919 0.146025013 0.138828422 0.128272018 0.123074743 0.121467561 0.128592691 0.133068095 0.130830374 0.140223277 0.128085052 0.136622443 0.124140545 0.119234091 0.10940946 0.100004169 0.101397745 0.111660584 0.104144312 0.107997761 0.112883082 0.117764634 0.131750059 0.137620627 0.138003187 0.130430662 0.125156462 0.133540065 0.132955938 0.129898768 0.127620036 0.124408627 0.118330945 0.131655382 0.123835444 0.10027511 0.103860954 0.106392314 0.10363017 0.102120459 0.108973245 0.111946851 0.102929333 0.107381385 0.114654306 0.111334303 0.137239657 0.149023334 0.152991056 0.144806007 0.141373888 0.130663013 0.126430686 0.124001704 0.129475202 0.127546004 0.128289892 0.139907022 0.12773257 0.110097695 0.106138326 0.116104307 0.115010153 0.120469682 0.122023892 0.10916779 0.102267991 0.111965565 0.116029129 0.123762086 0.155780661 0.167019129 0.169760527 0.158987934 0.144399924 0.130653601 0.136134026 0.135007228 0.135924383 0.120829819 0.11696863 0.123692942 0.120328507 0.109278849 0.116323009 0.113998054 0.115577386 0.119455825 0.126460288 0.117212589 0.097499899 0.099677603 0.095983601 0.100498628 0.129379714 0.138616973 0.144582909 0.146094836 0.136793959 0.137381931 0.134673018 0.13921384 0.139148608 0.138251562 0.142567675 0.152132256 0.155843481 0.150797367 0.144579545 0.142441745 0.14117486 0.141668753 0.132096142 0.134610759 0.138373163 0.139344061 0.148621112 0.156741379 0.176570685 0.184007513 0.186297888 0.167740181 0.148297527 0.137341293 0.127546543 0.127535576 0.128251793 0.12638816 0.132864302 0.138669715 0.120788181 0.103529756 0.104399207 0.10982348 0.111148323 0.113153142 0.109324165 0.11006988 0.106673514 0.105346147 0.106373795 0.119133898 0.149807737 0.151678877 0.145831412 0.143674 0.132147044 0.123242105 0.111952264 0.102312889 0.097194046 0.097684446 0.104652832 0.109606531 0.091655381 0.085642439 0.088649998 0.088705615 0.090363785 0.079636219 0.083052307 0.084946097 0.087172663 0.092251523 0.098233908 0.104198541 0.122535947 0.131005356 0.138080485 0.143618379 0.139717717 0.131288169 0.120248225 0.11920601 0.112139697 0.110548877 0.107842376 0.106750726 0.096593586 0.082504969 0.083788583 0.083224197 0.078684338 0.071739569 0.072223225 0.072104352 0.085476309 0.082028142 0.093430649 0.105304058 0.119682321 0.11815435 0.119626927 0.121481862 0.128499177 0.121555659 0.121606434 0.115978442 0.112359392 0.108878164 0.106538243 0.110666011 0.089887281 0.080158458 0.073174866 0.075781216 0.078196881 0.067931041 0.075447981 0.07763776 0.067455514 0.081130925 0.076953317 0.079776613 0.090777596 0.099291197 0.105987188 0.108803941 0.1093675 0.109612801 0.095576067 0.096710654 0.097488055 0.100455346 0.098082968 0.109660819 0.093903327 0.088164349 0.082472565 0.093926118 0.103326519 0.098345615 0.102444392 0.099844953 0.108965333 0.108142882 0.113906085 0.123962928 0.132519049 0.137983489 0.149958993 0.149142502 0.140366852 0.135745189 0.132774659 0.129287002 0.126620728 0.124374046 0.133149841 0.138603792 0.126601765 0.10780314 0.106683081 0.129954661 0.123140728 0.12275613 0.127107448 0.112691291 0.118283784 0.129064345 0.127953149 0.133780933 0.163018692 0.17815291 0.170661106 0.166686118 0.1570324 0.146462385 0.141329021 0.128713822 0.124239405 0.121616288 0.130757819 0.13559043 0.11786885 0.09663019 0.096011989 0.096539276 0.101048953 0.10467421 0.104157583 0.096477164 0.096685341 0.108260149 0.115266088 0.125207852 0.173381367 0.189030004 0.179274158 0.177714464 0.172041225 0.157283681 0.150166316 0.139181447 0.136396075 0.135074239 0.138721596 0.142533843 0.134011085 0.111600106 0.109053565 0.118230864 0.116901252 0.115897691 0.108214502 0.111252918 0.110536117 0.117165659 0.119858059 0.139648965 0.168510432 0.175673018 0.164671747 0.161744437 0.157670115 0.152354884 0.143315016 0.133988683 0.129316802 0.128703243 0.13149163 0.131225594 0.106330133 0.097340861 0.093359181 0.096946696 0.094034631 0.095344173 0.097419395 0.097685706 0.092588661 0.103365918 0.10755438 0.126007857 0.147708026 0.15728397 0.171725029 0.17594429 0.161058173 0.157797632 0.144171233 0.132781835 0.127148412 0.121488017 0.123813497 0.120161993 0.103807145 0.109056587 0.107854939 0.109332499 0.111118222 0.10637456 0.107603406 0.100586467 0.095270941 0.098860815 0.107030437 0.120878613 0.141891135 0.154273054 0.161278533 0.150615381 0.14211207 0.140090497 0.122889161 0.115277894 0.115624728 0.122207431 0.126272918 0.131321736 0.124576867 0.109386478 0.110592478 0.108060158 0.108672338 0.111076161 0.111029688 0.10771916 0.110862986 0.117426849 0.122713477 0.136256745 0.171714829 0.184996108 0.186004915 0.177498158 0.165354929 0.144968498 0.133768666 0.134232365 0.127799141 0.132053435 0.134640057 0.147270779 0.14337594 0.125386747 0.122544423 0.126807798 0.129849015 0.12450884 0.12296763 0.129128228 0.142699206 0.156022987 0.149607978 0.164140706 0.187079359 0.208305667 0.211203565 0.200123654 0.186213776 0.173078885 0.163502304 0.151783666 0.149305827 0.149009175 0.149469304 0.148896419 0.138621184 0.127786611 0.120333164 0.121731578 0.123627829 0.130406003 0.145435864 0.150974143 0.147488042 0.152759075 0.168016392 0.19263178 0.22192671 0.228014549 0.22856794 0.216914327 0.197493137 0.188626589 0.175742353 0.157218707 0.150052186 0.141185094 0.141555962 0.148078343 0.131911505 0.114278815 0.111428888 0.101545215 0.094472185 0.097593375 0.095200858 0.094588589 0.101873731 0.11394595 0.117779512 0.136607164 0.173111386 0.184569342 0.180262301 0.177371505 0.16861154 0.151739438 0.140169077 0.130139904 0.125365279 0.127564631 0.127366478 0.135122918 0.122144077 0.108316825 0.108094621 0.103667309 0.108436507 0.10650184 0.104312165 0.101601683 0.102447583 0.112961305 0.117877156 0.122187642 0.139144899 0.15709184 0.155211607 0.154431264 0.142234779 0.127083998 0.116343355 0.112259513 0.11760248 0.117797726 0.120754696 0.126912767 0.120863773 0.112912627 0.112301569 0.114678917 0.110765654 0.11214403 0.10742377 0.105979048 0.101395957 0.124010511 0.118453184 0.143606895 0.187928179 0.212785968 0.206781344 0.208541962 0.208725569 0.210770934 0.204799559 0.192757433 0.179939845 0.175979843 0.173361223 0.165936742 0.145084705 0.137113859 0.11648458 0.113166038 0.115399936 0.114567154 0.113953756 0.115139957 0.117788722 0.138002642 0.152488021 0.185454653 0.22949211 0.251348417 0.251619653 0.252402112 0.244794573 0.236805225 0.232777687 0.218929354 0.211640486 0.206932888 0.212291952 0.211736617 0.186029278 0.161538626 0.147513833 0.154354842 0.159087297 0.168126762 0.185303738 0.198618926 0.21087654 0.227415441 0.247449471 0.266167335 0.28426733 0.302191598 0.303481859 0.279427917 0.270884881 0.263181081 0.255483135 0.24833087 0.243914221 0.240419741 0.244384094 0.245678028 0.213226134 0.19204308 0.176281711 0.188280118 0.199390059 0.212998047 0.228901925 0.237539801 0.243283633 0.254878781 0.263813787 0.279575147 0.298167838 0.305653538 0.298642417 0.288679745 0.282409006 0.268713151 0.259353616 0.24678013 0.237917052 0.235429508 0.240948195 0.244060853 0.215447446 0.182981099 0.173330058 0.189449465 0.191999427 0.19859968 0.208751759 0.21680332 0.223767658 0.229592702 0.236574317 0.254434864 0.276083229 0.290310362 0.280976666 0.264238187 0.25082423 0.231348513 0.213682116 0.204528821 0.198763 0.190187858 0.193789082 0.193420475 0.172048908 0.14480235 0.129522017 0.133072441 0.132385428 0.12984197 0.137894549 0.126751186 0.13299266 0.14873029 0.157334146 0.170839177 0.19798834 0.207804532 0.207866636 0.20817285 0.199936011 0.190706238 0.169157542 0.159686878 0.152064478 0.148975091 0.146444725 0.151199655 0.129786661 0.111789958 0.114681812 0.109981617 0.109394606 0.105153789 0.092374093 0.093023592 0.10003204 0.107567684 0.122738955 0.140690777 0.169621548 0.189407613 0.190491685 0.185042461 0.174956118 0.161390557 0.155129262 0.151698458 0.148927754 0.145664 0.148957706 0.149182042 0.11672787 0.099238327 0.094937166 0.09416615 0.092277827 0.094419229 0.094044616 0.095915812 0.096499315 0.104981147 0.113401008 0.12446861 0.161249689 0.182259511 0.182459351 0.18191521 0.187474663 0.174874287 0.162993604 0.155066997 0.154587338 0.152451585 0.155024251 0.151679824 0.130426334 0.114405571 0.109508401 0.10508782 0.106098833 0.100905267 0.102933926 0.103602108 0.100197495 0.12066496 0.12326576 0.137944264 0.175447303 0.194163566 0.193186179 0.193583348 0.188161033 0.179872859 0.169487236 0.172031076 0.179471586 0.178955158 0.184810879 0.180913496 0.169405012 0.148533768 0.138654826 0.138615246 0.139049727 0.140773862 0.144400562 0.147818183 0.146636457 0.150057161 0.155445682 0.176095811 0.209034312 0.225342397 0.226093469 0.225363798 0.220037783 0.206957665 0.199602392 0.190641339 0.188418704 0.182440186 0.181446392 0.181360196 0.167501788 0.144569417 0.13706867 0.138331026 0.136896469 0.139720683 0.131970677 0.139926617 0.141900608 0.149466025 0.15032022 0.164357726 0.198895782 0.216077926 0.213835815 0.20312686 0.196906532 0.185348635 0.168746521 0.16268071 0.159979704 0.154513048 0.155068781 0.163543631 0.140897534 0.129108323 0.127541495 0.129204414 0.129881808 0.135035346 0.139943838 0.135130094 0.13335001 0.136959292 0.138924118 0.150745568 0.186127823 0.208644987 0.209100026 0.199764038 0.18179354 0.165509403 0.151934133 0.137539012 0.129062892 0.122494097 0.123623153 0.127358128 0.114109288 0.102843098 0.098606513 0.102850368 0.101432204 0.09829171 0.094846595 0.097178339 0.093121266 0.098076911 0.105607177 0.130143443 0.167298915 0.190606734 0.189554505 0.178422192 0.166480511 0.154569648 0.15748056 0.159951364 0.154816805 0.144815837 0.143802525 0.148121159 0.131748733 0.100464616 0.087307694 0.093309436 0.093112777 0.087688028 0.089278812 0.089175851 0.09152905 0.098721459 0.104325212 0.112717626 0.143665325 0.169715235 0.166089638 0.168037171 0.164321197 0.161963362 0.15445242 0.149409028 0.146735026 0.152488915 0.157235141 0.157192262 0.132268889 0.10582855 0.105019489 0.097464142 0.096220166 0.104225285 0.10311046 0.099193081 0.095125478 0.116652806 0.125095937 0.145992994 0.18540326 0.205998552 0.212584646 0.208835174 0.199765195 0.193296879 0.188706701 0.183684751 0.185488303 0.180502262 0.177693231 0.178999285 0.144329413 0.116376331 0.105824973 0.10218141 0.103239357 0.098206642 0.09630043 0.099020872 0.109577289 0.128505655 0.137953373 0.160863919 0.206081557 0.23338779 0.234625153 0.221497056 0.207789664 0.186598252 0.17960062 0.172465294 0.166131545 0.169033331 0.170211486 0.170093142 0.153683668 0.134362782 0.134168645 0.139097315 0.138492568 0.140254475 0.141736565 0.14430118 0.148682454 0.1534212 0.163725138 0.181309352 0.221158992 0.236164016 0.23135758 0.226749805 0.20958764 0.197914974 0.186876142 0.18277571 0.173299212 0.168456033 0.168992612 0.175238875 0.168076115 0.149303172 0.144648874 0.156312069 0.155574292 0.14967508 0.152040343 0.145260867 0.150391474 0.151126051 0.154536785 0.168137868 0.1940829 0.209193145 0.210371422 0.205904813 0.204912371 0.184341683 0.172038583 0.16460662 0.158130481 0.154072098 0.159762943 0.159939715 0.144699584 0.132165443 0.127809282 0.130053228 0.123554541 0.118823421 0.115708747 0.115291497 0.112413193 0.114483002 0.114094491 0.125062675 0.15643038 0.178617291 0.185509915 0.188313044 0.185078362 0.170399824 0.165712445 0.160184881 0.155397675 0.154791635 0.155684985 0.157630236 0.143323603 0.120875275 0.120115326 0.11662847 0.129591153 0.128751503 0.120306628 0.117920894 0.118853823 0.125166271 0.122982547 0.136363934 0.171143709 0.189784848 0.189886246 0.191972053 0.187138967 0.178528539 0.16258417 0.162965198 0.169440425 0.171160607 0.178807326 0.168860713 0.154171993 0.123605933 0.126217403 0.126705683 0.12571609 0.129445379 0.131297454 0.135857893 0.147040968 0.141911802 0.14566775 0.157512689 0.18275566 0.203012039 0.206806214 0.207985972 0.199121938 0.193271363 0.188989247 0.174913425 0.181245486 0.183164693 0.183598513 0.181076508 0.181682904 0.158725475 0.140961974 0.133159446 0.132478609 0.128973102 0.133466323 0.137491336 0.150573972 0.160384404 0.169213361 0.192492378 0.211459408 0.216708014 0.219799869 0.222979084 0.213095777 0.201225473 0.18592383 0.180817537 0.179673452 0.174494146 0.171213695 0.17671645 0.167096296 0.138361179 0.126588395 0.121207886 0.121904468 0.126270582 0.123297082 0.116159484 0.120724539 0.129140187 0.145341653 0.158509698 0.195386156 0.22062278 0.21792102 0.217218259 0.205940289 0.183629226 0.181819867 0.174525535 0.166318459 0.167543234 0.178646364 0.179831354 0.147980505 0.125521756 0.118631837 0.128590126 0.132269963 0.134096813 0.135330621 0.137104017 0.135503424 0.137701679 0.148296637 0.168013605 0.198359647 0.22533388 0.218406011 0.210616749 0.206316856 0.188861571 0.185210228 0.171753842 0.163868589 0.155902621 0.151359516 0.15586314 0.13108958 0.116799563 0.112681444 0.1086867 0.107167476 0.110812298 0.10866888 0.108438678 0.117462555 0.128133951 0.137003863 0.150284935 0.192389329 0.213254403 0.213957471 0.208396654 0.199649454 0.187055195 0.180417164 0.17590524 0.168110494 0.160511926 0.162441879 0.161846912 0.13480405 0.117745667 0.108268454 0.106390507 0.107426108 0.105582474 0.106528948 0.107240533 0.117143858 0.131414628 0.139639632 0.156000197 0.194231604 0.212508564 0.212408224 0.206153015 0.203793365 0.190239868 0.176854192 0.15823341 0.151048506 0.145595361 0.136621157 0.135773459 0.122930754 0.103372108 0.102135141 0.10505591 0.104638937 0.10302653 0.115170898 0.088090613 0.087653558 0.098699013 0.11006013 0.162805626 0.193639134 0.193725056 0.187052278 0.187358197 0.184004379 0.184447776 0.179835793 0.178258504 0.172358687 0.168732113 0.168901815 0.176981603 0.156797393 0.127575786 0.118693795 0.117603872 0.120521773 0.126620762 0.127706248 0.135552624 0.140320439 0.14573008 0.15325655 0.167403768 0.202448793 0.216215084 0.22206123 0.219452091 0.213010594 0.195689678 0.183569202 0.17067062 0.165761859 0.163928487 0.166833062 0.161393374 0.144102107 0.12073806 0.107431309 0.111157177 0.109322324 0.110310041 0.113317354 0.113437371 0.12210968 0.130818893 0.142854738 0.161529659 0.194420614 0.211710315 0.208834494 0.206711278 0.193658908 0.175076114 0.166982101 0.159146972 0.157712761 0.160136835 0.160996608 0.159503092 0.150903879 0.130750842 0.118052887 0.116433941 0.113332891 0.112576617 0.104307416 0.099070641 0.096819453 0.10963834 0.115533785 0.141373889 0.17345247 0.191987125 0.198818805 0.200561907 0.185221033 0.176608954 0.168131038 0.156555484 0.149579766 0.155072119 0.15988641 0.157110432 0.14301787 0.122641648 0.116158316 0.113547033 0.107698491 0.106008795 0.107304172 0.098931725 0.101115591 0.109174527 0.121892874 0.146526017 0.179006441 0.202015861 0.205169397 0.208545236 0.201540918 0.192556661 0.182109985 0.17364481 0.170340451 0.172270082 0.178320599 0.187574996 0.170154765 0.143293391 0.136785188 0.139072511 0.142841647 0.14573324 0.152397294 0.158884558 0.156550471 0.166612425 0.179427817 0.19764185 0.227976042 0.236458213 0.23736368 0.234242765 0.234208695 0.228729047 0.216865608 0.214604318 0.209650828 0.203379472 0.202879025 0.210636853 0.19241779 0.163466723 0.160677695 0.155222032 0.160345228 0.171741909 0.176568801 0.17071247 0.173715169 0.185799153 0.191600663 0.206300924 0.234644985 0.245998174 0.25010856 0.247323569 0.248611575 0.239116663 0.227135061 0.226086466 0.218225246 0.209869956 0.21405681 0.225100782 0.209624758 0.181132959 0.174167046 0.176830808 0.181890772 0.180670695 0.191644984 0.196864203 0.204990028 0.206904666 0.20910056 0.219968782 0.241748025 0.247957228 0.247560545 0.24383485 0.252478452 0.244740429 0.24213774 0.230300254 0.225101916 0.227172656 0.234939318 0.243250641 0.22141798 0.194784595 0.184671215 0.181201211 0.186390154 0.18449891 0.212488123 0.215638512 0.220423669 0.214448698 0.215369722 0.228750447 0.25715449 0.266911436 0.260297452 0.255916353 0.2539289 0.255100377 0.240420067 0.229988457 0.224617806 0.221116304 0.2193372 0.23547377 0.209420286 0.171673587 0.163937773 0.162510304 0.163618307 0.168006952 0.173689535 0.181813832 0.190496638 0.199814075 0.215749145 0.233665637 0.261907509 0.275427568 0.26743115 0.26592812 0.268008893 0.257188453 0.248429948 0.232900702 0.229941555 0.227692782 0.22600384 0.221389229 0.193838362 0.154996596 0.145329595 0.142739284 0.146343877 0.142952244 0.146804304 0.160479226 0.172023436 0.181776546 0.193332293 0.209731581 0.241958942 0.262586006 0.26771956 0.266244301 0.254330854 0.238220266 0.230875928 0.223800543 0.220248814 0.217225268 0.218055016 0.220216291 0.19551145 0.167965388 0.153263703 0.148666167 0.155653222 0.164154785 0.171245139 0.173099443 0.181808192 0.188377833 0.199524199 0.212027782 0.235300484 0.253540837 0.245373633 0.24679171 0.247652765 0.237301073 0.218629486 0.207473626 0.202800979 0.202575364 0.205029036 0.207269497 0.185440091 0.15738463 0.148662134 0.144844139 0.148735225 0.151310343 0.162262978 0.165474279 0.168006684 0.1797029 0.194179673 0.205297931 0.229284069 0.246278776 0.250941907 0.247876357 0.239790232 0.229294058 0.212105038 0.201634234 0.194247655 0.194176532 0.193371082 0.200361166 0.185507623 0.156790788 0.15793636 0.161831244 0.158238455 0.163343784 0.168600226 0.171173592 0.178017459 0.192479301 0.196703183 0.21021259 0.238332712 0.256022516 0.25218005 0.248342489 0.249496509 0.240446877 0.226552771 0.213506637 0.209843908 0.205657367 0.206675405 0.205027463 0.182183503 0.155476249 0.146836915 0.142114079 0.137638536 0.13751237 0.141757632 0.141895383 0.143343972 0.153989443 0.167280802 0.184490186 0.21788215 0.236398866 0.238124404 0.232303589 0.229004898 0.224403794 0.222917693 0.211499224 0.209285189 0.202609494 0.202017776 0.210133647 0.183044372 0.152390748 0.148058975 0.15024615 0.153655749 0.145140342 0.143384551 0.147358327 0.152274717 0.156368481 0.16492797 0.185136236 0.214201915 0.232199255 0.231573732 0.233412361 0.238515459 0.231502228 0.222588017 0.20826248 0.207005434 0.200531878 0.198615079 0.20418339 0.176357284 0.139662324 0.126900477 0.123995662 0.128342224 0.132010709 0.140498198 0.137673717 0.148691389 0.155423997 0.167557169 0.188079936 0.219677213 0.230428095 0.236761229 0.246985085 0.251429907 0.240481166 0.239962228 0.238154488 0.234083963 0.227636286 0.229285053 0.235446212 0.209907819 0.174375827 0.163710981 0.158145451 0.160027521 0.161169517 0.16171462 0.176247277 0.190805567 0.216902639 0.233081467 0.255255747 0.276871264 0.279568521 0.273527846 0.278662609 0.284196263 0.271456117 0.266961979 0.2557257 0.253293194 0.256609845 0.254410596 0.258293503 0.239407972 0.212361517 0.206399915 0.209124751 0.211600011 0.212285289 0.230680468 0.243610883 0.24753261 0.25792744 0.264406341 0.278381318 0.298025201 0.302895652 0.297994719 0.298803455 0.30149533 0.289856817 0.27579673 0.270296206 0.267489314 0.273812229 0.279568143 0.285532125 0.275270617 0.257491342 0.244774013 0.235484796 0.244998414 0.255030623 0.257563266 0.255872021 0.264500145 0.263556404 0.27410056 0.283200729 0.297960251 0.304047459 0.296390276 0.295760339 0.294370394 0.287108391 0.282583207 0.27381007 0.272051141 0.273969946 0.279900619 0.273725155 0.257217266 0.228155593 0.220459748 0.224433709 0.233239292 0.24875133 0.259773347 0.257733095 0.258702942 0.255934041 0.256635825 0.271336566 0.290687517 0.29502566 0.295969461 0.289751252 0.288056515 0.285712548 0.277778132 0.275766332 0.273956094 0.274784387 0.278520381 0.284410145 0.275507197 0.258414035 0.257243333 0.256655929 0.244643596 0.257604299 0.264613049 0.271207034 0.277255855 0.281428254 0.288024767 0.294930612 0.300111631 0.304509181 0.297311285 0.292675548 0.290370581 0.288252181 0.289755028 0.28481807 0.28145928 0.278025274 0.280252006 0.2796413 0.257461893 0.221747203 0.210372896 0.208945706 0.211840275 0.217225746 0.231657109 0.226717705 0.230193526 0.237082625 0.234210125 0.2459178 0.269057475 0.280816545 0.275653496 0.274332306 0.264219308 0.256205433 0.247387097 0.244683718 0.246289695 0.248758507 0.251235445 0.255247687 0.233591328 0.203449603 0.188870376 0.188233644 0.190527602 0.191596945 0.201190475 0.203446998 0.210240483 0.214890687 0.222772372 0.239336224 0.272804368 0.278786469 0.273460478 0.275246466 0.275723422 0.269831034 0.265986219 0.259949524 0.259373378 0.257286041 0.261687825 0.257789186 0.23996812 0.209507854 0.192655044 0.189781146 0.183515039 0.18152357 0.19028171 0.206375892 0.214838572 0.22627498 0.228695692 0.25301407 0.294873743 0.305336917 0.294468908 0.29166585 0.284262138 0.27038465 0.257440281 0.25163651 0.250187016 0.248565966 0.244470391 0.24627284 0.230627054 0.20849919 0.194028124 0.187570966 0.189335101 0.186030782 0.191234918 0.198808977 0.205078672 0.212271622 0.221085608 0.243507727 0.272928486 0.282018907 0.279916002 0.276911935 0.262933147 0.256867696 0.244663057 0.241106673 0.238923727 0.233841192 0.234215453 0.242596477 0.225486708 0.202835853 0.195180935 0.193569232 0.196520541 0.204019078 0.204811494 0.212046091 0.212084528 0.217113438 0.220129678 0.225846441 0.24885297 0.25504518 0.255293123 0.248035429 0.245330399 0.241435836 0.250723018 0.252259529 0.251643294 0.261231335 0.255014523 0.254259583 0.238159144 0.217340783 0.21376985 0.199879851 0.201790248 0.196152048 0.195651347 0.192237506 0.20498133 0.216071778 0.217809919 0.228949765 0.265694916 0.272856345 0.2738294 0.2729736 0.273815649 0.266438439 0.252411791 0.24490099 0.241948324 0.241556841 0.242189133 0.244660427 0.223750306 0.190009219 0.172452963 0.171675897 0.174542361 0.178976834 0.186681073 0.184901613 0.197800193 0.205662676 0.213574771 0.230623052 0.258905463 0.268038192 0.262677057 0.253960153 0.250529104 0.247903474 0.235396853 0.225794954 0.235798904 0.228436902 0.227734704 0.239665314 0.225540871 0.190370928 0.18027933 0.181046323 0.181781469 0.193461577 0.201332543 0.212633891 0.218842688 0.22329439 0.22379663 0.228663788 0.258397156 0.272814543 0.261308112 0.267896514 0.26582935 0.262110405 0.257998776 0.248754408 0.249302327 0.248142323 0.249090061 0.257875778 0.246292125 0.200302451 0.188724242 0.184437263 0.18562667 0.185845911 0.19321519 0.20155161 0.210313247 0.220844336 0.223925882 0.241389826 0.275775869 0.279666337 0.273735504 0.27128106 0.267731198 0.265939623 0.257687829 0.258719645 0.249072883 0.246999005 0.247933391 0.253654086 0.226054056 0.192710162 0.179269939 0.176431302 0.176977989 0.178476496 0.197506224 0.203940443 0.214241118 0.223248756 0.233167503 0.250092723 0.284190509 0.288728227 0.28337217 0.278084381 0.281432261 0.271050943 0.258915707 0.256389429 0.249339288 0.250683125 0.251746557 0.255364712 0.238326479 0.221753657 0.214171097 0.203903176 0.203782366 0.207383502 0.217503956 0.234914421 0.242989283 0.249978214 0.260656597 0.282038749 0.302855584 0.301630596 0.297445745 0.293439854 0.287386685 0.276456426 0.263467251 0.259462956 0.262621283 0.262936187 0.26306007 0.265425416 0.262195928 0.243813902 0.237048457 0.236002249 0.234743784 0.236534965 0.236351033 0.245589989 0.254334041 0.258982525 0.267625988 0.280618127 0.301651724 0.303140019 0.298301503 0.295436582 0.28507977 0.280875884 0.264822004 0.251977866 0.25351072 0.251030465 0.252333657 0.250998947 0.23975782 0.21955358 0.201302521 0.200776378 0.205546244 0.206785245 0.211952871 0.221402229 0.235142251 0.245796664 0.241060875 0.251076017 0.277024125 0.283704004 0.277523913 0.271502018 0.264266331 0.247516 0.235547854 0.228470059 0.231542535 0.233231451 0.231838732 0.237190715 0.21658309 0.189211973 0.176189082 0.169426182 0.168263609 0.169543188 0.173581633 0.182227222 0.183612931 0.187738075 0.191855295 0.205249575 0.243839162 0.250097967 0.243062089 0.242952009 0.244012981 0.24155216 0.23245549 0.22753196 0.227516502 0.229078853 0.233609589 0.239273883 0.223823912 0.184779107 0.160775803 0.154468319 0.151808879 0.154380594 0.158835725 0.165663631 0.168405795 0.177482164 0.183532513 0.202772649 0.237368615 0.247823543 0.254170275 0.257121886 0.24642004 0.234792654 0.227338676 0.221961846 0.218876552 0.218102063 0.222208477 0.222260964 0.195949409 0.139579867 0.118688653 0.135764033 0.127138046 0.120991783 0.117065346 0.12462923 0.128717512 0.14265126 0.149956705 0.175546407 0.212246648 0.226014741 0.225405702 0.228824472 0.233798084 0.2183302 0.209600619 0.201358686 0.193049151 0.194959509 0.197559534 0.199375532 0.174099705 0.13421974 0.122112647 0.110759989 0.11369543 0.112100772 0.116769721 0.120774968 0.126566363 0.145088518 0.156693555 0.177611172 0.214669792 0.232664714 0.235232198 0.238826172 0.23770801 0.231265712 0.225193388 0.231121611 0.234264809 0.237112289 0.236892092 0.242590473 0.223647941 0.187505565 0.173760011 0.166725647 0.169035332 0.177719544 0.184144899 0.196534557 0.205568946 0.219199909 0.224916221 0.243064265 0.270522381 0.274955204 0.273908 0.274336474 0.280244292 0.273597884 0.269191443 0.267266994 0.264861969 0.26235052 0.269763125 0.275399101 0.263838214 0.216562429 0.186022549 0.199530578 0.195784338 0.204466511 0.213221588 0.217036289 0.223975828 0.230935313 0.246623325 0.264266115 0.293767499 0.293965957 0.291057643 0.289069104 0.299319859 0.289560925 0.287160208 0.282830612 0.274703189 0.278339798 0.276179407 0.274887554 0.254241425 0.212778888 0.194904543 0.189393282 0.201417535 0.208577028 0.221132181 0.228887321 0.239903502 0.248094674 0.25373918 0.269647832 0.30064116 0.302756959 0.297126203 0.282812035 0.28601729 0.276308326 0.266687704 0.263168047 0.262542904 0.262518545 0.261973361 0.267561644 0.250503073 0.219031716 0.203119401 0.20039829 0.197547574 0.209228828 0.217601134 0.229666083 0.234699101 0.244016335 0.248930514 0.265785216 0.294409805 0.298947641 0.288710833 0.27767666 0.269330951 0.256754345 0.245851605 0.234713011 0.229046479 0.227074445 0.23557876 0.231568236 0.222119803 0.198004892 0.186980022 0.183576413 0.179804911 0.188391279 0.199877627 0.206405361 0.211680598 0.21753871 0.218486402 0.240757916 0.278344724 0.284246767 0.273939496 0.269032684 0.2653696 0.253000393 0.251675799 0.247891674 0.243313629 0.234941734 0.228033108 0.228333536 0.205166294 0.176960777 0.157894598 0.152449265 0.147708678 0.15092389 0.153971981 0.159933128 0.163620674 0.172630666 0.17978019 0.20765003 0.24650055 0.249920746 0.251642028 0.256274855 0.260056707 0.255162384 0.24455501 0.238048861 0.237340187 0.236790023 0.235456483 0.239197835 0.21981474 0.172032567 0.151506406 0.143470427 0.146464682 0.148083267 0.149413113 0.152721375 0.160833049 0.172072355 0.190236765 0.220763792 0.264016886 0.263218275 0.265599741 0.265559102 0.262258743 0.252291861 0.242263864 0.241077299 0.242287603 0.240845064 0.246378394 0.24910443 0.230385771 0.202723415 0.177985845 0.174735995 0.175614687 0.176468012 0.178057155 0.181109717 0.191815218 0.206432293 0.21345063 0.240699165 0.280090157 0.275847783 0.270171123 0.267181265 0.265382344 0.25890432 0.248649099 0.244445796 0.250983114 0.256449629 0.261462165 0.264739791 0.245424543 0.199997481 0.178801811 0.173562287 0.175267314 0.173570573 0.186099402 0.195900024 0.200760352 0.208138922 0.215494776 0.239674642 0.275113931 0.267717098 0.264858334 0.257253118 0.251304134 0.236206239 0.216493198 0.207957546 0.203483913 0.20464536 0.224541698 0.229799867 0.216836701 0.177859679 0.167042791 0.169203209 0.172780288 0.184435505 0.194151687 0.196700835 0.195944725 0.21544009 0.21370362 0.237835507 0.264869793 0.264557267 0.260057477 0.255589496 0.253684911 0.236733603 0.223627016 0.225347787 0.222111807 0.216832761 0.225311075 0.228578453 0.224956566 0.199521983 0.185393619 0.170851999 0.1746687 0.175032872 0.183371535 0.190046295 0.198782954 0.208972797 0.225050187 0.24977458 0.274835642 0.274224856 0.268982807 0.26514858 0.262891714 0.254783108 0.249286698 0.254937704 0.257092422 0.262747317 0.270228475 0.26935696 0.262682 0.222709014 0.194947417 0.187732996 0.186486871 0.190307009 0.198643461 0.205497178 0.214816831 0.225491484 0.234165324 0.259756854 0.287164441 0.282231021 0.282185343 0.277929438 0.279425716 0.286116626 0.282969491 0.275241372 0.271735072 0.26703225 0.263872132 0.260611005 0.243488964 0.199565249 0.175504892 0.168690663 0.170146545 0.168322287 0.176464052 0.185415992 0.198963453 0.214055573 0.22488825 0.257609262 0.290746551 0.287958832 0.284198855 0.286326803 0.285168165 0.277822769 0.265820942 0.251457001 0.241686132 0.238680835 0.228729154 0.226560656 0.213898437 0.187033321 0.16508714 0.152290493 0.159198274 0.171431933 0.192405319 0.213921636 0.202028078 0.212141424 0.230587417 0.256981646 0.282620307 0.280572791 0.275646834 0.271165341 0.259221411 0.246455367 0.236188588 0.238141112 0.237247915 0.241522419 0.240756233 0.252258913 0.251050566 0.234062541 0.218418315 0.215645983 0.216865884 0.227443349 0.234323814 0.244936143 0.253111055 0.260058116 0.268910578 0.287180418 0.306645598 0.303419413 0.29103985 0.287774695 0.286742366 0.27451709 0.267276462 0.264740496 0.260873967 0.262356182 0.265286599 0.27474448 0.259095641 0.23341739 0.215263403 0.219672483 0.223378411 0.232737529 0.240963004 0.246438593 0.252222734 0.260430405 0.269502221 0.28622756 0.306659409 0.302228608 0.293151058 0.293671527 0.29364071 0.28338127 0.267269295 0.2638907 0.257827293 0.267025781 0.26599238 0.273869339 0.260581105 0.223046691 0.200232675 0.193192622 0.190052863 0.191100043 0.197335308 0.211268699 0.213973635 0.226301377 0.238753754 0.265202182 0.290556411 0.287069633 0.282085443 0.27403126 0.256693968 0.246654046 0.244475452 0.238734038 0.238635153 0.242586054 0.249078923 0.255223764 0.243205101 0.207214614 0.183041282 0.177531325 0.179052322 0.1872417 0.197374721 0.206702038 0.212048167 0.221169672 0.227305324 0.248384452 0.278845668 0.277917169 0.275438513 0.27712372 0.281738657 0.273131529 0.25976165 0.246602953 0.236344028 0.235868469 0.248474968 0.258341377 0.24954554 0.210310244 0.194511926 0.20078858 0.198728441 0.208407605 0.210163002 0.228257155 0.227385701 0.233909593 0.234162431 0.26007629 0.282897094 0.275963981 0.277549373 0.27236761 0.2600667 0.267791682 0.266191152 0.254147638 0.248855996 0.245797503 0.246664878 0.259720254 0.247098249 0.204354376 0.191406047 0.18153938 0.18237882 0.192140209 0.198546327 0.212888988 0.225935872 0.230127795 0.235812428 0.259443362 0.281353957 0.281794714 0.283421088 0.286237676 0.281183394 0.272549461 0.267666479 0.266468222 0.258121933 0.25877749 0.254740318 0.256631917 0.247524452 0.198414423 0.184643204 0.170072627 0.17660005 0.190358508 0.206505306 0.22182381 0.23385042 0.239538515 0.247848313 0.268945667 0.288519936 0.286926459 0.288955779 0.283719343 0.281547749 0.270936223 0.264269995 0.263718238 0.26576003 0.268491844 0.268517879 0.269281196 0.26587497 0.231109913 0.214922056 0.211775985 0.214046328 0.222891513 0.230279539 0.236354192 0.240515219 0.251094976 0.260211989 0.282740208 0.300281718 0.301608043 0.302481481 0.30252651 0.299307338 0.276022481 0.272135977 0.262959242 0.261447074 0.261642037 0.26345248 0.267979356 0.264243739 0.236500206 0.217090061 0.224418313 0.225633221 0.235114725 0.245369448 0.25472976 0.262717454 0.266388605 0.268340679 0.282181551 0.295594594 0.293979816 0.296899484 0.293854737 0.29279033 0.28342582 0.276420587 0.276767527 0.278146208 0.287751185 0.294201828 0.297484124 0.284787715 0.256006341 0.232617346 0.225483604 0.234979591 0.245296412 0.258415635 0.264262825 0.269476706 0.274140209 0.29256572 0.309254696 0.319854491 0.31627304 0.315785438 0.311018422 0.316121111 0.318575533 0.309213607 0.298596262 0.301364789 0.300413341 0.301077388 0.297861421 0.297631453 0.277100934 0.250375237 0.249474343 0.247194034 0.251055056 0.263773604 0.274222806 0.271741985 0.275294679 0.282783697 0.306905459 0.319791867 0.310842062 0.311666617 0.309335494 0.311177634 0.294868294 0.282463959 0.283270369 0.279263821 0.277671918 0.275958089 0.282446211 0.270617304 0.236341361 0.217531368 0.211740862 0.21808241 0.223800743 0.232155833 0.234226281 0.231506601 0.235421277 0.250501958 0.27761823 0.29020866 0.281198995 0.276579119 0.279560572 0.275452333 0.261752508 0.25911892 0.24904857 0.241841545 0.238506097 0.235452035 0.234566539 0.226969454 0.17612383 0.150321603 0.144700871 0.153258458 0.157722353 0.163377142 0.17492311 0.185573094 0.202016315 0.208945099 0.226378443 0.257875434 0.255884988 0.250990573 0.247559746 0.243345321 0.236577968 0.220744901 0.218805745 0.216922889 0.208185949 0.211888273 0.212691066 0.2003366 0.149088088 0.120326675 0.104551385 0.103215084 0.10816663 0.110336761 0.116940567 0.13093547 0.148921856 0.155430911 0.18998333 0.214847622 0.223703632 0.231798432 0.22885875 0.22915597 0.23073951 0.225746709 0.225564337 0.2266127 0.233619006 0.226504026 0.231701057 0.231814589 0.198675309 0.167526181 0.151748605 0.152333562 0.152340653 0.163105544 0.154112264 0.158982154 0.171653497 0.183859361 0.216390563 0.233046938 0.229991374 0.233868474 0.235606041 0.237245827 0.232901081 0.235704248 0.231289371 0.230373216 0.231750879 0.234644124 0.237833259 0.240923232 0.19913646 0.157187272 0.151758235 0.157722455 0.144063461 0.139297277 0.142103348 0.140532137 0.155271728 0.170294553 0.205093031 0.234135131 0.231366541 0.239190072 0.238833659 0.241613291 0.240718693 0.232162575 0.229977448 0.233323152 0.235298163 0.233272724 0.228079458 0.227126327 0.205482198 0.186614324 0.182876791 0.182647025 0.180059216 0.189235781 0.198659427 0.189123223 0.203717005 0.21615799 0.256813467 0.277777361 0.277803709 0.280569447 0.288046376 0.29982509 0.299131343 0.287406271 0.282987858 0.286942 0.288562887 0.281059586 0.278408861 0.271315884 0.239587707 0.20337333 0.189229052 0.193461031 0.195735052 0.207546654 0.225654341 0.230498333 0.239533283 0.258298509 0.293373238 0.314205428 0.308096588 0.305103853 0.30137791 0.301839395 0.304305687 0.300958052 0.303422229 0.298233941 0.296398734 0.297104337 0.295156146 0.283719305 0.241489371 0.215015131 0.205903799 0.207203545 0.210109751 0.221815423 0.23532121 0.242479889 0.256853363 0.270891883 0.294567508 0.309704018 0.305755618 0.298987977 0.295567973 0.295698425 0.294006568 0.289408314 0.283976672 0.280668425 0.276350715 0.274662242 0.273772068 0.268490682 0.226313433 0.196606436 0.191744394 0.192400039 0.195688705 0.20380636 0.21497504 0.227672911 0.243286433 0.258582279 0.287560608 0.301299804 0.302180462 0.296561797 0.298004102 0.294057637 0.288563797 0.289947364 0.281760285 0.278047219 0.279388446 0.273370434 0.269355539 0.26036408 0.221721849 0.192521403 0.191720174 0.175558018 0.180993615 0.194526181 0.206863392 0.199626355 0.218669427 0.233795268 0.259742283 0.279931082 0.283084943 0.284939686 0.285614731 0.272578178 0.267122923 0.268333351 0.257633723 0.25858304 0.259661939 0.266848184 0.26492658 0.259553484 0.229248652 0.203522896 0.183651553 0.183200976 0.195052652 0.193491485 0.204333168 0.218638898 0.220266695 0.216823178 0.244412578 0.258289283 0.253807475 0.247627226 0.250144451 0.244275772 0.239619432 0.235301966 0.228588196 0.232229603 0.234166777 0.22320705 0.229047316 0.233389681 0.198438647 0.175039169 0.176157496 0.185004953 0.18765935 0.180824701 0.185324282 0.194338377 0.19690048 0.199098262 0.237796959 0.257782832 0.261584243 0.260361865 0.262138248 0.258729849 0.246709806 0.231869494 0.226824398 0.228236626 0.228689505 0.226160585 0.235746192 0.236118535 0.204756954 0.161242195 0.165533842 0.175101557 0.167719742 0.166428394 0.159921087 0.162291828 0.165591077 0.190177362 0.227985393 0.24937461 0.255315065 0.255623936 0.260263687 0.260619133 0.259607367 0.246704046 0.235652232 0.225212956 0.226202366 0.233537431 0.24207013 0.240208267 0.200014325 0.167464956 0.157713455 0.148791383 0.145405899 0.146149182 0.137376119 0.141932085 0.156142158 0.176306408 0.21771811 0.239190142 0.237626665 0.230110729 0.237782073 0.236583823 0.235191044 0.238676397 0.244347341 0.233316282 0.236222183 0.239012669 0.24899676 0.249509739 0.222681179 0.197748365 0.185862591 0.181408893 0.176924891 0.174730445 0.180660065 0.187791829 0.1979182 0.204861205 0.247281762 0.269132802 0.262692068 0.265753409 0.265248707 0.270706542 0.266536523 0.267576557 0.269844582 0.266782583 0.262694144 0.259862891 0.261881849 0.249282066 0.215811071 0.171733455 0.160522416 0.154592325 0.162370951 0.164318829 0.170698606 0.188925589 0.206388836 0.224874373 0.278934072 0.300234987 0.305234402 0.303303935 0.303624709 0.306763525 0.30794684 0.300048528 0.294454323 0.287379656 0.286679255 0.28821695 0.291049134 0.283093739 0.235413521 0.211400524 0.193932729 0.207935598 0.21276994 0.216414989 0.217330082 0.231095515 0.245828721 0.255446875 0.296953376 0.313845497 0.314230069 0.308590414 0.308602558 0.300117532 0.291478474 0.295510097 0.295494895 0.294000648 0.298193066 0.28997115 0.287297754 0.289616477 0.258826273 0.221008999 0.20305386 0.211356028 0.200255252 0.212730854 0.217860692 0.218899301 0.224330527 0.241412208 0.280833974 0.294417138 0.295210216 0.304873081 0.308945077 0.285049019 0.286930679 0.276744716 0.286802261 0.273663118 0.275381963 0.282435686 0.284774904 0.280149099 0.250848288 0.229896829 0.226758332 0.216605096 0.213878401 0.222936182 0.222258032 0.231518886 0.244579633 0.256158414 0.301066732 0.313183509 0.310094987 0.320883781 0.314204543 0.31289092 0.309334807 0.303857691 0.302726909 0.305926883 0.305384903 0.312570779 0.316321022 0.317201111 0.286604939 0.256478864 0.249435514 0.251615596 0.250792203 0.249805994 0.256954889 0.270719638 0.289326162 0.298092904 0.3232547 0.335005523 0.339537562 0.333436841 0.324673868 0.323945377 0.313206012 0.310166399 0.30735379 0.307057186 0.308509975 0.300003801 0.297546075 0.304327015 0.278399125 0.253008794 0.250366041 0.244401729 0.236912035 0.232018448 0.227194808 0.231660383 0.238384046 0.243378091 0.266433579 0.274099097 0.27494001 0.26778278 0.267637562 0.259595344 0.253590961 0.244571383 0.240888633 0.238414787 0.236883108 0.240579724 0.24241404 0.248133719 0.222014117 0.18589436 0.180322062 0.173191314 0.164940013 0.16322379 0.158291679 0.161642378 0.16779528 0.186214349 0.224268981 0.24088949 0.244397711 0.24697839 0.25169978 0.257869929 0.256557231 0.254056309 0.247308469 0.25021679 0.24817329 0.247617621 0.241811388 0.236453224 0.206610857 0.16024679 0.147576634 0.143150045 0.142090678 0.135367928 0.134673429 0.141444062 0.151336586 0.166311524 0.207231186 0.223021087 0.235520124 0.238730786 0.238716599 0.244033564 0.244960307 0.249959621 0.251441514 0.253769664 0.255126005 0.25299013 0.255196731 0.251152089 0.183897895 0.136535358 0.128932691 0.131551286 0.131346148 0.13026376 0.128139521 0.124613595 0.143642546 0.145598511 0.20575684 0.22455652 0.240453899 0.248264102 0.247337779 0.259833465 0.269477598 0.26647203 0.256236465 0.257301597 0.257268224 0.26924589 0.266687842 0.26961968 0.224096906 0.186580288 0.164216874 0.174878453 0.172344278 0.168605075 0.166483561 0.164834981 0.172237718 0.177222299 0.231198873 0.247038348 0.251399505 0.254210952 0.250471058 0.259265802 0.250943443 0.246136254 0.242337081 0.236918645 0.239469669 0.248459138 0.263263291 0.267560452 0.235529315 0.19570192 0.189012934 0.173226068 0.170509568 0.174582458 0.167443074 0.165890803 0.175109023 0.163830097 0.162743558 0.16664459 0.307216331 0.311829839 0.320438287 0.342346055 0.349549544 0.362967784 0.372062695 0.375435014 0.377394588 0.369346603 0.369468339 0.361755681 0.369130947 0.243667578 0.242767898 0.201505513 0.197016063 0.20328334 0.205671359 0.202364793 0.227878784 0.233142161 0.309623231 0.334264791 0.327984497 0.323637331 0.323361145 0.325965238 0.328204641 0.323339417 0.326259782 0.323618245 0.324134125 0.321333771 0.322865699 0.321396075 0.310426992 0.300786629 0.302807973 0.301526869 0.301126293 0.302346088 0.206325728 0.205223348 0.208729594 0.213812562 0.240869089 0.303906632 0.300140222 0.295752512 0.291027015 0.282079356 0.273710237 0.261178713 0.260193074 0.255119056 0.263960413 0.27796411 0.290365319 0.29596548 0.281378962 0.267023908 0.255000655 0.249886392 0.253379029 0.255628245 0.258002929 0.260229832 0.198249342 0.201702221 0.231794744 0.247569782 0.241022815 0.235992517 0.237769979 0.241324853 0.243563169 0.240928517 0.242092337 0.241062864 0.245189973 0.246754687 0.248492981 0.246850974 0.227717277 0.195396208 0.181276419 0.178978259 0.181354674 0.181938769 0.19425962 0.204239469 0.222486055 0.24323687 0.270644649 0.280250832 0.275909168 0.265734207 0.269328484 0.273426635 0.270523247 0.261981738 0.254609294 0.246231546 0.245518905 0.242594823 0.242981296 0.246129784 0.219084476 0.196266779 0.186888785 0.182683299 0.186346937 0.193155326 0.202271819 0.21556529 0.235586676 0.25846652 0.287677595 0.292896888 0.288571836 0.280105085 0.277006378 0.277517151 0.270450721 0.265288323 0.260559652 0.26162342 0.26149013 0.262499248 0.262410974 0.263026632 0.2569359 0.240496287 0.238276691 0.233602012 0.230886858 0.238088821 0.247896819 0.256165597 0.267494776 0.281562762 0.312243533 0.316229867 0.309836394 0.301772408 0.297063499 0.290967263 0.270932341 0.256918062 0.243188925 0.239648442 0.247877774 0.257808133 0.266343739 0.274085444 0.266589933 0.247782971 0.205368698 0.209336278 0.206859221 0.213800365 0.214547671 0.213458823 0.225027271 0.252821522 0.298041691 0.301560509 0.298541157 0.295510522 0.296265886 0.294997746 0.292414024 0.279313603 0.272437611 0.268344251 0.278356491 0.291352554 0.311415876 0.318601845 0.274165826 0.208467856 0.19301718 0.181305736 0.170880953 0.173863323 0.17141915 0.179253149 0.199202237 0.233327754 0.297638481 0.307060433 0.303783701 0.297910835 0.286145505 0.278761664 0.276051183 0.277086683 0.289017523 0.304262142 0.314115287 0.315055304 0.317134278 0.319347286 0.272339013 0.2039213 0.185828143 0.168793754 0.16941963 0.169984042 0.179232805 0.197489221 0.219406952 0.247174537 0.320945419 0.334461516 0.335974628 0.332827743 0.338117002 0.341304967 0.339490887 0.335739128 0.332137605 0.328407548 0.33523571 0.334042073 0.335310257 0.3316794 0.287366752 0.231431319 0.213910173 0.205469158 0.20740755 0.215027362 0.221144462 0.231634564 0.257766536 0.290946387 0.343109906 0.349169561 0.345694542 0.34287518 0.343817006 0.344788295 0.346230023 0.343591953 0.342868907 0.339910173 0.339995093 0.334494994 0.330579452 0.324344368 0.268797043 0.212763735 0.194206101 0.183347911 0.180709897 0.187682703 0.190012401 0.199251065 0.221803542 0.263288906 0.330639832 0.335877244 0.332126951 0.334665873 0.334601561 0.343555763 0.33827449 0.332801803 0.326835189 0.327473568 0.32616117 0.323264292 0.316775328 0.31717736 0.256588736 0.198552589 0.176524669 0.16250167 0.163573428 0.167274467 0.176351193 0.18693701 0.219227439 0.273367489 0.329467339 0.336109571 0.326830238 0.317838255 0.302274806 0.301736879 0.300932345 0.286486368 0.271957187 0.283687486 0.291098345 0.298972889 0.306975164 0.30156637 0.269126579 0.231962448 0.216503665 0.212053278 0.215202905 0.220803665 0.215326276 0.2224554 0.24517552 0.297616026 0.341124352 0.339105684 0.327578624 0.321362041 0.325418586 0.338129524 0.333862506 0.3401455 0.343609971 0.345307845 0.346486004 0.340226695 0.340761904 0.338302654 0.300453915 0.242120845 0.225463117 0.221842633 0.21276183 0.217217123 0.228273108 0.230977347 0.263253855 0.305028949 0.360704988 0.360921241 0.357197525 0.346407149 0.345311282 0.350423217 0.339854785 0.337951409 0.336591127 0.336523852 0.339839351 0.34007831 0.337718789 0.332614055 0.297200358 0.25980814 0.24687533 0.240572871 0.241420391 0.246238937 0.265488206 0.282258023 0.300642375 0.32229702 0.341036131 0.339877783 0.333406223 0.319311012 0.309151984 0.305666257 0.305634627 0.303831554 0.294638504 0.285315876 0.286339731 0.26447809 0.275940367 0.285525566 0.263483307 0.207606498 0.167512205 0.15828305 0.15238537 0.152975009 0.165400843 0.171194793 0.186966478 0.224981144 0.291962885 0.303135616 0.30335577 0.306187849 0.309602421 0.303300171 0.300109463 0.293675242 0.285247431 0.277640862 0.277191661 0.285964281 0.308983114 0.315183197 0.270965304 0.209874844 0.199947876 0.194306564 0.192161623 0.19736344 0.194312246 0.192282563 0.203734722 0.24557289 0.302909519 0.309925233 0.305298289 0.313028956 0.319854238 0.319278218 0.316395524 0.306395126 0.303706209 0.303234859 0.305964963 0.293000044 0.296854813 0.287453794 0.246412256 0.187755341 0.164597948 0.160421891 0.143723869 0.151578148 0.137980666 0.153578729 0.190262422 0.236352631 0.290423317 0.302968947 0.29965749 0.299347829 0.295026831 0.297474746 0.287527715 0.286804259 0.285140817 0.282237872 0.28764982 0.278868853 0.281340981 0.283948732 0.249219691 0.197509726 0.169587115 0.166229549 0.172869898 0.175966559 0.182934071 0.190789454 0.217760661 0.272486315 0.327398126 0.328047043 0.323720721 0.32376119 0.330003824 0.330717732 0.328007909 0.324135898 0.328108155 0.331180308 0.331646362 0.332285261 0.33799813 0.341189915 0.314300962 0.25657228 0.234863004 0.229255736 0.22256997 0.230610436 0.237270384 0.248960914 0.271047049 0.317790499 0.365636775 0.366008261 0.362564674 0.36183575 0.362179305 0.357925364 0.357583332 0.354558481 0.34953532 0.346988576 0.337887347 0.335610036 0.340988771 0.348084663 0.306073754 0.248767253 0.231121285 0.22958587 0.232499293 0.258792791 0.256776503 0.262471871 0.286590849 0.330245333 0.36903626 0.362500036 0.360407835 0.359820293 0.356697525 0.350768459 0.352708495 0.351933597 0.346482558 0.345014267 0.347334349 0.350007813 0.349858028 0.352286033 0.315388012 0.255177233 0.242839371 0.232342174 0.231565195 0.244642492 0.249235296 0.257310893 0.282407784 0.325719895 0.359843977 0.35663635 0.350780645 0.348427103 0.343522907 0.342552735 0.34398958 0.333979018 0.326912015 0.324849167 0.324865062 0.325002622 0.328422844 0.331873007 0.29961734 0.240638255 0.226791042 0.22337995 0.228765343 0.241705305 0.253700361 0.265137862 0.288059733 0.324473475 0.356068972 0.361975851 0.357071032 0.356014583 0.353524503 0.35647595 0.350785642 0.344332932 0.342319902 0.341713914 0.341354991 0.341230327 0.339779709 0.338955809 0.306909298 0.254676105 0.240532042 0.234192732 0.235335649 0.241399697 0.248988186 0.259227116 0.279864354 0.324748377 0.359471557 0.357459574 0.351386081 0.348372111 0.341948182 0.341312278 0.339365397 0.33202865 0.328269992 0.324171802 0.318666941 0.31220958 0.31092181 0.314656029 0.283477211 0.221740256 0.194042365 0.187555668 0.189910964 0.183449417 0.183593687 0.199962506 0.227105212 0.273328792 0.320589722 0.319130921 0.313020231 0.310099253 0.311954729 0.321622663 0.312350448 0.292516194 0.281605281 0.282784841 0.285301362 0.280203157 0.278682278 0.277909952 0.230399608 0.17740603 0.16885525 0.147798636 0.143088974 0.141205643 0.152728955 0.158789083 0.192508654 0.254560789 0.303640238 0.315393741 0.319285938 0.317299958 0.307589162 0.295589003 0.296479725 0.302157649 0.30655129 0.314185164 0.327402752 0.327229903 0.329667958 0.346420868 0.319446769 0.250788738 0.226297214 0.213386958 0.220006007 0.224034695 0.227370234 0.235671453 0.266383757 0.318641471 0.359636538 0.357510762 0.350332471 0.346765344 0.338285942 0.325794978 0.315755443 0.308287201 0.30599368 0.308633249 0.313431305 0.319702288 0.326984749 0.330144869 0.298459671 0.230759289 0.204026343 0.193146728 0.197870293 0.197467797 0.198877238 0.201262564 0.22846141 0.28799103 0.343393148 0.353050478 0.348716272 0.341950524 0.337329469 0.337742605 0.333124317 0.330021317 0.323325724 0.335577939 0.343095205 0.347481404 0.352343002 0.36260648 0.338498969 0.27116474 0.240572179 0.220631714 0.228143286 0.234019569 0.225092258 0.227089961 0.248964274 0.315575408 0.359450786 0.364242338 0.36589829 0.366033409 0.366659253 0.374267665 0.3702216 0.36687844 0.365555629 0.367830796 0.364552443 0.369537783 0.370275476 0.375770518 0.339413018 0.276849472 0.255176523 0.239103758 0.238831204 0.232745825 0.233642743 0.241530723 0.259576735 0.326408282 0.367947047 0.363446744 0.358428276 0.359331171 0.364850611 0.36570834 0.369648286 0.365115386 0.362260583 0.361538905 0.360016854 0.35636104 0.362748489 0.373287608 0.339000145 0.279960408 0.247362376 0.237181815 0.239524601 0.236545681 0.239930684 0.247018146 0.265755074 0.324777709 0.357423735 0.35368221 0.34815439 0.351611258 0.348502122 0.34590532 0.346716791 0.353333479 0.349553249 0.348864627 0.346707226 0.345847003 0.342114843 0.347433611 0.318446294 0.246550439 0.216851522 0.19524536 0.200832234 0.207940993 0.201026563 0.215689908 0.258269951 0.318045428 0.349701419 0.337111704 0.336719427 0.339473782 0.33798372 0.347526581 0.353955851 0.344290407 0.345476874 0.347732282 0.345811003 0.344751722 0.343948613 0.351830285 0.325322197 0.256163648 0.236648627 0.221028611 0.223458628 0.23052239 0.228206748 0.233376926 0.269140088 0.331193964 0.362616768 0.353608331 0.352846692 0.352003607 0.350675658 0.350727116 0.353330951 0.353847445 0.348438148 0.349746941 0.34783995 0.345482546 0.347168775 0.359920801 0.336890277 0.268548896 0.259045368 0.244806292 0.246066722 0.25176512 0.253562072 0.250289181 0.281285876 0.342691264 0.373543445 0.369705414 0.365925113 0.36403714 0.363353058 0.360282803 0.358502479 0.358221867 0.35296087 0.354522969 0.355734428 0.351574484 0.354127284 0.360041591 0.341878311 0.283194406 0.255355261 0.24427513 0.240885887 0.247086118 0.243575849 0.251519382 0.280967521 0.344524234 0.374003786 0.365286927 0.363993347 0.361400604 0.362823343 0.362051395 0.360117053 0.351707022 0.353294388 0.352056496 0.347492628 0.34726401 0.344577727 0.361348092 0.336143646 0.28065762 0.260348603 0.250688301 0.247983454 0.251306095 0.256429656 0.254611294 0.276310818 0.32144555 0.356952222 0.348232151 0.347426622 0.351819992 0.353459724 0.36009641 0.359139669 0.358256023 0.354872911 0.351632243 0.348913842 0.346556227 0.349320361 0.356407835 0.342607348 0.284057322 0.254720964 0.246750649 0.247365416 0.250486002 0.249752214 0.254682433 0.272977819 0.333491946 0.361399647 0.355697522 0.354469413 0.353519972 0.353703263 0.360897183 0.359486571 0.356764709 0.346496173 0.342855688 0.339599046 0.336947942 0.337570678 0.349084539 0.334562906 0.275840686 0.251790281 0.244183043 0.241619029 0.24455434 0.249653502 0.257565709 0.270831383 0.331782209 0.353467375 0.34565884 0.342598736 0.336671288 0.34242845 0.346325092 0.343998546 0.341226691 0.33578401 0.334323696 0.327552323 0.324663416 0.322197982 0.329167731 0.314507721 0.24634149 0.221512311 0.219205844 0.226487348 0.229038665 0.231166795 0.235377541 0.253729551 0.31599197 0.34760296 0.337525429 0.335881445 0.330842249 0.329777789 0.32992347 0.330953483 0.323550197 0.31264272 0.310771055 0.311244411 0.315922791 0.314102204 0.310245289 0.295647915 0.234780565 0.215261632 0.205939938 0.207162312 0.204997666 0.211767081 0.223203204 0.24704215 0.308412069 0.342280057 0.333624388 0.327930411 0.329360303 0.330860034 0.332172157 0.338374773 0.335333098 0.334710066 0.330130332 0.330982024 0.328011148 0.325312117 0.326399647 0.313647353 0.256467467 0.236648003 0.226580051 0.230046311 0.226456527 0.233188429 0.24085495 0.274726146 0.32589974 0.353157491 0.346562992 0.343974595 0.343115788 0.348832614 0.352751805 0.348303844 0.346196667 0.342756414 0.3376708 0.333950731 0.331971603 0.331629404 0.337414517 0.326943978 0.274574684 0.254803326 0.249640009 0.246833182 0.253260969 0.25614238 0.263835662 0.279986545 0.327806882 0.354695185 0.349517437 0.343899884 0.34175871 0.342029793 0.348804048 0.33957453 0.341994774 0.337493804 0.334285234 0.335703672 0.3353609 0.334992489 0.341044964 0.328015685 0.294145608 0.265920734 0.261220186 0.254142874 0.252342879 0.2641514 0.286473012 0.311725504 0.340479556 0.357213156 0.340682438 0.336489054 0.333578023 0.330015123 0.329420178 0.321920327 0.323074418 0.316694568 0.310782317 0.314166899 0.315430529 0.317823323 0.324345724 0.316997441 0.280404833 0.266332115 0.257346548 0.251998532 0.253416428 0.253232283 0.274949775 0.299265646 0.328536288 0.343249478 0.334228419 0.330495484 0.332614346 0.33238872 0.332596991 0.329583502 0.330533521 0.326421519 0.328087046 0.326622931 0.327642782 0.321547513 0.329069233 0.320078102 0.280728251 0.25422506 0.253623635 0.250217585 0.25151283 0.25037353 0.275561907 0.280908144 0.317517242 0.334765742 0.323286824 0.315760051 0.321239241 0.331156963 0.331745272 0.323541745 0.327155769 0.319493838 0.32126309 0.324099005 0.321859728 0.318204744 0.320256336 0.308214786 0.253294981 0.226936742 0.212540996 0.213979964 0.213298453 0.211222886 0.225547743 0.250913345 0.311816278 0.334225511 0.328523148 0.327541129 0.327804241 0.32995371 0.330276155 0.329241359 0.323452116 0.320987162 0.321224333 0.312886525 0.311708991 0.30667904 0.309438888 0.289069299 0.234846521 0.208762217 0.199652092 0.20115121 0.201844823 0.202755008 0.216540412 0.248927685 0.305729487 0.337216154 0.333255397 0.329927329 0.329341657 0.331326532 0.328315039 0.324783365 0.322639144 0.318566519 0.320566404 0.323267462 0.32450827 0.328096455 0.3364169 0.330193008 0.270010213 0.253634556 0.246428815 0.251733303 0.259296893 0.266278924 0.27711752 0.291446436 0.345450565 0.360602758 0.352663434 0.348727519 0.348817311 0.349992604 0.345887348 0.333639723 0.325613316 0.316154823 0.30844589 0.298462705 0.29429738 0.303472001 0.317327962 0.309690028 0.290925315 0.269708972 0.263415513 0.258672087 0.253620364 0.252514665 0.259826996 0.279911627 0.3051813 0.318285638 0.328541238 0.325899865 0.323697229 0.316869968 0.311975829 0.314028606 0.308880734 0.31196267 0.316467792 0.307963317 0.293722183 0.29409992 0.302762118 0.305040686 0.299738502 0.288851002 0.2784756 0.265062963 0.247630667 0.267034596 0.268355436 0.293304913 0.312919701 0.329981106 0.330729408 0.33013071 0.333708948 0.335964856 0.336808946 0.337934626 0.339597125 0.331388911 0.334233735 0.332866105 0.334369939 0.334927916 0.343827665 0.351522715 0.320382151 0.286000146 0.286612641 0.281897586 0.284927721 0.260154632 0.280170754 0.305691153 0.342553226 0.362819604 0.355698372 0.354352011 0.350951631 0.352882084 0.352612617 0.353639019 0.351497165 0.346753967 0.347676064 0.345331865 0.340118264 0.34143506 0.348982988 0.347094589 0.304660348 0.270847997 0.252306604 0.24626484 0.25066858 0.245699823 0.256929042 0.27486635 0.322556352 0.346469972 0.338917949 0.338128043 0.335308879 0.334073324 0.341320491 0.335763052 0.334121229 0.323251832 0.324521954 0.317257559 0.317168311 0.320095285 0.325174424 0.31976734 0.276822996 0.231701846 0.217588947 0.210740294 0.208517381 0.215192524 0.215633791 0.230515529 0.290066765 0.318505557 0.31082182 0.307956675 0.306139399 0.30754029 0.312449423 0.310047592 0.306526395 0.30133122 0.298832567 0.29208192 0.288551265 0.288480782 0.295701611 0.295723786 0.24327517 0.208483944 0.192407031 0.19476265 0.196055036 0.195503069 0.198057412 0.218265515 0.276532007 0.311991186 0.304972321 0.292474303 0.283385564 0.30438231 0.310402072 0.285081593 0.264556783 0.269487359 0.263811363 0.258001925 0.258179136 0.269873585 0.273974757 0.279913159 0.234119611 0.196861407 0.186797181 0.182024024 0.184441639 0.180881817 0.182563266 0.211838319 0.252315101 0.281739676 0.284280124 0.274988512 0.279118617 0.282264268 0.277838203 0.274368946 0.274900994 0.281778918 0.284051278 0.293297367 0.303752598 0.309361964 0.323768756 0.322824763 0.277837386 0.253174544 0.244705166 0.247721201 0.25627108 0.260879195 0.265332925 0.290973822 0.319989847 0.319946759 0.318836388 0.322316396 0.314473803 0.311037839 0.300698708 0.300287059 0.290391176 0.288457611 0.278810515 0.265567948 0.268116496 0.277279138 0.300238394 0.318699113 0.303768777 0.286693613 0.277145999 0.267883759 0.267097757 0.267802649 0.275840375 0.278003557 0.29965762 0.311950366 0.304542978 0.311456791 0.31526397 0.319119627 0.317720921 0.31153043 0.310726304 0.305145501 0.310195467 0.307784655 0.306077141 0.307236916 0.30759021 0.310296474 0.304613301 0.296671028 0.289521938 0.283422372 0.293791293 0.303277019 0.316576091 0.329316984 0.318557229 0.328729838 0.324146978 0.316661146 0.31866274 0.322568402 0.322221672 0.316860232 0.318590564 0.31367848 0.304141459 0.294480858 0.29369537 0.293977479 0.298858162 0.300742402 0.259052164 0.218438673 0.195943652 0.204329624 0.200391298 0.204558289 0.219493402 0.230014221 0.290681803 0.318553123 0.316183056 0.319254505 0.322188914 0.322901086 0.322977948 0.321976647 0.314206824 0.315067812 0.315215927 0.31770977 0.32048847 0.317374725 0.323249134 0.318001197 0.298097878 0.273045965 0.278118707 0.271792207 0.273863975 0.281056712 0.295690293 0.317438717 0.320836839 0.32462674 0.314717571 0.31097404 0.311115836 0.315055043 0.316008333 0.318583551 0.312772423 0.310156275 0.310156285 0.307836258 0.306151908 0.306734863 0.301447365 0.29987099 0.285289058 0.271344082 0.258964172 0.25807951 0.255592561 0.254912227 0.272480049 0.284633509 0.318112032 0.331047364 0.328245164 0.32591328 0.329037371 0.328876507 0.327453382 0.323553814 0.318106022 0.32266617 0.320425017 0.3163695 0.325275547 0.333220491 0.341165674 0.349358624 0.327150658 0.299217239 0.267520585 0.260454837 0.262253249 0.266976152 0.287581439 0.320266088 0.336110685 0.352781634 0.34419526 0.345452517 0.345710872 0.34513129 0.345642571 0.339479723 0.338455918 0.327614749 0.325978944 0.320855957 0.321033637 0.3233705 0.340071716 0.353806733 0.346079778 0.331785002 0.318435098 0.308506047 0.315430714 0.324325584 0.3343288 0.349011657 0.351089162 0.358964698 0.347252657 0.337948139 0.338883192 0.33790709 0.335878776 0.332597715 0.320231947 0.318183448 0.312209297 0.311680938 0.311762573 0.312377183 0.325895139 0.341943522 0.342423794 0.335703475 0.331072653 0.317988508 0.321125449 0.319646152 0.315222449 0.325583642 0.33433887 0.344575409 0.338106772 0.340003933 0.334135383 0.333887885 0.325566728 0.317221919 0.309520708 0.309188886 0.306881713 0.307289586 0.306861024 0.313736944 0.328218396 0.33878885 0.313547846 0.284763481 0.271450397 0.259314847 0.265394699 0.272499287 0.291607949 0.309269662 0.336808258 0.354143175 0.344294013 0.34052651 0.339917844 0.340378823 0.33450991 0.331964491 0.32482855 0.319382074 0.318820101 0.317969572 0.317883431 0.316255847 0.330923013 0.343695227 0.312458077 0.289605601 0.26753978 0.255362892 0.265973405 0.281777024 0.295074563 0.304445489 0.327244526 0.346449602 0.332487437 0.33009107 0.324160868 0.325393328 0.328576129 0.327678745 0.320474518 0.309441505 0.310039363 0.306881826 0.306388712 0.302846522 0.299942483 0.307420995 0.313135798 0.299972948 0.287315266 0.273771135 0.271813017 0.282623611 0.292566337 0.310467453 0.305945513 0.324718689 0.317405712 0.315395517 0.307105499 0.311661912 0.31345579 0.314272683 0.307855779 0.304745542 0.302750278 0.30358605 0.301878168 0.293284404 0.287326575 0.299471824 0.289005406 0.276248962 0.268050159 0.269272233 0.26393909 0.255949457 0.260215133 0.263747993 0.301870848 0.316990643 0.292187012 0.299349202 0.302518343 0.298197792 0.299950755 0.297097222 0.291853231 0.27922473 0.283151972 0.279529065 0.283227411 0.305700067 0.323500492 0.325391459 0.300922663 0.277915331 0.266728074 0.259100072 0.255901089 0.250179625 0.243231438 0.273333775 0.310988947 0.345814977 0.338886192 0.336526741 0.335591328 0.341123011 0.340227976 0.334949886 0.338185457 0.343791513 0.34244425 0.341677416 0.3418678 0.340423337 0.341401813 0.350767826 0.324846372 0.313047416 0.30166039 0.285362534 0.285379982 0.287019277 0.292221091 0.312457641 0.346165514 0.356090615 0.346703443 0.343171603 0.343081376 0.343274026 0.338745417 0.340781461 0.343859532 0.345559619 0.340276792 0.333477099 0.320730121 0.334290799 0.335141084 0.342733812 0.316253956 0.282947165 0.26906091 0.265820965 0.267824493 0.267031862 0.274533466 0.293932824 0.315700592 0.339568339 0.343344649 0.326576772 0.322917448 0.31988326 0.320987423 0.321027236 0.318112282 0.30901272 0.304449375 0.297131257 0.294849829 0.296130405 0.308994351 0.32341728 0.310418463 0.272111422 0.246384092 0.239544265 0.237766466 0.231474091 0.242024036 0.25666424 0.287178346 0.311941194 0.308467753 0.307992792 0.303915472 0.298921643 0.295992157 0.286364035 0.279798737 0.281086173 0.275807959 0.28079567 0.285199508 0.290149213 0.303682137 0.314481571 0.288148364 0.255403405 0.22805975 0.225088408 0.222411947 0.22457698 0.226395766 0.238879631 0.287234944 0.309005574 0.302263163 0.300019752 0.290448825 0.295575282 0.295422208 0.29367573 0.28790935 0.281298583 0.269594241 0.271955855 0.26892 0.273860584 0.265796864 0.279265779 0.250332744 0.219726314 0.19620966 0.186806002 0.188826803 0.187412365 0.202606417 0.21976866 0.261484128 0.293050756 0.282641399 0.273282601 0.273596357 0.271528624 0.268110409 0.251607363 0.26176756 0.25653892 0.258583858 0.263787867 0.265230034 0.265398836 0.263493781 0.263958792 0.220436465 0.176559644 0.167427245 0.173570344 0.170350821 0.179323519 0.183917509 0.185093397 0.250726078 0.288284968 0.289440434 0.299571211 0.307299753 0.316473147 0.313929089 0.320858741 0.326159549 0.312861633 0.311165253 0.312258696 0.313394595 0.318631375 0.328725974 0.333825221 0.29138117 0.246483324 0.217484825 0.212508725 0.213525391 0.210467468 0.211373489 0.244207826 0.303201209 0.337897898 0.331320378 0.330748141 0.333299067 0.330509246 0.333112318 0.334902737 0.33090922 0.328038943 0.31884632 0.320627293 0.320559394 0.32402425 0.331804505 0.33709229 0.309202601 0.270913469 0.25270975 0.243484591 0.24059375 0.239050971 0.257557639 0.289775629 0.321634765 0.334594718 0.322041764 0.323478067 0.323440439 0.323391605 0.325575712 0.327724064 0.327285702 0.325376791 0.328911601 0.334227831 0.337661927 0.338346383 0.343749156 0.34603144 0.322286287 0.307740961 0.300135647 0.285284687 0.286981258 0.293228512 0.303222835 0.308989615 0.328445853 0.343889165 0.335647042 0.327133185 0.326185486 0.325668331 0.329638078 0.327798132 0.331917747 0.3318298 0.326583236 0.321650868 0.330486555 0.327519839 0.335388667 0.336674421 0.298075573 0.245758111 0.226137091 0.226238086 0.221695221 0.219758044 0.220670215 0.248785139 0.308249513 0.333241996 0.32694096 0.322827887 0.324152136 0.326079517 0.321168801 0.320408946 0.316841808 0.309060548 0.304980989 0.304831065 0.304462828 0.307795645 0.31116107 0.320577963 0.281347242 0.242516193 0.231762647 0.219865703 0.226955498 0.221612179 0.226036903 0.252589848 0.302156236 0.320918839 0.311115886 0.310684126 0.306231583 0.309121758 0.31416368 0.311527107 0.307574584 0.309247123 0.306295647 0.306501645 0.295217227 0.301244318 0.299429677 0.306008846 0.283053776 0.26337168 0.241615242 0.231748395 0.220710395 0.227621479 0.228127915 0.263968488 0.289869329 0.298098606 0.290122479 0.295141535 0.288766993 0.290078908 0.294054063 0.289217515 0.289724416 0.291495455 0.292174709 0.291753268 0.279517082 0.279387304 0.273637547 0.284615907 0.28035076 0.257203447 0.244652003 0.236194173 0.23898622 0.241264567 0.258326562 0.276098951 0.285100238 0.291698421 0.297450951 0.294136457 0.295706642 0.295022238 0.300364507 0.304773454 0.300739675 0.290751891 0.292393682 0.294483621 0.2935574 0.286760059 0.288443639 0.297686418 0.303703027 0.299912104 0.298842768 0.295737283 0.295083372 0.298667436 0.305896481 0.314376554 0.311832427 0.316878589 0.309603668 0.311653873 0.311917773 0.306510207 0.308926612 0.307833109 0.305476307 0.295764887 0.289163203 0.296916649 0.294119076 0.288324115 0.291287861 0.298047188 0.282067257 0.245290636 0.224504375 0.226440032 0.214247049 0.213759932 0.214514066 0.228390582 0.261007494 0.278894486 0.271389923 0.270378784 0.269370614 0.270815604 0.27507721 0.274197453 0.276140793 0.278279078 0.277616304 0.275742107 0.26984817 0.273939485 0.275898568 0.282983114 0.267087196 0.21900963 0.208050466 0.208523624 0.211598698 0.214624716 0.229787599 0.252092685 0.275705912 0.289846249 0.279209551 0.277988156 0.275904702 0.269888349 0.268498665 0.268308332 0.263706582 0.258496372 0.266799714 0.273255158 0.278796101 0.284994096 0.280263134 0.28985855 0.300126226 0.300799867 0.29652574 0.291938795 0.279793969 0.277345994 0.280380082 0.283499166 0.299748562 0.315725282 0.306669806 0.304249881 0.304142999 0.305835959 0.307700828 0.301663549 0.300958397 0.295291728 0.297989672 0.294623352 0.288934702 0.278918769 0.283364498 0.293266153 0.281986997 0.241473205 0.207641221 0.19817285 0.195341148 0.202978122 0.200104841 0.217652935 0.261747984 0.298000809 0.29075264 0.297027379 0.302700343 0.307032909 0.308267189 0.305152308 0.300426167 0.302232832 0.294037885 0.295175215 0.285767761 0.282360614 0.278005414 0.290893217 0.24598572 0.194277852 0.175086453 0.175977519 0.169161693 0.166235658 0.171314784 0.192399097 0.251294989 0.299778438 0.300199381 0.298779424 0.296957853 0.296240339 0.299706883 0.298605013 0.301283351 0.293124284 0.294056147 0.29394221 0.29172864 0.287462797 0.28924273 0.297014808 0.266123869 0.238300885 0.217251476 0.213297305 0.207917724 0.215405902 0.220824582 0.249341522 0.282560614 0.30336899 0.298916233 0.293166395 0.289570802 0.295495965 0.29762719 0.295753046 0.292729669 0.289354118 0.28858822 0.282525749 0.272206012 0.278069993 0.285915261 0.299938801 0.299535478 0.285000828 0.265123931 0.237753905 0.229807994 0.234885474 0.239931006 0.245147351 0.281288076 0.302686844 0.299266786 0.293947461 0.292275906 0.292783849 0.29586491 0.292952347 0.282662997 0.272764477 0.275935514 0.274616908 0.268399439 0.274140352 0.274238337 0.277405865 0.258490521 0.21490286 0.187576454 0.19146053 0.188791055 0.18489471 0.191155565 0.209066266 ================================================ FILE: src/pymgrid/data/co2/co2_duke.csv ================================================ CO2_DUK_I_kwh 0.180924313 0.18330306 0.195031339 0.190779281 0.165302356 0.148113168 0.140914668 0.143098532 0.128036879 0.123927542 0.124957329 0.12943563 0.124560657 0.113910851 0.116719467 0.159613893 0.155651577 0.149032037 0.14856911 0.144624445 0.149420304 0.160581971 0.166213341 0.164033259 0.169841384 0.173119022 0.176464732 0.169054668 0.167960843 0.153002017 0.14763887 0.147055356 0.144711639 0.143415602 0.158535003 0.168648573 0.180316837 0.168610615 0.17225371 0.165113102 0.164272143 0.170081495 0.171532401 0.175561898 0.178842352 0.177304381 0.171966076 0.164751042 0.170001312 0.172759279 0.1671032 0.160075053 0.170098685 0.18329244 0.180231715 0.176892934 0.177131423 0.175402517 0.175442807 0.192481053 0.195465755 0.188333364 0.182832629 0.177433068 0.173888007 0.183734724 0.188138513 0.188965016 0.188272785 0.188455708 0.194178438 0.188020591 0.175812953 0.177078925 0.178597808 0.186494801 0.18873142 0.176015787 0.172187653 0.170149274 0.170767033 0.166278493 0.168423919 0.175109323 0.185303935 0.178140683 0.177864594 0.172854695 0.16626808 0.169422786 0.175087492 0.177541067 0.178081323 0.177735477 0.177131884 0.179394072 0.188322161 0.195162166 0.194831693 0.196071491 0.198228827 0.176730716 0.174204908 0.167592255 0.166092824 0.162455566 0.166625646 0.171409597 0.170833842 0.181512774 0.177599506 0.176880952 0.176820555 0.144794254 0.148011162 0.151364413 0.147907274 0.147374288 0.145005515 0.172538064 0.169530603 0.170347237 0.171879052 0.174401593 0.169586172 0.172805229 0.178670896 0.181102599 0.181977325 0.181551552 0.182037704 0.184736267 0.182996167 0.174590372 0.173904066 0.186070694 0.164709348 0.158346696 0.156492575 0.156496902 0.142211496 0.142885232 0.158863465 0.178352654 0.172918287 0.172667975 0.171941269 0.18168002 0.183477841 0.162407927 0.163314601 0.159674654 0.159781564 0.160824838 0.166159923 0.186500296 0.186470407 0.1908492 0.196925212 0.184210394 0.183584741 0.182721821 0.172742244 0.17317108 0.147707753 0.153358633 0.177265769 0.174206477 0.17659932 0.178998273 0.17738968 0.174717635 0.178519236 0.182833072 0.169895006 0.173331704 0.174184424 0.173739785 0.17166303 0.175624277 0.18044013 0.175555722 0.171454821 0.180666538 0.19028659 0.167605681 0.159864621 0.161861117 0.144903201 0.151471338 0.179569627 0.185760197 0.175725828 0.178025756 0.182180954 0.193331348 0.185407863 0.169473435 0.163180495 0.159071655 0.159999621 0.164530148 0.176160787 0.200176938 0.200039774 0.197003122 0.190024046 0.204576978 0.211781871 0.211274674 0.196193618 0.204069397 0.210811303 0.218458502 0.213896958 0.201796644 0.208891596 0.215975291 0.216389763 0.225041347 0.236842535 0.231899233 0.234528142 0.240285522 0.242249725 0.262126383 0.27568526 0.276193394 0.279376829 0.282734494 0.29386244 0.307056 0.296984632 0.287537749 0.279098827 0.281544634 0.288596532 0.303456602 0.317203833 0.287779971 0.289123623 0.303684536 0.311134116 0.308108962 0.312587361 0.305661509 0.311893297 0.317696078 0.319282265 0.320309232 0.319796718 0.29974939 0.292561521 0.294522032 0.296136828 0.302936171 0.313205817 0.297282751 0.273374922 0.262914231 0.262679808 0.266165365 0.273059866 0.261342074 0.251113495 0.268314706 0.266544477 0.277013575 0.288033953 0.295751029 0.302622338 0.307108571 0.308476696 0.309800668 0.311528578 0.313783056 0.308659686 0.304536383 0.297714205 0.295283734 0.296933952 0.304518272 0.308372419 0.301123707 0.304789137 0.305383204 0.306315476 0.303213992 0.288195331 0.284337205 0.283238887 0.285942569 0.290075084 0.296579005 0.300957523 0.29613906 0.290206826 0.289324788 0.285764367 0.282471358 0.290332284 0.295682881 0.290643459 0.285674121 0.284204684 0.282994583 0.269999357 0.263448332 0.259614136 0.265349272 0.261215101 0.246256254 0.245005955 0.268258194 0.274079979 0.277024493 0.280714061 0.277111577 0.268520843 0.266903661 0.275567181 0.273026831 0.268434508 0.284542655 0.28106825 0.282033779 0.284413226 0.280508741 0.285360081 0.287037293 0.279409434 0.279819055 0.281066379 0.283114126 0.284291174 0.271278807 0.2632545 0.266724171 0.270707084 0.279467055 0.286021427 0.280028611 0.278030869 0.283488506 0.277292108 0.292833456 0.308088958 0.307437725 0.297992975 0.294503791 0.277897879 0.289462007 0.309958075 0.303559187 0.306758753 0.307537655 0.304024124 0.308978189 0.30617091 0.313436694 0.316630238 0.320991154 0.315772489 0.322850587 0.326867432 0.319749579 0.326925667 0.334313065 0.333536274 0.3364815 0.349814941 0.34686376 0.328887484 0.32315902 0.344793392 0.344717324 0.327812717 0.322764273 0.318297722 0.305037898 0.289341751 0.287293503 0.289143903 0.301706581 0.323492492 0.330452238 0.333267159 0.333140374 0.32292517 0.318105083 0.319803348 0.317421503 0.322269518 0.333311708 0.342571628 0.339517457 0.331082499 0.329309948 0.317409654 0.306163382 0.309625264 0.320855873 0.319091026 0.328323018 0.322456724 0.33251642 0.332099334 0.326275762 0.314529441 0.313338042 0.320309017 0.324403372 0.302473609 0.287174384 0.285592868 0.278867681 0.273389252 0.268058163 0.264739522 0.295007511 0.306155088 0.303756757 0.313499904 0.321153845 0.302430298 0.298100339 0.27085471 0.269298077 0.262858052 0.270814454 0.267151903 0.283241881 0.282098247 0.293481198 0.291314465 0.287840192 0.287397844 0.281310918 0.283379135 0.279429152 0.27151283 0.263743808 0.245817909 0.278953153 0.266684545 0.291736015 0.304555771 0.313741467 0.318285652 0.306866317 0.293424054 0.296812927 0.292635104 0.292747637 0.28182831 0.294180598 0.28892293 0.292743895 0.289289704 0.272483902 0.272666832 0.263069478 0.255951719 0.249840392 0.235219945 0.215177039 0.205453192 0.205911709 0.221847627 0.244786096 0.257289424 0.26687019 0.275434259 0.278664661 0.278480906 0.296226823 0.306359795 0.317819751 0.325507208 0.356139328 0.378627379 0.392246599 0.394961877 0.39874238 0.398944381 0.400157363 0.406251139 0.41049878 0.401750783 0.38988316 0.383142479 0.384026669 0.386610632 0.385356299 0.391236202 0.391499287 0.388359864 0.39690274 0.40072367 0.404914815 0.394702688 0.388443764 0.383703912 0.361699197 0.353336089 0.36574798 0.367059277 0.374367301 0.391988845 0.417594342 0.430833811 0.431489006 0.431940505 0.419502658 0.412021679 0.399062166 0.399364814 0.389754325 0.390265502 0.402277756 0.394651394 0.377894129 0.369636007 0.368951878 0.357388943 0.355955324 0.353711898 0.342870772 0.340146727 0.357870581 0.365075948 0.362789543 0.376758017 0.356874127 0.361070067 0.35207642 0.34628823 0.334129427 0.328619018 0.337899317 0.397204651 0.372986552 0.352361973 0.353956139 0.345713327 0.337648371 0.331051717 0.323689116 0.318158308 0.322593759 0.324057742 0.321910653 0.324340255 0.334739502 0.323143391 0.306369302 0.291073305 0.276724928 0.254059343 0.259037841 0.257392322 0.254750987 0.257530943 0.259908919 0.298748867 0.295692258 0.3068435 0.31672089 0.319935365 0.301955247 0.279056109 0.264295791 0.264282913 0.269292256 0.283339507 0.289320927 0.284413381 0.280739742 0.279869568 0.277320018 0.280584848 0.287520962 0.265561882 0.271837926 0.284487442 0.289462864 0.301668273 0.306235563 0.293450681 0.271923879 0.301334236 0.293163191 0.29353123 0.291580692 0.292588001 0.291053721 0.301496836 0.302136529 0.304375421 0.292959087 0.294149687 0.305421038 0.301286762 0.308932696 0.318040703 0.316137929 0.322186937 0.321154756 0.322769672 0.32371594 0.319807298 0.31219 0.302700122 0.297001281 0.303284764 0.326925457 0.32894754 0.310927996 0.294706781 0.261604976 0.246048389 0.238822035 0.257385287 0.271843402 0.282236791 0.283812143 0.283133316 0.286339959 0.290840645 0.292607064 0.293988447 0.300698962 0.311763479 0.313864868 0.310999497 0.309075 0.30556968 0.304013138 0.304303323 0.317443704 0.328141495 0.303392864 0.291059439 0.284682839 0.297057093 0.308879994 0.319511077 0.320191653 0.321250401 0.321174406 0.317631949 0.314142998 0.298291618 0.294070631 0.278468872 0.279090386 0.284758228 0.292088963 0.303128761 0.316286811 0.302864117 0.302458264 0.305624229 0.319473089 0.314177953 0.308644147 0.301779446 0.287346976 0.28007378 0.276898736 0.291852932 0.307457376 0.327271597 0.321872335 0.320939651 0.314843904 0.311029961 0.307773336 0.29548881 0.301772165 0.314649458 0.322889253 0.328186537 0.341962027 0.354187026 0.357222538 0.375261488 0.379818662 0.378355374 0.362178769 0.355423645 0.354587543 0.369023726 0.366723331 0.371346071 0.386056882 0.398932048 0.406341958 0.408799053 0.409366666 0.40888444 0.401221217 0.406791881 0.406269626 0.409920266 0.42040145 0.423336351 0.410399755 0.391510707 0.390827146 0.402597462 0.424461018 0.406673798 0.388398183 0.36976696 0.357946026 0.354541939 0.368771753 0.400009432 0.419342842 0.417696004 0.425108287 0.4236275 0.426777996 0.43366225 0.43188311 0.43171504 0.43459681 0.435451081 0.432520701 0.417320205 0.384582011 0.377932154 0.373077494 0.377490152 0.387155195 0.396412431 0.379135886 0.350569535 0.330586595 0.325056559 0.33018468 0.34307769 0.353272775 0.365817305 0.372452119 0.378507213 0.396826932 0.413215813 0.422017412 0.422016156 0.421466662 0.414577601 0.416432872 0.419764737 0.412219377 0.393058064 0.38191098 0.397321359 0.409045186 0.370506134 0.352643875 0.326043868 0.2984083 0.280705506 0.274268683 0.290077453 0.307536067 0.32693772 0.336810848 0.326589542 0.312986087 0.304011076 0.296316152 0.284148727 0.279523507 0.291360847 0.29810255 0.295000625 0.29084058 0.285709021 0.276512286 0.282147172 0.292384555 0.267102446 0.259986716 0.23433708 0.211254685 0.205419204 0.201541307 0.214015041 0.245777507 0.25552357 0.256215554 0.257687693 0.26089678 0.250460133 0.242148761 0.243325737 0.247931833 0.253705421 0.260191034 0.26138715 0.257419863 0.251179873 0.241766598 0.239116458 0.243092872 0.248733513 0.233574228 0.234167988 0.215097613 0.215123167 0.213515909 0.227046504 0.229120361 0.232511551 0.239287039 0.237237669 0.236999447 0.233594682 0.225804482 0.216497051 0.215753548 0.219783383 0.22788317 0.230182084 0.244370804 0.241158486 0.237274715 0.238516824 0.240274655 0.228688914 0.218275812 0.215378827 0.205808526 0.207157858 0.209682654 0.228071918 0.226962223 0.22021408 0.221584871 0.224276012 0.227519303 0.221256271 0.200886951 0.202059242 0.197647529 0.195568623 0.201051673 0.216994741 0.224874265 0.227610305 0.234484768 0.245141113 0.243510004 0.217147054 0.206984713 0.203276993 0.198314265 0.205284258 0.204713863 0.207912244 0.228441392 0.217103708 0.22700854 0.23175531 0.233434849 0.222553933 0.19950366 0.177923711 0.174401775 0.171169907 0.175801883 0.191644814 0.19918736 0.224172672 0.215963265 0.226130477 0.228197801 0.217366308 0.200625391 0.203820355 0.195438141 0.199091515 0.196574318 0.186542474 0.177187433 0.180395169 0.182985669 0.17949883 0.186780267 0.187960933 0.167372258 0.165531581 0.163967412 0.155416871 0.15634698 0.163508263 0.166916627 0.187299494 0.188390214 0.200227401 0.189432038 0.158441074 0.172233695 0.181236264 0.179237253 0.185111768 0.195805346 0.202636811 0.204513858 0.191224362 0.192354085 0.199431932 0.204582129 0.196675472 0.16476423 0.158257181 0.154354338 0.15194573 0.152932881 0.158366375 0.163808955 0.197224747 0.197278924 0.199730356 0.162813654 0.167690027 0.176892874 0.176830265 0.175966302 0.177621402 0.183554278 0.201554398 0.196787525 0.192690672 0.191670898 0.192865364 0.201662135 0.197376883 0.177466272 0.18377519 0.183822047 0.184424608 0.180843052 0.173707042 0.172510946 0.203584687 0.19238245 0.175055293 0.174704366 0.177942872 0.189335533 0.188260661 0.177678052 0.176965721 0.174776914 0.179083195 0.19895657 0.196867515 0.199776659 0.203977608 0.208886767 0.213130033 0.217002893 0.219428643 0.219625622 0.220357952 0.218005728 0.219525044 0.21513087 0.205259114 0.197011898 0.199630895 0.212515289 0.222856355 0.218960289 0.205899485 0.203788183 0.213016307 0.217310772 0.224193656 0.218986583 0.204713653 0.211444552 0.218181431 0.224287635 0.215443973 0.206719853 0.20016974 0.190729083 0.189981116 0.187105382 0.197916262 0.220604179 0.219039385 0.212165387 0.214084102 0.208661407 0.204581102 0.21418209 0.223507501 0.226284377 0.226582354 0.226859633 0.222442909 0.212648496 0.202707588 0.202460239 0.206472512 0.206656406 0.199792371 0.178792569 0.176371158 0.172179926 0.173861601 0.174731748 0.178252839 0.205749987 0.199641089 0.204667902 0.205333591 0.208669234 0.203753687 0.209170657 0.224169261 0.216923614 0.21418678 0.21588647 0.214672597 0.202092453 0.196013133 0.198303362 0.206268087 0.211814826 0.218743847 0.198114205 0.184564133 0.184889664 0.186207165 0.187086047 0.197036464 0.227789678 0.211218763 0.213239146 0.22505706 0.219701125 0.188411554 0.181518511 0.182727819 0.179886592 0.180426932 0.180103064 0.182144228 0.212804854 0.199171478 0.207108575 0.207601636 0.204763788 0.215052264 0.226010086 0.228006721 0.219106125 0.218444114 0.220717577 0.225943429 0.25184221 0.23699754 0.238124103 0.234088052 0.232680901 0.215906614 0.185965578 0.183325735 0.180074597 0.178409381 0.191179522 0.196911554 0.220123861 0.209902029 0.202798854 0.204655037 0.211021412 0.206602776 0.193832898 0.181473026 0.184885255 0.182856359 0.17943897 0.181941283 0.212101049 0.199109282 0.199597444 0.209597008 0.211875035 0.202983158 0.188808572 0.186293985 0.184069656 0.185316139 0.195691326 0.196448406 0.224071449 0.215559339 0.220037611 0.218289335 0.217827017 0.200178027 0.184425922 0.169660014 0.157509848 0.156773771 0.159592981 0.161264801 0.170620965 0.162385162 0.16450384 0.213584423 0.21748103 0.218038347 0.21620985 0.211623939 0.208239387 0.210058545 0.211670336 0.212593424 0.219239647 0.229273186 0.236035275 0.247166359 0.250191386 0.23827437 0.235580613 0.221788552 0.226763785 0.224407157 0.22302826 0.220710282 0.229058328 0.239971956 0.251598182 0.243360245 0.243131297 0.232086031 0.231578909 0.245173327 0.252119263 0.247276326 0.248677616 0.249441965 0.24049209 0.243929367 0.249117892 0.253757976 0.271059129 0.273388753 0.263597362 0.240756278 0.23509488 0.22828735 0.220356838 0.219830502 0.227974537 0.235141241 0.242486423 0.255174845 0.258458012 0.219249143 0.204249 0.188138407 0.178491385 0.171287949 0.18274166 0.210157784 0.207244097 0.232237426 0.230527494 0.233013849 0.236683495 0.226231605 0.228519098 0.213037091 0.211829331 0.221150167 0.228076271 0.236978833 0.255541921 0.252960678 0.25161909 0.260006968 0.267571326 0.270291456 0.274129402 0.258953128 0.273778969 0.280815625 0.285106957 0.296091943 0.284206828 0.274774808 0.273072 0.272437928 0.277834842 0.278628718 0.2660008 0.250329888 0.25315596 0.25372406 0.252136012 0.250144624 0.260804981 0.249855573 0.247783476 0.245004763 0.243916048 0.247402681 0.252287192 0.263316192 0.269203999 0.272593094 0.279273769 0.275241307 0.268294127 0.262402141 0.2652772 0.269972357 0.272831078 0.27408962 0.266433092 0.247932569 0.240243747 0.234346151 0.231828332 0.241311642 0.256450915 0.251930963 0.244969374 0.250631899 0.250610573 0.256806625 0.258736259 0.221598878 0.210838537 0.203000509 0.206203175 0.207185033 0.241926928 0.245997121 0.24873501 0.235281816 0.227368643 0.196362861 0.16693264 0.162691943 0.162263394 0.163206841 0.164169547 0.165143733 0.183067748 0.225771847 0.225385249 0.233244055 0.241006858 0.241222515 0.242831837 0.242595525 0.239220995 0.238195697 0.23685026 0.23796266 0.235664884 0.229262401 0.231190178 0.238862774 0.240114383 0.24035505 0.237276501 0.240004529 0.224802596 0.221956828 0.225987788 0.226038142 0.229937837 0.229207342 0.231569873 0.227802338 0.240015647 0.246839761 0.252444835 0.259178664 0.262983634 0.269895574 0.255137933 0.272762089 0.269308388 0.258561238 0.260663352 0.263407119 0.254036972 0.254287881 0.249717806 0.242531867 0.237994876 0.227020571 0.221295524 0.218672921 0.226836736 0.21065389 0.255603855 0.250094203 0.247898137 0.251062406 0.21533877 0.205061213 0.196797064 0.17758753 0.15303794 0.178688483 0.210098248 0.205401325 0.215858975 0.222436023 0.226844901 0.233045886 0.244606905 0.221991177 0.224530026 0.23075894 0.235640103 0.233395343 0.252625225 0.236031641 0.245897053 0.251339685 0.256242272 0.235361297 0.204571383 0.174033541 0.172755729 0.179265586 0.18408788 0.195583806 0.200750063 0.201802875 0.221997222 0.230110582 0.228554905 0.224636333 0.210107716 0.212125787 0.218013717 0.226820979 0.241512658 0.244768542 0.247763621 0.244788795 0.247234213 0.246542177 0.24862931 0.248463538 0.233541314 0.194690629 0.183536448 0.19744613 0.211116694 0.224614086 0.222416532 0.228450871 0.224794879 0.224039764 0.227070181 0.222008238 0.225724406 0.203529362 0.201657478 0.200851978 0.200075315 0.197784908 0.24082676 0.224637737 0.227116817 0.242060823 0.242461767 0.247378877 0.248463814 0.239590047 0.24316474 0.249559826 0.246308549 0.250620494 0.25096408 0.23730872 0.233829393 0.232704701 0.236833577 0.242148104 0.247091085 0.225912681 0.218133922 0.210897327 0.212483724 0.21022176 0.24373748 0.232917607 0.232180483 0.245591762 0.249718587 0.244149316 0.241532549 0.233262162 0.221847744 0.224483563 0.222668012 0.229561843 0.244475892 0.241011795 0.241399709 0.24321829 0.242275275 0.244393883 0.226067245 0.224118599 0.207508344 0.199405295 0.201601288 0.200613548 0.216877357 0.24426647 0.251140124 0.258575067 0.26030387 0.256337907 0.250610367 0.250584441 0.252585958 0.261006792 0.263030892 0.270106872 0.270844734 0.261067941 0.261847488 0.255039354 0.251933986 0.254833467 0.264232559 0.259218128 0.249021976 0.2414297 0.240236668 0.245401383 0.256143352 0.250836333 0.251713103 0.249080451 0.248916836 0.255842283 0.228028408 0.191238451 0.174660385 0.166862178 0.170709684 0.183801252 0.207004513 0.234668817 0.2599447 0.258226238 0.243926976 0.235275699 0.219399597 0.225412728 0.224025225 0.22106638 0.221093793 0.223258231 0.217204671 0.201622848 0.242208425 0.233765628 0.231336469 0.241381571 0.271947907 0.276089338 0.274114189 0.278137261 0.278913325 0.280210146 0.298618483 0.28867604 0.291444453 0.295346653 0.297537509 0.28121148 0.273602393 0.258996646 0.255614458 0.257346826 0.259162545 0.275261376 0.290285475 0.296407477 0.314887248 0.331289897 0.351372824 0.352291538 0.329129546 0.33561073 0.329575896 0.318527666 0.318352836 0.31603662 0.337909886 0.329227618 0.329915323 0.345241002 0.357687385 0.366766622 0.357748648 0.353672592 0.350362087 0.363127703 0.377694158 0.38777463 0.384481634 0.377782094 0.384910737 0.39738309 0.392385582 0.385003357 0.392749282 0.392125014 0.393086235 0.390404865 0.382870052 0.388661889 0.38106807 0.344603798 0.330441454 0.32274024 0.326650413 0.341638671 0.366518851 0.383155641 0.384000554 0.381453932 0.358566386 0.343028582 0.349861467 0.353198236 0.355877911 0.355723255 0.370102236 0.374548756 0.359195386 0.348367674 0.332227911 0.318682463 0.317092619 0.322560894 0.341261248 0.332245995 0.322882126 0.330689221 0.34703233 0.374601129 0.376174227 0.378328156 0.384045612 0.377027713 0.378787437 0.376452556 0.369226681 0.353095056 0.352905374 0.368983297 0.365558113 0.355017146 0.341979675 0.33172738 0.306298876 0.273099268 0.272875022 0.288099952 0.319791325 0.352625623 0.360689205 0.364151199 0.360805712 0.349845072 0.316741723 0.305858388 0.295059538 0.296312456 0.297390171 0.308268305 0.336335972 0.34134646 0.333515692 0.353671753 0.367749818 0.364062825 0.350532146 0.348247734 0.358331212 0.365636565 0.369574443 0.376618139 0.366097942 0.3566797 0.335315609 0.344741968 0.353882117 0.359739597 0.327327347 0.297196418 0.282138088 0.285600531 0.271932086 0.264735846 0.259133414 0.26452695 0.267964782 0.260977351 0.256627395 0.272854969 0.287901353 0.280281817 0.274149654 0.268680935 0.265091458 0.27241377 0.278972945 0.268052881 0.267828889 0.274570273 0.269774503 0.261522101 0.252909406 0.250233282 0.237527638 0.237369109 0.235672514 0.239873196 0.24357542 0.245812688 0.253732092 0.25657758 0.249396536 0.243265392 0.258338375 0.250473862 0.246549271 0.247721907 0.255566755 0.266179874 0.279558907 0.275358217 0.277250585 0.280570549 0.269519685 0.249850915 0.200858758 0.193203778 0.18496074 0.178961547 0.19189284 0.191193716 0.230233402 0.228152214 0.239864585 0.253697187 0.244824471 0.230558323 0.227408359 0.220301486 0.220364696 0.228502395 0.246582495 0.260954979 0.280344294 0.28093734 0.285807976 0.286368072 0.26953833 0.239181318 0.218677908 0.203393764 0.202247844 0.208856193 0.22776385 0.250745735 0.261095433 0.262802599 0.275669173 0.287963786 0.267298653 0.250681062 0.242676565 0.232543767 0.228948306 0.232661826 0.23382164 0.249492905 0.275781465 0.274145649 0.282593425 0.293767526 0.287282487 0.267475958 0.248416162 0.25835552 0.273815632 0.290797846 0.298937583 0.297261751 0.278338048 0.268657204 0.276787676 0.288003629 0.284102781 0.271618103 0.249640142 0.24392656 0.233926769 0.236638347 0.249116653 0.258012275 0.267310838 0.270536488 0.273850396 0.280378986 0.286475934 0.270759179 0.22857555 0.220974321 0.222415425 0.218492846 0.241583021 0.272098263 0.268338458 0.251497124 0.26866594 0.277920527 0.244130207 0.23284328 0.218999619 0.214384146 0.212615928 0.220741901 0.239945729 0.258218297 0.285108876 0.283536347 0.281498447 0.29277396 0.25621725 0.22383799 0.188610707 0.169934236 0.158077512 0.148945469 0.155773561 0.189688692 0.230323379 0.24430192 0.252329827 0.238920367 0.234546735 0.22824464 0.217209599 0.22125621 0.223677899 0.23252093 0.231431858 0.241951572 0.249951376 0.246555288 0.231575479 0.228813673 0.233443744 0.234767425 0.218452301 0.205234567 0.19979197 0.199819115 0.201483993 0.200336516 0.22834312 0.2494585 0.260068505 0.248990953 0.237741889 0.223683982 0.218331733 0.213322332 0.202711879 0.200338355 0.203357135 0.221702409 0.229968413 0.240740601 0.242867898 0.240919712 0.245933888 0.251352057 0.263530456 0.266755346 0.277101801 0.283965777 0.282662368 0.285537499 0.274257437 0.273179988 0.268624368 0.281464834 0.285747548 0.254981839 0.226686035 0.216995671 0.204394965 0.194585848 0.198697857 0.22372795 0.232311406 0.220724544 0.215233062 0.214321895 0.214216188 0.238851081 0.26430261 0.277634657 0.292539604 0.331085683 0.33422864 0.320205902 0.314287574 0.321052464 0.329376536 0.344534886 0.342180797 0.323504286 0.314655738 0.291375589 0.287105161 0.281048088 0.284933531 0.296667276 0.288288374 0.269659191 0.266111409 0.275273086 0.288911234 0.29743639 0.282484905 0.282677533 0.290649733 0.299577906 0.302226658 0.305029077 0.29903048 0.292209082 0.303082059 0.313067132 0.295129222 0.2781934 0.26177008 0.246785699 0.231472379 0.223475919 0.224226052 0.25633194 0.275772583 0.295431459 0.288341654 0.305419444 0.312699574 0.316153823 0.304601976 0.305516218 0.312093878 0.320995599 0.334596012 0.334763533 0.321034104 0.314947006 0.31936131 0.329014634 0.34053306 0.325291988 0.323376976 0.319361376 0.307957115 0.303474415 0.314022066 0.338369725 0.342332686 0.337890047 0.326064891 0.327609579 0.304092211 0.279177188 0.28318884 0.278878899 0.274842196 0.269433173 0.27393144 0.299315136 0.330696198 0.340406756 0.346168292 0.343639406 0.336057764 0.327451333 0.32044911 0.320218257 0.300536994 0.295093232 0.297548065 0.301373931 0.350920494 0.337973141 0.332725611 0.339539663 0.328626116 0.320874686 0.316357376 0.309342216 0.313976028 0.325457503 0.340399138 0.348928561 0.314473858 0.311011231 0.315240542 0.328862532 0.314644956 0.31303549 0.301990226 0.289846349 0.277835162 0.254469516 0.24961303 0.257977983 0.295873818 0.301497787 0.311237198 0.305483289 0.313088077 0.310995368 0.299713342 0.300564525 0.308189541 0.312821196 0.31141746 0.30764204 0.307366737 0.287325838 0.291902476 0.313408602 0.291349563 0.274813537 0.258419754 0.244366198 0.243724414 0.231538712 0.233156077 0.232302527 0.278235804 0.30017231 0.29707549 0.303333502 0.317355266 0.322934751 0.321016356 0.321572445 0.32115603 0.333042771 0.358952587 0.380503484 0.371454965 0.347757832 0.349204968 0.346537678 0.307817631 0.273524648 0.243550736 0.226988797 0.221158421 0.219788344 0.217570331 0.220293017 0.273955488 0.303054359 0.334091822 0.343142906 0.312794018 0.291583143 0.263810444 0.240371867 0.237153032 0.239616402 0.264054661 0.303836283 0.323256504 0.353195545 0.369267611 0.360285214 0.326556539 0.298241297 0.298824435 0.308506946 0.32945465 0.350750907 0.355461924 0.337636465 0.315389878 0.305934986 0.307885017 0.305156642 0.313999357 0.306969214 0.288310968 0.27896529 0.279135981 0.284051522 0.306578748 0.332342997 0.367909507 0.357770325 0.357738733 0.363207634 0.375185 0.381023414 0.37253423 0.354525252 0.343447491 0.339186906 0.332121488 0.322320538 0.359575774 0.374161365 0.368690789 0.374571323 0.388753037 0.375836069 0.346421692 0.344916804 0.356974649 0.375530412 0.38880462 0.395007354 0.363962988 0.34907449 0.365055259 0.371967849 0.371184144 0.340383331 0.32382855 0.299781429 0.29319258 0.287347665 0.290205044 0.290122512 0.330704521 0.343761926 0.331035711 0.336675314 0.352948415 0.35190115 0.344447463 0.348676363 0.354064189 0.370482363 0.378998951 0.382066636 0.359486732 0.350291544 0.363410906 0.372618167 0.372500468 0.320247258 0.293748343 0.292363497 0.290514332 0.292166382 0.300649142 0.309304039 0.338665567 0.353793807 0.353710761 0.347969132 0.359992465 0.333806481 0.333633969 0.329679383 0.331128583 0.330055739 0.351863874 0.368702645 0.339862015 0.329634006 0.335402374 0.358034212 0.339022952 0.30482756 0.291777736 0.284522275 0.275905926 0.279036154 0.301560085 0.335737333 0.369099827 0.378530807 0.38345635 0.377725187 0.373171203 0.343954577 0.313436261 0.297141016 0.288041304 0.280008942 0.277169109 0.272712568 0.309553532 0.341446668 0.343156559 0.325577489 0.285177417 0.268833558 0.263741984 0.267249235 0.270579968 0.285548707 0.305254679 0.326862046 0.353659846 0.353013582 0.35842726 0.346815666 0.340064332 0.339224546 0.320967559 0.314442661 0.304531624 0.291747493 0.288956194 0.294271425 0.30236706 0.291115025 0.321863484 0.359224401 0.366123567 0.36924226 0.35371648 0.349528689 0.347673158 0.343389946 0.353436276 0.357834881 0.368090502 0.384724777 0.375582669 0.381109627 0.386844141 0.370804165 0.349835589 0.350654758 0.362572602 0.38112925 0.396463732 0.388685992 0.360797523 0.339928146 0.353486655 0.370854024 0.367712802 0.366829069 0.316269303 0.327696404 0.317355275 0.309774305 0.314485599 0.340406695 0.357046379 0.358977447 0.339438297 0.347984781 0.362212381 0.388584987 0.396211586 0.395868396 0.392102816 0.393049071 0.394715691 0.392473671 0.353744454 0.334099523 0.335766245 0.333137954 0.33525016 0.343908275 0.35869359 0.374788189 0.366248488 0.360519785 0.364471206 0.368905084 0.38707719 0.381420327 0.361556004 0.378668616 0.384101805 0.389091352 0.396161658 0.396988894 0.401151218 0.403570126 0.405849546 0.387875965 0.351676521 0.334972697 0.327185074 0.349265156 0.3486328 0.340613408 0.308692122 0.317392591 0.320140401 0.306887163 0.317491546 0.343147332 0.363236675 0.351980691 0.3131539 0.314943301 0.341831147 0.34097884 0.336181111 0.339327738 0.34027988 0.352205298 0.360474798 0.35696501 0.32258526 0.31840505 0.343673654 0.336117323 0.311719843 0.310340158 0.302606885 0.310857108 0.318608897 0.332995204 0.345193364 0.353209799 0.343553572 0.326724032 0.314481562 0.332653874 0.354510438 0.355907399 0.345807275 0.335422431 0.324193539 0.318055054 0.330534062 0.347659646 0.372815769 0.354278543 0.348818046 0.347886367 0.348886057 0.353469766 0.358999118 0.357808215 0.359159491 0.35919229 0.364730154 0.36463607 0.363176286 0.3438601 0.327356957 0.342017897 0.349219015 0.339935103 0.320370239 0.29868101 0.282827577 0.253229475 0.239474225 0.244911855 0.251761048 0.271811913 0.269048025 0.27019678 0.262295576 0.259901533 0.257796794 0.258696195 0.256792386 0.267412422 0.275076549 0.273006804 0.28352997 0.276371995 0.262283615 0.266495237 0.271415464 0.268962945 0.253496161 0.242158865 0.228053255 0.218049704 0.217957764 0.220632335 0.241823868 0.245297613 0.266107198 0.263984948 0.259216282 0.254270805 0.249041758 0.24254109 0.251104808 0.262140449 0.263517222 0.260134557 0.2541738 0.247147989 0.234675022 0.246615187 0.261014271 0.265382403 0.253614628 0.240199738 0.232071728 0.227200701 0.23743849 0.260122365 0.291816928 0.284714245 0.288672839 0.300761362 0.301657987 0.293642885 0.29954229 0.310460985 0.30538951 0.298179116 0.295456544 0.287716428 0.285996567 0.285319689 0.281774234 0.298050068 0.310009274 0.296918497 0.279597291 0.265010756 0.254296264 0.252794471 0.257331307 0.280198353 0.28393986 0.299166077 0.30876678 0.311982273 0.31013471 0.318255315 0.315731171 0.32251204 0.325620484 0.32538976 0.323921205 0.319565153 0.306804504 0.29753132 0.285662568 0.285179864 0.29619432 0.278028935 0.26612251 0.254675582 0.251199279 0.24518667 0.253712577 0.281217989 0.292048708 0.289468731 0.303129744 0.283446145 0.268825898 0.260257083 0.271013082 0.275137121 0.284283321 0.295035762 0.308735372 0.295566851 0.279221358 0.270650057 0.266307341 0.275424969 0.291357474 0.280533083 0.273308242 0.259842905 0.256041671 0.251580604 0.255481457 0.27609041 0.282805393 0.27868706 0.289902891 0.279097953 0.281570451 0.275752325 0.255325126 0.27052879 0.289894217 0.302998771 0.303864314 0.301553446 0.292990982 0.281896377 0.277951547 0.290329755 0.294651816 0.285878583 0.273421418 0.234305221 0.22491571 0.219016701 0.225881561 0.254200169 0.283038038 0.301113002 0.328048361 0.342585269 0.342053711 0.336472917 0.350691904 0.341055864 0.336261714 0.326068416 0.325756548 0.330365715 0.325113785 0.328781226 0.337623865 0.34270498 0.338640296 0.348542001 0.339091281 0.322235517 0.297370468 0.278061727 0.283671046 0.299153928 0.304602585 0.295932041 0.326947537 0.334376157 0.336740842 0.340741853 0.332655139 0.326516885 0.31856471 0.327004894 0.332570492 0.346171223 0.362802466 0.374575633 0.36337334 0.359705391 0.357136513 0.329478345 0.300731132 0.285403878 0.276655332 0.273241849 0.257728238 0.25619575 0.25083717 0.240234389 0.300757836 0.340644664 0.345439863 0.347766865 0.361997541 0.362088561 0.37203799 0.366179774 0.360588228 0.348697896 0.339999319 0.334445009 0.323801897 0.332998394 0.350559331 0.347846249 0.333188671 0.309457734 0.293222735 0.273422866 0.269033373 0.296078965 0.313488845 0.310244056 0.303010144 0.271532633 0.254084445 0.23414185 0.22540455 0.237696911 0.258324302 0.272021692 0.287558529 0.302517555 0.325377328 0.328757767 0.328652675 0.320413732 0.310958959 0.271408252 0.252580767 0.23571741 0.235578361 0.242480719 0.25611494 0.288201186 0.286154543 0.29706895 0.295761148 0.278498216 0.25318807 0.225010659 0.217355516 0.224182365 0.233778778 0.244152749 0.286397535 0.317479512 0.338535141 0.345699503 0.332760036 0.34068727 0.339099505 0.286876664 0.26059304 0.243508991 0.235436055 0.229582301 0.234350285 0.252991526 0.272273437 0.285981639 0.279938781 0.252795016 0.242539098 0.242776545 0.252510323 0.263621204 0.281770663 0.313377622 0.316290768 0.317098988 0.306075549 0.305792569 0.306112565 0.304443123 0.312224865 0.299649797 0.275271266 0.243874804 0.236423089 0.230732014 0.233176617 0.268703135 0.298394343 0.307289172 0.289035497 0.278381319 0.263091405 0.263865654 0.268323197 0.278812614 0.281289784 0.281606716 0.304217026 0.312462642 0.324553264 0.328671241 0.318766327 0.309158997 0.306672553 0.291783485 0.260987312 0.215914641 0.195352859 0.176840802 0.178467257 0.199678014 0.210094675 0.224012383 0.230644392 0.23487781 0.233364272 0.239092618 0.27882683 0.270734993 0.259664842 0.24406509 0.238992476 0.260915562 0.255438925 0.232866217 0.226326243 0.213060058 0.185499485 0.165879773 0.177515525 0.159325766 0.151526036 0.145436404 0.145412238 0.166524006 0.158956926 0.162855635 0.167353615 0.194258066 0.191916045 0.18273016 0.182061965 0.175824409 0.170329311 0.170172223 0.175756549 0.181575981 0.189678728 0.19713313 0.193744099 0.200376997 0.207642604 0.200587391 0.182976287 0.168579862 0.162083453 0.162492897 0.169078641 0.195139737 0.18735796 0.197529523 0.203586425 0.198014324 0.189072992 0.190751447 0.184415334 0.180088354 0.1668321 0.177955524 0.157851255 0.151539856 0.186076068 0.194468581 0.19992198 0.20811113 0.208624077 0.180100136 0.174027894 0.171899133 0.174632538 0.181600502 0.193045267 0.215768122 0.212884797 0.212751349 0.210586717 0.220583672 0.221417441 0.211512125 0.204178397 0.197868611 0.183981196 0.192463854 0.197667451 0.194171969 0.198425607 0.216138085 0.217446553 0.220471995 0.206729467 0.202681397 0.172732822 0.160593892 0.160904149 0.156628299 0.162144433 0.174148699 0.208460798 0.209131416 0.201736554 0.196699819 0.193356565 0.204608023 0.199486503 0.209810256 0.22605406 0.230280208 0.235803913 0.232182468 0.241257403 0.246004372 0.255787159 0.256486012 0.257160119 0.275540641 0.284060442 0.262058267 0.247925899 0.235256989 0.239185546 0.246698756 0.292941022 0.276166096 0.280195712 0.286992099 0.273418429 0.278857531 0.293679822 0.296959724 0.29455653 0.279440466 0.289330554 0.289957442 0.297840871 0.299268076 0.282372155 0.280612533 0.29190873 0.292862699 0.277408063 0.246263229 0.231936161 0.217470006 0.216496845 0.22560385 0.252121991 0.245292353 0.259280365 0.277772999 0.281123528 0.290110793 0.291498924 0.283074464 0.27369622 0.276037003 0.269515221 0.269326891 0.27402158 0.273453135 0.264046977 0.274415388 0.293542078 0.289561745 0.29500424 0.283020619 0.279131504 0.27925267 0.285903916 0.29173572 0.321383034 0.307301628 0.303177903 0.302487743 0.297262248 0.296135481 0.296972334 0.295067159 0.289055955 0.295001046 0.305026723 0.299560256 0.291197422 0.277600829 0.265174329 0.267627753 0.256037503 0.239422692 0.226969587 0.210979695 0.199556312 0.190319001 0.178167595 0.165227765 0.184669534 0.189497173 0.185699279 0.184213435 0.159911907 0.161598146 0.161310188 0.164412206 0.169430163 0.165747143 0.174694464 0.167158031 0.163323081 0.168204807 0.16659959 0.177185622 0.186415127 0.188955908 0.178470794 0.171527543 0.165518101 0.161038644 0.158222034 0.160184033 0.162198711 0.162463598 0.176606897 0.184007141 0.181562813 0.180338446 0.17853534 0.182333443 0.195871413 0.205053423 0.20201288 0.191067875 0.191901583 0.197343892 0.187765715 0.187543451 0.186099045 0.198853495 0.186023445 0.173648565 0.168915208 0.166891438 0.171321714 0.183228617 0.199765246 0.194114583 0.189785032 0.19831183 0.19746483 0.199688055 0.19948807 0.201425345 0.205602882 0.209808692 0.212776958 0.226601071 0.224264175 0.22192105 0.22240495 0.220749267 0.20029643 0.193919705 0.187650878 0.17777149 0.168230229 0.167348816 0.173459914 0.195856971 0.211943858 0.199793217 0.212427459 0.226978313 0.235099724 0.245614732 0.255219239 0.266722184 0.273577824 0.276029247 0.279240693 0.288115171 0.279957826 0.2817571 0.282008775 0.290415284 0.285800125 0.277669454 0.263823747 0.239061298 0.216601386 0.20835326 0.209575034 0.220727425 0.251657579 0.274276057 0.26652432 0.254406294 0.269834958 0.28014665 0.294030757 0.308872813 0.315473878 0.303860549 0.302260347 0.300601145 0.299706047 0.309449005 0.314069719 0.317153649 0.305452021 0.28909964 0.264613653 0.229727847 0.217510972 0.201836663 0.203292402 0.212489641 0.242235933 0.26663403 0.267072265 0.255687272 0.261863193 0.274196975 0.289787755 0.291177987 0.294460356 0.290484225 0.286452091 0.292501787 0.291721192 0.294595814 0.288127809 0.292246216 0.308558671 0.28902556 0.248885592 0.222711584 0.210587948 0.199978201 0.202192909 0.220046307 0.257365945 0.27352997 0.274509712 0.272215535 0.281808426 0.282075398 0.297111345 0.299925003 0.302903829 0.306286155 0.32849036 0.331559813 0.329275202 0.333299472 0.344458402 0.337706348 0.333388467 0.334174429 0.334314852 0.322575173 0.309302126 0.300858279 0.295932858 0.303160723 0.314939467 0.323502834 0.33851208 0.342906894 0.344994325 0.343509265 0.344279603 0.336179497 0.326390902 0.321731122 0.335771535 0.332350053 0.343110949 0.338770378 0.334023433 0.344774516 0.34667226 0.348569162 0.3296081 0.306060965 0.289764083 0.271143674 0.260759878 0.256123485 0.263917882 0.273353068 0.292780444 0.304370445 0.328504645 0.335405243 0.339886258 0.339265471 0.345056 0.347715609 0.340647193 0.331486691 0.329311247 0.332386553 0.329526334 0.334932539 0.344154815 0.323721638 0.295061847 0.258198211 0.2386414 0.226704811 0.220264495 0.237769899 0.287815284 0.299516244 0.304181155 0.305705376 0.304325785 0.308963481 0.312780474 0.312502873 0.300820073 0.293762287 0.294798115 0.303662744 0.303022196 0.306184296 0.311575559 0.326129584 0.322075023 0.289659759 0.267477389 0.249128059 0.231026837 0.215618819 0.221776885 0.240099569 0.271644648 0.288153896 0.279245476 0.278819908 0.282000391 0.294633433 0.303085231 0.311526728 0.323248814 0.314501289 0.304761564 0.304076818 0.319011465 0.323349665 0.312970919 0.306355657 0.312917035 0.30833641 0.266809058 0.238188043 0.228360135 0.220205266 0.224020036 0.245138987 0.279537406 0.279656031 0.276362876 0.280250062 0.285937234 0.300270124 0.308405942 0.307376697 0.309112412 0.308773287 0.296652764 0.290421857 0.286217323 0.299022701 0.303354486 0.299665145 0.316784936 0.307437523 0.28455053 0.262220863 0.237118062 0.221891812 0.221149602 0.23800304 0.27512773 0.288869633 0.289142592 0.291609792 0.296122838 0.302352696 0.317536945 0.325976719 0.326561191 0.325630675 0.316770964 0.308963919 0.305068014 0.30636399 0.305379104 0.315121889 0.333429232 0.308791482 0.277260006 0.241247064 0.214850509 0.202265492 0.209028714 0.237494431 0.274436519 0.275970061 0.276702167 0.281402002 0.275181592 0.278864012 0.295129555 0.306840878 0.306095758 0.297659075 0.287467537 0.279312258 0.276511205 0.280134453 0.273865085 0.276795226 0.28616335 0.271876139 0.256281267 0.244113498 0.229892723 0.219737786 0.211551554 0.210601275 0.200298957 0.206972321 0.207337108 0.233076268 0.24072791 0.252170725 0.243961929 0.242549559 0.244636798 0.239365134 0.236796703 0.235778473 0.236673984 0.240498469 0.239748643 0.246163165 0.255531129 0.25223296 0.232793713 0.205807143 0.186635471 0.175582059 0.171297918 0.172284432 0.15948203 0.177835242 0.208488085 0.247739825 0.237606395 0.239548615 0.24955526 0.252571262 0.247182696 0.248307468 0.243698124 0.247100018 0.242999698 0.240850325 0.234207831 0.236202181 0.246488503 0.243365903 0.222424137 0.19998901 0.183037883 0.170590352 0.178192645 0.200966296 0.214412435 0.235746658 0.235948923 0.252544978 0.259419844 0.2668286 0.264478096 0.263769664 0.26419194 0.268005394 0.272492299 0.271200478 0.266177703 0.265979998 0.26946061 0.270775473 0.266314801 0.244846699 0.221594513 0.200218136 0.188201489 0.181796885 0.185878444 0.208329243 0.233963119 0.250428224 0.22910246 0.215646146 0.213413521 0.213620679 0.206788959 0.209166075 0.215669252 0.227298626 0.227196219 0.240369739 0.258969636 0.278868576 0.284120156 0.283922428 0.260471485 0.231761451 0.207913492 0.189896176 0.184979399 0.181500078 0.189008834 0.208018159 0.242283414 0.240286068 0.218543323 0.208264405 0.20547644 0.207015914 0.204450087 0.209537959 0.214629031 0.221468529 0.229632082 0.220906873 0.214767288 0.219465644 0.234681065 0.229601484 0.222406626 0.216457468 0.202775058 0.193409097 0.189893972 0.184945744 0.18764297 0.204913958 0.248607468 0.255886464 0.232628817 0.220873816 0.217107853 0.227832805 0.242231845 0.265033875 0.28813136 0.302309555 0.323963836 0.322637193 0.312984706 0.31282128 0.321648606 0.329753195 0.325293226 0.282666398 0.250635778 0.224227416 0.21225659 0.205542653 0.210868218 0.224082883 0.264284589 0.276650975 0.277824238 0.283501727 0.289243207 0.310994895 0.332395293 0.344734315 0.356509226 0.349291256 0.344526094 0.346914223 0.346246556 0.349065523 0.35809568 0.362658365 0.35439274 0.348165543 0.320540345 0.294217264 0.271189771 0.253122796 0.244703842 0.236658802 0.238494566 0.254784635 0.286780232 0.316883116 0.334557998 0.342999364 0.352521432 0.357534197 0.359327257 0.354937113 0.350427982 0.347779207 0.347995701 0.352527385 0.348923266 0.355277098 0.368143269 0.352614262 0.34113183 0.313954138 0.290712508 0.269601488 0.258352304 0.243223646 0.236979656 0.256297628 0.299893189 0.336633008 0.335619981 0.350665656 0.370140599 0.370770992 0.3614179 0.3595369 0.354872227 0.353538089 0.345658689 0.349845321 0.354638967 0.350382529 0.371092085 0.37251777 0.348124083 0.332615462 0.308754604 0.297183578 0.295980432 0.324084314 0.35694435 0.366487125 0.368009907 0.37256545 0.372842822 0.369161928 0.362307858 0.356994967 0.366036311 0.36866864 0.370278255 0.368565767 0.375550994 0.389004225 0.395805096 0.409782294 0.407666379 0.379911592 0.341114676 0.320592063 0.303657718 0.282544568 0.27066072 0.276842449 0.30526134 0.318568951 0.318268737 0.320801158 0.3437086 0.356093879 0.381361108 0.397895659 0.381856804 0.372330933 0.37419439 0.37442236 0.381629983 0.390882418 0.394474652 0.404987508 0.417423583 0.388135492 0.354653321 0.324172267 0.296886168 0.283115489 0.283619509 0.293041442 0.31648997 0.328665953 0.333582693 0.335659644 0.341703477 0.341954974 0.353173831 0.369681298 0.383187581 0.389408223 0.409703821 0.412576425 0.411803413 0.412334117 0.417306554 0.419346324 0.404420853 0.37628462 0.339281001 0.318107443 0.293638708 0.275855764 0.276037113 0.297086061 0.322418139 0.353089876 0.360114707 0.354373577 0.367268983 0.379090755 0.387704107 0.397438966 0.404225368 0.390358913 0.378927947 0.376263985 0.361120794 0.360556517 0.362176983 0.369919875 0.400723933 0.386059977 0.36403932 0.352138595 0.340171529 0.319601864 0.314711951 0.328690177 0.347861329 0.363156081 0.371345527 0.371963104 0.373658245 0.370544739 0.374104272 0.374270366 0.372571513 0.377843085 0.371492281 0.371555704 0.374495088 0.382447807 0.392621848 0.403514866 0.421207449 0.426285383 0.40603902 0.399246724 0.367596465 0.337228235 0.308855592 0.295376662 0.305293525 0.309398958 0.329528567 0.349395394 0.363165653 0.390374406 0.399852968 0.399925485 0.389155002 0.384154475 0.378962713 0.37416914 0.377125403 0.382338326 0.392742458 0.414741517 0.423379996 0.404522696 0.394858012 0.379358124 0.354455191 0.339049402 0.334953946 0.319413761 0.310645111 0.339119403 0.372850907 0.399488636 0.418580317 0.429939458 0.429336084 0.434713337 0.427072324 0.417010363 0.405768003 0.395809797 0.396551297 0.408649927 0.430216955 0.449310842 0.44562292 0.424083497 0.373347962 0.32256386 0.286073182 0.278173462 0.274231322 0.273293859 0.269521053 0.272026179 0.292088836 0.320389904 0.345418721 0.371772931 0.403961286 0.428618064 0.425077366 0.422037702 0.414576458 0.397681732 0.389866904 0.400721142 0.421660914 0.437650436 0.416803951 0.376398026 0.331812388 0.299912853 0.282576379 0.271838234 0.264592636 0.281630176 0.318014807 0.345169565 0.355783001 0.378212413 0.416786073 0.434973543 0.437105941 0.429679927 0.412884651 0.417174075 0.407771168 0.406624315 0.410177523 0.424705279 0.431447965 0.443256805 0.444977429 0.427151272 0.390896301 0.364674226 0.327380471 0.305744388 0.308738299 0.319043988 0.348528175 0.375312306 0.387185417 0.398668344 0.42408739 0.436372931 0.426543635 0.420495781 0.416474205 0.414150175 0.409399464 0.419844039 0.422766398 0.424508002 0.41941796 0.435881468 0.445478054 0.414577789 0.3768188 0.341421118 0.31341194 0.295818174 0.289753759 0.319483531 0.360006419 0.381303145 0.391123395 0.408491963 0.423681319 0.44755441 0.403703874 0.389483492 0.385779985 0.392771452 0.384666135 0.388768814 0.392800854 0.398972946 0.394946889 0.388856293 0.410220901 0.406231353 0.368302009 0.340016231 0.324814201 0.309748341 0.299977775 0.309458559 0.334868679 0.368022295 0.373671452 0.388063986 0.420154415 0.441111773 0.445734836 0.442573109 0.435664747 0.433506724 0.439555562 0.434254963 0.442349661 0.432639887 0.408797221 0.390457369 0.348317259 0.310449503 0.275829698 0.250863131 0.237004326 0.226018517 0.220904239 0.222826012 0.226336737 0.23797558 0.250614725 0.257284748 0.262802336 0.275625553 0.297426312 0.320003238 0.345225466 0.354817951 0.378106062 0.39721703 0.398815667 0.403896078 0.397662487 0.398098879 0.369022066 0.322229679 0.281756074 0.242505623 0.233920912 0.227952613 0.222052494 0.22469829 0.232696929 0.242025049 0.262651779 0.295687763 0.312047452 0.32921105 0.366940342 0.377273955 0.393026962 0.399050705 0.391904832 0.389630728 0.389562424 0.395392324 0.391835817 0.398415478 0.364135429 0.327085019 0.285920657 0.260855874 0.247692277 0.235704681 0.233872691 0.25052574 0.28088056 0.303591761 0.313899219 0.325973798 0.352107121 0.379439381 0.39848547 0.410658561 0.411284585 0.410423318 0.410745465 0.403894779 0.406024382 0.415852015 0.414500476 0.417207088 0.38516336 0.321824188 0.275080711 0.247802221 0.232377202 0.225937858 0.225266883 0.242390757 0.261249668 0.282799011 0.291023182 0.288320485 0.290785078 0.294328606 0.290853315 0.312553422 0.353485958 0.380119532 0.383993202 0.386308584 0.384935244 0.395844416 0.403212058 0.407353606 0.376563363 0.339511642 0.310598421 0.279917645 0.258220737 0.251480625 0.254003942 0.277154231 0.306759744 0.320567485 0.327797457 0.342580013 0.359909673 0.374714393 0.385638568 0.393112258 0.391411439 0.382126942 0.377405552 0.369462644 0.364916546 0.373706103 0.37737075 0.375806297 0.36457705 0.320570249 0.299161049 0.272875891 0.268034342 0.262601526 0.259764832 0.271678661 0.309092649 0.331665871 0.333167126 0.340002828 0.355707995 0.354221844 0.35685769 0.340607811 0.345481568 0.344894918 0.340230322 0.341766064 0.336815191 0.327476082 0.322266628 0.321407092 0.323808552 0.297369957 0.268885331 0.254183641 0.236905209 0.227556874 0.221119559 0.235370565 0.274192388 0.288736437 0.307001541 0.320399603 0.34038766 0.354748654 0.357338773 0.351934402 0.35026092 0.33377063 0.335151667 0.350727067 0.353495532 0.350484325 0.335607794 0.323597014 0.30685564 0.270602147 0.253088711 0.24041206 0.226675761 0.217399234 0.215190644 0.220228609 0.225158501 0.232517201 0.244134868 0.26284592 0.287751069 0.296981252 0.295295774 0.297322739 0.296360717 0.29503702 0.292427304 0.295260119 0.3047378 0.299666754 0.290466421 0.292779806 0.282596643 0.269615197 0.252906086 0.224652997 0.214459283 0.210179872 0.204007618 0.206686349 0.209735888 0.21029596 0.222873922 0.232277125 0.245566395 0.249149171 0.250576924 0.265361012 0.266236096 0.262442986 0.263406921 0.278719491 0.284862902 0.284860638 0.277658747 0.276439936 0.270728475 0.251096004 0.223640929 0.213054327 0.206073378 0.203329915 0.206339174 0.21491655 0.239186922 0.24460897 0.261920387 0.285115813 0.303109205 0.296803089 0.291415789 0.291048488 0.288926122 0.292453868 0.281166202 0.285069519 0.285126592 0.281925305 0.282259367 0.281891779 0.297646513 0.281323047 0.260432623 0.248590405 0.237955366 0.23403756 0.233102469 0.229181975 0.248670691 0.250346848 0.255383051 0.26720752 0.271840755 0.286175069 0.305106028 0.311184674 0.304865694 0.300429188 0.293860779 0.287273399 0.283632399 0.282447635 0.263889237 0.260286416 0.255580224 0.243051109 0.216806752 0.196075346 0.187581701 0.182005652 0.18522769 0.196098287 0.216018558 0.22247557 0.214535751 0.213594259 0.217580939 0.219120388 0.227649982 0.236471966 0.242092615 0.24083149 0.24058474 0.239708665 0.243143418 0.243445526 0.24347017 0.235905718 0.219631215 0.21660354 0.198294003 0.1892164 0.180767252 0.175180469 0.180529807 0.193758879 0.219622952 0.213885887 0.217145203 0.216359621 0.217870602 0.225840679 0.2366837 0.259100825 0.258970525 0.250968986 0.249692274 0.251850625 0.249333658 0.247549492 0.251756215 0.242459884 0.248269907 0.253928454 0.23141409 0.210363271 0.188901088 0.178601015 0.178365163 0.190821858 0.20241324 0.203226951 0.209256099 0.20371375 0.203173763 0.203796889 0.20199144 0.205823711 0.212473094 0.215325039 0.212352647 0.216245291 0.222183506 0.226109864 0.208654015 0.20679505 0.211509337 0.205515262 0.181788711 0.161209454 0.150417785 0.141801622 0.138253614 0.142252125 0.148058953 0.164873837 0.177546193 0.177228907 0.18138773 0.206014917 0.212566676 0.214942613 0.224484011 0.228340753 0.23062018 0.227330508 0.228770899 0.231850342 0.232422729 0.237561933 0.254910626 0.249626928 0.224633527 0.203825722 0.186021853 0.167882552 0.163119122 0.164666974 0.166834704 0.181114645 0.206352407 0.220491476 0.237518926 0.280167388 0.288050994 0.298144245 0.307273245 0.31454942 0.327045238 0.322574344 0.321619807 0.325341487 0.348714988 0.353735245 0.363254471 0.343877023 0.316705637 0.292811073 0.277886996 0.270309858 0.26885695 0.272991107 0.295346995 0.303068364 0.30953692 0.322118604 0.353115229 0.364060611 0.369401341 0.371770435 0.373008147 0.370962865 0.371410385 0.373348377 0.376223645 0.375987049 0.373813431 0.379749506 0.389165627 0.381233438 0.371907244 0.34717501 0.323410992 0.306152252 0.299582846 0.314228975 0.340859822 0.369538689 0.376488134 0.367144262 0.379494252 0.39125856 0.386016236 0.37712414 0.373789867 0.375799566 0.374658979 0.375782833 0.370131169 0.368588768 0.362478194 0.356538534 0.381986162 0.375681774 0.355456014 0.328839129 0.315105343 0.308106687 0.306738121 0.322262666 0.354385521 0.370821563 0.372068946 0.36447639 0.383790423 0.384937661 0.392900184 0.393031373 0.385971858 0.391315727 0.391135131 0.386271463 0.385390361 0.389608707 0.39416755 0.387243706 0.388980727 0.380709261 0.378899373 0.362178177 0.338044019 0.318976699 0.316271418 0.332298474 0.361316071 0.386450489 0.391386153 0.395561868 0.396036478 0.389365162 0.387844641 0.387247713 0.387544173 0.391198986 0.381795847 0.382696122 0.381925886 0.386583491 0.39592461 0.394064717 0.378260913 0.346883681 0.314056435 0.288941849 0.271645932 0.262741572 0.263258258 0.275678325 0.285737093 0.315085679 0.327579201 0.324848927 0.326966128 0.345747658 0.368356911 0.387821629 0.394257908 0.388965233 0.392077219 0.396585731 0.387941331 0.384180298 0.365010652 0.374636235 0.365627154 0.336825169 0.29905294 0.273584338 0.265043869 0.260322607 0.256987714 0.257581474 0.261286852 0.277769136 0.287671823 0.294523413 0.288966009 0.290586623 0.317419414 0.352883839 0.357144235 0.388480285 0.382917332 0.367874864 0.360396286 0.36546617 0.34985264 0.333388079 0.298616945 0.283163995 0.260971585 0.247688626 0.244123292 0.239659559 0.241262294 0.246188185 0.244274026 0.248737005 0.261398666 0.272154295 0.277294976 0.277222731 0.297467471 0.303202787 0.316708777 0.328977917 0.341421226 0.362568944 0.37773123 0.375799549 0.364588321 0.351967983 0.317732067 0.29866525 0.271665589 0.257463244 0.250631165 0.248488511 0.251927871 0.260534577 0.280645348 0.290121545 0.297951149 0.322424436 0.36145554 0.403874489 0.422945723 0.42714978 0.420075393 0.412131549 0.404140958 0.401982288 0.403415473 0.407603207 0.409221885 0.408852325 0.420026651 0.385459069 0.348481259 0.321842172 0.302338126 0.293187161 0.290879207 0.293252139 0.309492233 0.337763091 0.345353426 0.347520524 0.372228716 0.40440353 0.422072311 0.434728133 0.436865496 0.428072826 0.421262311 0.415455858 0.413506042 0.401273273 0.397247234 0.417832311 0.412395167 0.369150183 0.325075947 0.296453085 0.282901027 0.281090981 0.281313489 0.285851638 0.293611465 0.3024418 0.31776411 0.327506045 0.352440538 0.377365266 0.398934021 0.402826741 0.413102295 0.411266184 0.411534375 0.411982115 0.41737515 0.418295003 0.430945469 0.431778167 0.412982247 0.371071781 0.333837905 0.310489812 0.299604173 0.296913406 0.297055224 0.303699944 0.312737313 0.328651807 0.343406465 0.370376708 0.40562525 0.418330591 0.421913559 0.422826406 0.417154327 0.407504822 0.403592911 0.398898162 0.399953449 0.4035967 0.410840195 0.403107114 0.407343964 0.390118979 0.362880947 0.327029496 0.297790777 0.284636577 0.279362291 0.285534329 0.303065925 0.325722962 0.342108436 0.360935491 0.373464054 0.39340543 0.393254904 0.395039753 0.396489202 0.39441657 0.40071909 0.403015498 0.409728374 0.423839916 0.425394993 0.41814041 0.416105663 0.39476247 0.372028003 0.345585245 0.320003483 0.296739733 0.288897859 0.281000192 0.281775517 0.285402833 0.301247447 0.324765628 0.357767144 0.396287084 0.429741941 0.445041556 0.438413758 0.422966107 0.412999119 0.408440488 0.411626726 0.417744998 0.420552522 0.425397897 0.42620935 0.401454543 0.376761995 0.345536415 0.308639007 0.286992608 0.280972646 0.275500774 0.276978444 0.284221834 0.300357334 0.322959027 0.36324032 0.403465522 0.436059391 0.445494435 0.442240017 0.434421521 0.431172612 0.427710282 0.428300697 0.432250829 0.445027292 0.449415743 0.449630124 0.425331322 0.387269101 0.360628716 0.351236786 0.333426845 0.316952636 0.32522323 0.335671205 0.357827782 0.367634662 0.374266351 0.40988921 0.438340734 0.447315562 0.44982509 0.443250065 0.430970212 0.428708884 0.433682846 0.429324792 0.436357168 0.437102332 0.431796428 0.429522956 0.410549137 0.379082604 0.338708168 0.314224749 0.303210052 0.293771967 0.302880032 0.313845751 0.340603547 0.370469476 0.389880492 0.420403398 0.446127038 0.449207212 0.446789149 0.4438939 0.441686691 0.428329905 0.423386817 0.422496505 0.427574854 0.440635675 0.446738707 0.451593855 0.429565093 0.398478654 0.374668841 0.349501262 0.338864606 0.337792595 0.342374657 0.35062696 0.374144701 0.380552248 0.388678913 0.422347087 0.441839012 0.443804387 0.434837839 0.425299173 0.418882392 0.416912578 0.420105023 0.423370856 0.425450309 0.424664207 0.429114826 0.440971866 0.422080194 0.394755566 0.361134577 0.323420449 0.310747587 0.303883291 0.302093398 0.296601326 0.291459934 0.308772977 0.344277142 0.38109561 0.404414204 0.405758365 0.392301596 0.39327449 0.400053453 0.409056758 0.408159946 0.405154635 0.405178502 0.394543634 0.379135374 0.353548655 0.331921114 0.301805173 0.270470437 0.248308082 0.24094836 0.239453015 0.247788112 0.252330966 0.262818539 0.28970477 0.305816837 0.316280663 0.344849093 0.378121589 0.400157232 0.412336677 0.407284378 0.3995492 0.39866092 0.40540689 0.417110822 0.424379654 0.412020349 0.381608557 0.344790754 0.310660809 0.287821286 0.272959464 0.264951937 0.259775685 0.26207607 0.264651144 0.274574654 0.287935391 0.297735467 0.319759842 0.351792291 0.386072714 0.405615587 0.408805903 0.407194484 0.410078823 0.417952647 0.416623507 0.417617391 0.41350771 0.421222046 0.427184917 0.392720356 0.368382809 0.332803177 0.299108144 0.282267479 0.277710178 0.271752012 0.272309426 0.283754428 0.300352289 0.333113856 0.376598824 0.417944395 0.432825377 0.437881636 0.430426952 0.414438653 0.408139308 0.414003955 0.421291889 0.433374217 0.439482306 0.439749983 0.432602339 0.397664714 0.354030786 0.328128197 0.315623615 0.299995657 0.298497664 0.30810247 0.33289704 0.354034427 0.38423866 0.414848758 0.437322945 0.44594095 0.440102778 0.428183662 0.415752716 0.413810062 0.416648994 0.417291678 0.429063967 0.443899448 0.457238348 0.460466303 0.445951286 0.426301587 0.397087337 0.368659638 0.339641747 0.323447041 0.322229899 0.334533263 0.361673563 0.374515069 0.381410464 0.384395341 0.401214605 0.412374527 0.423397617 0.432392688 0.430616008 0.417266137 0.413786339 0.409959796 0.410064639 0.414388754 0.429478344 0.43487583 0.423958388 0.396315407 0.364699022 0.341205937 0.313919411 0.300791162 0.303376744 0.326917767 0.361308559 0.37958179 0.392765947 0.414995447 0.42881275 0.441180069 0.448736482 0.434521411 0.424131286 0.414273923 0.414073033 0.412465938 0.414962054 0.428424862 0.452649142 0.453335632 0.449557336 0.427250487 0.401173742 0.378785892 0.355842505 0.334425535 0.331602171 0.353527835 0.392373846 0.417320824 0.43178162 0.436902467 0.446964279 0.445163042 0.441162423 0.437864944 0.425218946 0.416267732 0.41876267 0.417860007 0.416192542 0.419403482 0.412738808 0.410804781 0.415611573 0.424143184 0.406498313 0.388916071 0.368197643 0.35156274 0.346087807 0.365368123 0.389637259 0.407119398 0.414992154 0.41657211 0.420011367 0.436777266 0.434182333 0.421769862 0.410476534 0.406418387 0.406803692 0.412700549 0.422225034 0.425241666 0.437536628 0.435437359 0.429299125 0.407709804 0.399022257 0.389637102 0.366643399 0.356673432 0.350276565 0.353742083 0.352349256 0.363532828 0.388368523 0.407073055 0.426090873 0.439600082 0.436531681 0.430106758 0.426072312 0.429032997 0.430056588 0.431214511 0.440588912 0.44143087 0.437138596 0.435474613 0.425691749 0.381358593 0.345161699 0.315844781 0.300500779 0.291290017 0.283970807 0.281959031 0.278998813 0.28576658 0.307770994 0.333276233 0.346138575 0.380486262 0.411877902 0.416624551 0.426190694 0.42572107 0.419968854 0.415579221 0.410556871 0.421007297 0.437622378 0.447013301 0.436887352 0.408375536 0.372178945 0.351692131 0.330232398 0.312700083 0.304339798 0.329837082 0.351713915 0.388028357 0.420859994 0.432593217 0.446006416 0.447524824 0.438304105 0.432979562 0.42970525 0.424616716 0.423079282 0.425538778 0.422361517 0.432401034 0.442663464 0.450354845 0.452031031 0.432836181 0.418879095 0.402176944 0.378050437 0.353907052 0.352437376 0.368557122 0.402132038 0.425499942 0.441004253 0.453973705 0.458638561 0.450151236 0.429237961 0.42526094 0.428095796 0.424487502 0.422812954 0.423181101 0.431833421 0.435068508 0.439977517 0.444766614 0.468137444 0.454553098 0.441798561 0.433023137 0.413582931 0.389387118 0.378881839 0.393071789 0.41653761 0.434004397 0.441977705 0.46173378 0.473439372 0.468629836 0.451745552 0.43878618 0.436337332 0.438177275 0.438932618 0.437601301 0.440135838 0.438895848 0.433628709 0.435961597 0.443448917 0.435853548 0.416977336 0.396394197 0.385390156 0.378926421 0.375877225 0.385433419 0.399580309 0.419538946 0.436681665 0.443234172 0.442476853 0.451399397 0.444788553 0.432501039 0.423043933 0.424661648 0.42823774 0.430338425 0.435992557 0.445862355 0.452121921 0.460485528 0.454699312 0.4264244 0.400805103 0.374992844 0.353308088 0.332995135 0.340668634 0.352861557 0.373095754 0.386469245 0.408143761 0.422439102 0.422771288 0.413901694 0.401825987 0.400716893 0.404524821 0.42007486 0.433895273 0.428918774 0.42881951 0.433582347 0.442926458 0.460516593 0.466984199 0.454829482 0.445600147 0.431479355 0.406580402 0.382675751 0.364414078 0.359550328 0.356558556 0.370956029 0.400256158 0.425752147 0.425095716 0.444611418 0.455993098 0.456290571 0.450445459 0.446255916 0.43788608 0.43458916 0.430071278 0.433737194 0.44889573 0.455578391 0.449771478 0.429858197 0.396334543 0.375527331 0.354345383 0.335347947 0.321167736 0.316264323 0.313378106 0.327278775 0.360262579 0.385452946 0.410277422 0.429677838 0.438555733 0.441499871 0.441086224 0.444209632 0.43683316 0.430208681 0.427412113 0.434092545 0.451781615 0.466067518 0.464829263 0.444736054 0.420210613 0.388781069 0.361835562 0.3512608 0.345887402 0.343647973 0.363426287 0.390884877 0.413421753 0.427222539 0.4499183 0.450100494 0.444953117 0.444813739 0.439553712 0.436661879 0.439335175 0.442308562 0.440810336 0.434364548 0.431876993 0.420187674 0.400172302 0.395700614 0.384757239 0.35864477 0.329597223 0.322744662 0.323233757 0.332881732 0.360242901 0.3754816 0.392145053 0.40537152 0.416914749 0.415423365 0.394579266 0.379278386 0.38398724 0.384073505 0.385183464 0.386857879 0.39395449 0.396624939 0.384417656 0.37357338 0.345389115 0.293067034 0.278227126 0.257193715 0.246983761 0.237940605 0.243719153 0.255023701 0.271431675 0.290857058 0.29896563 0.304165548 0.309378178 0.313339829 0.333460569 0.345149859 0.364833224 0.370637578 0.373031765 0.376781499 0.381094883 0.388603995 0.400051724 0.397170529 0.37064284 0.307673857 0.285009567 0.261119478 0.241319539 0.236273202 0.236504907 0.245842573 0.258539445 0.268995748 0.280710848 0.261764821 0.28604503 0.30416191 0.321755952 0.319141272 0.310139748 0.308143087 0.314033536 0.313294533 0.313354553 0.325517266 0.325507896 0.335832475 0.349713886 0.312750034 0.299528219 0.273579693 0.255804131 0.245862512 0.244281421 0.250554095 0.270424792 0.295535079 0.307200227 0.312188667 0.330333312 0.354701806 0.358886429 0.363829511 0.355067196 0.352780126 0.340030164 0.341808816 0.349855805 0.360035525 0.3659527 0.360981474 0.365450464 0.319305354 0.296393433 0.276273464 0.259430008 0.249744019 0.24590214 0.242458396 0.245891118 0.250222613 0.260708212 0.275633712 0.289996622 0.311106174 0.357842219 0.392741339 0.40856281 0.41125633 0.416236996 0.419074649 0.415460063 0.417635523 0.438029944 0.42916688 0.395878431 0.340899116 0.310641677 0.277124149 0.259401619 0.249625884 0.244850062 0.245217834 0.246826904 0.250502461 0.264408646 0.286039618 0.302567499 0.324668017 0.373740458 0.403854979 0.409217091 0.411247583 0.404857923 0.392116338 0.390058321 0.392884284 0.389384329 0.38693442 0.399642447 0.3565745 0.323345752 0.292561382 0.274114129 0.265374856 0.265286465 0.278279108 0.291591518 0.308140684 0.324485152 0.339617904 0.375992937 0.41295852 0.429276147 0.435012973 0.43100902 0.420516345 0.408765838 0.407685459 0.406739043 0.407666844 0.4039162 0.413122661 0.41776881 0.386039566 0.357856317 0.327989715 0.296673402 0.278292372 0.279398196 0.28971006 0.305801234 0.321916985 0.333850884 0.349641721 0.371718071 0.393895559 0.407297403 0.415872376 0.412455717 0.409013801 0.400765029 0.406409268 0.409346197 0.419408368 0.423578001 0.411697756 0.390510399 0.372013475 0.351607067 0.319917894 0.302739858 0.287015338 0.284542144 0.301869009 0.32439453 0.338330209 0.351634761 0.36985546 0.390387357 0.400533338 0.409754195 0.406615584 0.386979503 0.385261564 0.380506755 0.384310485 0.391157297 0.404267099 0.411595098 0.414857121 0.411539067 0.396863512 0.369168496 0.334710986 0.311839057 0.288478973 0.28621866 0.303950054 0.326509678 0.338464416 0.357282293 0.36782282 0.37886085 0.391647893 0.377784876 0.372134537 0.366201099 0.370694582 0.372894119 0.374837363 0.374274412 0.376205537 0.36830693 0.37218836 0.374999307 0.356739065 0.313572402 0.282403605 0.265221112 0.255646374 0.253215946 0.262388463 0.288529334 0.314095594 0.326575604 0.33389852 0.350056102 0.361736333 0.374432321 0.380791291 0.386610318 0.377784362 0.367430567 0.359663976 0.363518378 0.359919661 0.354500901 0.356287495 0.347491964 0.332475552 0.308210653 0.285798484 0.273644008 0.26565472 0.267850353 0.274250384 0.276099336 0.282042594 0.292592749 0.306320326 0.325539409 0.334441226 0.355778034 0.365032129 0.368629174 0.357911903 0.342151389 0.335067391 0.334781703 0.341663671 0.353488994 0.369733781 0.362730008 0.347204008 0.323562656 0.298920224 0.28080788 0.276145891 0.275942037 0.277877377 0.278558796 0.281482231 0.292264166 0.307828772 0.320012707 0.327078629 0.342582575 0.353103249 0.361471907 0.374193958 0.375600912 0.374558896 0.375320401 0.371274709 0.363917964 0.35771301 0.342335012 0.311005886 0.288685489 0.278824743 0.273972433 0.27295824 0.280855069 0.299030859 0.316415935 0.331438492 0.337780034 0.341912088 0.353405637 0.36620641 0.382607806 0.405889586 0.418141389 0.414407698 0.414086724 0.416623017 0.41952503 0.419517887 0.427175864 0.421377968 0.390383271 0.345685077 0.319108438 0.301969896 0.290124233 0.287931806 0.289083234 0.301259837 0.321056873 0.330752598 0.340706529 0.347655732 0.370180021 0.389469226 0.410771556 0.422488764 0.422004047 0.413065774 0.405578321 0.399480088 0.397419244 0.405313387 0.401537796 0.407346793 0.422460106 0.406033573 0.367887654 0.338386536 0.31723716 0.305901377 0.30725865 0.325962953 0.348049644 0.365685478 0.382953431 0.398928126 0.41374449 0.4283547 0.429814032 0.423149061 0.412762411 0.404854905 0.391770935 0.388399859 0.392261378 0.401780804 0.403477866 0.410208758 0.424927728 0.405236197 0.379704769 0.355165569 0.330387762 0.321777252 0.314828102 0.322613766 0.333937292 0.353922404 0.369071124 0.380197807 0.406561662 0.42631757 0.436847907 0.434475169 0.431620673 0.431232484 0.432056347 0.425409947 0.421949139 0.431727611 0.448995536 0.456806676 0.457135122 0.413174966 0.366904039 0.340022277 0.321826754 0.308074402 0.310106805 0.314183334 0.33932317 0.361624113 0.375102988 0.381507015 0.40491626 0.439143713 0.453249826 0.451954759 0.442603305 0.433389248 0.424280592 0.414346458 0.419335039 0.433693176 0.4437131 0.448222936 0.45450391 0.430498317 0.406724323 0.381716728 0.3404247 0.316576524 0.308833867 0.314248073 0.313186912 0.318356802 0.349570095 0.369417429 0.380673746 0.402949208 0.436204598 0.451653586 0.45176583 0.448518253 0.442176133 0.434134972 0.43528113 0.441710525 0.445580503 0.443871657 0.441404903 0.410435344 0.372110393 0.345384295 0.32607893 0.313058366 0.309691378 0.310659204 0.309805301 0.31393876 0.322743572 0.351000809 0.381594561 0.410378819 0.434095697 0.444486512 0.444758428 0.442358132 0.435494894 0.423006999 0.417089665 0.426715746 0.438950535 0.458444138 0.452216879 0.420791011 0.384611571 0.356459384 0.339707053 0.324431021 0.322724276 0.347020077 0.382944134 0.415871162 0.430995526 0.438819272 0.444472915 0.456831999 0.45657444 0.45210615 0.450447852 0.445688594 0.436562763 0.427941645 0.426278354 0.437863533 0.44900751 0.460621211 0.461587841 0.446161988 0.425682633 0.398890909 0.391614896 0.373442082 0.37232188 0.397161026 0.422238174 0.441345903 0.450323867 0.454679052 0.462068634 0.457915291 0.441766583 0.426793353 0.42785287 0.429020569 0.433411541 0.441292281 0.448213423 0.45195265 0.462507384 0.462045928 0.463697928 0.447927117 0.424435108 0.407769073 0.396256268 0.383968268 0.384162886 0.406819404 0.430746113 0.441223446 0.43482407 0.441007618 0.446944131 0.455945009 0.462769861 0.459001913 0.444791926 0.439813363 0.440182549 0.43877583 0.43173191 0.446907505 0.451374213 0.453541954 0.45633088 0.445498254 0.416175231 0.388751054 0.362242264 0.342461121 0.340080391 0.35943531 0.386116564 0.410416596 0.422132168 0.426218935 0.441851693 0.446376418 0.455417318 0.453049302 0.448399219 0.435369367 0.423317837 0.422012804 0.419786565 0.433978626 0.434315579 0.452673871 0.454728425 0.440030454 0.424756284 0.400694787 0.374764625 0.355357937 0.344654265 0.360263227 0.377929571 0.398484847 0.418993487 0.440123114 0.447109137 0.457585356 0.449947529 0.447530654 0.440815351 0.42999899 0.428229375 0.429205517 0.427347123 0.447521859 0.459235285 0.465460462 0.454951789 0.436992338 0.40796938 0.401670363 0.382828639 0.359518875 0.340964876 0.340545318 0.341953644 0.34921329 0.385262124 0.421160953 0.434463174 0.445620437 0.448894997 0.444647935 0.442495232 0.436879904 0.43855825 0.442789967 0.450449332 0.461153263 0.459844757 0.451149389 0.436934293 0.40001093 0.378256734 0.354787874 0.334202976 0.314430206 0.307461664 0.307739536 0.314602762 0.323314118 0.359159558 0.402304275 0.41844092 0.42714229 0.443745455 0.448471524 0.439103196 0.436284348 0.426970064 0.42052956 0.424914223 0.436961775 0.444554247 0.450831492 0.450596291 0.435616806 0.408830463 0.394360368 0.377113134 0.361416814 0.3617896 0.382517278 0.421039617 0.442721795 0.449348302 0.449275777 0.445304887 0.449202765 0.441221483 0.430640618 0.432165216 0.440542244 0.445999352 0.446808451 0.446543616 0.44707228 0.44711255 0.45102515 0.438320416 0.406090603 0.388522549 0.365506617 0.343847066 0.3341038 0.340455833 0.361681534 0.40722551 0.424045229 0.424216608 0.421893668 0.437311113 0.450066099 0.449407528 0.451168217 0.44359667 0.421723768 0.406243147 0.411544542 0.412830954 0.415544192 0.420271902 0.43475658 0.444858212 0.432436645 0.402264856 0.370807775 0.35546445 0.354205322 0.356505141 0.380815297 0.416566095 0.425723453 0.434695236 0.438053538 0.435418935 0.449491723 0.455686841 0.440626177 0.428570416 0.42880848 0.422536682 0.424944515 0.435004974 0.449825394 0.445410813 0.435755806 0.439315198 0.416796465 0.40311396 0.387457078 0.373085264 0.358263205 0.357898199 0.385651621 0.420975113 0.427368105 0.436456296 0.438229157 0.448981582 0.454469726 0.447278041 0.434319233 0.43583551 0.438397935 0.442895221 0.453601121 0.449352838 0.443942019 0.441668448 0.43699302 0.43373683 0.405854136 0.367870302 0.335339951 0.327179874 0.322757926 0.326487638 0.340386148 0.369052327 0.383228685 0.392944685 0.406022194 0.425034838 0.433771285 0.431958215 0.433471644 0.436847411 0.44286919 0.445844783 0.44642695 0.443487949 0.434753334 0.43302868 0.44216302 0.430960807 0.388222805 0.34976918 0.318954569 0.304657751 0.297050692 0.296267388 0.29276277 0.30312996 0.303699421 0.309660711 0.315287941 0.328180432 0.325741438 0.326501581 0.335228809 0.323998818 0.318625926 0.314412752 0.309522221 0.309533142 0.311965272 0.313523492 0.310148887 0.305198344 0.294937394 0.285764672 0.277940299 0.269311765 0.266020149 0.251920229 0.249978978 0.258433521 0.263042698 0.27399746 0.281664212 0.281507677 0.283059548 0.294555886 0.310908798 0.314348075 0.322882534 0.333955322 0.337246 0.338690473 0.340831932 0.334698754 0.347957767 0.334065519 0.307580515 0.293820632 0.275328419 0.273160324 0.270609339 0.272175979 0.285206286 0.309983837 0.321756519 0.322956313 0.318643694 0.315306405 0.328856537 0.350738569 0.365442907 0.367275865 0.371942039 0.367775923 0.380113433 0.380063587 0.373027562 0.381736423 0.395805705 0.36671852 0.327949696 0.295600586 0.275069072 0.270129768 0.268698432 0.270103955 0.286770046 0.318218865 0.343056362 0.346534488 0.348912058 0.348344081 0.353671449 0.373142298 0.396419637 0.408450899 0.40613043 0.411186661 0.41500849 0.414819599 0.420487256 0.417195373 0.426635212 0.404237964 0.350143657 0.319178391 0.297186643 0.281309571 0.282453269 0.28474126 0.299108238 0.344028563 0.363230693 0.369178378 0.360913278 0.35859151 0.358951882 0.371701763 0.379319123 0.38721495 0.383848765 0.383283458 0.381952911 0.385078314 0.393099548 0.390051121 0.396201486 0.415581925 0.375609032 0.326820512 0.300742777 0.29064464 0.282110422 0.284295942 0.29650719 0.327602609 0.329509015 0.329532136 0.329054819 0.337632647 0.364735517 0.387587929 0.404159596 0.419078031 0.41097517 0.407013137 0.405757022 0.400023878 0.398960263 0.394879892 0.387373981 0.3549996 0.31859025 0.306085229 0.289290064 0.276488302 0.275052594 0.274209881 0.285993944 0.303346695 0.299893227 0.303583542 0.304225097 0.305094896 0.328238785 0.37596046 0.409967985 0.423386558 0.415713892 0.406124669 0.393099169 0.395603488 0.414013973 0.429829691 0.428571924 0.410251386 0.35918008 0.342824835 0.324314484 0.294146006 0.27878034 0.271887789 0.271846014 0.278208058 0.281868699 0.292259322 0.302060695 0.305681619 0.341160633 0.381457981 0.409287116 0.411868928 0.402573597 0.394408215 0.387253317 0.392869626 0.409241395 0.416419692 0.41832674 0.400838719 0.354990059 0.326421267 0.291675859 0.278005345 0.273055236 0.271383659 0.276609438 0.273248869 0.278371024 0.290197183 0.319643386 0.338191663 0.361624294 0.388873943 0.415271126 0.417272609 0.411012413 0.403817137 0.398842025 0.403362147 0.416449552 0.422818946 0.426598313 0.412907405 0.37860159 0.346400061 0.309745857 0.297867796 0.291049753 0.284148731 0.290694939 0.296304226 0.297358039 0.308586547 0.327031699 0.355578448 0.363975901 0.376514874 0.390005181 0.394924631 0.394313712 0.386033841 0.387881151 0.389777164 0.406259266 0.414711588 0.424173541 0.419702993 0.400808213 0.377746782 0.3401916 0.305948871 0.292295834 0.293875838 0.316584699 0.369713035 0.394959832 0.406107856 0.417760397 0.422553142 0.419800298 0.41375915 0.401200201 0.400964531 0.404224106 0.399131449 0.400632703 0.403617182 0.410097924 0.410288648 0.418438191 0.428841095 0.422742351 0.406300483 0.377086086 0.353079796 0.334345057 0.33309965 0.361981744 0.414093774 0.426982602 0.428846223 0.428516707 0.42549932 0.423573087 0.417374081 0.415457113 0.408101595 0.399043047 0.39822817 0.391475887 0.390110042 0.398441735 0.408037935 0.406723535 0.42627611 0.415447527 0.411019665 0.397998501 0.375144583 0.361527548 0.367205643 0.37390869 0.40773226 0.427242175 0.437889067 0.443027735 0.428216781 0.409852987 0.413348666 0.408081973 0.407544337 0.408726228 0.404898131 0.40410606 0.408425881 0.414418654 0.41900253 0.431507699 0.422604304 0.41617464 0.411892734 0.406632874 0.399591595 0.393579976 0.382358599 0.396232096 0.429510546 0.439862022 0.442834293 0.448842126 0.445691889 0.442269539 0.4435992 0.42282748 0.41575756 0.411895338 0.413018697 0.415573289 0.418114947 0.435213603 0.443891449 0.443307685 0.435787774 0.404399473 0.375617256 0.351325665 0.328354257 0.29837597 0.28472756 0.285253596 0.29907749 0.311687786 0.335134275 0.358184889 0.371128307 0.385742469 0.377859645 0.378313749 0.379564744 0.369235989 0.369489154 0.37628309 0.379247711 0.381390752 0.379644564 0.384543206 0.394606026 0.373378309 0.364905659 0.35469653 0.336629275 0.3146464 0.288036246 0.2907436 0.290380208 0.292393489 0.320493182 0.353728805 0.366628873 0.385169184 0.386639787 0.401194788 0.405079801 0.389872298 0.384070763 0.383648562 0.385998513 0.385587952 0.385142249 0.389953672 0.401445531 0.387545404 0.36437908 0.35702635 0.344457963 0.332434682 0.338743937 0.352275054 0.385142145 0.401175597 0.399479656 0.404749268 0.40775765 0.413656124 0.411011821 0.392517949 0.377813796 0.382864911 0.390973804 0.388172499 0.388201301 0.395922495 0.3947061 0.402421774 0.417480023 0.410833213 0.381978517 0.367663459 0.358618095 0.33444459 0.344746645 0.358835215 0.382582549 0.391625318 0.39444334 0.396861265 0.403128903 0.408648122 0.415778406 0.410815075 0.399264983 0.388797723 0.388547424 0.386689389 0.386506396 0.398486566 0.402584681 0.412781978 0.394905945 0.387260776 0.380100427 0.359108159 0.336803786 0.314429773 0.309887052 0.337507844 0.383493862 0.386525239 0.388077779 0.391046009 0.396315802 0.397363107 0.409236195 0.406304244 0.396717996 0.391253304 0.385304799 0.384713336 0.389529199 0.396175527 0.396054173 0.395937247 0.398476265 0.404809119 0.384492537 0.373992264 0.354525424 0.333840429 0.332586093 0.353882502 0.382488227 0.381442812 0.384327394 0.392071056 0.400670929 0.406008487 0.410026684 0.396029738 0.398190722 0.396904666 0.395320615 0.393963836 0.392516265 0.399957839 0.39296683 0.392230521 0.375738992 0.37873599 0.353110533 0.341053959 0.333676519 0.329653309 0.328361953 0.338119651 0.354410246 0.352053942 0.349563385 0.353454964 0.361661584 0.369523036 0.374307097 0.36485913 0.369937306 0.366523401 0.370606376 0.373746589 0.361947067 0.361662895 0.364334724 0.370289978 0.361033089 0.349548645 0.343223951 0.331238556 0.326557968 0.315701064 0.309341414 0.311433641 0.323442975 0.339924839 0.357508718 0.363607712 0.368296796 0.362388176 0.380575138 0.384043063 0.374987688 0.368969683 0.358378591 0.358106909 0.363563452 0.358270868 0.358461379 0.377082824 0.380998996 0.362250073 0.345674937 0.319787974 0.297813257 0.290001069 0.279013527 0.276554326 0.289737726 0.294388425 0.319216327 0.348706456 0.361582645 0.367180662 0.366551798 0.370510367 0.365429921 0.361119093 0.35618661 0.358783129 0.364171664 0.368693808 0.364493741 0.370409329 0.385572421 0.367756414 0.351160448 0.321746728 0.305493845 0.297222026 0.296489464 0.321149383 0.369536875 0.373364203 0.374258946 0.377272207 0.37731542 0.38913079 0.402384392 0.396452093 0.393513411 0.399489536 0.401493497 0.404468665 0.411945752 0.406719449 0.395843233 0.394788875 0.400355066 0.374695221 0.362989986 0.349372164 0.32461967 0.306131895 0.306091791 0.335782443 0.369060809 0.367862481 0.365677153 0.372095928 0.377396666 0.385255292 0.39578991 0.393692808 0.398316643 0.397837161 0.403772433 0.406193118 0.412588186 0.411847089 0.411244914 0.414511523 0.41690752 0.393356417 0.35998159 0.322611253 0.300065697 0.291469718 0.286716902 0.295827481 0.329464878 0.339219715 0.333251132 0.327515301 0.318463815 0.324546085 0.33365679 0.339808358 0.346672604 0.344657886 0.33436294 0.332350478 0.33402339 0.338055181 0.341656703 0.349250228 0.317777141 0.292485069 0.25571675 0.238410505 0.23365326 0.22699173 0.230594599 0.243749732 0.27188693 0.264350652 0.272343543 0.26599995 0.268253667 0.278365553 0.307220699 0.331778273 0.339708523 0.341163302 0.34543064 0.356420821 0.36631083 0.364502025 0.356522426 0.352310407 0.327481894 0.281395611 0.234279242 0.210698047 0.200730509 0.199752067 0.201163876 0.21728323 0.255959389 0.275515332 0.259129499 0.250214548 0.248538071 0.249578105 0.251798242 0.274728286 0.30613341 0.323097478 0.325352866 0.331433211 0.324043462 0.326898929 0.326061018 0.321323952 0.300250985 0.26369192 0.234606617 0.220035552 0.213326529 0.213333685 0.21338763 0.217768734 0.225066542 0.231079517 0.237873615 0.242031538 0.24857538 0.265384275 0.286200425 0.306532213 0.32213392 0.316677561 0.307323276 0.313952105 0.322370285 0.328584442 0.331241467 0.345273233 0.334360026 0.308981657 0.274636521 0.241822152 0.221499796 0.217200475 0.217085415 0.217231183 0.220671589 0.226128 0.240506812 0.261439296 0.276780992 0.312327358 0.337500365 0.34934266 0.343660229 0.344783829 0.35244595 0.364862077 0.374673021 0.369700124 0.365562739 0.360215036 0.343649084 0.317001986 0.286577316 0.258153928 0.243428706 0.238369015 0.244474818 0.267342679 0.313409946 0.328126313 0.327139646 0.332450944 0.347042846 0.366564002 0.37130684 0.39441928 0.398403881 0.391121058 0.388396292 0.391720758 0.404890205 0.406678582 0.411789206 0.4182668 0.38699415 0.353167075 0.337906332 0.323698042 0.308357459 0.286714227 0.286299759 0.310737982 0.36354661 0.371571795 0.370293317 0.373425409 0.377551049 0.382851826 0.402204635 0.403243467 0.39379155 0.395170316 0.39044445 0.393289215 0.399913341 0.401246514 0.417316774 0.411210297 0.387354997 0.367292725 0.339246077 0.320541104 0.287607516 0.273856511 0.274207366 0.289268425 0.328613481 0.344200322 0.344436614 0.347097494 0.35184104 0.358437605 0.373509537 0.404385234 0.394868618 0.390991415 0.386899101 0.388489073 0.39788395 0.398028351 0.399487325 0.400803515 0.409277731 0.373744569 0.335840495 0.318498966 0.304568943 0.290641948 0.293136429 0.314563933 0.370453929 0.386924222 0.396505319 0.40034257 0.397593923 0.39525847 0.398634927 0.405895611 0.400102681 0.399671655 0.393574376 0.394798938 0.404412162 0.411907246 0.413186081 0.412610725 0.416764725 0.4109159 0.383487279 0.360303264 0.327787089 0.30896812 0.310201459 0.321132091 0.376321523 0.38978156 0.391859006 0.396133853 0.399944601 0.412247748 0.407104432 0.413896693 0.404027833 0.408601757 0.402573639 0.405918883 0.411349244 0.410650428 0.407709384 0.414702294 0.420882623 0.396620601 0.383268424 0.367530265 0.350979875 0.330880554 0.314104966 0.319644327 0.343610599 0.348487766 0.367447813 0.379902847 0.38958125 0.392419907 0.404149307 0.410143812 0.400637276 0.397574931 0.396271553 0.396701768 0.403805093 0.404701043 0.400939339 0.418919527 0.414031359 0.37483187 0.353248435 0.332726313 0.301104939 0.277313461 0.267316717 0.266667597 0.282419355 0.299289354 0.314746946 0.358150738 0.383922582 0.39594288 0.399341833 0.399968991 0.396392485 0.403512722 0.399801949 0.401168164 0.408778899 0.403802584 0.404145934 0.408891 0.410556509 0.411156609 0.378549952 0.375404751 0.36987405 0.359190795 0.358177823 0.384506236 0.412303347 0.415186881 0.418935001 0.421876704 0.417572792 0.419260208 0.41477493 0.405082394 0.404903539 0.397241477 0.402359558 0.405330144 0.406727422 0.414622897 0.420958757 0.427214759 0.419407128 0.390192047 0.362016577 0.345762305 0.330431029 0.315362293 0.317721569 0.348653635 0.393046879 0.400538368 0.386076283 0.390678081 0.40600032 0.414907041 0.411455167 0.406093635 0.404388217 0.398501773 0.400796314 0.404746512 0.409930943 0.40792023 0.413550664 0.434793148 0.417112684 0.394144027 0.378691592 0.358840911 0.332213702 0.320896753 0.31619142 0.346009173 0.380570819 0.391813139 0.38047783 0.385852994 0.394755589 0.398934571 0.397696631 0.395662027 0.394847801 0.393536985 0.393242396 0.404136215 0.406437473 0.413948984 0.423775653 0.424289131 0.401399609 0.380982743 0.369321585 0.361304219 0.355946145 0.343538995 0.339052852 0.353580459 0.380461739 0.387825197 0.377175932 0.384821024 0.390463153 0.417784659 0.412759792 0.409838029 0.399644657 0.399028192 0.400942805 0.401576356 0.407748673 0.409338653 0.412024184 0.395016786 0.400130344 0.372871555 0.360566437 0.350059482 0.337405575 0.323911359 0.31604007 0.332968174 0.35897643 0.360868829 0.36078578 0.36215547 0.378105449 0.395683435 0.390810512 0.389673707 0.386241631 0.391746344 0.388043344 0.393064669 0.390883488 0.386637789 0.384603103 0.374236414 0.34602955 0.332461212 0.31250023 0.290907563 0.281415708 0.272615252 0.263385051 0.259180108 0.256242698 0.248142524 0.255220819 0.254483158 0.258929404 0.264782618 0.268559089 0.265008174 0.263183933 0.263432845 0.266986266 0.276502214 0.28034411 0.280268185 0.271753839 0.262026925 0.239271549 0.214791241 0.189546171 0.183691517 0.178823507 0.178402226 0.180078809 0.186936635 0.188990629 0.196724943 0.204407493 0.208058467 0.213690227 0.219827618 0.232275673 0.238257439 0.253255608 0.257076608 0.260439124 0.249900378 0.249217946 0.247176957 0.250334686 0.257278595 0.27074828 0.253669236 0.219163645 0.206127983 0.197201729 0.195257128 0.201580396 0.231030937 0.237575808 0.260966613 0.282317839 0.285105397 0.287358239 0.30074463 0.310987444 0.315135778 0.315901094 0.309924333 0.307250664 0.312844342 0.317520202 0.314933296 0.322569172 0.325964557 0.318178278 0.297028053 0.280015294 0.269081081 0.256001661 0.252879183 0.254689263 0.271243776 0.286782055 0.291043356 0.297301682 0.296913476 0.295492927 0.30699415 0.314888349 0.316549895 0.32107283 0.326589758 0.324266606 0.327470354 0.329804339 0.314601983 0.319854557 0.327483938 0.307565195 0.27828698 0.249149204 0.22713287 0.222268998 0.21517433 0.220694748 0.257952961 0.290083291 0.298542776 0.290144818 0.299539336 0.293371916 0.288321276 0.289010828 0.300088087 0.305661248 0.312182813 0.313933396 0.306669787 0.304255246 0.3030311 0.306435811 0.306446235 0.293595108 0.258185219 0.224285556 0.194780372 0.179693499 0.176502789 0.179862468 0.207076274 0.247034356 0.25797764 0.261160124 0.260648029 0.254991303 0.250758864 0.250220421 0.255340044 0.265544553 0.259862919 0.254105043 0.258289586 0.256646057 0.248329148 0.255565858 0.246362252 0.234927007 0.207997566 0.176515728 0.163918146 0.160410705 0.153889907 0.167446169 0.184202345 0.21006886 0.213916206 0.225744976 0.225520727 0.219305911 0.211016364 0.214466709 0.224453669 0.240220419 0.244691527 0.238114463 0.242101746 0.250922364 0.244280079 0.243416146 0.242432572 0.237925055 0.222640017 0.197999457 0.171927827 0.151026799 0.144199012 0.144865423 0.149965366 0.16511891 0.170896826 0.202318679 0.199920169 0.19998839 0.20150166 0.201443641 0.213990147 0.218426251 0.221115303 0.224419094 0.219690331 0.224340139 0.224915146 0.228308515 0.242370118 0.240839394 0.216636257 0.192094061 0.174065402 0.16399626 0.156528045 0.154704795 0.163478306 0.168642511 0.167601282 0.204408763 0.219075987 0.222566222 0.224114054 0.226639371 0.219567959 0.219163816 0.220902034 0.216351955 0.206951248 0.205745525 0.205965378 0.210165944 0.225686683 0.226729071 0.216367379 0.20164191 0.190894758 0.180406873 0.182278378 0.19602755 0.227448491 0.244491949 0.244150428 0.250228312 0.263067435 0.26029068 0.26093128 0.262509753 0.26346273 0.259897797 0.256189319 0.265958407 0.269249679 0.274525902 0.274063222 0.269048971 0.270491039 0.234845679 0.217419469 0.208608531 0.197166519 0.178485096 0.168928541 0.171540719 0.202945788 0.235951779 0.232970768 0.241432452 0.229914916 0.224624121 0.22344773 0.22444692 0.230845662 0.23583247 0.236321972 0.22969319 0.226285247 0.22692464 0.229317743 0.231464253 0.220117615 0.205654547 0.20758045 0.197903544 0.180581585 0.174121822 0.168885188 0.173982484 0.196430665 0.232670099 0.22590227 0.221988296 0.221670765 0.222400319 0.233336811 0.233958112 0.232899644 0.239600198 0.243456319 0.24094628 0.239741691 0.239531078 0.234709151 0.242268087 0.236992319 0.226370224 0.198712955 0.183527051 0.167063473 0.157684747 0.160861327 0.17775116 0.21954167 0.2491576 0.24614985 0.252867302 0.238823337 0.208532937 0.208904502 0.214364842 0.207717661 0.211515542 0.217248462 0.233091828 0.244995743 0.260493687 0.253003503 0.255296719 0.254481809 0.235300178 0.208078621 0.195453185 0.190960549 0.191293312 0.191256691 0.198431373 0.216043871 0.226780734 0.236222888 0.23941074 0.227211897 0.205170828 0.194272192 0.19231936 0.191660018 0.187083751 0.197744355 0.208432065 0.233049615 0.233239959 0.240366745 0.241203909 0.240987512 0.239986372 0.216424937 0.203924338 0.186978358 0.176690346 0.175349829 0.183417204 0.189242723 0.211251549 0.219636343 0.231559892 0.231314782 0.234846707 0.237078417 0.234700905 0.240157517 0.228157535 0.241781546 0.253499898 0.258844068 0.258661318 0.247077948 0.247049265 0.245638141 0.237782099 0.214702133 0.189674469 0.172817229 0.16036372 0.160753345 0.163148186 0.173909027 0.205661871 0.218315753 0.231519314 0.245411606 0.248399553 0.244228393 0.251519078 0.250891069 0.244223926 0.244653506 0.254748085 0.26848343 0.273850913 0.267923775 0.281722326 0.279542811 0.262590097 0.222179506 0.191120306 0.175067233 0.165626633 0.166378175 0.179184816 0.22065925 0.266114175 0.291775275 0.301097982 0.290602779 0.276982092 0.268148634 0.262106501 0.268714582 0.283403514 0.288393646 0.296610567 0.296061666 0.289920245 0.289254904 0.296018871 0.298661883 0.293185178 0.265818197 0.23637397 0.22511128 0.212004838 0.207417316 0.212235747 0.240189152 0.275798119 0.286033612 0.305000288 0.306839063 0.310020567 0.308656221 0.310077417 0.310420875 0.309808527 0.310549548 0.303065918 0.29441012 0.288511586 0.293335786 0.291090759 0.294987091 0.27987231 0.275076601 0.233319179 0.207246034 0.208086972 0.204780671 0.212032881 0.240808778 0.264292701 0.268259447 0.283307694 0.264077941 0.250965866 0.236302492 0.232770642 0.233640841 0.239896013 0.257222858 0.268223621 0.27112836 0.257406153 0.254934307 0.265359245 0.272031223 0.279542797 0.259891506 0.242539216 0.220846874 0.215381823 0.217543766 0.239009548 0.267243669 0.283790205 0.287930056 0.30205689 0.282024373 0.272699138 0.264536468 0.259397476 0.260258058 0.263630991 0.2745828 0.286690951 0.301865052 0.297665237 0.285395386 0.292007691 0.293710575 0.296075172 0.267127242 0.255030719 0.238854878 0.225414421 0.226627553 0.236095025 0.256595619 0.283948468 0.278044362 0.289874797 0.297983654 0.282961406 0.273875922 0.269215112 0.282951028 0.281965041 0.2900384 0.284747683 0.285354416 0.27914267 0.278136756 0.280415494 0.287981351 0.290702585 0.279509277 0.26595484 0.246972964 0.243311868 0.236210919 0.237291482 0.242674578 0.25815371 0.275898845 0.288323067 0.273446639 0.266030555 0.267682006 0.27219317 0.283343439 0.291283035 0.292075501 0.290103127 0.294726682 0.285122212 0.282238274 0.28359798 0.28432897 0.28618329 0.280972872 0.285526603 0.27294608 0.272405405 0.269303119 0.269418998 0.270575532 0.281837628 0.295307448 0.303281428 0.30887129 0.30366269 0.306356638 0.30413782 0.298125924 0.295515623 0.291104216 0.27982821 0.280828573 0.281672551 0.279077832 0.278196858 0.27978308 0.296517644 0.279428011 0.269575997 0.24795892 0.239955194 0.232396015 0.234695511 0.254691274 0.287241742 0.304389941 0.294584629 0.286946365 0.280182481 0.28084516 0.28812564 0.310807054 0.312993962 0.312613418 0.312404702 0.29659141 0.301934558 0.301760415 0.301032705 0.290316501 0.308781254 0.301798051 0.278967405 0.246130628 0.220503494 0.216362772 0.23223233 0.249729259 0.295476613 0.298917141 0.306410529 0.303085075 0.296124407 0.299671318 0.302701575 0.305546871 0.308467611 0.311172433 0.3180919 0.31823135 0.305001501 0.303077627 0.316427948 0.325328784 0.29771627 0.292689052 0.306011981 0.305829815 0.305123168 0.301268103 0.306300351 0.295401072 0.298253767 0.282931917 0.292619615 0.29749548 0.310376619 0.325476687 0.335909703 0.336180571 0.335411457 0.336256269 0.332273891 0.3331895 0.325723757 0.32139893 0.32706732 0.332834615 0.316908288 0.304259371 0.316804347 0.308724545 0.306500197 0.305545947 0.308632161 0.298271392 0.311490172 0.313208858 0.326724356 0.317271101 0.316792844 0.326607251 0.329293126 0.324390118 0.32018265 0.313761093 0.309172423 0.306065828 0.309957529 0.312931318 0.323168258 0.323086448 0.311435486 0.287123859 0.286639498 0.272871196 0.272190729 0.268252302 0.27542384 0.271437628 0.295992094 0.2912077 0.291680841 0.310748409 0.300564656 0.286477441 0.27265163 0.247850979 0.232884219 0.228820894 0.248517042 0.254894366 0.315419021 0.298244772 0.306186666 0.312753582 0.314219595 0.287482195 0.300412162 0.295286212 0.299002389 0.303707328 0.307584282 0.301342492 0.292900465 0.290643711 0.286969268 0.298916649 0.308104999 0.291603036 0.281916992 0.258465652 0.245424507 0.248917133 0.276294353 0.313156143 0.310492006 0.304339215 0.304996931 0.306057502 0.311213102 0.303117101 0.309599803 0.291954557 0.295263317 0.296846224 0.307643525 0.293798445 0.313668735 0.30475143 0.301390535 0.309182897 0.297037295 0.277482707 0.26153823 0.260974125 0.247959223 0.255048828 0.284734967 0.313934008 0.303528268 0.2924158 0.294219086 0.299771865 0.309619768 0.314120527 0.330514037 0.330461805 0.330203373 0.3282031 0.343885155 0.346023758 0.347662762 0.335445897 0.336099103 0.343624576 0.3403443 0.330622367 0.329217156 0.327195408 0.336032341 0.34196037 0.349550441 0.362819996 0.358364202 0.354522836 0.358932548 0.362159565 0.367339139 0.345925137 0.340031184 0.32764084 0.316358128 0.312477505 0.321298377 0.327104084 0.334436821 0.372412631 0.363041248 0.352733731 0.340065039 0.333115904 0.327417019 0.318602227 0.327313572 0.339635315 0.334888668 0.339804294 0.333486615 0.326765145 0.334019665 0.339230673 0.339599388 0.338467339 0.3294884 0.311833427 0.295168528 0.294294388 0.308807551 0.317990785 0.305190734 0.320312797 0.314220742 0.32128733 0.312249167 0.306554147 0.308831952 0.305583595 0.307661533 0.316640665 0.320806646 0.33025038 0.327577708 0.313611622 0.318796608 0.326828471 0.33524018 0.333747671 0.31986525 0.324486904 0.327879144 0.330031815 0.333473494 0.334356291 0.326685986 0.326979313 0.32090554 0.329182875 0.334192106 0.320792512 0.302908874 0.305621819 0.318514241 0.337582828 0.343120854 0.342338027 0.318455765 0.312016322 0.322882084 0.34084033 0.345967225 0.338113987 0.316462909 0.30633015 0.289818082 0.279210404 0.277153893 0.292966729 0.308329118 0.350266453 0.348410293 0.335099848 0.333841773 0.325915487 0.321294443 0.312973286 0.297376227 0.318302075 0.356216462 0.367005093 0.358756369 0.352638052 0.352883006 0.372565073 0.3837306 0.391239936 0.394819909 0.396427332 0.394852102 0.394659028 0.392219643 0.39255158 0.388671974 0.376328066 0.369069944 0.377136403 0.381364412 0.368054273 0.376123811 0.373136207 0.374495928 0.36895659 0.38683309 0.388677329 0.384574548 0.368335745 0.3625346 0.359633598 0.360612601 0.365977397 0.374556403 0.378474642 0.378576153 0.377492204 0.375046302 0.374666555 0.364967444 0.353908701 0.354276991 0.360193852 0.379811744 0.391056209 0.380198985 0.351419785 0.330408331 0.347211537 0.377326774 0.392148904 0.39254008 0.381540977 0.389347161 0.399154164 0.401094247 0.362350059 0.367679483 0.371812269 0.372204121 0.373399188 0.374244061 0.372000302 0.361210002 0.374342379 0.365710059 0.372528795 0.38479393 0.380080082 0.376950676 0.379113494 0.371634577 0.383105196 0.398589815 0.401000785 0.409997279 0.393077741 0.393360568 0.410661656 0.41779232 0.374731818 0.367213229 0.377040313 0.377154129 0.371649555 0.367371935 0.361997858 0.375282266 0.427304934 0.416829967 0.419778437 0.428349359 0.42155455 0.422580063 0.424315069 0.422716191 0.425896013 0.43769643 0.445941521 0.428588165 0.411490379 0.407928438 0.410255225 0.418178393 0.408255814 0.425969604 0.440269367 0.443167614 0.446354043 0.448937736 0.437313147 0.430030911 0.417360978 0.416923655 0.410592615 0.415209722 0.42610853 0.443629161 0.439397803 0.420226345 0.41559895 0.443635947 0.439165898 0.427858526 0.415821557 0.411999668 0.415852048 0.413899835 0.429267662 0.439736364 0.461385627 0.464781527 0.465090605 0.464164917 0.454818603 0.439587367 0.428341382 0.423989244 0.423302968 0.426920664 0.441251382 0.449197487 0.445168745 0.451717822 0.455175319 0.45611222 0.449823906 0.450297619 0.432036479 0.424523057 0.430796398 0.447421285 0.417579908 0.420082392 0.427401303 0.411995965 0.409352007 0.411124296 0.408598023 0.411816394 0.39981748 0.395604906 0.401751631 0.398204338 0.390808935 0.385651705 0.377935656 0.380820286 0.391919062 0.389261634 0.382227663 0.358110974 0.354252058 0.358826851 0.373132356 0.380391817 0.374475049 0.379045591 0.375257418 0.370949025 0.369835765 0.370797755 0.372543151 0.379393711 0.375423002 0.369616942 0.381091423 0.382131925 0.377139482 0.372542531 0.361952553 0.368441649 0.379972434 0.381404175 0.376189891 0.364683476 0.35920221 0.359952874 0.366862249 0.372089089 0.377862873 0.380716367 0.378092842 0.375461856 0.373916776 0.374776759 0.370768768 0.379701164 0.376006712 0.367100955 0.359828751 0.366676127 0.347553606 0.348570324 0.341228334 0.357059023 0.361872385 0.363991242 0.360380593 0.36211224 0.349906563 0.353489285 0.364403171 0.361735681 0.361761993 0.363118593 0.361978033 0.358366463 0.362684117 0.362577519 0.36576831 0.377613462 0.3353783 0.321592742 0.32699506 0.332832269 0.337645092 0.343382936 0.351829841 0.372780103 0.378579811 0.375621562 0.371978557 0.353279784 0.348125404 0.350494062 0.358495737 0.369883692 0.379267612 0.360508254 0.367513582 0.361594932 0.366059871 0.366716283 0.372844858 0.374713061 0.338163987 0.336840717 0.34867192 0.359541225 0.372830904 0.368291874 0.365525941 0.350056503 0.360712484 0.362810206 0.362184676 0.379373106 0.360654223 0.357273059 0.360565518 0.37473538 0.375759934 0.370310128 0.366741798 0.363334108 0.364860393 0.364516774 0.373077677 0.378723634 0.333011851 0.32449693 0.323542973 0.344572863 0.347468222 0.328364102 0.310789068 0.309685759 0.317848309 0.330722049 0.335754687 0.321441302 0.307620836 0.308950854 0.308591908 0.335503504 0.370404806 0.3741352 0.373512327 0.370420401 0.368585223 0.368532094 0.382369021 0.360203241 0.349394484 0.341026971 0.348522267 0.377439878 0.377315513 0.352883492 0.34893433 0.371496301 0.381253155 0.394346433 0.401004539 0.388462181 0.378157916 0.381541929 0.388445799 0.393087874 0.382892662 0.364873386 0.351962693 0.332448945 0.326962655 0.324873732 0.334088611 0.34604338 0.308012297 0.299578727 0.31092014 0.320085843 0.327280803 0.330613831 0.325586258 0.315053523 0.301565254 0.310175548 0.338652746 0.338893662 0.34469746 0.351573164 0.354763051 0.355428547 0.340003416 0.314956799 0.307982935 0.290951228 0.279582973 0.270360994 0.247346497 0.262026084 0.260787762 0.273221807 0.304144515 0.327089847 0.349247269 0.355200762 0.353240167 0.348360284 0.342565835 0.339369487 0.339247841 0.335884527 0.343985176 0.34397659 0.347420299 0.33161575 0.300668189 0.285840562 0.268612016 0.260417648 0.25787635 0.263696956 0.258264009 0.255168756 0.297946657 0.319270841 0.315536914 0.280194981 0.268528958 0.264147008 0.254559076 0.252086102 0.25569735 0.261105629 0.298766863 0.323720212 0.3288382 0.333332231 0.336593686 0.347460103 0.358271381 0.361591322 0.361005498 0.360560574 0.364393288 0.357309773 0.349067873 0.348626233 0.332818792 0.315653141 0.326724265 0.33870969 0.340496832 0.298648078 0.282534001 0.271000658 0.268767285 0.285576832 0.319035899 0.321616544 0.316752264 0.316539966 0.315411162 0.316932992 0.324821026 0.336819525 0.340497755 0.342130183 0.34557364 0.349977148 0.347364141 0.346248688 0.329127723 0.326996136 0.324719968 0.319185392 0.316187357 0.278641206 0.274711251 0.284177169 0.290656263 0.304756244 0.321027296 0.316968322 0.314332944 0.322461187 0.329407222 0.334547321 0.330687642 0.313566936 0.302015306 0.288634707 0.279710396 0.270976823 0.265552661 0.277081367 0.311745772 0.31027132 0.313709439 0.321957088 0.321017047 0.322334363 0.322990282 0.329027745 0.324233731 0.316321307 0.324234231 0.3272965 0.31988436 0.309955154 0.304071954 0.302648028 0.295233151 0.256997989 0.239958294 0.228294465 0.225552133 0.224571724 0.2286413 0.246285445 0.25355349 0.247144684 0.256113851 0.258563638 0.238441214 0.232150964 0.21964593 0.216131454 0.221165553 0.223635176 0.230138103 0.236724548 0.250698376 0.257641288 0.269984833 0.273962744 0.272134657 0.243208651 0.234777074 0.232622771 0.234524467 0.227417756 0.245807325 0.259396895 0.267078961 0.265223386 0.272639898 0.262653058 0.239322635 0.225007754 0.217933903 0.213852142 0.214176787 0.227785227 0.246693162 0.270030737 0.283064671 0.28886158 0.290353034 0.280706979 0.274656509 0.254032361 0.241740576 0.227636437 0.214520557 0.212534121 0.217741562 0.21712565 0.20716186 0.212658258 0.239280482 0.244244498 0.248706783 0.247875633 0.244052925 0.246199016 0.247191502 0.251913573 0.263135119 0.266574936 0.272030492 0.274902885 0.273654126 0.273989153 0.263637391 0.250722589 0.237830321 0.235823289 0.227664192 0.221287024 0.224515538 0.219076741 0.183512041 0.251925799 0.266816463 0.271741395 0.279691628 0.284675707 0.282204182 0.263158486 0.254640622 0.24786123 0.260185719 0.254094658 0.25668135 0.258235479 0.258465833 0.267252596 0.276543114 0.271950498 0.248377488 0.238583778 0.238910058 0.240320044 0.259567657 0.285336988 0.272733363 0.277595565 0.286289796 0.295933587 0.305931532 0.305041922 0.29501912 0.28520972 0.279828146 0.284523543 0.271986143 0.284992501 0.306769603 0.30814212 0.307297782 0.299578098 0.295711957 0.314422848 0.327920622 0.327459779 0.328854284 0.332770661 0.339951995 0.339283116 0.305405363 0.290642273 0.310238793 0.325683646 0.302692919 0.29075752 0.279538692 0.271897774 0.258019113 0.261573764 0.292675571 0.275952291 0.280303485 0.286769191 0.297971651 0.312656251 0.31182005 0.277910777 0.268497736 0.265884889 0.270879682 0.278795297 0.288244929 0.306125395 0.301846712 0.299568597 0.321504412 0.296288203 0.269984441 0.250863274 0.243182603 0.235610445 0.238938944 0.252454896 0.283375306 0.297567483 0.310045086 0.317325533 0.313122505 0.328235878 0.336566603 0.319472193 0.293790389 0.288296269 0.283390744 0.279673353 0.310766537 0.32675072 0.315996977 0.320337626 0.3427894 0.321679445 0.271391447 0.259477176 0.253706892 0.247851584 0.242239549 0.239460097 0.274261658 0.300380942 0.321554356 0.33670144 0.334813325 0.336107529 0.340478758 0.330402724 0.32784745 0.333281099 0.327318545 0.321550354 0.31575816 0.309781419 0.321632708 0.315304505 0.302993559 0.306127169 0.312609017 0.329498556 0.332586378 0.325327757 0.325129278 0.334991292 0.347682342 0.368236937 0.363048593 0.352047478 0.34073305 0.334898537 0.327823761 0.31726175 0.306422477 0.300164209 0.291273311 0.28866022 0.30485026 0.30820527 0.34421482 0.33474482 0.336182126 0.293926338 0.285456582 0.262160919 0.222378998 0.216077483 0.208599687 0.217848919 0.233765486 0.23508438 0.232473348 0.244679925 0.247200854 0.247918006 0.246924641 0.247788747 0.241006738 0.238030941 0.229496538 0.221777095 0.256168176 0.239436941 0.222597719 0.219292697 0.23440861 0.254601768 0.248934081 0.248064967 0.239346308 0.24137201 0.244012617 0.250918747 0.258865859 0.260451962 0.255500173 0.268303293 0.279813623 0.295138252 0.291482144 0.262919121 0.251605043 0.245382874 0.23764744 0.239067221 0.267526906 0.285030523 0.315668511 0.305825105 0.303817441 0.307548621 0.314654021 0.322217819 0.313424336 0.305647838 0.302380468 0.31112096 0.315858124 0.303208201 0.301961202 0.305804467 0.315659824 0.320589078 0.29644493 0.249265049 0.238167978 0.230691957 0.224316206 0.224661729 0.234760873 0.238516986 0.279033283 0.303266836 0.292474174 0.285656819 0.277026192 0.27027286 0.266105193 0.264944553 0.267265814 0.279159414 0.301701845 0.318087878 0.321778994 0.310912015 0.318658925 0.307968604 0.262810942 0.256786915 0.250260787 0.241478577 0.236125746 0.238345189 0.241705434 0.266034291 0.332524283 0.331855763 0.344332144 0.340553343 0.30908772 0.296252876 0.296061849 0.300256541 0.310154301 0.325024993 0.354827445 0.379033474 0.380908982 0.380112155 0.379082066 0.380720267 0.386615936 0.392163483 0.399386867 0.398375267 0.39302649 0.395319032 0.389449005 0.390649578 0.372659015 0.371583214 0.374214163 0.369286151 0.352560327 0.334453813 0.314673208 0.301401843 0.308605744 0.327875413 0.357423821 0.355965083 0.350148788 0.348554139 0.341701804 0.338798591 0.351876096 0.35657309 0.323598383 0.313515342 0.310405773 0.313462837 0.313280343 0.346476283 0.340478992 0.343436219 0.347941875 0.356186601 0.362401105 0.354396516 0.350554196 0.347226002 0.349075465 0.346763097 0.352066517 0.344485546 0.339440509 0.327131249 0.328359953 0.330104456 0.323808964 0.302967028 0.2831583 0.280910892 0.26772444 0.25771654 0.255487773 0.261592033 0.25746899 0.276575942 0.288498734 0.297832378 0.288134222 0.266553198 0.257064569 0.239346115 0.239170987 0.253720028 0.268934016 0.272543765 0.285413562 0.285726126 0.285479704 0.28443982 0.287845107 0.279838021 0.268379862 0.263282891 0.262368707 0.274422279 0.289064405 0.294060542 0.299401043 0.29593975 0.300753075 0.301049314 0.260859166 0.232997852 0.215500789 0.202997171 0.205439367 0.224962341 0.258075409 0.290046858 0.296412397 0.307466164 0.308548063 0.301357485 0.294692429 0.27413051 0.258461409 0.243796296 0.240857603 0.240496423 0.245913571 0.27060869 0.271545289 0.28414801 0.278277872 0.283978558 0.263726865 0.241120113 0.233515752 0.232070927 0.235767493 0.253917386 0.274174218 0.271179458 0.286032466 0.287694377 0.281359058 0.262643169 0.245407793 0.239008106 0.223765882 0.219016644 0.215636346 0.215713958 0.219364126 0.239248302 0.230458988 0.246500225 0.253388014 0.280558818 0.284828554 0.281949366 0.273077479 0.279668517 0.278677247 0.274229149 0.283219727 0.295389104 0.295782703 0.294698216 0.294591251 0.288804113 0.279733144 0.26537377 0.260707308 0.258016927 0.259892644 0.269625926 0.279638535 0.329847127 0.319984896 0.314297672 0.328775952 0.332705585 0.308304693 0.307364756 0.298893654 0.287661868 0.291351862 0.302517704 0.334802087 0.334575848 0.326337943 0.327298842 0.324910678 0.331392446 0.344298684 0.351208559 0.34123668 0.343642332 0.346334166 0.34939453 0.345783361 0.350528793 0.33573408 0.328814435 0.344508237 0.354248571 0.331015023 0.310882615 0.297193545 0.295917372 0.302868021 0.309538092 0.329780262 0.331302173 0.322269464 0.320699711 0.321611845 0.322285421 0.324144543 0.324730088 0.332397289 0.332325923 0.327529328 0.320894597 0.321188785 0.332240851 0.330970146 0.331917009 0.330531211 0.340177728 0.330073682 0.299506911 0.282855163 0.260920537 0.253711538 0.270706781 0.298673129 0.322692151 0.319919415 0.32151493 0.318615079 0.317034407 0.328367606 0.331497392 0.331573528 0.331072158 0.330515664 0.330747051 0.330628467 0.332481286 0.339984651 0.331528673 0.322287005 0.320994746 0.324820415 0.317936327 0.28440316 0.254402857 0.244212863 0.274479998 0.282048835 0.304269 0.31795202 0.321165285 0.321247885 0.319896018 0.313940118 0.310988826 0.317693431 0.322664707 0.320735876 0.321273239 0.32384127 0.325935035 0.320398678 0.3147844 0.318541092 0.321990719 0.331161861 0.319705641 0.314890324 0.308276046 0.30761032 0.319661602 0.316547664 0.325848966 0.331986675 0.327231495 0.323600955 0.315027659 0.304217087 0.289444255 0.272078895 0.248031762 0.237596596 0.237996189 0.255999247 0.274083737 0.279786103 0.290637472 0.284819418 0.277271958 0.267138512 0.262142585 0.26338375 0.264466455 0.271483451 0.276669575 0.278886142 0.281899219 0.279912866 0.272705342 0.259543164 0.24831974 0.232046466 0.20877191 0.187621834 0.185538384 0.181644156 0.184135659 0.18990649 0.180253964 0.2135037 0.222954666 0.219878801 0.208862328 0.185165893 0.158510973 0.150914851 0.145478636 0.165255401 0.185067453 0.198960411 0.197591732 0.198322805 0.195743159 0.204709705 0.206802829 0.208927181 0.208742772 0.206527452 0.203950895 0.205200654 0.210295874 0.227892147 0.23494335 0.22597848 0.207271406 0.212224836 0.209207702 0.208116983 0.186350051 0.148840517 0.139058506 0.153904763 0.175417775 0.18690018 0.204134183 0.208406335 0.210391118 0.216597045 0.216947547 0.216721932 0.205453849 0.207916935 0.202906037 0.206000692 0.21757236 0.234710734 0.240955419 0.24410334 0.239431043 0.241844443 0.25669785 0.234103188 0.199212044 0.170170526 0.164389442 0.174997487 0.196173856 0.198043791 0.195932846 0.197340287 0.200248796 0.201009885 0.201180323 0.194394528 0.203858555 0.190394188 0.188635577 0.188672306 0.190126817 0.193512886 0.203997621 0.208949955 0.205709617 0.200608107 0.194039091 0.192784598 0.183360398 0.174502643 0.175899042 0.178362252 0.186365828 0.18784799 0.199169757 0.20761674 0.211737176 0.209309843 0.210483797 0.194534812 0.182905022 0.172987955 0.167213693 0.162795115 0.164312156 0.170806657 0.160897551 0.191344313 0.188333393 0.187766685 0.185367798 0.170595211 0.166980588 0.159198971 0.158553514 0.159263234 0.168946735 0.173587219 0.170881829 0.171606891 0.174513354 0.17973236 0.183388616 0.178675089 0.175955655 0.161791967 0.151874599 0.144550503 0.142904194 0.147814213 0.149860944 0.161477738 0.152756053 0.173431778 0.17784254 0.176735973 0.176391748 0.178422289 0.18012153 0.179890334 0.17676021 0.174847228 0.17372262 0.167283522 0.167027635 0.171717142 0.179546163 0.180498829 0.164142916 0.152902986 0.138159848 0.130915702 0.129717519 0.140455397 0.159397079 0.177616207 0.171300964 0.168886707 0.17276085 0.173686624 0.173666575 0.184079593 0.181293541 0.177782445 0.178215058 0.204155324 0.197887349 0.205030071 0.203420193 0.188179596 0.185546138 0.187023636 0.179963304 0.16839123 0.159170057 0.158163118 0.160397664 0.169656774 0.199519741 0.207688718 0.226900964 0.229193731 0.216984257 0.183102725 0.178680434 0.184230342 0.17035081 0.169291369 0.174085011 0.207125936 0.221168905 ================================================ FILE: src/pymgrid/data/load/RefBldgFullServiceRestaurantNew2004_v1.3_7.1_6A_USA_MN_MINNEAPOLIS.csv ================================================ Electricity:Facility [kW](Hourly) 22.32153712 14.64444443 14.66463229 14.67616229 14.82645007 22.45533704 38.4123316 44.81745964 41.64815833 34.15881629 41.66515522 42.42998564 41.7092551 34.18865388 34.19450022 34.18642183 43.74398917 45.86426911 45.86706421 38.50820589 38.48708445 38.41358433 38.30210841 39.10710387 22.34240087 14.64938121 14.67264305 14.68419222 14.83422553 22.45449367 38.42022608 44.83961396 41.66834953 34.18271257 41.67513248 42.44237189 41.73814708 34.22128134 34.22044581 34.20532196 43.7542282 45.88263805 45.88973625 38.52914365 38.49461095 38.4127553 38.29673364 39.10032965 22.33791345 14.64218186 14.6616314 14.67096656 15.33407266 22.95982553 38.63474807 44.81610131 41.64485636 34.15765226 41.64761185 42.41953937 41.69987525 34.17523411 34.17466307 34.16240817 43.70689972 45.83203385 45.83865198 38.33744634 38.32747662 38.28870603 38.2829469 39.09267795 22.3317923 14.62338489 14.64086258 14.65291405 14.80286471 22.43990588 38.40085942 44.8109332 41.63986703 34.15245298 41.64196829 42.4125638 41.69114071 34.16683881 34.16783242 34.15535071 43.69930915 45.82313433 45.83163335 38.47440158 38.4561629 38.38685101 38.27843498 39.08852555 22.32762719 14.61635221 14.63157017 14.6422256 14.79099746 22.43098136 38.39462109 44.80472801 41.63374145 34.14641737 41.63535324 42.40730551 41.68433957 34.16082766 34.16146638 34.14930876 43.69288513 45.81645168 45.82338939 38.46737511 38.44934681 38.38071983 38.27241935 39.08322397 22.3219352 14.60634387 14.62156451 14.6354079 15.30333074 22.94236494 38.6241797 44.80690079 41.63543701 34.1492953 41.63916473 42.41083096 41.69079306 34.16686048 34.16727751 34.15477757 43.70105695 45.82337966 45.83262949 38.33170381 38.32297533 38.28459493 38.27898849 39.08926517 22.32885685 14.61786372 14.63460647 14.64731876 14.79832504 22.44087297 38.39963535 44.80119612 41.62838063 34.14969848 41.64572531 42.41788818 41.69591864 34.17193522 34.17391383 34.16314931 43.70694395 45.83170777 45.83788701 38.48115846 38.46140722 38.39241333 38.28397689 39.0936309 22.33431212 14.62736727 14.6446073 14.65714732 14.80771064 22.44670044 38.40422427 44.80643744 41.63329802 34.1488052 41.65094315 42.4180647 41.69853832 34.17238675 34.17308591 34.16055319 43.70732683 45.82983392 45.83483701 38.47793106 38.45883139 38.38963549 38.28144208 39.09189975 22.33310715 14.6286096 14.64837311 14.66154734 14.81276108 22.44617048 38.40682182 44.81760015 41.64611105 34.15876644 41.65087889 42.42228128 41.70401959 34.17708958 34.17569778 34.16333071 43.70956566 45.83599669 45.84357636 38.48543417 38.46569382 38.39571001 38.28677873 39.09656833 22.33736866 14.63614368 14.65699346 14.67032166 15.33701961 22.96379724 38.64053481 44.82284629 41.65598396 34.171404 41.662299 42.43258335 41.71373621 34.18868748 34.18744416 34.17544122 43.7244649 45.85007651 45.85790212 38.3556631 38.34546987 38.30453749 38.29608187 39.10298782 22.34170965 14.64901805 14.67268059 14.68570849 14.83668817 22.45405933 38.41779004 44.83360037 41.66184861 34.1767845 41.66826405 42.43949356 41.72345753 34.20281398 34.2088671 34.20414652 42.6981956 45.87614415 45.87280054 38.50667214 38.48570657 38.4123376 38.29982943 39.10533932 22.34243487 14.65030829 14.67284291 14.68449195 14.83418801 22.45328633 38.41234553 44.82410885 41.65278981 34.16745594 41.66100942 42.43486371 41.71588134 34.1928964 34.19138121 34.17753594 42.66869662 45.84874996 45.85847787 38.49928686 38.48056667 38.41031101 38.30100984 39.10952013 22.34842081 14.65601118 14.68043271 14.69089342 15.35197768 22.96770479 38.64032727 44.82111097 41.64924087 34.16126458 41.65106312 42.42374255 41.70318893 34.17748775 34.17724547 34.16514369 42.65083245 45.83650721 45.84408482 38.34181525 38.33183126 38.29329608 38.2880465 39.09805517 22.33993517 14.64083261 14.66351782 14.67972579 14.8350861 22.46831595 38.44252544 44.84059092 41.65756487 34.17071939 41.66090096 42.42772621 41.70916682 34.18191931 34.18082843 34.16921454 42.65573886 45.8375696 45.84333224 38.48608974 38.46535723 38.39496183 38.28576285 39.09553182 22.33603637 14.6318247 14.65028266 14.66252017 14.81281729 22.44796694 38.40536446 44.80777162 41.63820345 34.15143523 41.65335137 42.42224479 41.70132796 34.17678686 34.18010733 34.16729555 42.65852235 45.8402936 45.84521101 38.48685925 38.46766296 38.39702157 38.28767057 39.09730415 22.33922917 14.6418106 14.66251538 14.67547114 14.82644171 22.45516524 38.41111696 44.81561102 41.64425552 34.15628837 41.65879509 42.42739096 41.70765502 34.18547457 34.18464788 34.1717474 42.66393566 45.8436432 45.84882311 38.49285566 38.47385802 38.40322227 38.29207513 39.10010205 22.3416473 14.64865513 14.67237336 14.68649753 15.35302965 22.97241751 38.65459834 44.8418475 41.6661195 34.17607646 41.67259196 42.43752047 41.71918977 34.19562582 34.19368591 34.17166482 42.6588035 45.841916 45.84757265 38.34565529 38.33311068 38.29171541 38.28440277 39.09259089 22.33097286 14.62491572 14.64122629 14.65041567 14.79842865 22.43513918 38.39675566 44.80666658 41.63567276 34.14773559 41.63734576 42.40922548 41.68706512 34.16384964 34.16477042 34.15264587 42.63675566 45.82064293 45.82725055 38.47085992 38.45252538 38.38332866 38.27459962 39.0849501 22.32294789 14.60760287 14.62177277 14.63429543 14.78499115 22.42790019 38.3937409 44.80459279 41.63410935 34.14625798 41.63661237 42.40791094 41.68543315 34.16274845 34.16486318 34.1533317 42.63898049 45.82254224 45.83001035 38.47356663 38.45573766 38.3870776 38.27896226 39.08920972 22.32886052 14.61781255 14.63421423 14.6475828 15.31502104 22.95164314 38.629096 44.81133973 41.63950428 34.15323153 41.64470474 42.41774386 41.69898412 34.17257855 34.17226292 34.15968629 42.64870993 45.83117882 45.84116928 38.34015541 38.33147461 38.29222718 38.28565902 39.0954897 22.33635496 14.63579071 14.65696188 14.67103529 14.82312098 22.45543899 38.41382351 44.82319666 41.65507594 34.17439359 41.67209956 42.43383726 41.70691239 34.17813761 34.17764363 34.16466592 42.64626105 45.82740982 45.83173929 38.47422492 38.45424241 38.38477516 38.27501836 39.08504473 22.32266742 14.60739851 14.62003591 14.63231277 14.7824492 22.42894535 38.39151107 44.79298968 41.62145485 34.13535712 41.63171939 42.40697625 41.68299536 34.15983301 34.1625013 34.15046445 41.57787565 45.8194532 45.82465735 38.46921856 38.451156 38.38318742 38.27540319 39.08641703 22.32674167 14.61529003 14.63205191 14.6458305 14.79747027 22.43794994 38.40079263 44.81243194 41.6417372 34.1542317 41.64727324 42.41337836 41.69163674 34.16809198 34.16807683 34.1552516 41.58228491 45.82457084 45.83445882 38.47609636 38.45795078 38.38891189 38.28065352 39.09078307 22.3306893 14.62163582 14.6379729 14.64943198 15.31510434 22.94999239 38.62712673 44.80913072 41.63724331 34.15071136 41.64245968 42.41801721 41.69732926 34.16941792 34.17014776 34.1580802 41.58466556 45.8287259 45.83584114 38.33491431 38.32571308 38.28735378 38.28193781 39.09213246 22.33207902 14.62443729 14.64274707 14.65560104 14.80654893 22.44292217 38.40432135 44.81517785 41.64399314 34.1562295 41.64640516 42.42095543 41.69969049 34.17324822 34.17361934 34.16124154 41.59130582 45.83397844 45.84184665 38.48320836 38.4642761 38.39444371 38.28578288 39.0954272 22.33589182 14.63329489 14.65322073 14.66644537 14.8174481 22.44765042 38.40845309 44.82198454 41.65084496 34.16411298 41.65962778 42.42736122 41.71243142 34.1821188 34.18076466 34.16625251 41.5963935 45.84177533 45.84790118 38.488983 38.46901854 38.39741463 38.28679538 39.09602801 22.33529981 14.6339346 14.65343543 14.66404909 15.32748072 22.95680618 38.62742144 43.75244052 41.63761911 34.15267511 41.64214067 42.4160632 41.69426394 34.16786676 34.16956323 34.15779639 41.58476638 45.82756956 45.83293521 38.33182356 38.32098119 38.28234184 38.27654626 39.08682539 22.32508939 14.61387903 14.62977733 14.64187468 14.79166342 22.43437718 38.39440728 43.73665104 41.6216118 34.14129879 41.63755272 42.4049806 41.68132438 34.158541 34.15999258 34.14851639 41.57475451 45.81438002 45.81988855 38.46347866 38.44450969 38.37635457 38.26748191 39.0781591 22.3162754 14.59612314 14.60825672 14.62113615 14.77168173 22.42214762 38.38671377 43.72945509 41.61699499 34.13071517 41.6310868 42.40071305 41.67577405 34.15297167 34.15540765 34.14295361 41.57022258 45.8114667 45.81621347 38.45996448 38.44125292 38.37273379 38.26447956 39.0756762 22.31304326 14.59173151 14.60401683 14.61615498 14.76608004 22.41291201 38.38344709 43.73563519 41.62142301 34.13527414 41.62566389 42.39882205 41.6758929 34.15370201 34.15591923 34.1441788 41.57160624 45.81291855 45.81994165 38.46341155 38.4452114 38.37586603 38.26697024 39.07787716 22.31542391 14.59497986 14.60795918 14.62070939 15.28773809 22.92848406 38.61584907 43.73878824 41.62650954 34.14096965 41.63393587 42.40341939 41.68078786 34.15852911 34.15970243 34.14727484 41.57834013 45.81797013 45.82740286 38.32778614 38.31954148 38.28189956 38.27688739 39.08741163 22.3274163 14.61556196 14.63241783 14.64596372 14.79741104 22.43768897 38.40015575 43.75235985 41.63939877 34.15426161 41.64873497 42.42268359 41.70307816 34.17604755 34.17320959 34.16199033 41.58914313 45.83276026 45.83881423 38.47774109 38.45754256 38.38724363 38.27876025 39.08911734 22.32742882 14.61946991 14.63880012 14.6537563 14.80738794 22.4469449 38.40896764 43.76433328 41.65206602 34.16730035 41.66253989 42.4296877 41.71322512 34.18854455 34.18801348 34.17402854 41.60860345 44.78972502 45.85597018 38.49369562 38.47360828 38.40111567 38.28931475 39.09817917 22.33766738 14.63839659 14.65875521 14.67058054 15.33544997 22.96177077 38.63706783 43.76126955 41.64797906 34.16134171 41.65520569 42.42894856 41.71362767 34.19012609 34.1890373 34.17626489 41.60706663 44.79038715 45.86082447 38.35895836 38.34931719 38.30922309 38.30112145 39.10768618 22.34489379 14.65208443 14.67544711 14.68788858 14.83823642 22.45803701 38.41439571 43.75859677 41.64322485 34.16142358 41.6533587 42.42474557 41.70165165 34.17688372 34.1774297 34.16539367 41.59169708 44.77237864 45.83870305 38.48006837 38.45998747 38.39029393 38.28067744 39.09031492 22.328825 14.61762162 14.63250243 14.64524807 14.79552676 22.43817033 38.39788176 43.74078446 41.62760406 34.14259569 41.63851699 42.41302087 41.6894997 34.16612798 34.16784098 34.15558774 41.58114116 44.76498575 45.828355 38.46974374 38.45085926 38.38210466 38.27404105 39.08496521 22.3239594 14.61052999 14.62536786 14.63726625 14.78715354 22.42880294 38.39291796 43.74093199 41.63170651 34.14692668 41.63695585 42.41121983 41.69127696 34.16582482 34.166739 34.15473348 41.58063434 44.7660616 45.83260472 38.47376728 38.4541805 38.38478144 38.27557721 39.0844343 22.32247457 14.60816001 14.62179761 14.63498969 15.30351636 22.94283249 38.62453986 43.74729351 41.63509562 34.1499442 41.64100629 42.41645936 41.69597318 34.1703517 34.17126056 34.1585584 41.58616135 44.77255198 45.84015081 38.33925166 38.3287064 38.28943568 38.28423978 39.09472857 22.33561627 14.63285383 14.65264944 14.66465749 14.81431518 22.44591156 38.40621526 42.69670062 41.64523834 34.16244882 41.65651384 42.42958973 41.71291332 34.18615263 34.18493345 34.1726656 41.60505702 44.79044373 45.85638268 38.49559023 38.47609465 38.40692739 38.29917163 39.10956136 22.35143569 14.65851769 14.68037369 14.69311621 14.84407344 22.4585454 38.41643626 42.71744174 41.6647164 34.18627602 41.69056493 42.45865517 41.762443 34.25072052 34.25631055 34.24597521 41.66987002 44.84341657 45.90086093 38.53610143 38.50455979 38.42059537 38.30722058 39.11252337 22.34771243 14.65657791 14.68126441 14.69389346 15.35776616 22.97024113 38.64508061 42.71493499 41.667376 34.20415349 41.72322176 42.47922633 41.79887802 34.283817 34.29061064 34.27720986 41.7019922 44.87391904 45.92564865 38.41979544 38.40594737 38.35563455 38.34048868 39.12796094 22.36743787 14.67880247 14.70308255 14.70510745 14.85259535 22.4632306 38.42528714 42.71041279 41.66670462 34.20985097 41.72728522 42.4859933 41.81559342 34.30517065 34.30402662 34.29403694 41.71847586 44.87810615 45.92933092 38.5723278 38.55111234 38.48104285 38.37336481 39.14637039 22.39704976 14.70430276 14.72927462 14.74258906 14.89356135 22.50115241 38.46362344 42.75056095 41.6879326 34.20257946 41.70799617 42.45101103 41.7305501 34.20575154 34.20426617 34.18916398 41.63010708 43.75347392 45.8765712 38.51592074 38.49400955 38.41896354 38.30509852 39.10775992 22.34619114 14.65488854 14.6788719 14.69178108 14.84279765 22.45671244 38.41952187 42.71657966 41.66230784 34.17288639 41.66630897 42.43809028 41.72158252 34.20378764 34.20840628 34.19573897 41.62387269 43.73686589 45.85983715 38.4999993 38.47881232 38.40472131 38.29319865 39.10217362 22.34248041 14.64623313 14.66793566 14.67998198 15.34458823 22.96361202 38.64092838 42.70436878 41.65027438 34.16228951 41.65320501 42.42420265 41.7068811 34.18144304 34.17960563 34.16649423 41.59383032 43.7197987 45.84400096 38.34184772 38.33139678 38.29183795 38.28584623 39.09550482 22.33452277 14.62739458 14.64450661 14.65592419 14.80558691 22.44136078 38.40235742 42.6937301 41.640631 34.15621659 41.64696159 42.41952392 41.69885388 34.17381957 34.17459074 34.16272865 41.58845131 43.71434931 45.83952487 38.48064298 38.46226169 38.39246054 38.28348429 39.09359843 22.33368054 14.62675414 14.64396614 14.65422618 14.80326293 22.43911811 38.40000317 42.6919533 41.6406298 34.1564141 41.64676145 42.41913084 41.70257959 34.17988977 34.17901032 34.16635665 41.59820726 43.72250893 45.84917136 38.49130011 38.47406081 38.40671752 38.29594158 39.10268441 22.34302181 14.64828742 14.67176263 14.68529152 15.35145163 22.96969735 38.64938951 42.71774623 41.66462945 34.17747049 41.67296024 42.45118018 41.75723625 34.24899276 34.25382936 34.23973838 41.6618781 43.76847395 45.88141772 38.37459349 38.35536185 38.30734208 38.29610337 39.10270562 22.34188002 14.64909011 14.67033572 14.68103057 14.82983289 22.45446134 38.4112247 42.69477747 41.64923762 34.17013616 41.66837966 42.43605847 41.72136348 34.20840592 34.20109037 34.18439566 41.61555969 43.73028934 45.85476558 38.49659414 38.47482032 38.4024415 38.29073135 39.09954721 22.33880927 14.63673955 14.65517441 14.66690213 14.81656663 22.44917305 38.40574863 41.62775976 41.6367885 34.15169561 41.64927779 42.42321039 41.70257899 34.17638957 34.17811291 34.16566908 41.59507917 43.72046621 45.84297367 38.48539313 38.46533443 38.39513165 38.28531083 39.09442442 22.33703174 14.64263303 14.66347943 14.67486593 14.82393144 22.45361016 38.41052238 41.63413342 41.64412281 34.15663661 41.65471408 42.42801838 41.70529842 34.1789789 34.18036991 34.16799966 41.59816935 43.72352037 45.84654705 38.48640118 38.46658204 38.3937987 38.28505303 39.09454683 22.3347436 14.63195842 14.6520452 14.66573344 15.33257221 22.96072639 38.63817209 41.64461302 41.65296063 34.17150169 41.66830521 42.45219572 41.77408939 34.26680748 34.27556695 34.27714861 41.71818533 43.82105984 45.9264382 38.40787335 38.39343582 38.34227512 38.31692547 39.11080278 22.34740857 14.6561891 14.67875112 14.69071778 14.84188508 22.4556565 38.41882633 41.65838083 41.66848987 34.19667675 41.69978362 42.46532187 41.77029361 34.24731477 34.24791151 34.22970477 41.65530242 43.77517317 45.89962917 38.53763928 38.51651177 38.4400335 38.32619474 39.1201723 22.36215339 14.66412304 14.68556451 14.69946052 14.85102341 22.46469823 38.43186636 41.67449774 41.6810073 34.19516919 41.69130224 42.4509698 41.74090833 34.21564287 34.21476063 34.19947614 41.63498702 42.69690288 45.88569772 38.52958866 38.51202282 38.44291108 38.33847902 39.1349005 22.38408437 14.69254336 14.72138163 14.7372709 15.40250797 23.01899341 38.70017403 41.71402913 41.71384721 34.21156586 41.689132 42.44428123 41.72323444 34.19823453 34.19451359 34.178264 41.6082969 42.67161891 45.85523813 38.3530739 38.34209975 38.30112654 38.29278114 39.10143065 22.34165802 14.64716201 14.67064525 14.6842085 14.83512176 22.45623962 38.41545045 41.64369977 41.65071514 34.16978473 41.66815083 42.42934333 41.7138546 34.18658033 34.18564476 34.17373515 41.60617147 42.66672083 45.85192817 38.49512696 38.47565452 38.40406182 38.29297171 39.10071455 22.34214591 14.64375116 14.66354782 14.67560511 14.82524796 22.45353359 38.41080577 41.63811326 41.64680752 34.15968534 41.65959835 42.43441471 41.7128834 34.18868585 34.18810941 34.17888683 41.60757247 42.67222506 45.8539456 38.49508414 38.47480743 38.40273708 38.29111674 39.10009332 22.3406309 14.64488736 14.6673014 14.68081894 14.83165581 22.45098586 38.41360766 41.65042905 41.65490181 34.16809735 41.65985642 42.4292373 41.7140272 34.18814964 34.18527608 34.1701465 41.60140327 42.66985383 45.85399894 38.49493628 38.4750933 38.40151906 38.28990251 39.09871121 22.3383875 14.63890747 14.65945309 14.6713323 15.33612718 22.9614992 37.57804647 41.64208472 41.65310297 34.17027267 41.66025833 42.4317778 41.7128772 34.18549145 34.18465787 34.17315645 41.60177096 42.66882072 45.85226913 38.34889068 38.33678232 38.29588251 38.29009674 39.09994346 22.34105216 14.64317886 14.66606715 14.68042502 14.83238509 22.45262735 37.35871984 41.65526562 41.67399485 34.21644317 41.73701782 42.49732998 41.84704797 34.34207239 34.35850129 34.34916099 41.77855942 42.82223161 45.98524458 38.61163709 38.57731226 38.49177282 38.36277005 39.13422927 22.3915922 14.7093722 14.72758938 14.73059498 14.87619016 22.47425731 37.37220052 41.68396431 41.70125776 34.21787688 41.70656061 42.46162059 41.76471544 34.23523177 34.22573348 34.20541799 41.62660576 42.67950102 45.85563639 38.49583225 38.47667695 38.40383759 38.29349892 39.10234513 22.34146224 14.64050641 14.66037689 14.67218536 15.33721578 22.95959014 37.57932996 41.64194435 41.64684543 34.16208492 41.65315642 42.42576737 41.70696592 34.18014948 34.18085893 34.16876818 41.59564695 42.66390095 45.84900302 38.34723623 38.33686518 38.2977474 38.29218614 39.10187601 22.34387995 14.64559285 14.66836988 14.6822853 14.83406577 22.4558132 37.35775922 41.64328342 41.65224838 34.17722809 41.69412316 42.46125378 41.76348887 34.23757369 34.23642719 34.212832 41.62339179 42.67939 45.8604293 38.50277285 38.48047026 38.40805738 38.29637456 39.10331992 22.34326225 14.64793375 14.66981839 14.6827237 14.83359439 22.45491022 37.35580686 41.64358653 41.65076014 34.16289074 41.66207409 42.43543238 41.71343574 34.19136309 34.1927807 34.17551193 41.60356981 42.67003695 45.85069127 38.48959268 38.46999185 38.39895524 38.28987287 39.09936289 22.34003999 14.6414678 14.66264598 14.67484472 14.82532391 22.44892707 37.35341513 41.64707397 41.65495031 34.17194273 41.66364854 42.43566202 41.72361311 34.20851184 34.21278785 34.20115646 41.63289229 41.63283729 45.86333915 38.50015694 38.48045502 38.40701846 38.29427343 39.10242204 22.34258825 14.64669841 14.66898403 14.68167109 15.34727771 22.9650434 37.58432076 41.6507796 41.65629061 34.1701031 41.66311427 42.43221975 41.71165559 34.19011929 34.19147678 34.17845048 41.61441991 41.62163094 45.87067663 38.37063532 38.36182858 38.32052151 38.30863162 39.11296135 22.35290429 14.66182875 14.68684643 14.70058667 14.85201052 22.46726779 36.31640534 41.67280508 41.67594086 34.19021945 41.68236585 42.44915836 41.7343016 34.21351731 34.21159983 34.19859265 41.63481294 41.63692717 45.88005355 38.52183551 38.50190531 38.42990099 38.3179632 39.12141427 22.36385434 14.67519629 14.70030268 14.71366975 14.86501615 22.47971323 36.33199128 41.68917488 41.69252971 34.20640041 41.70743435 42.46062603 41.75522241 34.2382206 34.23880258 34.22369025 41.65866814 41.66077314 45.90545056 38.5429145 38.52047119 38.44383907 38.33090111 39.12367939 22.35783201 14.66723754 14.69220188 14.70720923 15.37268907 22.98574583 36.54712467 41.67754972 41.6784601 34.19888918 41.69837874 42.46406049 41.76158882 34.24343749 34.24679058 34.23571986 41.67190354 41.67506792 45.92027051 38.41909456 38.40560817 38.36122853 38.35397639 39.14696468 22.40213258 14.71227036 14.73762563 14.75481283 14.90907625 22.52737949 36.38113769 41.7372682 41.74642697 34.26560679 41.76172114 42.49630575 41.81526228 34.29983072 34.3075831 34.30000059 41.74805939 41.75275151 45.99923685 38.64238109 38.62820981 38.56388933 38.45271113 39.20712854 14.85975948 14.86473745 14.87511729 15.03938366 22.64892391 38.61007604 43.9557654 41.83962796 34.36397974 41.89519292 42.61456264 41.99283587 34.48452779 34.49555266 34.50650246 42.71367179 42.99788138 43.13567812 38.86036224 38.70574346 38.61906033 38.49436906 39.22725814 22.49397306 14.79552189 14.81820579 14.81456861 14.949636 22.53501058 38.48927477 43.85303226 41.74120238 34.26970305 41.80121209 42.56377976 41.91455661 34.38566741 34.37993094 34.35085675 41.7717147 41.7788143 41.79218679 38.67274 38.65528282 38.57731292 38.46413684 39.22148974 22.50559392 14.81527086 14.83399432 14.84816539 15.51275448 23.12974925 38.83125697 43.95592656 41.83056967 34.35409734 41.87358788 42.61134414 42.01167641 34.43571797 34.39164935 34.35330031 41.76388676 41.75290553 41.74350667 38.46338894 38.44607761 38.3957973 38.38038121 39.15539205 22.40872301 14.72305358 14.74351902 14.75372472 14.90114193 22.50662797 38.47088033 43.83058852 41.71661265 34.22911466 41.73385355 42.49811115 41.82636882 34.26574965 34.22401438 34.19477125 41.62656117 41.63323618 41.6487946 38.52584832 38.5058113 38.43564804 38.3274521 39.12855583 22.37371413 14.68545044 14.71126937 14.72070318 14.86909163 22.47991919 38.44529344 42.74254192 41.68710066 34.19973575 41.69576568 42.45244937 41.7389609 34.214976 34.21594739 34.20135603 41.63103767 41.63021816 41.63826191 38.51151969 38.4900465 38.41577724 38.30380196 39.11101346 22.34949878 14.66126584 14.68677734 14.70025257 15.36562186 22.97869203 38.65709049 42.72875696 41.67333418 34.1801473 41.67542621 42.44200149 41.73038179 34.20924179 34.20405683 34.18745679 41.61838601 41.62787562 41.63687359 37.3084276 38.35548428 38.31046861 38.300583 39.10925639 22.34791233 14.66099574 14.68439556 14.69530962 14.84393351 22.45879987 38.41635956 42.70459969 41.65179285 34.16982038 41.66592101 42.43310029 41.71493263 34.18516597 34.18415159 34.17160717 41.6007782 41.6051925 41.61194427 37.43228175 38.46989408 38.39829693 38.28897795 39.09838518 22.33896414 14.63724424 14.65754315 14.67005163 14.82051488 22.45147431 38.40871821 42.69078344 41.64315887 34.15582572 41.65424433 42.42998465 41.71080819 34.18342816 34.18353349 34.17674478 41.61189411 41.62322643 41.62544577 37.44066403 38.48104324 38.40532827 38.29176171 39.09893411 22.34051979 14.64609197 14.66758805 14.67996171 14.83071064 22.45109977 38.41573264 42.71299211 41.66445199 34.19640278 41.71968448 42.48562586 41.82576092 34.3202928 34.33027912 34.31913975 41.75428321 41.76075864 41.74810226 37.54921422 38.5780432 38.49573925 38.38203448 39.15098945 22.407967 14.7087844 14.72985601 14.7346994 15.39677932 23.01404328 38.69428667 42.76119167 41.71273934 34.24259364 41.75922815 42.50466288 41.84666704 34.34431511 34.36718498 34.36142423 41.79889909 41.79393719 41.7901747 37.44784662 38.48156542 38.42287384 38.40688245 39.16459717 22.42933858 14.73461614 14.75760956 14.76833642 14.91831082 22.52575628 38.47491104 42.75566324 41.69206788 34.20013691 41.69521035 42.46173771 41.75941199 34.23645779 34.22999862 34.20746497 41.63074368 41.62267476 41.62458049 37.44047709 38.47645844 38.40220356 38.2917534 39.10038706 22.33916058 14.63761668 14.65633399 14.66807916 14.81779493 22.44701028 38.4082269 42.69906836 41.64533279 34.16100934 41.65246307 42.42465026 41.70390284 34.17775404 34.17889274 34.16633694 41.5952922 41.60337244 41.61341562 37.43256023 38.472704 38.39864667 38.28925919 39.09835439 22.33916769 14.63828766 14.65895956 14.67168263 15.33810809 22.96083973 38.63948242 41.64501895 41.65234941 34.1696829 41.65977715 42.43108715 41.71228966 34.18740479 34.192883 34.1856448 41.62373917 41.62630935 41.62677852 37.29894881 38.34860469 38.30393092 38.29442756 39.10281037 22.34414072 14.64953345 14.67298474 14.68598226 14.8370722 22.45751074 38.41704784 41.64647097 41.65533667 34.17607783 41.67747252 42.45870365 41.76377423 34.24529316 34.25209277 34.23781827 41.67548523 41.67619182 41.66907107 37.47204704 38.49546675 38.41336386 38.300336 39.10604243 22.34629685 14.64954338 14.67142202 14.68308665 14.83252164 22.4534134 38.41280521 41.63424314 41.64213977 34.1568659 41.65467145 42.43025548 41.70788561 34.18739965 34.19522903 34.18893494 41.62351624 41.63101338 41.63303871 37.44185883 38.4787256 38.40382701 38.29326716 39.10268921 22.34623523 14.65436482 14.67692556 14.68886833 14.8382753 22.45349316 38.41725373 41.65531642 41.66368288 34.18715056 41.69593455 42.47813312 41.82231439 34.31641367 34.32490833 34.32390039 41.7588787 41.757932 41.76125079 37.54663884 38.57506386 38.49395358 38.37087279 39.14111629 22.40633712 14.72187523 14.7467608 14.7511327 15.40908616 23.01377739 38.68602166 41.69626258 41.70870669 34.2347678 41.7454693 42.49521856 41.83917372 34.32459644 34.32823115 34.30126712 41.71977663 41.72523552 41.72752118 37.39977025 38.44872495 38.40141062 38.3913107 39.14856721 22.40888972 14.72093767 14.74385933 14.75088714 14.89789228 22.50579895 38.46119478 41.69668067 41.71768307 34.2577896 41.76869798 42.5172763 41.86305664 34.33712419 34.33230006 34.31887579 41.75606662 41.75690724 41.76258992 36.51876797 38.60870804 38.5203072 38.39738035 39.15056821 22.41302127 14.72877115 14.74551311 14.74078554 14.87743886 22.48095455 38.43961655 41.68938342 41.71250228 34.25550697 41.76849625 42.52278048 41.87750961 34.36757983 34.3707662 34.35083805 41.78911843 41.79358085 41.78558831 36.51707425 38.59157863 38.50582765 38.37742763 39.15270696 22.41058895 14.71327047 14.73319389 14.74141803 15.4026924 23.01127688 38.68723394 41.70679373 41.72631173 34.2470896 41.74806978 42.49449559 41.82743325 34.32113331 34.32982882 34.31826899 41.76003635 41.75911105 41.76384474 36.37378894 38.47872438 38.43411697 38.41380647 39.16312424 22.41319891 14.70694769 14.71146449 14.71337193 14.8590231 22.46117152 38.41961873 41.64924903 41.65767561 34.17903281 41.67516112 42.43797126 41.719424 34.19586324 34.19563046 34.18271951 41.61669049 41.61599517 41.6227982 36.38857274 38.48626717 38.41415643 38.3048927 39.11138564 22.34961204 14.65852951 14.68386485 14.69737429 14.84902753 22.46371004 37.37158539 41.66216728 41.66835614 34.17769095 41.6824605 42.44539902 41.73366115 34.21176705 34.21528391 34.19320157 41.62741375 41.62739451 41.62219139 36.38106985 38.48046965 38.40702235 38.2936533 39.1008497 22.34073025 14.64718648 14.66801216 14.6798382 14.83015747 22.45105004 37.35517046 41.64860227 41.65385211 34.16872074 41.66163769 42.43314913 41.71389312 34.18765648 34.18797457 34.17428862 41.60280684 41.61016874 41.62123057 36.38156623 38.4814753 38.40711308 38.29520969 39.1027228 22.34368993 14.64937776 14.67259364 14.68567936 15.35151714 22.96680438 37.58724616 41.65447687 41.66181935 34.17403599 41.66394211 42.43150672 41.71665141 34.1906301 34.18620183 34.17250988 41.60702656 41.61072054 41.62315403 36.24196185 38.35004495 38.30523089 38.29543809 39.1027251 22.34321622 14.64822329 14.67093827 14.68334559 14.83298567 22.45074726 37.3544819 41.64915543 41.66281868 34.18074411 41.66976366 42.44293353 41.73580205 34.21355954 34.2147302 34.20387282 41.63849624 41.64537543 41.65223135 36.40435582 38.4963939 38.4193905 38.30135917 39.10556646 22.34649637 14.65496874 14.67866761 14.69093628 14.84159314 22.45563376 37.36027352 41.65533476 41.66965324 34.18898928 41.69090919 42.45537044 41.7630883 34.24777963 34.25437693 34.25197099 41.69538508 41.70744181 41.71611881 36.47586142 38.57056554 38.49426595 38.37900007 39.15147576 22.4233464 14.73900105 14.76840494 14.78508372 15.44844546 23.06034696 37.69995405 41.77521484 41.78466885 34.29754501 41.80066021 42.51357305 41.86557183 34.35705316 34.35873686 34.34112749 41.78462479 41.7825845 41.78452433 36.39890929 38.50126797 38.44760342 38.43509759 39.19507764 22.47275882 14.78113313 14.80129558 14.80856841 14.95735071 22.568101 37.46219134 41.74257742 41.75546998 34.27655285 41.76745574 42.49842947 41.82267154 34.31155217 34.31889437 34.31262157 41.75181943 41.74732942 41.74758196 36.49482668 38.57633436 38.48786892 38.3624842 39.13714726 22.38297647 14.68829087 14.70699054 14.71248979 14.85944508 22.46609803 37.36771414 41.65745001 41.68056395 34.20727717 41.71639879 42.48025813 41.7982018 34.28391966 34.29182247 34.29039467 41.73728687 41.75353773 41.76870593 36.53300053 38.62130363 38.54470409 38.42380504 39.17824803 22.46451765 14.79066802 14.81763846 14.82294895 14.97063852 22.5777739 36.42359587 41.78378492 41.78063751 34.2942138 41.79616877 42.51247775 41.85121947 34.35474389 34.37935098 34.38922577 41.82789111 41.81788621 41.79869963 35.46128568 38.60438464 38.52298172 38.41536873 39.18711735 22.47324888 14.79822351 14.83354648 14.83074648 15.47639301 23.08160053 36.64410293 41.76946633 41.76712315 34.27787842 41.77923046 42.49885383 41.81264042 34.28906022 34.28694712 34.27042487 41.7092958 41.70879975 41.71751059 35.27406725 38.44228001 38.40275887 38.39712686 39.17211341 22.44015882 14.7571636 14.78184852 14.79286629 14.94433545 22.55598168 36.40265893 41.76085734 41.77163873 34.29511645 41.7993911 42.52997374 41.87384373 34.36939761 34.39081673 34.39586785 41.85961731 42.11388235 42.89875304 35.83583512 38.74458701 38.62172719 38.47873815 39.21797654 22.49996028 14.80633708 14.82205809 14.82397073 14.96881817 22.57295201 36.41868915 41.7796512 41.80170815 34.35316052 41.87298071 42.62292939 42.37192003 34.63991923 34.46956424 34.43371335 41.83788253 41.81997359 41.81841875 35.52889806 38.67675296 38.59541607 38.48008905 39.2374195 22.51891395 14.84084003 14.87665598 14.88766932 15.58613387 23.17964194 36.73629517 41.85032781 41.84366257 34.38004306 41.90513994 42.71787938 43.95987523 37.35503486 37.43117974 38.06375546 46.99768212 48.13291805 48.41216196 39.34839279 41.27428849 39.27751138 38.60488731 39.32120678 22.58903746 14.8833293 14.88796603 14.89685374 15.06666575 22.71751179 36.56099329 41.91836076 41.96841744 34.50715252 44.31321741 49.43362516 50.75809329 43.8007636 44.81698516 46.19393122 56.39335053 56.99019938 58.27084793 49.58153699 49.78245769 48.37239227 46.26820806 45.22284503 25.17726818 15.05407855 15.0695187 15.07041052 15.24482952 22.8542695 36.70064512 42.43001416 44.71768107 36.12859866 46.35633012 49.67023504 51.34882488 43.60687701 42.89138986 42.86350604 52.43497663 53.59985128 54.81806395 47.24528073 49.57191952 45.86110557 42.21888039 40.23812214 22.65344639 14.94122807 14.95427148 14.95171566 15.08522777 22.65618364 36.45335976 41.81028716 41.81838358 34.34784314 41.85222245 42.59754119 42.15785344 34.46299661 34.45966157 34.44137172 42.31077669 43.11775567 44.0963173 36.45131407 39.28670733 38.67230135 38.51462048 39.25353552 22.54203072 14.85577575 14.8810844 14.87841222 15.58291833 23.19498207 35.69315143 41.87224724 41.91194943 34.52162703 44.9181829 50.2246779 53.67048181 45.868633 44.75116647 43.50931886 50.42029659 49.67532269 48.56494686 37.79927848 39.01344348 38.52266192 38.48114668 39.21564774 22.47667952 14.78413802 14.79636749 14.79616754 14.94149898 22.53832311 35.31401808 41.72799377 41.73014072 34.24312945 41.73806099 42.48720998 41.80946781 34.30224536 34.31376156 34.29808232 41.73006635 41.73592748 41.74030046 35.43589136 38.5864102 38.49845034 38.37258645 39.14496354 22.40169595 14.71228215 14.73357561 14.74096057 14.88302104 22.4856161 35.2660693 41.68346304 41.70263235 34.22988593 41.73711619 42.48692531 41.81291236 34.2924788 34.29753791 34.28350039 41.71732273 41.72648855 41.7339948 35.43025627 38.58521743 38.51059086 38.39279745 39.1487357 22.41405226 14.7199862 14.74029186 14.74234459 15.38810842 22.99768602 35.50650987 41.69604137 41.69592819 34.2015784 41.69301357 42.44786416 41.7323059 34.2111542 34.20755457 34.19017058 41.6253848 41.63525419 41.64153825 35.2061026 38.3718961 38.32759794 38.32036565 39.12378448 22.36532835 14.67639991 14.69818413 14.70886494 14.85978699 22.47146468 35.2583539 41.66377656 41.67261296 34.19498476 41.70281834 42.46216067 41.75280685 34.23652983 34.244407 34.23643618 41.66807576 41.67478222 41.68717874 34.33116259 38.54198215 38.46196687 38.34563951 39.13562562 22.38941656 14.70056043 14.72496422 14.7387216 14.88670198 22.49957073 35.2865519 41.6951138 41.72112471 34.25986143 41.79226604 42.54939797 41.92157625 34.43168692 34.45460991 34.47948678 42.2995341 42.9608766 43.3743211 35.06480408 38.79611775 38.65191058 38.50270343 39.24860423 22.54019672 14.85855925 14.88741057 14.90431662 15.07995512 22.74441935 35.50525887 41.85165679 41.81705791 34.31161077 41.79635056 42.50090969 41.82358751 34.30246499 34.2821161 34.25475119 41.68726924 41.69379026 41.70230623 34.34032095 38.54941767 38.46988105 38.35180884 39.13249764 22.38669068 14.69555353 14.71981216 14.73609851 15.40006566 22.99584478 35.48191644 41.66061358 41.67084495 34.19556999 41.69797159 42.46304725 41.76468969 34.2473587 34.25224299 34.23986612 41.67848505 41.68031944 41.67769048 34.16720451 38.38658475 38.33749756 38.32176415 39.11534086 22.35784099 14.66662681 14.69209278 14.70180797 14.85074049 22.46223774 35.24978135 41.66153526 41.69838575 34.23182262 41.72936583 42.47779431 41.80308572 34.28246922 34.28065883 34.2717822 41.71356418 41.72262783 41.73515971 34.37382383 38.58485431 38.50738499 38.39577868 39.15794832 22.43136888 14.74699412 14.77605227 14.78901456 14.94014849 22.54578372 34.27290215 41.75087374 41.74698887 34.24747674 41.74156924 42.47573138 41.77509161 34.25192327 34.24316474 34.21575216 41.64687396 41.64572478 41.6559128 34.29938178 38.51235362 38.43714714 38.32289621 39.1263813 22.37437918 14.6902446 14.71922651 14.73176423 15.39461083 23.0086502 34.45234846 41.70230144 41.70511172 34.22169921 41.72530205 42.4798915 41.78229273 34.25535911 34.25295328 34.24167082 41.68486825 41.69341334 41.70026762 34.19872464 38.42495696 38.38285588 38.37448946 39.15507803 22.42317974 14.73778338 14.76396714 14.78061016 14.93129397 22.54603174 34.2803666 41.74765771 41.76532719 34.30040891 41.81364241 42.55749544 41.92494879 34.42613208 34.43759374 34.43134521 41.85030152 41.81255128 41.81419739 34.45006147 38.63534424 38.53871631 38.41999508 39.17346842 22.44649704 14.75876653 14.78622353 14.79188605 14.9354008 22.53390003 34.2540973 41.7324264 41.76586413 34.29310253 41.80930469 42.53625417 41.87931511 34.36901892 34.37808536 34.37223806 41.81973312 41.84879291 41.90252326 34.46690066 38.65038692 38.54564241 38.41618092 39.17136329 22.44316178 14.74838017 14.7592833 14.75569395 14.89067545 22.47975736 34.19902963 41.67361153 41.69863491 34.23237818 41.73537674 42.48381505 41.81376164 34.29841504 34.30891854 34.30891509 41.75243429 41.76414646 41.77073932 34.40047502 38.59529664 38.50767992 38.37879578 39.14998741 22.41843349 14.72288588 14.72071577 14.72317678 15.39924693 23.00417833 34.44654538 41.71336874 41.76037509 34.31149132 41.83630855 42.5867047 41.99853232 34.41897737 34.41942276 34.40769303 42.00259681 42.71763621 43.0739727 34.59917001 38.5457536 38.47636534 38.44561201 39.18716337 22.45981119 14.75850458 14.78399883 14.79548991 14.94226062 22.54784101 34.2703194 41.76950846 41.82318759 34.37291462 41.89698716 42.93369593 43.72233181 36.09327567 35.39975785 35.24426096 44.15707554 44.7338475 45.26082331 35.69926473 39.13919122 38.65064466 38.50394448 39.24494199 22.52489574 14.84853277 14.86999541 14.86431638 15.00324548 22.59813333 34.3238551 41.82996937 41.87873914 34.41352234 41.92679198 42.84464859 42.63713213 34.80971478 34.50188782 34.58444441 42.80646772 43.10887873 43.13478411 34.7428887 38.70892995 38.60126705 38.46099075 39.20020976 22.47009561 14.78834043 14.81446489 14.82024522 15.47107673 23.06286527 34.50095643 41.75231629 41.7736896 34.31181573 41.82611282 42.5702727 41.99668002 34.42838555 34.46453453 34.46231773 42.53219638 42.97923005 43.43388857 34.86447168 37.51592619 38.47541259 38.43842471 39.1875595 22.46447377 14.7753762 14.79460428 14.80352986 14.95006707 22.54349009 34.26289728 41.74706815 41.77596621 34.31868368 41.83755321 42.59028964 41.94864599 34.42794477 34.43000226 34.43231932 42.05493681 42.22221825 42.86521484 34.93339181 37.6572158 38.61830353 38.48774631 39.2307103 22.50675561 14.81615131 14.83693098 14.84173213 14.98913682 22.59113946 34.31739311 41.79955987 41.81613742 34.33857812 41.85424375 42.57603735 41.93912514 34.41195281 34.40193575 34.36644906 41.79952689 41.79616656 41.79927317 34.45046794 37.5964736 38.55159958 38.42908218 39.18805507 22.46951366 14.78936025 14.81645135 14.8301359 14.98191826 21.5369805 34.33192559 41.81348159 41.81280684 34.3271553 41.82798294 42.57588649 41.89818255 34.372471 34.37167331 34.34940945 41.78010526 41.76169791 41.77229762 34.41454843 37.56273924 38.53888655 38.42370997 39.18305323 22.45837393 14.77757377 14.80519877 14.8183099 15.48166427 22.0326796 34.53655031 41.77928938 41.78163272 34.30347881 41.80555076 42.5280098 41.86650936 34.35985232 34.37319116 34.36652058 41.81054585 41.81250713 41.91971764 34.32526602 37.48313337 38.47454606 38.44265419 39.18075475 22.45453409 14.76822031 14.78784737 14.79834536 14.9461793 21.48836978 34.2777012 41.78238855 41.85110732 34.42997633 42.2345131 44.85292672 47.02191071 39.37097099 38.90149495 38.68451368 48.231891 50.09095718 51.75634555 42.65594595 44.66264951 42.8797814 40.84739175 40.09126345 22.68404641 14.98124322 14.99782557 15.00359702 15.17717344 21.71971269 34.5288345 42.05501052 42.51636248 35.02898185 44.00964055 47.32417702 48.66952896 40.47078228 39.6121916 39.50574638 48.17654352 48.95953151 49.07225788 39.08405998 39.28145727 38.69261657 38.52709976 39.28604052 22.56325007 14.87777948 14.9006697 14.90212069 15.56083466 22.09256573 34.60395107 41.86011079 41.8819014 34.42387945 41.94560434 43.39106926 43.35713248 34.62061692 34.45751051 34.41546186 41.82728723 41.80906121 41.80858425 34.29733814 37.46142263 38.47488039 38.46450733 39.20051575 22.47488471 14.78890626 14.80999668 14.82082467 14.9717012 21.51919304 34.31142655 41.78611035 41.80120638 34.34024881 41.86215661 42.60287319 42.1473627 34.65022926 34.72612984 34.8136294 42.96748913 43.14804797 44.27194946 35.75687787 37.87769461 38.63192686 38.48867088 39.22637678 22.50454208 14.81225238 14.8239613 14.82646417 14.96197745 21.50754269 34.29602108 41.76907028 41.78597024 34.33238232 41.86852324 42.6247901 42.53003506 35.32012024 35.28266704 35.00034102 43.52847941 44.31390109 44.27764499 35.26686553 37.7626718 38.61840535 38.48104882 39.22723211 22.51050509 14.82084506 14.83918831 14.84946198 14.99715867 21.54194472 34.32972753 41.82087081 41.83611146 34.36966656 41.89184597 42.66007527 42.59462381 34.67331639 34.5562608 34.99785201 44.19057564 45.87977497 46.96899673 37.96641893 39.31626301 38.79098694 38.53224405 39.2807619 22.55389652 14.86200189 14.87631923 14.88274207 15.55837697 22.10562221 34.63603271 41.87984467 41.92063833 34.47814485 42.45316495 44.86205553 46.71000539 39.2185377 38.78337448 37.70995562 46.41099903 48.24542968 49.27771047 39.5404281 40.77179212 39.26953247 38.58505086 39.32420115 22.58748393 14.89428459 14.92587623 14.92481198 15.06074612 21.58665541 34.37721027 41.88148925 41.94129159 34.48899151 42.5990795 45.35108605 47.39939701 39.40048449 38.8529749 38.46412617 47.25068566 48.57717434 50.08628189 40.43865167 40.12141541 39.4437751 38.56972577 39.32137252 22.59103912 14.90215578 14.92497479 14.91819959 15.06251166 21.61134428 34.40962585 41.90679899 42.06916209 35.06100506 44.31489763 47.61189357 49.07872699 40.81981035 40.36148792 40.46252637 49.97837845 51.58671508 52.65614089 42.6285816 42.23857404 41.48590549 39.57848889 39.44938656 22.65355238 14.94552964 14.95840613 14.97124074 15.7368083 22.25854404 34.72273391 41.97967087 42.53731382 37.25200343 48.09518854 51.93244339 54.26589224 45.56126261 44.93073073 45.37738984 55.36532682 56.94500363 57.46419754 46.03854786 44.98898577 43.31447172 40.85775169 39.61075181 22.64233403 14.92839026 14.94778908 14.93879876 15.08145229 21.62236718 34.412956 41.88243268 41.87649371 34.39923198 41.90580111 42.63226076 42.2153566 34.6210719 34.6387526 34.91145422 43.72890099 43.64942235 44.01531499 35.45496346 36.69791766 38.62088986 38.48377054 39.22343872 22.50227105 14.81796526 14.8261643 14.82379284 14.96823699 20.45292432 34.30224307 41.79035064 41.82234882 34.35855244 41.87555696 42.61424853 42.20925183 34.92959364 35.12531045 35.64261873 45.01959106 46.05813022 46.77637591 38.02890348 38.04815921 38.69507705 38.52750917 39.26468598 22.53983395 14.85957629 14.88503565 14.8906609 15.03467183 20.51014226 34.37404257 41.86699184 41.9172258 34.48661275 42.94960671 46.37142698 47.79911672 39.91993343 39.68127266 39.17214541 47.11159723 48.69220338 50.26781689 40.35691808 40.27264134 39.61390345 38.60880686 39.31534605 22.57838499 14.87318386 14.88960398 14.89444216 15.57617989 21.05515486 34.63013045 41.89050093 41.92171514 34.42949781 42.1270228 45.78368224 47.60444534 39.28013684 38.41986532 38.15392454 47.20973214 48.61522577 50.03478874 40.83112207 40.86100223 39.76562485 38.79815211 39.34009611 22.61196622 14.91782974 14.94787988 14.94971737 15.10029836 20.57929694 34.44419365 41.95680576 42.00978893 34.93388285 44.46198031 47.63459486 49.24726604 41.02885604 39.67551293 39.20120309 49.14531151 50.4216409 52.01386193 43.59367249 43.92435107 43.03910301 41.45431662 40.14878449 22.70108295 15.00622384 15.02940189 15.04662037 15.23344427 20.75209441 34.64676316 46.66221718 49.48749363 43.26889451 53.2576026 58.07476402 60.84467406 51.61943718 49.22888565 48.84227803 58.62642094 58.06708105 58.96235356 48.55270736 47.77045173 46.31259751 44.28618645 42.88018437 23.79016669 15.04335918 15.05641242 15.0698638 15.88850636 21.36988095 35.12905582 47.50057986 52.32379438 45.92200366 54.9508938 59.18669024 62.73101591 54.95378434 51.77343832 43.66548863 51.5003948 54.65314485 55.38784033 43.71748819 43.61582547 43.05556234 40.41138028 39.64836233 22.70131909 14.98954505 15.00616298 15.01734059 15.1820865 20.6798423 34.59018282 43.29918051 45.3736375 38.65333342 49.21108778 54.34672343 55.62188035 45.92361065 39.27827569 35.43025104 43.97449566 44.47896322 47.01878609 39.08361135 39.48540152 40.9453583 39.62448432 39.54895498 22.6902418 14.99825911 15.02202239 15.03323367 15.19890743 20.72661498 34.58228028 42.27112907 43.93597442 35.18775772 45.7424238 48.53516165 50.80072835 43.29309505 41.90923285 41.51465661 51.3952246 51.67465039 48.94842955 39.49209202 41.15514995 40.49366827 39.49395206 39.55342826 22.68303774 14.98436001 15.00019901 15.00399771 15.1725137 20.674422 34.56034789 42.15012486 43.25854499 34.64331513 45.22806289 48.14733406 50.18080081 42.30726512 40.75364301 39.38519754 46.17520979 45.696475 44.96175562 35.94750846 37.83925797 38.9461285 38.60035457 39.34543323 22.6157171 14.93327395 14.96109879 14.96886402 15.69308069 21.15868179 34.68921947 41.90439382 41.91492084 34.42166986 41.919056 42.64039774 42.4036828 34.46151011 34.48298669 34.51327982 43.02355639 44.75589585 46.43358008 36.65004973 37.50586156 38.66849453 38.56679041 39.29881335 22.57594782 14.88919411 14.90967842 14.91881445 15.07945529 20.57650108 34.43271632 41.91671672 41.94690534 34.47549685 41.97903684 43.82686502 45.51779219 36.76090343 34.69340964 34.48210986 42.93672035 43.66786749 43.93598061 35.6179139 37.26336091 38.70218457 38.56471717 39.31469287 22.59313286 14.91123005 14.93757647 14.94832884 15.11286965 20.58678943 34.43082218 41.95057759 42.3096929 34.79441496 43.08203643 45.93801014 47.04119395 38.70989058 38.16437887 38.21385974 46.8863866 48.3362966 49.99140242 41.41089299 40.90891999 41.22857147 39.1936093 39.31266774 22.57658862 14.88064408 14.90458039 14.90730607 15.58546957 21.07319817 34.656696 41.9406168 43.01869309 37.13833411 45.47351254 47.86274331 48.17967344 39.79081791 40.04145715 40.82288809 50.52433333 52.39651483 53.38713334 43.21402842 42.62627961 43.64340684 41.85259696 40.26296361 22.66656148 14.96489221 14.97099604 14.97582586 15.1413263 20.60894697 34.43573594 41.9475309 42.43857565 34.86247326 42.954225 46.39554863 47.86541027 40.23817165 39.73432609 39.64203645 48.2855363 48.21566277 49.83553941 41.34374246 39.59676601 40.86686501 39.15023494 39.31745092 22.58501785 14.87860206 14.89711849 14.90192901 15.04447226 20.53419022 34.37741621 41.8948585 42.12074153 34.47155504 43.19943124 45.3368164 46.98625039 39.71627887 38.86242713 38.60478637 47.42903883 47.87913618 48.37230814 39.51168782 38.10214306 39.41051231 38.63125762 39.25407022 22.53711786 14.8752767 14.90381608 14.90634262 15.03502645 20.51455482 34.38628858 41.92099324 43.0498065 37.61017994 47.51651402 51.86942222 53.65278666 43.7945956 41.72922765 42.37033618 52.07138946 52.9297334 53.46921466 43.90906649 42.75739095 42.40699354 40.53547558 40.50697079 22.68270386 14.98012294 15.0025014 15.01094374 15.7780226 21.29357379 34.81260365 43.43327554 46.07129981 39.42407846 48.16703185 51.55734391 53.98179038 45.76276799 44.7525681 45.03311435 55.04944767 56.28107677 57.39457256 46.78082813 45.88698046 45.7780122 43.76992845 43.29828973 24.01779259 15.03611838 15.05481955 15.06960652 15.25684148 20.762594 36.05564646 46.87512099 48.51841876 42.82208515 53.29119024 58.15894288 55.33959924 41.08409267 41.29914578 40.84996811 49.57228399 50.56435364 51.35990856 42.5164695 42.57510839 42.65753777 39.7557872 39.33840779 22.57737209 14.88656723 14.90657815 14.90800618 15.05973183 20.53336976 34.36953773 41.8393761 41.82972731 34.34491255 41.84562026 42.56313911 41.90421311 34.37494899 34.37687003 34.37357866 41.817557 41.8145242 41.96728575 34.46608977 35.49556166 38.58598601 38.47042341 39.22714795 22.50756268 14.82944501 14.85734868 14.87220231 15.55306665 21.032254 34.58312973 41.83071612 41.82822282 34.34214223 41.84617489 42.5758435 41.96215459 34.43816845 34.47559444 34.56211895 43.51200153 45.36342191 46.87545786 37.82088052 36.8414086 38.67089613 38.53032627 39.27310927 22.55041939 14.85964993 14.87494403 14.88143417 15.03318273 20.51140356 34.3597209 41.84537078 41.91672557 34.55928609 43.16459207 46.785011 47.79881638 40.13549835 39.9695838 40.16028748 49.53452131 50.3536465 51.84739054 43.37017586 41.01384333 41.85923112 39.48635302 39.36152893 22.62452243 14.91753198 14.93958575 14.94017044 15.10429239 20.59009965 34.43562827 41.9609303 42.93705896 35.43971461 46.18158757 49.78922036 51.30684624 43.17729218 42.78072949 41.79844764 49.97111501 49.35835428 48.76581163 39.75308077 40.33628257 41.52905011 40.01515045 40.14464172 22.69762015 15.00585015 15.02067597 15.02719124 15.1999972 20.73582038 34.57656924 42.45947668 43.09085905 35.35279461 45.18019118 49.2477049 52.52757815 44.35220094 42.80790494 41.45340213 50.70451654 49.5574561 49.4072816 39.03749421 37.63876402 39.12135814 38.56343203 39.32212144 22.58819252 14.89274641 14.90949507 14.90621101 15.56519823 21.03800338 34.62180748 41.88204043 41.92205339 34.43432101 42.02929483 43.78906774 43.53713913 34.87211196 34.46197344 34.44906267 42.13187766 42.76502466 43.48513607 35.16532419 35.6438864 38.52319425 38.49239389 39.2347375 22.5122888 14.8231566 14.84535227 14.8545587 15.00106133 20.48479321 34.3313262 41.82187337 41.81881271 34.34356682 41.85111618 42.56781813 41.91101088 34.39258294 34.3879984 34.37110986 41.82390363 41.96925628 42.87123201 34.97350884 35.62559795 38.61517699 38.47316021 39.19509608 22.46416967 14.78476902 14.80971676 14.81911247 14.97272825 20.45168745 34.30001853 41.81547881 41.88237093 34.4339679 42.01887654 43.74695242 45.57920785 37.15685749 36.02489048 36.22087189 45.34009839 45.64202776 46.44849305 38.24436794 37.38426779 38.94226696 38.54545298 39.29400091 22.57873145 14.89609252 14.92626394 14.92681283 15.62791865 21.10805635 34.67991 41.92656039 42.30677005 34.86286669 43.27875592 45.80197205 46.57667688 38.59261498 37.60147984 37.20209403 46.57592171 48.2022503 49.002487 39.46608983 38.32386521 39.29670754 38.59325969 39.2745608 22.54334399 14.8688206 14.90015163 14.90477755 15.05386463 20.53307463 34.38742816 41.88918681 42.15329761 35.46928311 45.22340885 48.23942413 49.67025936 43.22623676 43.55683498 44.07943554 52.89530367 52.75325717 54.29707111 44.84856323 42.43497869 44.24790804 42.08117233 40.51789109 22.69223783 14.99290416 15.01631811 15.0291836 15.20322766 20.7492745 34.59195926 42.96785131 44.58345051 34.72887314 43.81014722 48.14800339 51.24768169 43.30882168 41.93461185 41.49856822 50.68118029 52.68160375 54.00969516 44.70553942 43.84684677 43.9993117 41.3110453 40.47068109 22.68279644 14.98182458 14.99023274 14.98711807 15.16177255 20.65364625 34.53708912 43.93422903 47.49909329 40.89570442 49.96969674 53.39079386 55.10093774 46.87701641 45.58697963 45.71695485 55.32472661 56.77122921 58.35335557 48.62522588 47.23822019 47.10614691 45.20025195 44.06738314 24.40889497 15.04108496 15.05299107 15.05768598 15.88549289 21.38833702 35.39734766 46.03082995 48.04706577 42.00722606 51.5565269 55.60822705 57.93368365 51.39866739 49.88200809 48.55627256 57.59125361 58.63140599 59.0956112 48.51041273 47.16503999 47.39045098 45.60029536 44.41836396 24.89983777 15.04502925 15.07088737 15.08174333 15.26766963 21.00974773 35.43643122 46.12632648 47.73856014 40.12730904 48.59793631 53.95911881 57.29699913 49.12236946 48.82653385 48.0379026 59.02343205 61.53245104 63.15515095 53.22149173 52.49540282 53.176778 49.19913931 45.9419996 24.29691412 15.04598221 15.04646702 15.05009324 15.20763831 20.74708936 34.57294052 42.48462945 43.30370456 35.14868908 43.12985392 44.84195006 47.680618 39.4961271 37.98492071 38.39822082 47.43357376 48.94802062 50.95919812 41.6193282 40.99306711 41.04014939 40.32449762 39.82648781 22.68550347 14.99914516 15.01990902 15.02924727 15.79410815 21.33712778 34.84014372 42.68108755 43.51931994 36.97356614 46.44202264 49.94216049 51.91100147 43.31345662 41.93770481 41.71704947 50.52316964 51.59298001 53.05624475 43.30369877 42.92426743 43.48031878 41.8551611 40.45435868 22.68190706 14.97808394 14.9880956 14.98914957 15.15069693 20.63331814 34.50280881 42.90068855 45.88506342 39.31512256 49.0891587 52.74698449 53.33260109 44.7695013 44.0198463 43.09153283 50.64212688 50.38272726 51.16064614 43.10712095 42.18786402 43.84209274 42.59901112 40.66400116 22.6902508 14.98628937 15.01451692 15.02447541 15.19888439 20.7281536 34.54584713 42.04868234 42.77330265 34.50331842 43.34654148 45.32364199 48.51101328 42.66289233 43.60270492 44.51275409 54.81257781 55.79582988 57.39895107 47.85788477 47.00739763 45.89752357 43.68791328 42.83253883 22.72480865 15.03564624 15.05894681 15.06900363 15.22334535 20.7479639 34.55446295 42.0860677 42.72277111 35.33670347 45.98264544 50.51337069 51.24932231 42.16702159 41.51703257 41.85064848 51.48598232 52.86696853 55.1845878 45.60942217 44.20256384 43.80158773 40.78509538 39.63048045 22.63906442 14.93200679 14.9552358 14.96248059 15.68060503 21.14234333 34.70212167 42.04140068 43.56382809 37.61865009 47.17321282 50.50095111 51.73074354 43.28853487 42.33356707 42.19965163 51.37862809 52.76868003 53.9030551 44.85458271 44.26574642 44.75181117 42.67797923 41.29996668 22.70915363 15.01551615 15.02943286 15.02590222 15.19013267 20.70375241 34.53135247 42.85790952 45.15270664 38.41583704 47.35449455 50.65722357 52.75520106 43.93761503 42.57463655 42.14925352 51.66990204 53.80844266 55.59574765 46.4171663 45.95870376 45.55518963 43.24273965 41.65198944 22.70164528 15.00535159 15.0311265 15.03895811 15.20379883 20.71279881 34.56245562 42.98804567 45.27321877 38.23538059 47.59627028 51.38743004 54.00085201 46.10470383 45.18403636 44.95728892 54.59451482 56.2125777 58.11011162 48.69654544 47.75433435 47.622883 45.2571568 43.9822452 24.49618165 15.05646434 15.07513639 15.07940191 15.90293289 21.3937638 34.90853887 43.25882539 43.51222056 37.47726511 47.98677589 52.63879563 56.07744207 49.33304235 46.98211399 47.20763606 58.53103227 61.40628263 57.97024757 45.75525926 46.40057833 46.5891728 43.915859 41.53745669 22.71553722 15.01238363 15.02272925 15.02154782 15.18145796 20.63626283 34.46021416 41.94523463 42.27388359 34.98143907 43.86474524 46.93257841 47.66703055 40.39274515 40.30524413 40.36411995 48.9344463 49.60596272 51.21839037 42.71187886 41.66290583 43.33295115 41.07410235 39.53970754 22.62508684 14.92032007 14.9311551 14.93806325 15.10055832 20.5849833 34.44113472 41.96081138 43.92680295 38.17418735 49.66855878 52.59994093 54.77517173 47.59079329 46.43475418 45.8074552 55.9166775 56.11507038 55.95181997 47.24173534 47.35920245 47.08167326 44.78501937 44.29773146 25.03970588 15.04782428 15.07341562 15.06894428 15.23853666 20.80611426 34.63357971 45.7052199 49.25565018 45.46571184 57.98244922 64.75646565 65.98765567 58.09750123 57.54107522 57.39120562 66.76416339 67.52466955 67.63328105 60.06098406 60.00931361 61.58139676 58.58760978 55.39853055 32.72903129 15.13611654 15.15227934 15.14588277 15.32606529 26.02088259 43.31408433 59.34551882 62.73630678 52.20146989 64.27673716 67.94431878 68.04048783 60.36108722 51.88078251 46.57341429 57.39839973 61.08394573 64.79437301 56.19725281 55.55048693 53.73042058 50.41132156 48.93902852 27.94353849 15.10665906 15.12712601 15.13687541 15.32391078 23.70779734 39.1532221 51.50015279 54.62676274 48.64633697 58.87116387 64.03556696 66.83698852 59.07225274 58.78074228 59.19784767 69.03549612 69.65899539 69.45873068 61.1420418 60.28272709 59.87859753 56.51672516 54.69441075 33.12353739 15.13715059 15.14914447 15.1560589 15.33835164 25.73254839 43.007622 58.04153023 59.55979073 50.14917931 52.10055831 53.27442284 59.1394365 54.54181948 50.37070094 45.46586236 52.90470333 57.42850561 61.71414101 52.91387016 52.00461349 51.01949303 48.79744101 46.65946242 24.60539596 15.07765135 15.09995903 15.0985196 15.90047535 21.46051267 36.12163674 50.91446465 54.39562913 48.58634258 58.73436623 62.78695542 64.58472941 54.24772605 53.21478355 52.53699563 61.6296943 62.36713523 63.22564964 53.58334156 53.71026218 52.13052697 47.8561874 45.87128105 25.48109212 15.05888346 15.07320699 15.07726711 15.24069391 20.75635265 34.58248917 45.22238175 46.6338172 38.97049415 46.94995239 49.52341594 49.88152485 41.79889681 40.940917 40.4629344 48.99554956 48.92818369 50.69410738 42.71624352 41.41471227 43.1307687 41.10148053 39.69966483 22.62993044 14.92304483 14.94252674 14.94721927 15.10063036 20.57296094 34.43046981 41.9455275 42.52869329 34.76043248 43.90447616 45.84149573 46.62793423 38.8458088 38.36296643 38.59415199 48.64397899 48.36472423 48.21728857 39.7674617 39.43929962 39.99397155 39.31969304 39.6606951 22.66508592 14.97232923 14.99692281 15.00557484 15.18998838 20.72018773 34.5398484 42.32508402 42.83210022 34.65279239 42.96107593 46.45531999 48.60217721 40.90653241 39.85079663 38.58183354 48.7377191 50.26642627 50.82480949 42.07907221 42.07832503 42.59545502 40.63871694 40.03877131 22.69078877 15.00348767 15.02954775 15.03758801 15.81177157 21.3374504 34.87669366 42.82519336 45.57157372 40.16242838 49.37188429 53.48515057 56.77925827 47.60085621 46.95587261 46.7585421 56.40550829 57.93134796 58.70067238 48.23730094 46.25432106 45.56249073 44.07563053 43.53168607 22.98477596 15.0121121 15.0291418 15.02964551 15.19785547 20.71426797 34.52812421 42.56785263 43.92777412 36.5322996 44.94141347 48.30934557 50.65581964 43.45287171 42.37670698 41.99771651 51.19220463 52.48354169 54.35017663 44.95869569 43.76596222 43.79281108 40.43407489 39.60610732 22.65678973 14.93409761 14.95913214 14.97696018 15.13918011 20.60988508 34.46758611 42.50925135 46.22014575 40.31235338 50.24913793 55.04247499 58.09435706 49.88744094 48.87018023 50.34724946 61.67912934 65.37417044 67.03787676 57.97619325 56.91782217 55.97400229 53.29884902 52.20125703 30.72141192 15.12170129 15.16367055 15.18079614 16.06526813 26.86935882 41.36921493 54.19149357 57.33132042 50.36600182 59.41917167 64.50824475 66.25570435 57.29925828 50.74868048 47.83613437 56.77182063 57.38538019 59.31697786 50.31311655 50.48748591 47.78528053 43.61226227 41.46131505 22.69228527 14.99953823 15.02677767 15.03091338 15.20066705 21.7132517 34.5219747 43.19333868 46.44629162 39.43798683 48.68635997 51.7215167 52.26571034 44.30563349 44.30879497 45.30751365 55.64171954 56.08749624 58.03879117 49.193842 47.25569517 48.95288054 46.20037458 44.49470617 24.27332523 15.05974929 15.08165334 15.0868793 15.27399515 21.87729889 35.07273524 48.0526573 51.40660108 44.76989208 57.74532822 62.42084994 65.97820237 58.17143418 57.78146337 58.01451925 66.83317724 66.41127492 65.54043848 53.66183762 50.0873189 46.89514756 44.73407089 44.78232291 25.24272194 15.06196612 15.07413523 15.08157096 15.26624001 21.86988732 35.26394754 48.18607315 53.29300454 45.43645648 53.19342664 56.85878237 58.13671664 50.88951083 48.65280234 46.54440803 56.30502108 57.12606315 58.31097951 49.31876446 49.12464127 48.24164945 45.37323611 42.86457411 22.73629554 15.0442044 15.0634377 15.0741854 15.86694615 22.46378135 34.94483014 48.04509785 51.5365808 46.71798556 58.10509064 65.25692237 67.46793358 60.01190766 59.6470889 59.65360161 69.04615753 69.032493 68.70553098 60.73985671 61.01305633 62.44468015 59.38597927 56.22194074 34.13899982 15.15909565 15.17700697 15.18235456 15.36938652 26.95943481 41.10645322 53.70903995 56.39912741 49.97392063 59.99625629 66.42397901 68.60298193 60.86453202 61.06100506 61.30594503 70.39555915 70.04841075 69.36246175 60.53924328 59.24614409 56.80790289 53.81113707 52.36083933 31.17602872 15.13973268 15.16243026 15.17565015 15.38566654 29.12925722 43.05200258 54.51841374 55.30953814 44.502627 50.42212399 53.93513257 56.64899324 48.16176625 48.06827379 47.74212483 55.90116756 56.46088525 56.61240939 46.33866395 45.65028282 45.39894702 43.21683736 41.49065417 22.69419594 14.99246827 15.01283877 15.03240135 15.82324396 22.39915168 34.84737723 43.10320234 45.97880106 39.7610361 49.15036406 52.09261362 54.37962054 45.78852557 43.96645136 43.55469206 53.3087639 54.93475418 56.61439181 46.41488474 45.44904141 45.27419852 43.02992085 41.62099442 22.68900002 14.99321633 15.01723175 15.00970303 15.16975232 21.70173212 34.52258101 42.55556898 45.46760405 40.2877644 49.43226641 52.26244287 53.71800503 46.08199802 45.75607255 45.71118483 54.18633216 54.31870365 56.38543452 48.18564278 45.5860793 45.20580666 43.64610181 41.38030013 22.67121346 14.96298797 14.99932134 15.01411272 15.19279806 21.76660015 34.53300402 43.58890905 46.52848448 37.08703449 47.74514368 50.44677879 50.69809574 41.33313408 38.90642956 38.47773961 49.55472762 52.2933513 54.16982423 45.84640069 47.31910552 47.45394333 45.93096551 46.29378146 25.32150941 15.07554491 15.09337786 15.09138602 15.25913871 21.84159502 35.05501102 49.51222656 51.75211857 43.90751562 53.73936763 58.81477133 62.95291531 55.91576989 55.36194169 53.89327812 61.64366451 59.66522057 60.5058394 52.72130961 51.34970663 47.79366736 45.30983494 44.00809697 23.74271602 15.02728918 15.03587312 15.03287624 15.79569034 22.36818565 34.79531862 42.30300801 43.67783173 36.82611979 45.53080686 48.34825766 49.58019598 41.40889983 40.53990937 40.42850587 49.42053813 50.40155836 51.64759961 42.10592856 42.19591008 41.24194067 39.3651954 39.39059487 22.62108134 14.91731308 14.94841317 14.96903706 15.13724608 21.66549852 34.46971776 42.08714522 42.65921618 35.74016714 44.59336035 47.38574391 49.52100449 41.7467289 39.92885562 39.87780115 49.27728643 49.4260042 50.12058312 41.17084755 42.26972298 42.18420472 39.83755116 39.45403351 22.65151829 14.96462766 14.99251721 15.00522367 15.1736254 21.7028065 34.49721464 42.10275338 42.93882603 36.17149414 45.90156005 49.67147631 52.27288829 43.63700049 41.25988331 39.81120912 50.13402692 52.08177846 53.69629267 44.59209981 45.08189966 41.60539788 39.44962408 39.47362386 22.67293097 14.98265867 15.01073061 15.018656 15.78603696 22.38105506 34.8159474 42.38906859 43.64302118 36.98828677 46.22077225 50.40399751 52.73409233 43.79566412 42.44171856 41.79582241 51.23167218 52.66913589 54.90991625 45.07541408 44.84248969 43.4526245 40.4393773 39.82012435 22.68167313 14.97597208 15.00246207 15.01272915 15.17738893 21.71425758 34.50770416 42.34483267 46.41711676 40.70767585 49.96949351 53.84502515 55.51828133 48.22275926 47.59769118 47.07484044 55.76376755 56.10326966 57.69971345 49.20698887 48.58510486 49.02061736 46.74287084 44.52737333 23.1372332 15.03628963 15.04847746 15.05221375 15.21774301 22.84251381 34.56691794 42.44753408 45.86137446 38.23119531 48.53000886 50.85659898 53.41819478 45.75887749 45.12659081 45.22396709 55.47941128 56.6931684 56.5937433 45.53498423 44.72840647 42.61592313 39.41951366 39.41476417 22.68278938 14.99702616 14.99669606 14.99416532 15.1643272 22.76684182 34.51236496 42.1688543 43.05447354 35.25201059 43.69975613 45.68920131 46.91391216 38.61067514 38.03055811 38.09238882 47.04074541 47.94204439 49.45557695 40.55434144 40.81796732 40.37476866 39.80645113 40.65721358 22.88200837 15.0555162 15.09457418 15.12559783 16.03476775 29.58216556 42.23539258 55.2659685 58.83104149 53.14775098 62.55150717 67.08824499 67.70804415 59.83537119 59.02786775 57.61134583 65.23312644 66.03766798 65.77390093 56.61269746 56.61576195 55.86009828 54.54129522 52.52773109 30.61363088 15.11868411 15.13822303 15.13912518 15.31539823 26.77081746 41.42248605 55.80088674 58.19436611 51.98358832 61.23691993 64.42219765 65.19543144 56.29615453 54.47768675 53.68481294 64.54570847 68.29171762 68.83920221 60.05410155 60.57972267 59.52579158 56.50371503 54.17176542 32.14389131 15.13271028 15.15069369 15.1588897 15.3475057 27.44180404 41.10138593 54.0830475 50.76648873 40.81806697 47.97632254 50.21502211 54.00794858 46.00055107 45.82125205 45.80992553 55.0747226 57.25965613 58.36614845 46.2737551 45.5078612 44.64050463 42.35363713 41.78441272 22.69824878 15.00017188 15.01901519 15.01878451 15.78372542 23.41550175 34.77968403 42.27805795 43.28170807 35.28592999 43.53656966 46.87075821 48.5469191 39.74056063 38.0268852 37.05513778 45.56521258 47.12783576 49.28708684 40.15503795 40.66656228 40.31751591 39.18844411 39.35016865 22.63275308 14.94176724 14.9676085 14.97479563 15.13083916 22.72691548 34.44128488 41.94793207 42.31231637 35.28387719 45.39455528 48.60278925 49.17425391 41.56064003 41.21878875 41.3144579 50.05998366 50.32744234 52.61766871 44.46857017 43.78789417 44.36374751 42.91809671 41.84312418 22.70783416 15.01474492 15.0364357 15.04374177 15.21597461 22.86221732 34.56771258 45.15134371 48.30102985 40.43039974 51.26871203 53.66925647 54.42222213 45.55109601 43.17293035 42.92306051 52.24003492 52.71134974 52.93244205 43.44768858 44.83921958 42.47010457 40.07128172 40.07705132 22.69050194 15.00184761 15.01891835 15.0166859 15.18451814 22.78072754 34.51631819 42.94573525 45.99741726 39.09393244 48.08546697 50.81057287 52.06360078 44.08811278 43.00276283 41.86559869 50.59722685 51.78047555 53.05273689 43.61881108 45.8373446 44.56835455 42.39308067 41.92271178 22.79698027 15.03517511 15.0510151 15.06050493 15.86229306 23.48112435 34.89260153 43.79097924 44.57102328 36.82935186 45.89476098 49.59726607 51.55722598 43.05857188 40.40524868 38.17615946 47.73757434 49.5429679 51.5604417 42.57887841 44.93926309 42.76077238 40.20497816 39.63361452 22.68319468 15.00155042 15.02431614 15.02966512 15.19351973 22.78484843 34.51479885 42.07185994 43.93987624 37.91812227 47.82999431 52.53650905 55.62843091 47.89884078 46.41776301 45.4483459 54.60509472 55.74506437 56.86324494 46.79086819 48.20528985 46.00583021 43.37766995 41.81096143 22.70867142 15.01334655 15.02958071 15.03260268 15.19619692 22.82885607 34.52541982 42.53130061 45.68613065 39.60591153 49.26371198 53.31548583 55.72427461 47.14620442 44.60980614 43.5248461 52.64330312 54.50301869 56.23923395 46.83809682 48.34462586 45.92349572 43.77862352 42.73671248 22.7271883 15.02846062 15.04357102 15.05152434 15.8434984 23.50360333 34.89166138 43.7220359 46.23769693 40.53045715 50.4124642 55.50682713 59.07572724 50.53608885 48.49522221 47.74212176 56.97522766 59.21918668 61.2587297 51.0513192 52.58068408 49.699046 46.72600561 45.18695352 24.76751267 15.07139932 15.08965524 15.09847821 15.27645237 22.94559116 35.69913841 47.17996156 48.15570051 40.41479315 49.46988929 53.61341122 52.12315233 44.04704171 43.69148817 41.84862979 50.21899062 50.28404273 51.8379218 43.59168832 44.04738766 43.97660246 42.76988 41.70724918 22.69789057 14.99904341 15.01705529 15.02756815 15.20105789 22.84040975 35.59019566 42.08278004 42.85134632 34.81551865 45.75985432 50.42446184 53.22709135 46.26462409 45.44867732 44.54034229 53.72254954 54.75569369 55.74011376 46.82963714 47.94512946 44.4244636 41.28871154 39.86702349 22.68939544 15.00467628 15.0278296 15.04070951 15.22398085 22.87912896 35.64458437 42.69019947 43.33396017 35.34497311 44.27815478 47.99107254 50.90557097 42.21444469 40.41146486 39.28517511 48.78224241 51.0383978 53.98317166 45.42126129 48.15550065 46.74694548 44.97971019 43.712225 22.82608269 15.06807527 15.09016826 15.09802011 15.91456044 23.59434606 38.13113728 51.22739072 54.42898893 48.53479259 57.6630581 63.23266604 65.68494916 57.58743227 56.56349331 56.38323703 65.81491853 66.51472629 66.50779571 57.92964704 60.20391093 58.93316808 56.32030148 47.10720477 22.78342187 15.03975453 15.05880411 15.06934788 15.25070927 22.9242421 35.69807632 45.3662648 47.81388106 41.10153352 50.78515391 54.66133276 56.54841948 48.56374961 47.20301212 45.47218065 53.47867716 54.05238174 54.67611975 44.62415779 46.95973264 43.50716279 40.44670743 39.61933317 22.6678028 14.9795591 14.99245178 14.99837658 15.16322944 22.75828418 35.53650492 41.97534908 42.64694372 35.11621265 43.95083725 47.72481329 49.38689483 41.18930244 39.92968191 38.93183787 48.35238914 50.00492197 51.15125095 41.85171637 44.86676964 40.77175397 39.21108178 39.44564181 22.67111419 14.98650589 15.01860476 15.03441676 15.81907465 23.43737204 35.84853844 42.04386534 42.89510833 35.57692478 44.48498718 47.87924721 49.2921089 40.26607142 38.60337889 38.87005546 48.26840715 48.90350374 49.86954778 40.80227715 43.11170129 40.05387775 39.10824685 39.34364775 22.62103824 14.93966942 14.95862659 14.95472054 15.10613517 22.7045555 35.48751509 41.91827886 42.16964669 35.11004431 44.17118493 47.21643278 47.81960509 40.39838196 40.02144822 39.26813126 48.50473656 48.14473316 49.47308013 41.17303464 43.03191531 40.99338464 39.40616646 39.39454163 22.63194307 14.94031428 14.96516801 14.97074659 15.12812011 22.72241497 35.49815657 41.95081159 42.45718523 35.45347465 46.18881922 49.3538085 51.32708355 43.72005019 43.14968036 43.46035645 53.27610849 54.20548931 55.4172923 46.29753771 48.82586316 45.60386656 44.11070457 44.41351411 23.96976579 15.06147137 15.07939901 15.08364273 15.26725926 22.92220828 35.68150489 45.44233772 48.07486012 41.32746475 50.34693216 53.96886198 55.84494722 46.67785648 44.63709232 44.51133597 53.99741577 55.55528642 58.18982855 48.8121459 50.93315128 46.99391661 43.74892076 41.34111796 22.68001909 14.97841165 14.98605125 14.97914973 15.7015412 23.28031639 35.73484229 41.90931895 41.97543489 34.47399703 42.72659489 45.15472181 46.7644719 38.29818145 36.985334 36.56072104 45.07719224 45.75830097 46.52610613 36.86413948 39.78105484 38.80838091 38.53794317 39.26294877 22.53611189 14.85771109 14.88364508 14.88395364 15.0286214 22.62559413 35.40207353 41.84193457 41.87132994 34.41341646 41.93123971 43.42180168 43.72257294 36.21820816 35.48048614 35.13491634 43.41310206 44.76941882 45.90195715 36.23231988 39.51296478 38.66999194 38.49594588 39.2384327 22.52974152 14.84962635 14.87819654 14.88795275 15.03287845 22.62657884 35.41324392 41.84538254 41.87869929 34.4330372 42.27961733 44.97993381 46.8817243 39.21685329 38.61419334 38.14966732 46.88031918 47.4524942 47.6428039 38.35669185 41.26294399 39.55775194 38.72433638 39.32082923 22.59140256 14.9059688 14.93160025 14.93296656 15.62682916 23.22158444 36.76448924 41.8838678 41.90364036 34.42437281 41.93491001 43.33001722 43.66574354 35.61299079 35.03377213 34.74719023 42.95291577 43.31616196 43.68252803 36.40611073 39.19129003 38.55584043 38.53778171 39.29228821 22.57732811 14.90393546 14.93801592 14.95225843 15.12528107 22.73205059 36.58159921 41.92131722 41.91398344 34.43486201 41.92996782 42.87108159 42.74834894 34.82172157 34.49552135 34.46220977 42.4471492 42.83318131 43.69860445 37.03167819 39.48807759 39.11379781 38.66941646 39.34104658 22.62323398 14.93857831 14.96385295 14.97462467 15.14339373 22.74835662 36.59750234 41.95079799 41.95276975 34.46136883 42.01762844 43.20357154 43.0385195 35.14582179 35.59009978 35.61272934 43.8890193 43.82531063 43.96073501 36.83063684 39.62235569 38.77093724 38.57035132 39.31068396 22.59617015 14.92247717 14.95408989 14.96761655 15.13446675 22.73681175 36.59076554 41.94273652 41.94312469 34.45497786 42.04932821 43.89607121 46.55874453 39.14771898 38.19585547 37.81544198 47.86919741 48.92814884 49.20277291 40.15462528 41.26916722 39.52558768 38.64580506 39.32693949 22.60634781 14.9188814 14.9405753 14.94476174 15.64717308 23.23902971 36.78209201 41.89968142 41.94654791 34.62407966 43.58944198 47.48375828 49.33049293 41.6571072 41.61448306 41.8747844 52.14132411 55.31044191 58.12362261 48.42062382 49.45110522 46.43212996 44.76582782 43.89891645 23.79339379 15.04208874 15.04844007 15.03530957 15.18468517 22.77098826 36.54461198 41.90961781 41.92547325 34.46308707 42.33284151 44.20503878 45.91340841 37.04158067 36.70749499 35.98898906 43.85683087 44.87282139 45.93172569 37.54019989 39.63812476 38.71192108 38.52247703 39.26595075 22.5420055 14.85536711 14.87457952 14.88196797 15.02404484 22.61254341 36.45821072 41.82338357 41.85087154 34.38996599 41.90119665 42.86400745 43.11461606 35.37165906 35.1971894 35.21659576 43.98006358 44.96975128 45.41356636 37.43195599 39.77532255 38.78442904 38.52667456 39.27729257 22.56669807 14.89361108 14.9246975 14.93593681 15.65175495 23.25947339 36.8071682 41.9349809 42.23388787 35.71015458 45.54759829 49.57809221 51.20221996 42.77329107 41.85063903 41.42585242 49.9418024 51.01023128 51.75852619 42.32020417 43.13830215 40.18512204 38.96296533 39.37440321 22.64858327 14.94804911 14.96904303 14.98077271 15.15380248 22.75711458 36.61440504 42.00532774 43.15522025 37.34360508 47.17506787 50.70531393 51.94778369 44.77010677 45.47663852 44.94388797 54.65725486 55.66718191 56.32429632 47.65035925 48.35457913 48.0000422 45.53540562 43.62934265 22.80416193 15.04310894 15.0554736 15.05132303 15.20763394 22.865665 36.69922683 42.22473686 45.33466076 38.81779139 50.69705825 53.052218 55.25741607 48.0965545 46.46644669 45.68774047 55.52028449 56.41197902 57.01463077 49.3718983 49.71628265 45.69694079 43.21235059 42.95715971 22.96453527 15.03155453 15.03509689 15.04379123 15.20549857 22.80465969 36.66625103 42.13910703 44.87939906 36.66382139 48.30712648 53.03524839 55.62132011 47.80279956 46.67372603 46.62847713 55.94129109 56.20911826 56.30841428 48.10574175 48.1810309 44.10568667 42.37111234 41.84671253 22.72300685 15.01982305 15.02638376 15.03307726 15.80650806 23.44717763 36.93618878 42.24343603 43.96534663 38.07540504 47.76468421 53.05741626 57.6452313 49.40713281 46.64179182 44.66313207 53.14849245 53.82281907 54.91206209 47.91597554 50.06871686 47.76775924 45.9221771 44.84193772 24.806471 15.06949969 15.08715082 15.09277501 15.27152018 22.90083083 38.19113694 47.83294585 49.99542014 42.39814946 50.71309458 56.81554855 61.30920429 53.23748975 51.3568721 48.1276473 53.89592874 53.71235392 54.58659523 46.32901656 46.92556145 44.70036172 42.66983994 39.59079825 22.62580191 14.9229881 14.93430982 14.93093947 15.07181069 22.65405998 37.55280426 41.84033068 41.8295975 34.34188848 41.83455457 42.56845424 41.9420851 34.41835995 34.41563721 34.39459292 41.84584153 42.14149229 42.47426437 36.59689319 38.66719196 38.57075973 38.44801664 39.19080533 22.46209567 14.78019467 14.80926482 14.81162316 15.46850162 23.06865839 37.68690967 41.76910261 41.80209977 34.34428732 41.85879172 42.59465302 42.11642713 34.45724147 34.44821561 34.44938654 42.46254973 43.00595072 43.18249118 36.62647886 38.5542898 38.48848731 38.46592457 39.20011224 22.48027763 14.79560389 14.82515223 14.83771289 14.98195769 22.58694665 37.49590908 41.79491834 41.84669512 34.41085381 41.93926134 43.25721694 43.5978074 36.22596043 36.07713615 35.50474649 44.87346344 44.98485895 45.0831057 38.14251782 39.15554221 38.65558233 38.52520608 39.27355472 22.55264019 14.85994179 14.87975143 14.88512859 15.02485976 22.62156043 37.52166099 41.82831331 41.86181624 34.40742216 41.95610842 43.52926834 44.13997467 36.20847202 36.78076772 37.29423777 45.581643 46.02438303 45.31296718 37.6726128 39.18022636 38.67691847 38.52590613 39.28207165 22.57413036 14.88179495 14.89915367 14.9083042 15.06514938 22.66414502 37.56268376 41.88134758 41.91196135 34.46603119 42.26384967 45.10605232 47.28270594 39.35204554 38.26446423 38.25847418 46.70407022 47.4710802 47.81918923 41.16852841 40.08923123 38.91412808 38.56049585 39.30158719 22.58442098 14.90629073 14.93666864 14.94568242 15.69397673 23.31676153 37.91773396 41.98470735 42.26088561 34.96223117 44.26628517 48.70189821 51.16396416 42.47746043 40.50684013 39.24620996 48.03938654 49.64821352 50.698108 43.04990716 42.39761125 39.72896377 38.72888927 39.35422902 22.62289843 14.93660228 14.97288291 14.98761339 15.14933311 22.74731268 37.64236453 41.94548217 42.16538795 36.29629228 47.13074825 51.06656773 53.2074495 45.37625095 43.43889485 42.02215533 50.18063838 50.88079692 50.19966826 42.83175143 41.9110153 39.29104984 38.56052508 39.31138688 22.58262656 14.90243142 14.9267163 14.92599643 15.06241151 22.65617022 37.55718728 41.84550358 41.85963717 34.40287502 41.90072262 42.78070407 43.07912491 35.13561727 35.06508315 34.92924081 43.21816891 44.74237748 45.06894672 38.76727357 38.95625086 38.62924974 38.48631958 39.22986393 22.51124632 14.83019293 14.85198121 14.86469378 15.54723728 23.16125359 37.79009818 41.86134108 41.8633089 34.37692801 41.87821246 42.58822918 41.96177067 34.55988323 36.73737706 39.06117802 48.55395914 49.38938592 49.88305182 43.15016361 42.86481425 41.12927241 40.190845 39.63080649 22.68594415 15.01680499 15.04241446 15.05215997 15.24205348 22.85617029 37.77135908 42.32243255 43.70482269 36.83942177 45.72236142 48.07474747 47.85693048 38.68417647 37.06210621 35.71964035 43.39314098 43.28393098 43.35901294 38.14842872 38.701366 38.59773243 38.4780602 39.20918081 22.50414169 14.82693316 14.84263251 14.84383595 14.98376133 22.58097043 37.47673948 41.78419431 41.82135276 34.36182291 41.8693987 42.60584556 42.1689826 34.51999578 34.47884191 34.48453244 42.70310456 42.88334801 42.81837031 37.79251034 38.73917015 38.64050586 38.50579814 39.25875318 22.54723993 14.86005224 14.88318512 14.88725748 15.04299473 22.64503984 37.54751695 41.85019859 41.85553639 34.39648467 41.91817096 43.06202839 44.1634163 35.71105936 34.63982744 34.48984818 42.47600613 42.70985385 42.95089756 37.78069554 38.71859754 38.61618805 38.49383909 39.24582526 22.53133466 14.85061078 14.87966222 14.89289317 15.58672275 23.20440899 37.82601535 41.88573543 41.87778123 34.36983044 41.84941427 42.53508689 41.85728076 34.33391529 34.33526084 34.31402425 41.7525007 41.75640573 41.76527632 38.49258881 38.47554227 38.42076158 38.40039133 39.17196685 22.44192702 14.75503118 14.77906129 14.78449322 14.92037521 22.51463053 38.4726642 41.71948234 41.75073504 34.29373094 41.79217309 42.51160021 41.83994842 34.32397479 34.32705144 34.31621897 41.74303843 41.74585816 41.7460549 38.61897242 38.59192682 38.50481825 38.37983708 39.1509264 22.40866674 14.72745318 14.75788239 14.77116831 14.91301473 22.51761105 38.47571111 41.70765345 41.7327925 34.2716929 41.77510941 42.48756992 41.79556764 34.26983583 34.2687304 34.25189117 41.69905211 41.70921539 41.69918492 38.56025142 38.53534505 38.45239991 38.33950865 39.14060436 22.39447507 14.70431851 14.73085904 14.74278594 15.40092552 23.00442005 38.67384865 41.6899883 41.70463012 34.2286605 41.73123983 42.48865601 41.80004758 34.27653001 34.28333724 34.27944803 41.72266828 41.72636451 41.72535305 38.44436676 38.42321444 38.37198216 38.36170509 39.14618634 22.40443971 14.71879487 14.75056593 14.76986843 14.92030376 22.52567384 38.4885188 41.71969996 41.7315789 34.27235271 41.79861517 42.55538919 41.89800788 34.36420788 34.36742532 34.35203846 41.77873283 41.76668783 41.76898608 38.64457174 38.62210817 38.54204386 38.43009258 39.18538622 22.46925008 14.78465387 14.81229587 14.82200771 14.97461521 22.57716387 38.5357256 41.77023489 41.77606598 34.28821663 41.80454205 42.51573534 41.83883593 34.31678117 34.3208776 34.30896249 41.7479508 41.73874629 41.7450441 38.62169592 38.60455975 38.53008349 38.4168087 39.18097708 22.45907851 14.77850957 14.78299108 14.77738043 14.93066431 22.54239291 38.51563375 41.76730432 41.76602009 34.28681882 41.8190354 42.5980943 42.25860973 34.46577593 34.46759435 34.45931765 42.26160749 42.80389396 43.22864265 39.10728548 38.74332781 38.63561721 38.49543333 39.24272541 22.51141355 14.82417027 14.83561553 14.84525377 15.50131325 23.10884155 38.78130783 41.79115718 41.81573399 34.3876222 41.94014318 44.29102882 46.94527579 39.55591763 38.68729382 38.02675415 46.42536806 46.82442695 46.29424471 39.75464085 38.66301406 38.50463127 38.4863153 39.24121934 22.51050763 14.81274045 14.83440054 14.8488875 14.99762488 22.5977207 38.55980184 41.80234185 41.83084466 34.40628154 42.13562841 45.42817817 47.64817688 40.24104903 39.71054287 38.92181011 47.45083222 48.02385461 48.57807273 41.21772708 39.85299495 38.77784218 38.5426336 39.28850647 22.56807238 14.8810706 14.8988795 14.9054974 15.05848556 22.65393465 38.62185465 41.87470541 41.91448482 34.45774939 42.423988 46.32946697 49.64214838 43.0069843 42.14637868 41.04156099 50.02948735 51.62360828 53.71547877 45.93237804 43.91498631 41.52547029 39.41502141 39.41784228 22.66224582 14.96070649 14.97940488 14.98859918 15.77000836 23.38442305 39.0362311 41.9986264 42.09737926 34.49409737 42.70209229 44.99708513 44.98137336 35.43083823 34.76426083 34.49652322 42.70480657 43.50621455 45.64351091 40.55162943 40.78000709 39.52933816 38.97325338 39.37541222 22.64881324 14.96489235 14.99152726 15.00374729 15.17457161 22.78974435 38.77033083 42.00855129 42.14093916 34.6653891 43.75823207 47.46469421 49.19263556 41.51180016 41.31194942 40.85357956 47.58316989 47.33485848 49.59316031 42.28903185 39.64341291 38.87016507 38.54474761 39.2644644 22.53431028 14.83512394 14.8427546 14.83335587 14.96251723 22.55305943 38.49686425 41.72778782 41.74891259 34.28180516 41.80651473 42.55108656 41.89868588 34.37753492 34.38589739 34.37260077 41.81035663 41.80704228 42.8458982 38.64693271 38.60442519 38.51526915 38.39264709 39.16181253 22.42083912 14.73367199 14.74823501 14.7538058 14.89715965 22.50314821 38.46564529 42.77064696 41.73953267 34.28826857 41.8104006 42.55618768 41.91524056 34.39306535 34.3939267 34.38158339 41.81194888 41.81429861 42.84667142 38.64867635 38.59802122 38.50614063 38.39091255 39.15270524 22.41287092 14.72080493 14.74380695 14.75570377 15.41725539 23.02514488 38.69703197 42.76613441 41.73808765 34.29333119 41.82156419 42.58036679 41.94777031 34.41645464 34.42628126 34.41439323 41.84153113 41.84030948 42.88630058 38.50392894 38.48685197 38.43409286 38.41286961 39.17151604 22.44264893 14.75803947 14.77336239 14.77960058 14.93042456 22.53762506 38.50755408 42.81326808 41.77068619 34.30985119 41.82968589 42.56043625 41.92680212 34.43608042 34.46079858 34.42974976 41.82597586 41.81962529 42.87901046 38.70326491 38.67813545 38.59041217 38.46596849 39.21099636 22.47589203 14.77510792 14.79102512 14.79197454 14.92236925 22.51383298 38.453903 42.76072782 41.73672026 34.28931993 41.79442298 42.5260038 41.86692459 34.34659265 34.35070508 34.33982612 41.75908166 41.74435664 43.85617618 38.60672506 38.575281 38.49669642 38.38251553 39.15412152 22.41803019 14.73152465 14.75681125 14.76700493 15.41964765 23.02893053 38.7033303 42.77322046 41.73798628 34.27078232 41.76499278 42.50018097 41.819689 34.29885036 34.30808957 34.30132708 41.7251639 41.7271086 43.8494052 38.45007361 38.42601897 38.37683001 38.37587074 39.15823318 22.42105484 14.72315354 14.74948686 14.77098049 14.9249667 22.54028016 38.50997719 42.80149235 41.74774059 34.27199069 41.76982335 42.4961071 41.8069664 34.28308929 34.27917459 34.26047318 41.68932355 41.67959108 43.80327203 38.56048476 38.53661587 38.46004555 38.3536852 39.15082976 22.41337961 14.73034567 14.76044557 14.76993099 14.91685754 22.52417153 38.48588497 42.77632289 41.72049768 34.22880499 41.74074245 42.48231915 41.78696214 34.26689752 34.26951993 34.26051866 41.70217411 41.70173834 43.82145863 38.58382106 38.56558984 38.49218498 38.37998496 39.15971837 22.42695836 14.73948233 14.75535757 14.75978939 14.90453507 22.50745542 38.46055678 42.7502534 41.70658815 34.22630773 41.74159019 42.49927802 41.8233911 34.32582054 34.34247403 34.33681613 41.76890724 41.75628665 43.86520378 38.62035567 38.59499503 38.50917433 38.40321213 39.17641909 22.45579679 14.7644753 14.78467589 14.79847451 15.45579367 23.06708949 38.74922537 42.81885216 41.76602442 34.29700746 41.78332637 42.49089839 41.79153372 34.25320257 34.22631418 34.19629584 41.62946196 41.6384136 43.76587317 38.38550884 38.3808164 38.34131442 38.33284917 39.13204722 22.38462117 14.69774021 14.72197296 14.73553982 14.88402806 22.48664652 38.44771125 42.76309438 41.7269145 34.24416334 41.7412093 42.48233067 41.79241202 34.26630051 34.26377392 34.24769052 41.686784 41.69004102 43.81535825 38.57178751 38.5510269 38.47242974 38.35437287 39.13984088 22.39011783 14.6967463 14.71390042 14.72241946 14.87726035 22.49178671 38.45102182 42.74727138 41.69657007 34.23022208 41.73677594 42.49239013 41.8263235 34.30772693 34.31174334 34.29754286 41.73191025 41.72807212 43.84450811 38.57651782 38.54884645 38.47107825 38.35542416 39.13756673 22.38416718 14.68956567 14.71130762 14.71745634 15.37733158 22.98907025 38.66644418 42.74034635 41.70995196 34.26145788 41.79798193 42.57977029 42.11268697 34.59735734 34.48475432 34.47216524 42.45693862 42.53154547 45.5359664 38.53871113 38.48855936 38.44238079 38.44224236 39.18896782 22.46853119 14.77937235 14.80432961 14.81086767 14.95802316 22.56887417 38.54243065 43.89817148 41.79504945 34.33692619 41.84929497 42.59108903 41.95805447 34.43463354 34.4269242 34.39617427 41.8173437 41.7981338 44.96848842 38.67189166 38.63047819 38.53873269 38.41695903 39.17326748 22.44620471 14.75433471 14.7740405 14.77796302 14.92451443 22.52718601 38.47772417 43.82126642 41.71014357 34.23253771 41.74575424 42.49372651 41.81512201 34.29974054 34.29988871 34.28084283 41.7065071 41.70509883 44.87766072 38.5689291 38.53505222 38.45755276 38.33735194 39.12455519 22.36793239 14.68222534 14.69952421 14.70904393 14.85923799 22.47017017 38.43328673 43.78698773 41.6811306 34.22885964 41.75463343 42.50853785 41.86447098 34.3575618 34.36265139 34.34394411 41.76876926 41.76476459 44.9144453 38.59657527 38.57028911 38.49349374 38.3779915 39.1506996 22.4128775 14.73746899 14.76534528 14.76106358 15.43775719 23.06224293 38.73750781 43.86205209 41.76930568 34.31360137 41.82504635 42.55951828 41.91133406 34.38538116 34.37225898 34.33663244 41.75293933 41.75366276 44.93901358 38.49159562 38.49222094 38.43844789 38.42535494 39.18621549 22.46516311 14.78055022 14.8059783 14.81870752 14.97134758 22.58274372 38.55073622 43.90665518 41.78033674 34.28637418 41.78514897 42.50588906 41.83588164 34.31688161 34.32562575 34.32882568 41.7712835 41.77273506 44.93993432 38.61261688 38.58182928 38.50345968 38.37800886 39.15204541 22.40174247 14.71257568 14.72809175 14.73688663 14.8767414 22.47911601 38.4467914 43.80403887 41.69745242 34.25027052 41.77677513 42.53122351 41.89476991 34.38658829 34.39407555 34.38286591 41.82276121 41.7989128 44.94201333 38.62361203 38.58765027 38.50268687 38.40009961 39.16499174 22.4249771 14.74397644 14.77558216 14.78119228 15.44028433 23.05490106 38.73411514 43.8613224 41.76701634 34.32936327 41.87438084 42.63850108 43.63121162 36.68019727 36.050751 35.93738395 44.10197727 43.45664211 46.16566399 38.67261196 38.55104403 38.47410308 38.45889687 39.20911281 22.47648847 14.78202938 14.81048651 14.8215311 14.95961954 22.56360871 38.52246872 43.85895844 41.76366401 34.30847057 41.82803034 42.58375402 41.96833622 34.43774471 34.42501865 34.43192319 41.87352785 41.84235446 45.01640401 38.71172223 38.67018071 38.56552634 38.42670535 39.16583459 22.43179663 14.74467913 14.75971686 14.75769347 14.90006608 22.4988862 38.44623981 43.78995902 41.69118608 34.22307639 41.73964276 42.48902593 41.82041145 34.29645208 34.30465846 34.30175235 41.72542103 41.71623434 45.94654824 38.57982262 38.55062109 38.48052179 38.36962765 39.14586019 22.41359745 14.72570096 14.74400146 14.74854573 14.89517428 22.5112238 38.48483551 43.84307688 41.72535448 34.2440132 41.74616397 42.4888991 41.81529871 34.29933247 34.30307442 34.29372829 41.73327546 41.73022578 45.97445958 38.61521843 38.59149021 38.51553254 38.40089919 39.1755379 22.45303713 14.77226832 14.80163918 14.81560762 15.47943811 23.09777612 38.78492044 43.91555516 41.79441244 34.30288292 41.80534235 42.52091946 41.85304971 34.33553433 34.33779655 34.32010606 41.75721224 41.75452048 45.99987127 38.49854487 38.48969927 38.44607061 38.4383066 39.19857432 22.4831858 14.80173953 14.82794674 14.83805614 14.98053721 22.58944403 38.5617536 44.9800274 41.79902553 34.31136301 41.81477204 42.52375735 41.86719691 34.36054559 34.36245189 34.34611527 41.77637062 41.76623621 45.99653422 38.62496986 38.59200896 38.51508345 38.40679664 39.17793356 22.44747773 14.75925453 14.78686779 14.79563383 14.93837748 22.53764171 38.49734639 44.91552868 41.74767873 34.29518904 41.82879445 42.58423609 42.00618179 34.46161945 34.46941164 34.44988862 41.87647595 41.84461972 46.03508111 38.65084423 38.62633269 38.54530023 38.42657053 39.20370211 22.49301375 14.80674427 14.83325607 14.84657245 15.5091718 23.12776549 38.83093679 45.01858433 41.82299726 34.34117063 41.87243146 42.64844468 42.77990653 35.19868289 34.72883496 34.50900849 42.7248651 42.43034112 46.58957926 38.53532698 38.47306992 38.40799303 38.39333335 39.15841436 22.42687134 14.75129227 14.76685058 14.7634036 14.90241624 22.50819049 38.48596794 44.90469095 41.74482495 34.28910334 41.81971031 42.58685437 41.96181025 34.43402325 34.43683379 34.42143024 41.83335643 41.81623854 46.04213638 38.66530729 38.62388161 38.53682975 38.41895236 39.17721763 22.45752266 14.76956402 14.78681797 14.80099685 14.95463032 22.56265738 38.52531633 44.93756937 41.76763264 34.29057462 41.82603886 42.58003095 41.95420587 34.43451893 34.43604836 34.42287229 41.84041313 41.81479454 46.04022955 38.68867408 38.66883313 38.58121676 38.45030818 39.19826758 22.48361961 14.79126008 14.80021653 14.80282614 14.95167754 22.56331771 38.53079309 44.94965111 41.77187578 34.28494095 41.78943207 42.52369488 41.87300755 34.36321272 34.37367729 34.36041344 41.79727859 41.7918458 46.03035987 38.67241458 38.65040796 38.56831068 38.43436005 39.18892629 22.46750005 14.7802472 14.81011897 14.82818964 15.49349918 23.11109304 38.80143011 44.99000652 41.81160664 34.32152208 41.82653116 42.57241727 41.93230424 34.42373959 34.43648681 34.41223763 41.82897614 42.85775009 46.02187177 38.50251097 38.48918476 38.44015971 38.41478895 39.17010327 22.42215967 14.72515576 14.73264456 14.7256331 14.86655519 22.46868654 38.42500372 44.84077267 41.66822163 34.17914124 41.67261458 42.44422143 41.72810208 34.20858475 34.20857489 34.19638901 41.62754367 42.69434699 45.87990668 38.52108589 38.50372259 38.43572032 38.32675564 39.12401216 22.37511303 14.68734596 14.71408007 14.72801578 14.87954205 22.49048231 38.45251523 44.86820353 41.69383306 34.20673939 41.70131768 42.46378764 41.77622723 34.25635447 34.25853699 34.24366213 41.66773262 42.72806032 45.90727158 38.5437189 38.5211529 38.44762303 38.33670446 39.12585093 22.37335697 14.68331273 14.70328802 14.70709479 15.36725083 22.97746265 38.65440669 44.84271217 41.66994192 34.18217439 41.68006244 42.44191903 41.7264202 34.20401417 34.20293785 34.18917789 41.62889414 42.69418113 45.87950679 38.37807251 38.36937141 38.33148547 38.32133209 39.12280734 22.36463724 14.6761439 14.7014342 14.71470048 14.86613165 22.47995556 38.44645599 44.85601643 41.68403345 34.20003123 41.70003083 42.45493865 41.74161944 34.21645689 34.21725612 34.20620056 41.64090137 42.6962423 45.88055311 38.51972481 38.49968492 38.42587986 38.31077128 39.11512218 22.34975164 14.66036002 14.6852119 14.69780357 14.848081 22.45953164 38.42291905 45.8890961 41.66059325 34.16886087 41.67372259 42.43333023 41.71106683 34.18754504 34.18578232 34.17158941 41.60677656 42.66701232 45.8497489 38.49077344 38.47054597 38.39843366 38.28872375 39.09798389 22.33916659 22.30389545 14.63013959 14.65171962 14.66475399 14.81572911 22.44615574 38.40702299 41.63877333 41.64674353 34.16546077 41.65828033 42.43153621 41.7137378 34.19650121 34.19845383 34.17959449 42.66292569 45.84608169 45.85388943 38.49498463 38.4745827 38.40291631 38.29146777 39.10068201 22.34095725 14.64307382 14.66520586 14.67781399 15.34349017 22.96343986 38.64070641 41.64620539 41.64951577 34.16279984 41.65220428 42.42306012 41.70335278 34.17721439 34.17787761 34.16552889 42.64895303 45.83305087 45.84052975 38.33943716 38.32976311 38.29115336 38.28548913 39.09549582 22.33601961 14.63076211 14.65028495 14.66382145 14.81504694 22.44635719 38.40839572 41.63949842 41.64627367 34.16243556 41.65216092 42.42426003 41.70387627 34.1780504 34.17923986 34.16742912 42.6524662 45.83777823 45.84524198 38.48595581 38.46694079 38.39711675 38.2884052 39.09798033 22.33896245 14.6366497 14.65787372 14.67084614 14.82141799 22.44907447 38.41039963 41.64468899 41.65337959 34.17302006 41.6738987 42.45100278 41.7638787 34.24856799 34.25299737 34.2448655 42.72972227 45.8963742 45.89962408 38.53844578 38.51670264 38.44409798 38.32995413 39.12323198 22.37802778 14.68955261 14.71896839 14.7348476 15.40073339 23.0144403 38.69914718 41.71102245 41.71114524 34.22723247 41.72680113 42.4766635 41.78872215 34.26333527 34.25688405 34.2405084 42.74177082 45.91728966 45.92509326 38.42473772 38.42133016 38.3830547 38.37998452 39.16166746 22.43315752 14.75478765 14.78251523 14.79261984 14.93471619 22.53272229 38.48709885 41.71426989 41.72252912 34.24723033 41.76604508 42.51404112 41.87238759 34.36913205 34.37958395 34.3642804 42.82388484 45.97130953 45.95871403 38.58584694 38.56201687 38.48633477 38.36412303 39.14029108 22.40286883 14.72510004 14.7509714 14.76473185 14.90649072 22.51707402 38.48157196 41.70668733 41.71018905 34.22723046 41.71910664 42.45663229 41.73673536 34.21273952 34.22164729 34.20819909 43.74859586 45.85823725 45.8566631 38.49829898 38.47922843 38.40804787 38.29607961 39.10486184 22.34528406 14.65665937 14.6816269 14.69392751 14.84351596 22.4558133 38.41813624 41.65311033 41.66156211 34.17656368 41.66757284 42.43586938 41.71773649 34.20261776 34.20728407 34.19575174 43.73875523 45.85997709 45.86245386 38.50107959 38.48209727 38.40841034 38.29532804 39.10637227 22.35248162 14.66140989 14.68306533 14.69509453 15.36167284 22.97624516 38.66129211 41.67944615 41.69323598 34.22100677 41.72633647 42.47976119 41.80034228 34.27744668 34.28186817 34.26000983 43.80525143 45.92399471 45.93343624 38.42770476 38.41657335 38.37541815 38.36654559 39.14625679 22.40585835 14.71965186 14.74587751 14.75661786 14.90645796 22.51906684 38.48577411 41.73167262 41.73419503 34.2484519 41.74891974 42.48299936 41.79214554 34.2707101 34.27146095 34.25720611 43.80970633 45.92706129 45.93814884 38.58250807 38.56697807 38.49364265 38.38287058 39.16201656 22.42803574 14.74295353 14.76888958 14.78251783 14.93464232 22.54888265 38.51778571 42.81894135 41.75704531 34.26908375 41.75772781 42.48025574 41.78325501 34.26662822 34.26666568 34.25577236 43.81110275 45.92663665 45.93569753 38.57621885 38.55954776 38.48257105 38.36811109 39.15298464 22.41818814 14.73141219 14.75481303 14.76784711 15.43523799 23.05276646 38.74069909 42.81851938 41.76418989 34.2896127 41.80521903 42.53175287 41.86764496 34.34428845 34.34546349 34.32687855 43.87697791 45.98740671 45.99021806 38.48478957 38.48068596 38.44166305 38.43556886 39.19909519 22.48640839 14.80048368 14.82646147 14.83986554 14.99149323 22.60009722 38.55049031 42.81259424 41.74280383 34.26605723 41.77629465 42.50801753 41.83167901 34.31102328 34.31375851 34.29849927 43.82909274 45.93864069 45.93792808 38.57394133 38.5469251 38.46783064 38.3520942 39.13490122 22.37479982 14.68728747 14.71771781 14.72960429 14.88170939 22.50053817 38.46938036 42.77176637 41.73949232 34.26472093 41.77436542 42.50405307 41.8330845 34.31562854 34.31845273 34.29680628 43.83009369 45.94620695 45.94611561 38.57735666 38.55010091 38.47518486 38.35553625 39.14868232 22.40879566 14.71112847 14.74411752 14.77204441 14.935609 22.56890703 38.53854778 42.83461152 41.77855778 34.29855545 41.80716212 42.53808806 41.8741032 34.34804712 34.33754709 34.30010885 43.82822055 45.93223265 45.91869431 38.54462395 38.51423794 38.43695329 38.32213052 39.11447627 22.35072024 14.6606672 14.68547204 14.69799169 15.36256741 22.97321848 38.64961703 42.71889559 41.66624536 34.18034181 41.67157642 42.437258 41.71800551 34.19420703 34.19207632 34.18059359 43.72911867 45.85007189 45.86024902 38.36245091 38.35107474 38.30787279 38.29941858 39.10607005 22.34719982 14.65640873 14.68100786 14.69461537 14.84644285 22.46021457 38.42550868 42.72470219 41.66623377 34.18443456 41.68098345 42.44272687 41.72840489 34.20467813 34.20409663 34.18989086 43.7350768 45.85966748 45.86814117 38.50902126 38.49079216 38.41842298 38.30684261 39.11252508 22.35116346 14.66219496 14.68597105 14.69909475 14.85079157 22.46621572 38.43396483 42.72528723 41.66655286 34.17654681 41.67316366 42.43738659 41.71411766 34.1882282 34.18319584 34.16792332 43.71854099 45.84073121 45.84391431 38.48620457 38.46664012 38.39579668 38.28688481 39.09646587 22.33613602 14.63561049 14.65657829 14.66987826 15.33558127 22.96080739 38.63646411 42.70076791 41.64655705 34.16029326 41.65098436 42.4224611 41.70209099 34.17667041 34.1762416 34.16365021 43.70752148 45.83248126 45.83922038 38.33825067 38.32833829 38.29014908 38.28485811 39.09493362 22.33570591 14.63417808 14.65672228 14.67169297 14.82543345 22.45672348 38.41733862 42.70448023 41.65859178 34.18012107 41.68294912 42.44692968 41.74012903 34.21393814 34.21235807 34.19803433 43.73896087 45.85403936 45.86090942 38.50234902 38.48307041 38.41046615 38.29989973 39.10545584 22.34506138 14.64916956 14.67024329 14.68176442 14.83154426 22.45486397 38.41291757 42.69699895 41.6510912 34.16379481 41.66364295 42.43707226 41.7237887 34.20853044 34.21434967 34.20239842 43.75102237 45.86582876 45.87236032 38.51508606 38.49054855 38.41788818 38.31185992 39.11858851 22.35809056 14.66580282 14.69060031 14.70291915 14.85365614 22.4667109 38.43180424 43.78986261 41.67322289 34.18103128 41.67119989 42.4396391 41.71945355 34.19475452 34.19287158 34.1795513 43.72460136 45.84793294 45.85706677 38.49576557 38.47742075 38.40647086 38.29521225 39.10243178 22.3427845 14.65042825 14.67491576 14.68784108 15.35296021 22.96829258 38.64584434 43.77353919 41.66008862 34.17066369 41.66553419 42.42916236 41.71069663 34.18720732 34.18476183 34.16877568 44.77616254 45.84186579 45.84970052 38.34863808 38.33869317 38.29839381 38.28982213 39.09834973 22.33795927 14.64138169 14.66216134 14.67354806 14.82283251 22.44878606 38.41034255 43.7613801 41.65394571 34.16895168 41.66243105 42.43163115 41.7125952 34.19438748 34.19951642 34.19165932 44.80585562 45.86826885 45.87144778 38.50737087 38.49048254 38.42173755 38.30718047 39.11092155 22.34968908 14.65890696 14.68382375 14.69664589 14.84723521 22.46116158 38.42687137 43.78521152 41.68867136 34.22603734 41.73646199 42.48120792 41.79510196 34.27043107 34.26302266 34.23804153 44.82945013 45.88341694 45.88155209 38.51576081 38.48576501 38.40906566 38.29757223 39.10519902 22.34545893 14.65649156 14.68126736 14.69441764 15.35995519 22.97198082 38.64894869 43.77714324 41.66396448 34.17313266 41.66513049 42.43233186 41.7129614 34.18714579 34.18522116 34.17165609 44.77678876 45.84630963 45.85296962 38.35058416 38.3423949 38.30068377 38.29291872 39.10185324 22.34318456 14.64896142 14.67266177 14.68613444 14.83789991 22.45894009 38.42036695 43.77051849 41.66014912 34.19220159 41.70599957 42.46599559 41.778646 34.25738355 34.25893516 34.23915369 44.83525886 45.89011481 45.88328594 38.52178827 38.501211 38.42967048 38.31455376 39.11335669 22.35248135 14.66194779 14.68562873 14.69750374 14.84720041 22.46244646 38.41848581 43.76487896 41.65937616 34.18250065 41.70762374 42.46978657 41.77675781 34.25371375 34.24021708 34.2097115 44.81242795 45.86447744 45.85727053 38.49636798 38.47531288 38.40003454 38.28882975 39.09797572 22.33766091 14.64158325 14.66273629 14.67449246 14.82493894 22.44986923 38.41075864 43.76370881 41.65431392 34.16873429 41.66241244 42.4310871 41.71383993 34.19044311 34.19380493 34.18302205 44.80134893 45.87100111 45.88377502 38.52588566 38.50893198 38.43883311 38.33161347 39.12638163 22.37164101 14.67366202 14.70667959 14.73030098 15.36880065 22.97090444 38.64091289 43.76674178 41.6540522 34.16594347 41.65499607 42.42433591 41.70300879 34.17929731 34.17950319 34.16715247 44.76984413 45.83405973 45.84275081 38.34163151 38.3326829 38.29397439 38.28827301 39.09786182 22.33825177 14.63327191 14.65234295 14.66513836 14.81585946 22.44687723 38.40851594 43.75993387 41.64707342 34.16102535 41.65056555 42.42141537 41.70002437 34.17614327 34.17720628 34.16514707 44.7678082 45.83198059 45.83886193 38.4822638 38.46414695 38.39464628 38.28590025 39.09564652 22.33553175 14.62794351 14.64499571 14.65662795 14.80672839 22.44223746 38.40315622 43.7546364 41.64225524 34.15672762 41.64662145 42.42035402 41.70076032 34.17507256 34.17566794 34.16379145 44.76536337 45.83247595 45.83899721 38.48086306 38.462568 38.39362147 38.2859136 39.0963765 22.3377234 14.63460381 14.65585753 14.67033978 15.33839182 22.96499924 38.64309052 43.77395127 41.66192981 34.17367078 41.66976592 42.43227798 41.7146028 34.18158024 34.17000542 34.15505598 44.75763708 45.81973344 45.82624237 38.32667427 38.3171655 38.27890635 38.27319118 39.08367387 22.32078786 14.60593734 14.62030689 14.63317326 14.78389258 22.4299859 38.39209423 43.73495462 41.62293853 34.14394983 41.63782033 42.40529162 41.68184789 34.15969311 34.16214928 34.1506646 44.75437157 45.81625193 45.82395669 38.46691689 38.44868137 38.38071941 38.27264388 39.08375116 22.32341705 14.60630129 14.61872597 14.63174602 14.78226858 22.43261122 38.39127579 43.73410573 41.62247626 34.13686681 41.63379027 42.40758372 41.68204657 34.15943598 34.16124008 34.14867369 44.75061554 45.81498179 45.819768 38.46404278 38.44569147 38.37732156 38.26909441 39.07990369 22.31831788 14.60029333 14.61434726 14.62769783 14.77841133 22.42537148 38.39050044 44.8011964 41.6304629 34.14270419 41.63165924 42.40431683 41.68034589 34.15776136 34.15857857 34.14562896 44.74846272 45.81337822 45.82261144 38.46562285 38.44819163 38.37982646 38.27170182 39.08251405 22.32113516 14.60503548 14.6201832 14.63361548 15.30129383 22.94054024 38.62247661 44.80454443 41.63298826 34.14644128 41.63572246 42.40748404 41.68392715 34.16149147 34.16257782 34.14948568 44.7558018 45.82008447 45.82794661 38.32840921 38.32060139 38.28315921 38.27819714 39.08891778 22.32941507 14.62016537 14.63847423 14.65221471 14.80439075 22.4430303 38.40495304 44.81789394 41.64684125 34.15967519 41.65428219 42.42043161 41.70209859 34.17974724 34.18146363 34.16782413 44.7800623 45.84960911 45.85755917 38.5001984 38.48347395 38.41242933 38.30227862 39.10842238 22.346945 14.65378831 14.67804212 14.69182737 14.8437477 22.46258365 38.42801288 44.84290709 41.66811016 34.17706207 41.66971787 42.43863664 41.72401043 34.20622446 34.20630344 34.19104738 44.78622633 45.84812337 45.85238216 38.49105203 38.47062219 38.39806909 38.28751397 39.09652056 22.33446498 14.63193494 14.65156122 14.6633899 15.32817351 22.95722864 38.63336968 44.81458863 41.64119716 34.15665384 41.64660183 42.41940963 41.69989595 34.17382818 34.17440147 34.16252601 44.76438537 45.83103712 45.83865473 38.33691815 38.32719297 38.28875444 38.28301201 39.0928189 22.33328991 14.62682471 14.64584734 14.65886522 14.80997134 22.44763383 38.40569726 44.8073301 41.63663269 34.15580119 41.64936579 42.4218105 41.70152106 34.17652559 34.17849969 34.16718595 44.77293752 45.83650339 45.84333556 38.48714718 38.46855915 38.3979336 38.28868533 39.09808765 22.33981495 14.63972064 14.65979094 14.67295168 14.82380971 22.45388472 38.41107455 44.81666759 41.64508342 34.15881823 41.66387892 42.43145569 41.71261443 34.18717951 34.18777447 34.1751282 44.78224802 45.84638788 45.85145318 38.49496031 38.47555093 38.40314971 38.29104888 39.09928606 22.34084659 14.64822143 14.67132369 14.68458483 14.83583177 22.45379721 38.41706925 44.83370445 41.66237927 34.17311228 41.66749172 42.43676122 41.71664288 34.19484866 34.19306805 34.17881063 44.78893288 45.85142735 45.86034194 38.50212165 38.48411893 38.41244329 38.30139897 39.10827249 22.34646425 14.65511413 14.67933094 14.69298378 15.35889075 22.9742132 38.6548279 44.84397844 41.67059739 34.18074124 41.67577389 42.43681097 41.72129661 34.1969157 34.19777297 34.17904836 44.7852326 45.85003896 45.85778146 38.35568199 38.3435235 38.29976241 38.29052443 39.09896491 22.3381664 14.64017211 14.66168812 14.67463502 14.82505703 22.4505116 38.40634452 44.81970349 41.64765535 34.16143959 41.65308249 42.4244213 41.70432886 34.17912553 34.17734559 34.16484409 44.76937279 45.83547771 45.84365896 38.48536227 38.46647524 38.39515433 38.28609571 39.09573325 22.33560375 14.63249885 14.65307583 14.66652459 14.81783386 22.448088 38.40999741 44.82151583 41.65004682 34.16192544 41.65578007 42.42894209 41.70887657 34.18239846 34.18076974 34.16583872 44.77101356 45.83744033 45.8460066 38.48664917 38.46797421 38.39650564 38.28667725 39.09585786 22.33528619 14.63598598 14.65569647 14.66590966 15.33104042 22.96038604 38.63692453 44.82249251 41.65203127 34.16408807 41.65933444 42.42713749 41.70726442 34.18468549 34.18314735 34.1681385 44.77717166 45.84109376 45.85019476 38.34908459 38.33893313 38.29778544 38.29008 39.09845676 22.33922216 14.64270839 14.66464628 14.67766568 14.82906834 22.45702714 38.41356019 44.82033385 41.6509227 34.16943584 41.66442295 42.42777167 41.70713134 34.18363779 34.18392367 34.17140929 44.77908235 45.84110756 45.84853084 38.49188276 38.47279896 38.40095325 38.29039547 39.09836961 22.34162472 14.651081 14.67241159 14.68364195 14.83372549 22.45907614 38.41542493 44.82288241 41.65345271 34.16262651 41.6664594 42.43127852 41.70884009 34.18308395 34.18244321 34.16752518 44.77686402 45.84119234 45.84388614 38.48807016 38.46978153 38.39776811 38.28760502 39.09673416 22.33707098 14.63669724 14.65572406 14.66805859 14.81871837 22.45130968 38.40862216 44.81171636 41.64179577 34.1534189 41.65258688 42.42356182 41.7032446 34.17601161 34.17618163 34.16385196 44.76826949 45.83246884 45.83724522 38.48133648 38.46338799 38.39422382 38.28601609 39.09635569 22.33871375 14.64717672 14.67063512 14.68430163 15.35032595 22.96869074 38.64624139 44.8335597 41.6606723 34.17190405 41.66609497 42.4342325 41.71433051 34.19149533 34.1892633 34.17547038 43.72543004 45.84572706 45.85340167 38.35110742 38.34110118 38.3005836 38.29133079 39.10007656 22.34012729 14.6424909 14.66407194 14.67685776 14.82711772 22.44937353 38.41205992 44.82420138 41.65254745 34.16330098 41.6552508 42.43030344 41.71020783 34.18156968 34.17960204 34.16715837 43.71191143 45.83700996 45.84390338 38.48538779 38.46682161 38.395444 38.28501023 39.09432704 22.33357902 14.62912383 14.64762489 14.65971198 14.80970858 22.44334359 38.40434424 44.81589878 41.64511172 34.158759 41.65187626 42.42690421 41.70983228 34.18353412 34.18070669 34.16808141 43.71698563 45.84177742 45.84917864 38.4907256 38.47049925 38.39814307 38.28717755 39.09642019 22.33714098 14.63792224 14.65927047 14.67212898 15.33875939 22.96486377 38.64186755 44.82981601 41.65851577 34.16939678 41.66479221 42.42916749 41.71278551 34.19025514 34.19010317 34.1759763 43.72856333 45.85065158 45.85981055 38.35942891 38.35093095 38.30985595 38.30002855 39.10541628 22.34314122 14.64767804 14.66967625 14.68157172 14.83263339 22.45911849 38.41712247 44.82506488 41.65555758 34.17269686 41.67042569 42.4366027 41.71952505 34.19614908 34.19669658 34.18536684 43.73859611 45.85466458 45.86512287 38.50845139 38.48995051 38.41819279 38.30806284 39.11446226 22.35234497 14.6604214 14.68408404 14.69731079 14.84854855 22.46770139 38.42900517 44.83740826 41.66680045 34.17678228 41.67910053 42.44088535 41.72006966 34.19687075 34.19635206 34.18210215 43.73517952 45.85521548 45.85782508 38.50237531 38.48472454 38.41258484 38.30111631 39.10793002 ================================================ FILE: src/pymgrid/data/load/RefBldgHospitalNew2004_7.1_5.0_3C_USA_CA_SAN_FRANCISCO.csv ================================================ Electricity:Facility [kW](Hourly) 778.0079691 776.2417501 779.3573377 778.7371961 787.835835 786.1813539 853.5088811 859.1351385 928.7459153 918.674958 933.6863985 939.7496526 942.3993169 939.0273826 944.3362001 956.8007646 920.947656 880.4900035 865.2484589 859.6448838 824.9100224 826.6410027 808.700256 801.4081714 789.0006741 802.3976527 803.6917375 804.3349092 884.6315368 880.8147014 1117.444028 1227.432053 1271.237363 1314.401195 1333.06337 1334.068821 1284.421526 1313.550931 1310.689264 1311.521763 1319.707497 1329.130873 1065.303118 1073.79061 923.863202 872.9060841 805.6027106 814.4186568 796.4557717 801.2412201 817.274789 835.6164297 924.5554603 919.0004369 1139.190858 1253.684909 1297.395817 1337.990155 1331.617106 1333.490652 1289.229174 1326.016604 1328.473203 1326.545447 1350.650254 1371.851479 1101.319154 1071.97701 938.4177261 874.8785992 803.950683 806.3745778 793.2196687 792.0848226 789.5617739 792.3282725 885.4484497 876.6354365 1103.625422 1222.251313 1256.63806 1295.670031 1307.70588 1312.044676 1272.029279 1307.366175 1306.272234 1309.427797 1322.673202 1333.640008 1056.903742 1047.882589 912.5736848 872.6849786 807.7064913 802.5732598 789.5389177 790.1920982 795.7037198 794.6316543 875.5770692 876.9499487 1099.790545 1217.504001 1254.785073 1292.183866 1303.213776 1310.184174 1272.226891 1305.495014 1311.086854 1313.940405 1323.285281 1333.364355 1054.588461 1048.89899 916.7443926 869.918696 803.3485684 803.9361974 792.2492551 792.0030422 790.4929056 790.0078913 879.9105511 884.493141 1112.459072 1226.653061 1260.058319 1295.066074 1308.373768 1313.270676 1272.48234 1309.166465 1305.612141 1306.769427 1313.180317 1326.541864 1051.94669 1047.116161 912.1543003 870.4109671 798.262162 806.9879829 796.1007382 797.4453195 793.7773245 789.7573338 795.227457 796.51889 872.8420352 988.7171463 992.6751319 1102.43134 1109.389585 1107.38007 1075.127544 1069.183883 1071.704725 996.3685694 1002.202259 972.8475107 931.4151355 921.4875201 807.5414407 805.7530869 796.8282286 797.9289118 773.1777658 774.0821616 773.2096159 772.198682 781.3999958 780.9822479 849.6803565 846.2162948 918.1183645 923.9478714 949.9851787 941.5311781 960.3509284 954.8999817 968.7856604 976.4237994 921.2748835 896.9217738 865.8075413 841.4447263 809.3307314 807.6687615 811.0441722 814.5203937 814.5233733 807.1603372 814.5468363 815.0228312 885.7687649 884.0976832 1111.50787 1225.814478 1260.748019 1299.934282 1311.210785 1303.328853 1264.393529 1302.38183 1305.856602 1306.445568 1308.345166 1324.55209 1055.581168 1058.594687 922.549449 883.1369246 810.2436704 808.5805492 793.6149826 795.0435406 795.3174916 793.7276111 887.9124583 890.4191347 1117.346868 1224.38591 1262.151809 1299.915922 1309.619874 1307.163279 1269.308002 1308.286333 1310.388304 1305.119755 1309.016683 1331.242769 1060.007869 1054.02429 915.2985502 869.8336594 806.8356073 805.9793451 797.3007963 794.7815564 796.1601394 796.6706079 883.6213843 884.0186077 1104.740567 1219.86677 1263.339839 1295.634232 1301.826436 1305.99049 1267.425588 1304.04822 1307.314492 1302.412635 1313.084844 1329.928211 1056.609499 1052.083185 918.9666395 880.1671819 813.5210201 814.3312721 801.1184427 800.8164921 798.6576504 794.1363589 880.4043403 878.7169072 1107.958835 1223.294143 1262.07383 1296.510143 1307.047899 1312.817125 1278.128698 1314.37706 1316.449551 1319.620128 1323.481095 1335.841551 1058.542705 1051.402452 917.4468731 878.9361456 812.7208594 813.3783743 800.1874317 799.2713854 799.3794235 799.6937826 892.7086797 893.6310158 1122.138148 1234.823245 1269.985699 1303.065076 1315.846284 1324.602537 1286.266639 1320.524664 1317.69836 1316.429494 1320.122798 1335.412151 1060.256548 1052.742269 917.0925029 875.0439915 804.4276442 802.8275945 790.5328877 791.9426026 793.5025211 791.9375506 803.89061 805.110867 876.0326876 983.4991724 987.3739247 1094.523412 1103.876863 1108.651572 1082.044399 1077.144527 1077.585577 1000.923461 1010.535503 982.8975591 942.9369509 936.227305 824.6523464 824.3830895 815.0976612 815.8848701 791.5999094 791.254832 790.6418256 789.262549 799.3286178 801.5075653 876.0946575 871.7090183 946.4649667 938.4521542 949.2617428 956.073492 955.8455888 947.8914547 949.4452445 953.5832792 927.8737794 900.1376664 858.0677469 842.3752356 815.2624153 805.5185841 790.5864359 792.4603717 783.294213 785.2963892 788.7226541 790.2923165 809.5894464 813.4797067 892.9595792 883.9700963 956.4120572 956.6230227 953.5180235 942.718081 945.4820204 948.0181688 958.1348643 955.1695588 927.8879833 895.3944534 863.2371417 854.4276398 822.4951039 823.5561618 813.8745725 814.3015739 812.9173436 812.1199406 811.1490207 810.8981297 903.9249335 904.8521079 1134.195871 1245.447498 1285.287875 1303.857015 1290.697354 1284.020476 1245.388894 1281.283656 1283.904906 1291.419794 1309.128027 1339.638888 1077.568107 1065.811465 934.4226883 895.833649 820.9219467 819.8359363 802.4138917 800.786259 797.4959188 795.6850758 886.2108477 887.4466196 1129.175094 1237.711493 1275.220063 1305.886625 1307.303189 1310.259655 1284.689501 1319.629235 1306.529429 1303.890008 1324.236158 1346.415755 1079.067388 1067.888987 926.6150115 881.0455009 813.7363249 819.2444399 808.5431791 812.3776143 805.9658784 802.0613512 898.3807382 899.4405295 1139.794094 1256.960066 1295.077375 1303.031344 1293.624742 1306.831024 1244.041497 1274.609389 1279.373356 1282.170071 1291.94472 1315.72082 1053.980759 1055.624295 911.354738 861.5095025 799.1100734 806.5670172 792.2690853 784.1160926 790.7962002 800.741864 901.1016295 902.9035072 1135.838606 1253.9304 1287.358153 1312.08053 1314.69079 1333.249415 1296.315968 1328.921113 1329.156617 1315.741173 1322.306217 1346.635905 1080.757116 1070.358765 933.9036576 893.2261257 825.0044228 825.55142 812.4348883 811.5933323 811.3666557 810.4330213 819.4004553 818.3302691 888.5544225 995.6400887 1002.732722 1114.400389 1125.033981 1128.261788 1096.474454 1088.604228 1088.473667 1011.373154 1019.104777 987.1464145 949.4894194 940.5094596 826.2736031 824.4967162 816.702504 818.215458 793.2257128 793.284538 792.9852559 792.547842 800.5716027 800.2005016 873.6031779 869.6426173 947.1968741 942.5075383 952.595203 954.6862219 952.9852123 945.0714273 944.6056457 945.3396727 921.3204589 888.9300236 867.478317 863.0684259 820.9721924 812.6666203 796.6610594 796.4722767 820.0046876 817.4679992 812.7542373 808.4889216 895.5085279 893.6077194 1119.983455 1231.408277 1267.893495 1299.923394 1306.430827 1308.483904 1267.069626 1302.901827 1303.967555 1303.990898 1313.178559 1325.16446 1070.423192 1068.931634 935.5871942 892.9595232 824.9409656 830.8194553 819.03846 816.8630838 814.5345365 803.7496815 901.9454906 892.0865931 1116.99983 1234.699674 1276.101342 1318.034151 1325.479974 1327.700087 1290.315735 1328.309367 1333.109027 1333.194396 1339.671943 1345.356116 1081.475824 1067.428362 925.2953807 886.4668687 825.065726 820.4929337 814.1451444 810.0481529 799.1381772 796.7441296 885.0803829 905.0836439 1132.810622 1239.850601 1287.940948 1327.842544 1315.109802 1323.294195 1287.938286 1312.614685 1312.415608 1313.008643 1320.988445 1329.203841 1057.164794 1048.142769 917.7833435 879.6565474 809.6761577 811.2044404 796.1352765 793.3345587 798.3926132 800.115063 887.1473379 888.0531551 1109.937348 1223.583297 1263.581965 1294.895824 1303.96497 1306.24981 1265.523524 1303.76712 1308.526125 1310.173478 1314.74126 1328.032669 1059.370436 1051.185938 914.4462426 874.6079259 813.334115 820.335908 807.2731503 801.768757 791.7885655 791.9951699 881.0077675 879.5698141 1104.288799 1224.479386 1257.525967 1308.234804 1328.841396 1330.545693 1294.989672 1341.040705 1337.968382 1341.180038 1347.021886 1343.787861 1057.848655 1044.224669 910.9255399 881.6293926 828.5706802 830.7087102 811.2479803 809.3546642 806.7544951 802.461589 807.8042381 806.0660451 866.6387442 975.5056614 983.2647937 1099.158938 1112.27969 1116.184759 1085.363668 1080.649513 1081.920493 1004.662816 1006.172372 973.048365 936.8678581 928.4013621 815.5996169 814.3642676 802.8530457 803.2765929 778.9707739 780.6214003 778.3543561 777.1929156 782.9820153 783.2807763 852.1667835 847.8872117 923.4678683 917.0289489 927.2374591 930.9939332 934.9457157 931.4403745 934.6592611 936.497668 912.366201 879.2505662 851.3524284 836.1282118 805.78808 806.3906428 796.2215004 795.3319297 789.0276545 788.9056113 789.7042676 789.1461144 873.8706352 874.5332212 1100.21343 1213.411143 1252.809635 1289.391403 1298.500704 1300.40833 1262.679078 1302.375036 1309.705879 1318.376802 1327.667529 1336.1071 1065.625905 1057.323056 920.6369805 881.4356496 813.3145327 811.7796755 796.9489388 797.9195026 799.2421094 797.6043216 888.6716659 890.4474008 1118.343718 1228.978478 1269.297595 1303.846663 1312.085927 1315.356432 1275.329956 1312.613273 1313.267226 1314.859375 1324.682778 1338.450591 1067.462168 1058.164801 923.1077473 881.716498 815.3356549 814.1120821 792.282707 791.5364256 793.3357939 794.4248283 880.1576542 878.05898 1108.215037 1224.57255 1264.725382 1300.656046 1312.194528 1322.417313 1292.889709 1326.522339 1321.861415 1317.827822 1328.64526 1338.36077 1062.208679 1053.454614 919.5170634 880.3062271 810.8231498 811.226871 798.8546999 796.4778781 794.8869054 793.8488724 880.2268165 882.3807009 1111.285571 1227.215655 1268.833902 1306.123662 1315.958768 1320.248302 1282.12241 1318.622823 1320.994417 1322.86814 1329.093061 1340.112583 1068.5652 1057.736312 920.254499 877.2682774 809.8838737 810.5848587 798.2459185 799.7772087 800.147958 800.3596846 889.2687303 888.4362517 1114.134593 1227.817094 1268.639641 1305.046136 1313.571098 1318.234328 1281.499331 1319.275324 1322.949448 1324.849581 1333.726876 1343.457224 1069.233655 1058.998466 921.5040821 880.443563 815.5500448 817.7164145 805.6411497 803.4509172 800.5071974 798.0514596 806.3582304 808.2857664 879.644921 985.4163025 987.5632293 1095.751284 1106.218468 1112.28463 1086.766292 1080.89875 1074.236193 990.2808011 1005.750387 985.2367725 956.7468978 948.9061401 836.9827282 838.8314658 828.5180206 825.2674903 797.7670262 794.2537124 792.3619584 791.2692155 799.292868 800.9192134 872.6831761 862.0620074 931.4899981 926.0628967 941.2555726 947.4102477 950.319138 945.8300808 948.316309 950.6716879 926.0271992 884.4177921 858.0189122 849.0650422 818.2351428 819.485471 811.1324628 813.8019881 814.0781417 813.9528895 811.8226659 809.1293561 897.7599505 899.5026223 1129.333602 1237.995787 1278.976331 1311.844066 1320.184339 1323.625913 1282.670242 1309.339254 1304.168306 1296.354262 1313.144689 1338.982865 1076.547394 1064.232219 926.1990879 882.9948429 812.5253139 812.3056805 799.3576579 797.4844974 797.4864895 798.2699252 884.0081033 880.3076557 1111.085698 1222.151093 1266.172925 1301.683068 1313.590978 1324.040151 1279.960637 1307.113816 1306.696177 1305.653853 1319.8706 1339.59838 1074.198741 1062.879481 927.0699192 887.3288042 819.0142368 820.7301349 810.5885494 812.3161143 812.8635106 813.0032765 901.8881373 900.0168955 1125.800451 1234.684066 1281.393483 1320.94836 1328.370027 1327.416347 1282.5975 1320.865196 1329.39995 1330.711563 1335.638457 1342.266882 1073.615018 1065.144425 929.4305839 888.1209103 818.3781188 817.2270994 802.8217996 800.3428839 797.5806575 794.5852662 881.7926999 881.5147964 1110.11616 1219.804444 1268.89196 1313.010346 1328.344104 1332.063418 1291.399447 1325.635439 1319.929964 1313.478324 1325.000766 1342.829666 1074.101634 1064.27167 929.0491808 888.7351826 820.5564135 821.3763946 808.9032346 807.0705606 802.8727974 798.3480977 887.3172724 886.0438258 1113.611915 1222.040905 1266.091413 1303.00889 1315.021812 1321.50895 1285.556781 1324.613489 1310.292377 1288.80188 1303.711916 1335.079556 1078.290981 1065.487147 930.6005956 891.418712 823.8700462 823.4046612 809.4280814 806.060334 801.0877321 796.2339032 801.8850193 801.2945871 875.1830044 982.4664468 993.0197735 1101.437701 1112.198784 1121.866389 1094.221743 1076.668134 1065.469161 979.9720713 996.3378029 980.1399931 962.1501256 950.9647211 836.6723672 834.4716507 822.7466275 822.9681777 798.7460022 798.3574118 798.6446777 799.1248105 808.5553815 805.8807689 875.9429749 865.916165 945.636952 939.2431771 948.9732262 953.7594179 956.5127293 952.1092276 937.097142 922.6199391 905.5961795 886.8970765 870.2351399 858.0419012 823.3670231 820.3176772 807.8854568 807.0873335 804.0473034 801.9467813 799.3699886 796.6832389 884.705627 885.3866038 1114.240884 1223.37059 1267.487822 1304.431438 1318.272154 1324.256813 1264.353866 1282.753482 1274.384091 1265.121904 1277.886078 1299.576443 1053.346184 1059.125945 937.6643487 896.4888225 824.7646227 822.6333185 807.5223638 804.2446686 800.4065103 796.7463376 886.0828254 885.7533712 1113.861017 1224.667369 1277.173297 1306.867895 1293.21431 1272.914855 1216.967002 1245.619761 1256.79015 1265.838669 1284.504506 1299.27532 1044.976622 1051.767761 931.7850083 887.3422114 815.1907839 812.5353033 797.0055895 794.1669781 794.0555557 794.7943139 881.4842302 882.5852859 1114.580213 1230.025523 1281.537316 1313.498953 1300.976457 1285.746455 1230.692447 1253.907775 1244.916298 1236.249257 1239.156956 1257.927986 1027.723168 1034.637138 910.6888639 880.0465621 819.7005351 828.5984179 815.6941234 811.9435687 808.0324838 803.7745781 891.5094438 893.0670889 1124.62956 1238.411415 1287.074066 1319.121981 1308.211965 1292.180703 1236.679805 1266.8996 1269.199099 1270.533906 1289.060383 1317.026684 1076.070149 1073.173179 935.5473295 892.9172162 822.8241039 821.6385309 807.2297388 805.4034847 804.2149806 803.2591912 893.3344557 891.3879418 1124.127679 1225.43882 1268.646708 1315.5172 1310.497432 1292.303174 1234.820665 1261.418824 1256.376732 1252.037436 1263.167206 1276.940889 1036.465936 1042.028816 915.9946318 886.9393026 824.6244733 821.0521102 806.9106851 804.2533391 803.4909127 804.2971304 808.570848 804.2366362 872.1753655 978.6792051 998.8078616 1113.95223 1109.339577 1098.601411 1054.625486 1043.531905 1042.878743 960.9024166 987.5826656 983.6208277 957.5866218 941.4589852 826.134571 823.7204753 812.2314986 812.3999433 787.9720611 787.3733789 787.1710361 787.1043804 796.4540861 794.2189725 860.7781172 855.5331198 937.6373716 934.3015087 947.2045274 954.3689231 956.4276393 949.4910076 952.7781519 953.0636407 924.9725684 878.1260939 854.6745901 843.9674193 809.8766915 807.3658748 795.5227057 796.8205017 785.1479789 785.5882958 785.519758 785.5667209 792.1589628 791.9084553 860.17128 859.3947556 942.4034654 938.2997392 948.4585615 951.1723406 951.3868146 944.4981116 944.2935534 943.9217926 918.094779 875.0854927 856.1732047 850.0874772 820.1868079 821.401014 813.4098708 816.4772902 817.1504247 815.8991655 799.2382172 785.7846893 885.6321514 905.7694797 1140.91109 1248.265485 1286.534251 1317.219065 1322.83653 1323.249957 1281.128792 1314.306687 1314.915984 1315.869272 1323.000101 1326.359552 1068.608604 1060.246002 926.5137546 887.5661428 819.3507088 816.8302283 800.6234004 799.7168032 799.2793856 798.1043647 883.5361509 883.8007961 1107.597768 1219.21898 1263.955361 1304.819705 1317.688619 1320.543336 1282.606234 1321.525389 1325.247426 1329.83564 1339.965542 1343.060931 1081.687838 1073.570765 936.2470646 895.1453274 826.977562 821.6122079 804.9166076 801.0985693 797.1275666 793.2806157 881.2448301 887.5148226 1119.93884 1237.535255 1279.707358 1313.124135 1323.900307 1330.601006 1287.514853 1327.911848 1337.07616 1339.653229 1346.440054 1350.001879 1086.827948 1077.683491 941.8997992 900.9903887 834.2257865 832.063418 817.5866453 816.2083424 814.6560941 812.5564463 904.7480299 908.9828415 1135.901722 1247.472376 1285.397798 1317.439905 1327.933688 1334.297989 1297.265227 1331.748164 1331.797931 1328.032809 1337.440609 1341.999683 1078.553204 1066.177885 924.5383815 881.0835727 819.1031997 825.6633759 818.033658 816.7384439 813.9633657 810.6861975 816.644912 817.0121171 883.8343392 988.2288033 993.6726753 1101.83178 1119.186816 1134.65748 1117.546516 1112.024783 1108.651553 1024.736693 1026.204663 980.4001578 949.6887309 939.2728743 825.9737706 824.2838912 816.0991848 817.6166857 794.6350124 794.9172165 795.7198413 795.2429799 801.4314037 800.269621 866.5642035 856.8733464 933.3902566 927.2516078 941.071958 947.9628781 951.5504517 942.3043258 937.6391866 934.3739097 916.3536263 882.8084533 861.7336692 852.4061639 819.7895715 818.5785338 806.8801381 805.1939436 800.7612724 797.5849504 797.4426257 797.0918905 884.02322 884.681065 1107.642392 1216.541234 1258.922265 1300.672805 1316.491478 1321.192797 1264.613928 1289.710856 1287.716028 1285.21772 1302.445351 1324.742611 1074.654284 1063.662275 928.1365704 887.6599102 819.6462925 820.8680777 808.953204 809.0660297 808.5185784 807.7576786 900.0733588 900.4262627 1124.762692 1235.181769 1275.074402 1306.797922 1314.31719 1319.723047 1287.712765 1328.027831 1333.692745 1337.976154 1342.427206 1341.685234 1075.311438 1070.113899 939.0390864 901.9454334 838.5186942 839.1330345 790.961297 796.1068292 801.2971449 803.217094 895.5383728 898.4501862 1123.47917 1237.949444 1282.13258 1316.796688 1325.365964 1331.601127 1258.916341 1266.118867 1244.960643 1234.060484 1251.533984 1287.513589 1072.174934 1069.828853 939.534668 898.6403792 828.9027517 829.2417361 814.263167 811.5821107 812.505719 812.1933507 898.7386073 897.802972 1127.804321 1247.729539 1269.682396 1281.180291 1278.092501 1268.180625 1227.695413 1252.542789 1238.24145 1227.253533 1232.355626 1236.671605 1005.772064 1057.933711 938.8335056 901.1051376 832.4076072 832.9449623 818.1782938 814.3529445 812.0219777 809.2424116 898.562984 896.3610312 1117.284558 1240.116466 1269.396114 1282.872118 1289.86647 1278.228938 1228.474739 1256.6781 1262.568915 1274.352781 1286.524897 1288.041301 1037.479558 1036.418481 911.6210445 880.037399 814.3654595 819.2703668 808.6739565 818.3154811 822.3722048 811.1863283 826.9181979 831.6067109 896.1032366 1009.486928 1009.702443 1102.297659 1098.554691 1094.001637 1044.01135 1030.41795 1037.649031 960.8176958 989.1030884 950.7843286 929.2225291 919.2169371 804.5394851 807.7302392 796.11874 795.3529691 775.1946291 773.5345718 793.4323431 795.2464311 803.8547314 811.2119535 882.9001969 879.1301193 963.4667831 948.8579849 962.5054298 961.9417655 956.4273923 954.6896776 952.9179765 953.2836997 928.692528 881.9105424 864.8129392 855.7134189 823.5259711 822.6527315 811.7643211 810.275195 805.2857416 803.2828607 802.9220114 803.7784335 895.8898549 898.0291968 1118.46125 1235.79961 1283.077784 1311.465979 1304.232607 1296.913162 1233.303786 1255.524346 1259.071068 1268.639088 1285.187348 1297.28399 1055.846664 1056.771791 926.6067641 892.4181398 827.1685354 828.2131682 815.2663704 816.3818319 814.854924 811.7101163 902.8349674 900.8741797 1120.106883 1237.093588 1279.162548 1286.515777 1284.984083 1275.280139 1251.790993 1278.383484 1245.342897 1257.19963 1288.79403 1315.76659 1079.113331 1065.129671 928.0223002 886.1745864 816.5122511 815.0377201 800.5975051 800.8980479 799.8797667 796.9004823 884.3139271 882.7248753 1102.429301 1222.738967 1272.888355 1317.999267 1331.656416 1319.62314 1248.946798 1273.427912 1280.375521 1293.979549 1309.980869 1336.398256 1076.547572 1064.208015 926.7995992 884.883983 817.0202701 818.8893727 804.7869277 801.4335346 800.069241 799.4371867 890.2496935 894.1061168 1117.417278 1238.899985 1285.065283 1323.072782 1328.86433 1314.967848 1268.927045 1299.306858 1297.150479 1318.72182 1340.52659 1339.496085 1074.830411 1066.877712 932.0622793 890.8965011 820.6114322 820.7652094 806.9931379 805.552097 802.1816708 800.7640296 899.9267959 906.1630519 1131.430791 1251.464695 1282.475066 1307.61207 1319.874876 1294.318559 1245.052337 1289.731573 1283.794509 1291.580617 1305.204661 1321.951127 1082.7583 1071.008434 932.4709265 888.3132218 818.0945535 817.4089752 802.9222057 801.35799 800.2830777 798.8345748 806.8101091 805.4628089 871.9585244 990.5215202 1007.999065 1118.528313 1125.483905 1107.173679 1058.357054 1055.528032 1060.25467 983.6116407 997.9483156 967.729714 952.0599688 951.421667 839.3527076 825.5344401 806.5954255 809.5159851 812.7633437 821.2007282 813.7914936 816.590691 818.9845474 888.1397372 897.9306027 957.6610239 928.5795455 916.7145781 923.3226864 920.2872043 911.6179274 919.7466639 925.5833415 898.0057719 840.6522613 819.2464158 809.0351382 788.6613123 811.7205707 816.1572344 809.7753487 805.3224369 817.2019763 810.8214335 803.900395 893.8401792 889.0160801 1111.214561 1224.76117 1265.117515 1289.925449 1300.11607 1295.062432 1241.091835 1256.556284 1248.227423 1240.609082 1260.656068 1281.28996 1013.91432 1036.139676 910.0020068 872.6946537 816.1973471 830.0541354 809.7284125 811.8379025 808.8965869 822.6174399 890.7253366 895.7536586 1121.711478 1229.556528 1268.909522 1310.498239 1296.209829 1291.189425 1237.76585 1267.298403 1256.642695 1248.632557 1280.612696 1293.849973 1043.519655 1082.826547 955.9258409 896.7635242 822.3593871 820.6933658 802.035455 800.1412498 808.9661207 815.9825719 882.7910563 888.1508963 1124.616836 1240.131743 1281.512163 1322.182784 1328.614572 1311.38291 1257.455044 1285.425409 1287.921462 1282.288029 1290.629035 1297.417961 1044.825868 1061.940332 935.5710704 898.9452272 830.890227 830.7563635 819.3131694 815.1827893 810.3229421 807.4389359 892.9365806 904.0505496 1145.082818 1252.080021 1277.654858 1317.319322 1328.179788 1332.396528 1286.336869 1318.717476 1319.305075 1319.59149 1321.708245 1328.077487 1056.904427 1061.743873 923.8689395 881.4365181 813.0040934 813.3845706 800.2469823 800.4809282 799.1043432 795.952127 886.5969244 884.9808701 1109.726669 1221.382827 1266.670011 1313.080784 1328.610941 1326.047402 1278.111912 1298.258711 1290.370937 1275.901743 1302.780068 1325.03063 1057.689542 1062.273366 927.3323298 888.4888371 820.6507708 821.3724447 808.8687447 808.8155111 807.6273873 807.0000233 818.4180379 817.5878061 889.4507312 1000.805182 1009.440099 1121.352388 1131.486071 1131.066662 1091.394926 1086.560613 1074.990376 988.0628858 1003.516271 973.5867731 943.2155465 947.7096213 832.1575724 831.9074417 824.3021645 826.1216439 811.8904324 797.7801562 793.7380376 789.6535779 798.5156107 800.9690123 874.7948175 878.6851595 961.3546769 954.5353777 960.8799258 963.9912147 959.0973117 945.1063478 931.0030744 928.6250585 914.134717 879.2900558 845.4694884 843.160678 812.3701848 811.0706854 800.5204457 803.0696256 791.8775817 801.5298111 799.6838497 798.5948467 885.5355203 881.4031975 1108.694359 1222.30168 1264.747169 1308.443455 1317.512949 1316.642804 1271.446386 1298.619729 1301.545725 1309.125433 1326.957568 1329.980664 1053.427509 1054.256545 920.8246063 879.98773 813.1167786 815.2391599 802.638333 803.4782407 807.1777276 807.6765622 900.732564 900.3199043 1126.90854 1240.847306 1284.901796 1324.122211 1327.20694 1320.481011 1267.785585 1298.188046 1304.82561 1327.145859 1331.910126 1327.614829 1046.690347 1049.83745 922.7200007 885.7601971 825.1244469 839.0847091 819.2443586 818.7283711 825.1937268 825.2721547 908.4824124 906.6868347 1133.45298 1234.640881 1268.376101 1297.204059 1308.342488 1317.851385 1280.422153 1321.099394 1332.418619 1331.413815 1351.003232 1348.053843 1069.489343 1073.656452 938.0367861 894.5141641 827.8490648 822.8994119 803.3813824 801.4819794 801.6995599 801.0723367 887.9982804 887.6501297 1110.400623 1219.460989 1266.294814 1307.659475 1319.504914 1321.857167 1284.714528 1326.778707 1329.746407 1331.114573 1331.480539 1332.523857 1055.647357 1058.149009 925.5927939 882.3729139 814.1725926 814.5507818 809.345128 815.8996809 812.4608992 814.7071297 913.9816157 912.5548815 1134.116999 1236.241299 1273.332266 1309.418488 1327.934277 1330.398596 1284.04034 1314.330895 1315.381277 1322.297745 1329.833958 1327.74681 1048.998411 1050.70922 918.1443883 876.5473885 808.398395 808.2624299 795.4172995 795.2691747 794.7003453 793.6656453 803.5405996 802.9290345 874.0328671 978.265562 989.3748743 1100.353959 1110.91019 1119.099199 1091.354034 1083.140407 1085.791843 1004.415329 1015.873384 972.5755361 931.632184 933.6851679 825.1084098 825.6010587 817.3513162 819.0772 806.7967036 796.094834 797.2168127 797.5117905 807.7113492 806.9829705 879.8736333 872.9013471 954.295449 950.3705723 948.6593898 942.7006137 927.2575667 914.6581355 908.6014794 919.5810779 901.3301526 871.5528262 855.1614369 854.2584705 821.8725032 818.192349 805.7839422 806.1891215 793.5615068 804.6575833 805.3921819 806.4088927 895.6063505 895.1153681 1123.563477 1231.64156 1273.771586 1311.016936 1325.189209 1324.261756 1258.690938 1273.301795 1265.478617 1256.447924 1262.213802 1282.708744 1047.466203 1071.940521 936.9229494 894.216004 825.0216013 825.5113157 810.8028619 807.2136867 804.2530183 802.221913 895.8450641 898.7780139 1128.523856 1235.963615 1279.551484 1318.534295 1325.116356 1311.459893 1264.131797 1274.871294 1272.976459 1277.576055 1284.592166 1286.796044 1048.523204 1062.587218 927.0332427 887.1418983 819.4364866 820.2155256 806.8928906 805.4706882 803.3298644 800.8093222 888.0659277 887.4041537 1120.513812 1230.801127 1279.410807 1318.340249 1314.921995 1309.294305 1256.399708 1259.927133 1253.490348 1249.538362 1261.832339 1282.363039 1023.13863 1044.088836 931.9615295 895.6699426 821.8579307 827.9888304 823.017826 819.854899 816.2925625 814.5842686 903.0696507 903.4057851 1133.082604 1244.328623 1289.935063 1314.697062 1313.908702 1308.508078 1255.031932 1285.61304 1291.2913 1298.56037 1318.040136 1326.682326 1060.52745 1061.484019 927.8089243 886.9120134 818.0961258 818.0302104 804.8661991 802.5330346 800.555476 799.0477936 887.4738438 885.4628291 1115.649535 1226.04542 1276.795245 1316.554374 1313.62712 1297.355956 1246.476047 1264.400808 1263.076749 1272.253406 1287.257124 1301.669271 1045.43673 1062.714536 930.6929638 890.5845996 826.2589233 829.5953787 799.5361973 826.7621442 818.4434952 846.92291 832.9142422 809.9880094 870.0759185 954.681177 959.2366353 1067.965501 1062.400855 1065.900101 1033.094416 1014.398986 1015.635356 945.7650002 953.8455929 902.8859678 882.6909548 902.0551034 795.7459523 796.5579884 796.5410558 802.6891103 796.2301191 800.9962844 804.2470718 796.8765663 798.3430098 810.8091297 877.3153393 868.6302891 927.5624045 909.3193947 910.216346 904.9991549 891.6370878 870.6606434 857.2168504 856.418413 833.4035701 788.5311912 771.0376214 791.6501821 772.7229746 773.3173819 768.5202963 772.234716 768.5564163 786.4664578 814.9980648 821.5053008 908.2692631 908.6647362 1133.079882 1245.199486 1285.585579 1298.867281 1284.897962 1269.9424 1219.707557 1251.790118 1247.424494 1239.650729 1249.297928 1267.982243 1021.350099 1050.636616 931.0825396 896.7408228 830.5823269 828.7693428 814.4647206 814.6551577 813.6661418 811.9739692 903.1472204 902.6392153 1128.559837 1241.763221 1286.130079 1321.749112 1325.992184 1316.157848 1262.128992 1292.577588 1297.087393 1299.41697 1310.328018 1322.022382 1060.699773 1061.826764 929.2821068 888.1749573 818.9629961 818.3339323 805.4516451 805.2901984 805.2364539 804.5356974 894.0015218 896.1773987 1123.68369 1237.524965 1280.231048 1316.678417 1327.212822 1324.209511 1271.505306 1299.079161 1297.319798 1297.787648 1314.340778 1324.185566 1059.138769 1053.349336 922.7825804 880.3613929 811.2431754 811.7367546 799.5725773 801.6293826 804.0560859 804.3309396 892.6538521 892.2174185 1117.632167 1231.801299 1275.563407 1311.624343 1324.870071 1320.928227 1270.094509 1297.022594 1300.238844 1303.528048 1315.815402 1328.895678 1056.152307 1051.756128 922.6029305 881.8138009 813.6752652 813.6289732 800.8774845 800.1415654 797.9126753 795.3315532 887.9878763 890.2137049 1117.517157 1231.529403 1277.522486 1317.886225 1332.296165 1328.862876 1273.2329 1286.575503 1261.388044 1281.128406 1304.938901 1327.111156 1063.914767 1058.859001 929.2396457 885.6811517 815.5256998 815.8616803 801.5916121 800.9724228 800.7819175 801.1374206 812.1313731 812.3888351 881.2490273 991.5621064 1002.941585 1112.346351 1121.828765 1126.898726 1097.834465 1090.471057 1089.921224 1010.522085 1016.711425 972.8222123 932.1038858 931.8565506 828.095649 828.0985396 817.9332741 819.7405979 808.0261985 796.4861638 795.2016395 795.0906438 803.8464094 802.0816075 870.4297636 867.517958 947.6294073 941.9424448 953.0111783 951.9032145 938.0883993 926.4423143 926.7282378 926.7304993 901.7569788 869.4897772 849.094199 846.4330337 819.1491561 816.6706231 803.6934102 802.74198 789.1927356 799.0851522 798.2227968 798.2599785 887.2486151 887.8295505 1114.52424 1228.811164 1272.406118 1310.841712 1319.186829 1311.709983 1269.282786 1295.386857 1295.717515 1298.308267 1313.803186 1327.851223 1061.24345 1058.373608 929.6090578 888.5384385 820.5114059 820.6038273 807.2266789 806.9455921 806.8605423 806.0284401 896.7814745 896.5843795 1122.928867 1237.307291 1283.794277 1321.289601 1320.615708 1293.148455 1254.937086 1298.730454 1275.428181 1264.973695 1262.540245 1260.871942 1029.408958 1061.35793 922.3727992 886.5905243 822.9779342 831.293689 817.1348824 815.1004644 813.5361853 814.1488744 905.6703979 909.2504097 1132.805093 1240.599972 1258.338399 1278.64913 1272.041168 1268.808053 1223.582816 1278.567768 1261.071055 1260.754767 1265.844556 1268.702023 1005.321955 1018.232525 894.4520837 856.4022609 809.9739896 808.6267038 794.2936618 788.1324209 789.3620143 784.2478675 873.3478492 876.1274601 1112.021232 1219.223208 1253.698422 1282.00768 1287.078755 1268.414187 1224.532348 1267.160062 1268.191089 1277.619051 1287.874666 1300.461236 1042.024022 1052.847357 927.9049823 890.0742564 824.2866125 831.6298015 818.4567492 816.1066801 816.1829545 816.2677542 908.5787802 909.2922434 1131.013028 1249.214748 1294.125054 1328.278703 1321.66183 1317.06911 1281.698374 1299.198721 1300.341375 1296.42424 1298.097797 1307.301275 1056.694928 1066.157873 937.240555 896.3774305 828.3062301 827.3598354 813.5364705 813.1260168 813.503802 814.3874059 824.8639101 825.4420442 890.715922 1003.683897 1014.855098 1123.690218 1123.957145 1109.746482 1066.30873 1060.402085 1072.046404 1003.221977 1013.628309 961.0423841 926.5880944 936.7185046 837.5926257 836.4574264 825.7574878 826.2638332 812.055659 800.604128 799.4220652 799.1630786 812.4231815 812.1707435 877.1426772 876.3090139 955.2867131 938.0423329 937.5343569 929.8271256 930.113509 925.6832506 919.973299 921.1230701 902.6048143 857.5940837 831.6977804 836.9762465 810.8448341 815.6636402 813.5993732 820.9447554 810.9871776 821.1012163 819.3009339 814.6190293 902.6879489 903.4197761 1123.355472 1239.495966 1281.225969 1317.418176 1325.443962 1311.085904 1261.801057 1293.743596 1286.754897 1277.095134 1293.786871 1301.32351 1043.356691 1054.834841 930.1888705 889.8508973 820.7375439 822.3054904 806.3200872 803.3968129 805.218999 808.8782289 900.1191634 896.3178277 1112.868375 1231.458571 1280.950314 1320.268903 1330.678498 1324.080757 1264.142977 1282.83072 1281.261725 1284.910011 1292.337547 1297.090338 1041.289984 1057.771374 933.973799 893.758641 825.8394328 825.9017752 811.8847974 809.699895 809.0424982 807.6921855 892.743678 887.385848 1107.18582 1231.685731 1285.245524 1317.810671 1310.467944 1296.077071 1246.751316 1278.604486 1278.110537 1280.37185 1290.846707 1305.651123 1051.316824 1061.357067 934.2610284 894.9576575 827.9865492 828.4995664 815.2121998 814.2992277 811.1233701 809.3043294 902.2778664 904.0142286 1127.377938 1248.443778 1288.072278 1312.965504 1309.345509 1303.290472 1240.623046 1266.195329 1270.222079 1274.216809 1287.137006 1293.313698 1033.381825 1052.350495 938.1761332 898.9605183 829.9532691 829.6188034 816.8655832 816.1099108 815.2434099 815.0187116 908.6717671 910.1000802 1132.002466 1249.732461 1292.791073 1326.171289 1320.771555 1320.609248 1269.714386 1307.85539 1314.474633 1322.625499 1334.748933 1338.294456 1058.483819 1056.225376 928.7919075 888.5110862 821.1423117 821.5033569 808.6005062 810.2701025 813.1935812 817.0897712 819.4057956 816.4586537 877.683853 989.4201441 993.0966624 1087.89175 1112.133882 1103.911705 1082.982315 1071.829816 1066.015239 992.1295805 1003.619833 971.072095 937.3191142 929.2732559 826.6782795 824.8393842 814.1197601 815.52584 802.4346254 790.0916811 787.8249165 788.3146741 798.280474 796.9643563 858.7432487 864.3236941 946.656965 942.5127955 948.1757387 942.1564269 924.7579517 917.3881969 920.2401372 920.7966193 899.6515701 863.3298313 846.1352947 840.7210997 818.6058136 816.9650734 805.768331 806.5780319 792.7970239 800.4452334 797.8676087 796.5782063 885.4311852 885.2111039 1103.343027 1228.928472 1278.575672 1316.261768 1318.378962 1305.873327 1250.671908 1277.246128 1283.005429 1293.349777 1307.621983 1313.695266 1050.850598 1051.494625 925.2717086 882.815926 815.3972246 816.9407034 804.6071527 806.878518 807.5473286 801.2610215 893.9294038 896.3527257 1115.506723 1239.038198 1286.356755 1312.187629 1303.430204 1288.400281 1255.421702 1273.557076 1268.492591 1273.105278 1282.652505 1297.329629 1048.885402 1063.326363 938.4159964 894.4187286 822.6304869 821.4812533 807.1505773 805.1547142 802.5089914 802.08104 892.6045417 892.092539 1112.874733 1239.737394 1265.981758 1283.427223 1284.680833 1271.985305 1215.498938 1238.199791 1227.305151 1231.693724 1262.842417 1268.022279 1016.697543 1041.449225 924.3692947 894.4404474 826.0180102 823.9209217 811.3125063 806.6767608 807.7413468 809.7263004 901.546605 904.6953573 1125.829648 1249.999519 1276.23812 1296.591264 1284.97841 1272.694288 1232.393568 1273.984142 1305.441673 1305.858483 1316.213765 1321.325142 1058.260616 1054.468647 926.5275584 885.6728326 821.0067308 818.3334736 809.0538728 810.5383672 807.3849178 805.4016761 893.5030914 901.9809873 1122.639444 1240.405391 1287.14899 1327.443297 1333.27002 1323.906348 1272.900685 1302.361261 1303.022336 1299.342034 1315.412808 1325.805213 1056.208656 1050.162608 921.485929 878.0718471 810.7788071 812.203403 798.1060594 797.6741124 797.2332416 797.4022899 802.3362184 800.1816317 861.6654745 983.2135127 1001.53838 1110.309519 1098.360264 1097.093437 1056.599373 1034.819043 1046.816427 977.2351865 988.6981971 957.2774763 931.6693813 934.714257 830.1228053 827.5414182 817.2068192 817.959093 804.4683654 793.2200843 791.5773343 790.5086711 800.6462469 798.8009602 859.2084106 866.3485868 951.8660917 945.1731104 938.7151032 929.6551897 920.2117331 912.4493891 919.4067615 924.5291212 904.1694029 866.944282 844.4624048 843.450721 819.2921242 816.6778772 808.2939364 813.7797824 802.617394 816.4529575 805.6103635 800.977628 877.2946138 891.3225914 1110.019671 1196.043401 1212.625072 1241.505335 1246.344939 1242.255164 1190.950908 1216.51693 1217.770719 1227.145513 1244.142738 1249.596486 992.2667126 1005.077177 897.3707956 860.2715129 799.2258163 815.8330441 809.630669 808.5266102 816.1165525 818.2488128 908.3693706 910.2502666 1125.542544 1216.304317 1227.271399 1249.649624 1252.21731 1246.706646 1200.626308 1238.695097 1244.786832 1249.148936 1275.948829 1300.882176 1038.137174 1036.676162 915.4887716 876.1282403 816.6584043 824.9958769 811.2334216 808.7608038 807.1890388 805.3897824 892.7992922 890.9983711 1110.2724 1235.038767 1281.450385 1308.690559 1301.191964 1291.40469 1248.76378 1290.208885 1294.535121 1299.571785 1310.50438 1323.995105 1055.547187 1049.664698 928.3080908 886.399236 820.8739108 813.2620182 795.5692852 796.8580887 795.253758 794.0972737 883.0177276 884.7431712 1105.022141 1233.194462 1280.662495 1302.482451 1303.496429 1294.619274 1238.380636 1266.55278 1262.44916 1262.237768 1288.206231 1308.549912 1050.747461 1051.548233 926.8959661 886.12028 817.9278084 817.9837543 805.1287554 805.0564656 803.7190494 801.6277513 892.3652664 891.6197058 1112.092933 1238.754684 1284.643477 1302.28125 1298.136011 1302.270945 1253.322734 1287.740805 1294.385655 1290.110708 1293.593493 1310.867012 1053.532993 1055.301606 928.1407623 885.7714414 817.418125 817.6229193 804.6505498 802.8712029 801.7690407 802.1697308 812.4971155 812.5020198 870.1758359 994.9592876 1010.806421 1115.848466 1115.50387 1110.926466 1077.262083 1066.577145 1064.695412 991.2515284 1017.56651 979.7402702 941.9228974 935.2832646 833.5919439 831.9303038 820.6001664 820.8953377 807.4596051 795.9201755 795.8105455 795.0883148 802.9784319 800.6077113 857.5308757 867.0628417 951.4406866 937.9354344 934.1846152 929.7327637 923.2561758 918.5487889 921.7205659 925.8530137 905.9471132 868.0577127 845.9599256 840.0892044 815.5820824 813.8049946 803.5367556 804.6056527 792.1442311 802.3721581 801.1414648 800.7738373 890.9979185 892.4815183 1106.15982 1231.862503 1278.663691 1312.391845 1306.416232 1296.589417 1252.095822 1285.06749 1284.863294 1285.416555 1304.515158 1324.790177 1057.433885 1046.2478 923.3545139 881.0492111 812.0206062 812.0895294 799.6255608 800.3291571 800.5803394 800.6447413 892.9827971 892.507131 1105.416789 1231.114555 1277.133007 1311.546739 1310.170088 1298.476552 1240.994382 1265.797218 1268.110448 1281.826311 1306.990648 1322.775512 1059.357618 1047.779338 924.6713422 882.2858796 813.4051161 813.0627489 799.5524081 798.5096513 796.860505 795.2152533 884.7256857 887.2453274 1103.344842 1231.073025 1280.415595 1313.883653 1311.857786 1299.199716 1246.540295 1261.323481 1251.782416 1259.011936 1275.91928 1297.717937 1034.836765 1036.962951 929.1994623 887.6871566 818.6885401 819.1963084 806.9929881 806.4888381 806.4889406 806.0298063 896.4909392 901.3797665 1118.629002 1233.398787 1238.333503 1255.992187 1247.559566 1237.549743 1194.675289 1229.237934 1236.143067 1238.981549 1253.48647 1250.86065 968.6883423 1013.432193 910.4467804 872.3484174 809.0471087 809.4758888 802.1786295 809.7693227 815.5790861 814.7421377 908.0647608 908.895386 1123.791487 1224.706022 1233.13986 1256.022596 1256.429131 1243.174134 1194.816194 1231.332632 1231.636473 1230.475183 1258.849966 1280.244456 1015.726584 1017.06078 908.0432089 874.4197384 806.6305745 812.3008275 802.3073866 796.9526592 799.3206098 805.9157041 829.3064851 833.4056427 874.0509272 984.044693 984.9698966 1068.829681 1050.124524 1037.765764 1000.188931 994.2154942 996.1644294 916.5734704 922.5621987 879.4558182 839.2075236 829.6095508 766.3847091 775.8618903 765.01852 772.0401679 765.1372957 773.4275407 779.2534044 765.1488679 757.962393 752.7010013 802.2595091 798.7319142 862.0976157 853.8215636 867.5879881 866.3885062 864.5667131 857.8469174 861.1378172 864.2682455 842.8114525 795.833437 765.1142014 756.0896945 724.1811197 726.994426 736.6269398 735.7095439 720.2639056 745.3012172 760.4928478 763.795915 851.2657423 851.1105992 1055.887752 1173.53042 1210.183428 1235.38517 1234.432254 1226.916143 1182.844072 1216.851789 1215.774178 1228.540224 1236.951789 1226.87099 960.2578243 960.2028148 851.2715444 803.297142 729.3718818 730.1620635 720.4169757 724.6858795 725.5134485 738.0813182 848.2146373 846.4299895 1054.23588 1171.15372 1201.729958 1227.941546 1228.826975 1226.947117 1187.908906 1227.843317 1228.763421 1227.952974 1234.959456 1232.861223 960.9579324 972.402886 867.2906461 833.5191611 761.2289971 759.8041228 751.1277947 748.9914622 752.4330534 759.4024493 855.3484295 862.104536 1072.725378 1190.755554 1228.181129 1257.134478 1266.000222 1260.173372 1211.920889 1240.649083 1230.582335 1223.080277 1230.400543 1230.89117 960.4877336 970.8513612 858.5930569 818.3653414 757.4891828 763.0546746 754.0140091 755.9321946 771.4750177 775.4901548 866.9275188 878.9566317 1087.302578 1200.909736 1234.915403 1261.337752 1267.092415 1264.309487 1223.742141 1256.717449 1252.874584 1253.976843 1269.228663 1274.35632 1012.909648 1011.319518 900.7730299 869.3202639 803.5991355 807.3782651 805.5022849 816.9196631 822.39737 822.5410835 904.3446501 913.5170304 1130.354858 1230.512625 1262.058533 1281.898761 1291.117213 1293.016902 1243.613843 1264.528429 1269.4942 1274.619813 1287.436552 1294.278091 1037.957489 1047.015692 935.5164916 894.2099502 826.2362783 827.1798026 816.1545412 815.9577597 814.5421407 813.9735037 824.0575474 823.2757345 881.5257832 1005.696075 1014.233124 1106.548025 1098.334143 1095.527743 1059.287783 1056.613703 1060.281239 982.4317395 994.2238461 965.8505947 936.9501759 936.0118185 840.0733997 837.9531555 826.5963819 827.3562851 814.229002 802.806313 802.8740234 803.9366992 816.3225118 814.9494027 869.9679599 872.3564661 942.5910574 914.1965512 894.829896 873.416567 855.0582328 849.1745571 851.3887409 850.8948563 821.9730165 779.4001049 787.0964963 791.6241433 787.0347314 806.2079704 815.3089644 824.8917589 808.2488092 816.7215728 815.9935783 815.2714692 904.0302194 904.1790426 1117.42068 1243.937516 1282.219149 1297.41119 1292.838915 1289.290118 1246.947366 1276.407406 1272.565917 1280.061924 1289.511079 1292.027188 1034.885289 1045.709947 936.2827659 893.455934 824.8457653 824.9254873 810.7850339 809.3403101 808.24152 806.7527662 896.9571929 891.5484847 1110.331048 1240.510694 1274.401403 1291.736045 1285.799546 1276.60193 1231.523573 1265.539174 1269.536865 1278.277734 1284.132342 1285.258254 1035.697601 1046.883451 936.3719125 895.6816696 828.8359354 829.0581103 814.9876534 787.382768 776.6462444 791.6358314 872.1761928 867.0464629 1082.025106 1198.469702 1231.100313 1255.209355 1255.616165 1251.416499 1207.382115 1238.430011 1237.831357 1241.427541 1265.186716 1266.506976 1006.821778 1021.864166 925.8444141 898.5992558 831.1487914 826.4289584 818.4940384 819.7229065 819.2312659 818.8155161 903.9124206 906.5195294 1092.483587 1177.573599 1209.34442 1237.614205 1240.507068 1235.890244 1193.883625 1233.354816 1239.199899 1236.17395 1242.143584 1241.718249 962.8159263 996.9584006 911.9251505 877.8505155 812.2203484 818.9559979 813.0911742 815.223857 814.9548761 820.1794692 915.0394485 911.7894947 1122.824207 1228.682984 1269.509587 1306.872155 1308.698445 1303.654499 1274.551593 1307.802805 1309.286282 1323.812739 1334.058482 1340.208819 1061.988142 1053.774622 930.5116842 893.9037817 825.3936928 824.5123923 810.6884977 808.8467432 807.563407 807.6176638 817.8826455 813.3501379 874.6941499 999.1866183 1012.612195 1114.332098 1097.952905 1083.538843 1050.92974 1032.567168 1033.123509 971.408199 989.8000766 956.7899644 929.7910784 934.4153807 832.4672704 832.2311178 821.1847853 821.1657715 806.3509513 793.0326153 792.377813 791.2597762 800.1438719 795.8698679 858.1473123 868.848044 950.5491192 931.093243 928.3569621 927.253236 935.4599172 935.9814354 937.6267756 941.3728093 917.8985966 874.4133814 847.2420077 835.5990645 813.704876 816.2902682 806.1188137 806.5629906 793.9564858 792.4931885 790.3753677 789.7023069 799.6660889 795.7149292 858.0992978 866.6647602 946.6901907 941.1823602 952.6631321 945.8076285 934.0964389 923.7802831 928.2894801 934.8168191 915.7993563 879.287872 849.2727245 839.1047906 816.0513902 817.7788092 807.2700852 807.5736237 794.2309574 804.2045348 802.4455612 801.2017683 893.1325162 889.2908613 1105.711528 1231.568556 1278.268539 1308.717124 1306.906411 1297.925893 1257.088486 1288.834515 1294.148413 1294.62446 1306.868355 1310.915476 1055.640741 1049.976308 924.0020374 886.9221078 819.3739444 819.3323656 805.4947478 805.1460147 805.1066052 805.0845158 895.4244251 892.8898985 1111.795485 1239.014623 1285.126276 1303.902217 1291.966399 1277.761831 1225.360677 1263.039069 1266.896861 1265.918556 1270.636186 1276.357772 1022.929163 1027.567362 919.5204882 895.518126 829.7534793 834.8207256 820.8585866 817.8509219 813.7899826 810.5770753 898.9640823 896.0778539 1116.199391 1237.30139 1240.107014 1253.298901 1252.974389 1236.715139 1192.212143 1231.505862 1246.568238 1252.988776 1250.688848 1235.37246 995.7508518 1007.956892 915.4067785 900.7533314 833.4252795 832.2931415 816.7483542 800.2429569 815.1650438 822.0909869 908.3539023 893.9050905 1085.795206 1168.528391 1187.713915 1228.092962 1238.185716 1248.605525 1216.288007 1252.696658 1259.812681 1278.629222 1296.983196 1291.074366 975.5622484 954.1696192 837.5998516 846.2307464 794.5455579 804.5668575 792.3177408 812.9428158 823.6497905 821.1550912 828.9749641 824.4845497 887.6639311 988.3685229 957.9591941 1042.541225 1041.286182 1034.320407 999.7456151 991.8860875 989.7502308 919.1775694 939.120137 906.965533 881.9025744 894.0586748 811.5184665 824.8122439 819.4878004 827.7201828 822.2291023 810.8406099 809.317483 806.4854039 815.1746139 809.13797 871.488852 876.1044828 937.113039 917.5751439 909.3720007 905.0215338 898.5820993 894.8552748 894.7921454 890.058063 875.7064026 841.7843478 825.3017156 830.8170696 823.7967907 831.5628345 818.9324181 818.4720481 805.6566672 815.5008743 814.3513621 813.5279108 904.7524173 905.7410181 1107.032286 1192.079489 1209.399524 1225.006758 1224.840558 1230.834805 1200.777691 1244.970029 1248.019853 1248.857796 1253.148119 1237.451708 992.2848436 1029.131936 920.0718375 892.8884707 833.5217302 833.3964535 821.3678725 819.6946442 817.5025527 816.279921 908.335466 905.0541703 1124.189972 1212.07137 1230.504153 1248.540302 1241.922587 1231.191848 1194.912232 1240.345628 1250.996711 1249.335928 1243.851428 1237.274041 1009.478089 1026.04725 920.6345508 888.6235861 823.5035751 825.6863415 812.8125338 818.7161465 819.3290937 818.3038616 907.5039333 904.9788285 1125.086812 1229.717412 1255.267094 1278.246102 1281.205653 1274.249236 1228.890241 1268.70067 1271.281814 1270.686807 1281.634844 1285.291002 1030.825515 1041.547235 932.8871428 897.7773713 827.3899416 827.5557461 814.3183112 813.4341037 813.7039184 813.1387005 900.9488684 897.4244229 1118.958451 1245.407529 1263.422122 1282.509257 1283.518932 1272.559487 1220.691826 1248.134215 1250.369983 1255.266437 1264.488985 1275.806543 1019.275824 1025.256065 917.9710792 891.8294218 828.4820331 828.3113019 814.6025676 813.4162425 813.0858752 812.3858998 904.6178624 901.888233 1122.62424 1242.328509 1257.03184 1273.698599 1275.357344 1275.431559 1230.892384 1255.558808 1255.220487 1260.918608 1272.670079 1285.068353 1028.951901 1039.58809 930.6877816 895.1752022 827.0760297 826.4869512 811.4093827 810.005221 809.6190384 808.1816714 816.7227741 813.0901941 876.0796129 1001.450115 1009.800732 1103.305758 1100.010311 1098.451207 1059.78622 1049.100989 1047.310025 968.4194725 979.1705773 949.1757012 916.4334198 920.6959178 835.2949946 840.581052 828.696767 828.0927242 813.8396473 802.096728 801.0582358 798.6228147 807.1305366 803.0244202 865.868955 872.8438297 930.339371 907.6313274 906.9912346 899.7002849 893.6899258 884.2977538 883.9736198 891.3559488 878.4905451 836.6645622 817.6200695 828.7573584 824.0462559 831.6637141 819.8512157 820.4984184 807.0895347 817.0795057 816.1293059 815.212472 903.8924292 899.3084127 1118.609988 1237.952085 1257.05937 1278.75425 1276.901076 1270.244515 1227.631063 1268.920405 1286.837526 1293.098921 1306.221404 1319.796652 1061.698929 1058.165766 933.5384466 896.4131357 828.4197021 829.2149507 816.1221379 816.8505512 817.208781 816.453414 907.9127742 901.8396485 1119.436298 1243.993129 1287.704605 1323.687491 1312.397724 1297.120311 1257.300555 1289.172994 1283.400629 1285.364392 1294.113248 1301.889387 1040.977035 1047.881836 934.1962384 894.4698557 826.3770467 826.0561179 811.6095446 810.6187247 807.9323401 806.3492332 896.2560989 894.0123427 1115.381595 1244.119705 1266.923458 1294.779447 1298.069838 1284.700441 1240.826029 1271.821071 1275.961399 1283.417865 1291.670625 1308.236686 1053.977608 1057.350022 931.5716702 893.8878536 825.7566939 824.5205148 810.2633447 810.4452738 810.0534278 809.6505926 900.6126006 897.5712206 1115.339999 1240.764718 1283.97368 1319.233115 1329.168924 1326.667815 1261.5257 1287.729742 1287.199886 1287.545848 1302.018217 1316.683823 1060.055725 1054.613808 928.3882894 891.0926087 823.0481117 824.3242463 812.7720245 813.0181003 813.07706 813.0830232 905.2207318 900.7024556 1117.924159 1242.591363 1284.200153 1318.573146 1329.610269 1333.44809 1293.46702 1327.250232 1318.485161 1323.700118 1334.003213 1333.658861 1062.215102 1053.381683 928.450386 890.2999693 820.8347471 820.1140402 806.0837235 803.248181 801.4445578 800.9022332 810.8976428 806.951691 869.330743 994.4717666 1009.063032 1119.543051 1108.620009 1098.627126 1058.779604 1052.280104 1046.541229 971.9842685 979.2489349 941.6238887 913.9629926 918.7911948 828.9031709 831.185334 818.8443881 819.2942402 806.1368389 796.2349731 797.6706431 797.2660223 804.753713 796.1050901 857.6936962 869.8242517 927.9685686 904.6423063 902.4678188 901.417742 894.5738895 887.1529049 894.5716701 895.1688698 875.0551472 836.4816139 816.5864959 822.1675294 814.8252592 821.8786067 808.6717757 807.6561635 794.7300807 806.2564386 806.2741174 805.4315022 894.8746594 890.642052 1109.660031 1238.507201 1255.525502 1268.565096 1270.230206 1257.011202 1214.129642 1253.290231 1267.751446 1266.556111 1277.675534 1289.863806 1034.541334 1044.455283 935.3430107 899.3688316 830.1066286 829.6711263 816.2546748 815.2971119 814.4904996 813.5021124 906.2302517 902.2787379 1119.492261 1243.964047 1287.357019 1323.399501 1332.16025 1316.543943 1272.428612 1300.762743 1292.103467 1294.641334 1307.967981 1315.060904 1059.147905 1056.979671 931.8826046 895.684192 827.7304196 827.19479 813.626599 811.8896727 809.6822652 809.021125 899.1926331 897.0203406 1115.975208 1242.512599 1286.43433 1322.723921 1322.037981 1309.130233 1260.24717 1292.861701 1293.268527 1296.774067 1310.730458 1318.770324 1059.090992 1054.972158 929.3350573 891.3447082 823.1148589 822.9798644 808.8346538 806.8851969 805.5836881 803.208337 891.5222955 890.3001458 1111.755242 1242.959174 1276.933839 1297.725674 1294.131514 1281.285161 1223.46129 1249.255482 1257.056528 1264.527663 1275.143882 1285.648032 1029.71594 1040.080816 929.9942778 890.6760949 820.8156261 819.7338338 805.8345184 805.3905806 803.9906258 802.5087583 897.1368129 894.773138 1114.573983 1230.16228 1241.328348 1260.288708 1259.110879 1255.414564 1214.285145 1242.882605 1232.439886 1240.862461 1256.649971 1268.407956 1013.865999 1030.427031 917.9437017 881.0031129 813.9006404 818.5646348 807.8779152 819.1035631 811.9960538 820.9128868 829.3829844 825.2928103 887.4472567 1009.152633 1011.876953 1104.957062 1098.882374 1091.784921 1050.453577 1037.896064 1040.681112 972.9381979 987.054218 947.3373782 918.1063045 919.8209455 835.1053923 838.2763051 830.9787308 834.2829891 821.5323088 809.5864402 809.4062423 808.2785763 817.2938795 814.0111675 875.6732227 883.4777482 958.554862 943.1811889 944.338022 943.755383 947.3717863 925.7687802 912.7064679 910.3490829 888.9240799 852.5666226 828.6831023 833.4637477 820.2656377 830.3497818 822.2377005 817.5248691 808.7764821 821.1768685 820.6754176 820.422592 909.8225571 907.3679118 1124.055192 1247.42082 1283.934565 1315.743836 1315.105128 1307.929633 1264.383369 1298.126648 1298.398901 1294.265691 1298.758865 1303.424746 1042.226079 1042.337391 922.6359074 892.0712727 825.1899642 823.3925574 809.1769946 796.3380844 799.4043131 808.2175211 897.9057218 892.6048492 1109.530929 1227.668036 1257.474969 1278.830788 1285.067787 1267.999272 1226.584724 1253.513467 1252.349827 1260.41125 1265.041851 1273.737121 1015.79803 1025.25868 924.4900169 900.743138 832.4936975 830.2430709 818.5602303 821.1661628 821.75304 820.265791 910.2367333 909.5257297 1123.826993 1235.999933 1251.352602 1276.106463 1277.36975 1266.435737 1206.780516 1228.743469 1229.650691 1230.239343 1237.081962 1238.295239 983.2007241 1003.894158 889.4289035 872.8195004 815.4179999 816.7391241 809.637175 814.2410468 811.9995369 809.6411273 908.8619874 909.2363549 1112.552516 1190.021476 1206.633776 1223.921271 1235.217412 1241.799914 1213.862712 1258.281101 1263.020742 1263.958823 1269.259659 1266.948303 952.9923159 960.5892265 876.835516 863.3976596 801.8689018 812.3160196 803.8370779 803.1590819 802.7785989 811.6845672 902.4428862 891.4508941 1088.106173 1173.355215 1190.932327 1231.390829 1246.313675 1256.168861 1222.205718 1264.071105 1283.076416 1296.115974 1301.530764 1298.53338 975.6151799 960.9285144 822.1379608 823.4232331 776.5454845 792.3233019 795.8570024 809.9833892 819.9928128 816.2203814 819.8639375 812.6352451 875.6118031 1000.666342 1003.294382 1093.350771 1085.064575 1083.076955 1053.468191 1048.003475 1048.667689 971.5868012 979.4205029 945.46472 920.2566784 927.6971828 831.4221264 839.0709291 827.0984306 826.7114744 813.4129 801.4995384 800.5853903 799.3628151 808.2521626 804.5514691 868.3553982 871.1838492 937.3779812 914.8521271 908.5274781 903.1036022 900.0485389 890.3695832 893.4870572 901.8606475 882.664772 844.8082627 825.4222267 831.8314478 820.1624614 831.4182963 818.4481783 817.458168 804.8772892 816.4440944 817.1108424 817.8145706 908.9383638 906.9495218 1124.668273 1248.502975 1284.491137 1311.139538 1311.815166 1305.621413 1256.738319 1283.738256 1283.11843 1285.096168 1293.472118 1299.302123 1041.994812 1045.216966 930.0647779 898.9772039 832.670774 831.5430696 817.5682473 804.9263477 804.3980178 805.2579042 816.7717664 814.2109662 872.5002422 873.9951977 936.1891911 911.5616531 903.3298695 893.9262823 886.024353 877.6278012 875.8653022 873.189595 847.3349645 811.7742412 792.9363993 797.0415386 782.532103 787.5194454 779.6383126 789.4617951 794.1183456 820.5909101 821.7700246 819.2556379 907.7803277 904.8638048 1124.209443 1246.110127 1275.073144 1295.714507 1292.358876 1287.834438 1242.805207 1273.021702 1273.000687 1274.662315 1282.333518 1288.223431 1029.221301 1030.25105 911.500762 878.3793184 813.4089126 819.1691249 812.7598381 818.9364433 819.4177307 817.8816275 906.8557655 904.4210454 1119.360948 1235.738688 1266.735799 1288.962017 1286.623287 1276.238309 1223.625494 1247.89361 1243.27437 1243.163229 1252.223021 1258.063886 1007.40073 1013.567043 896.0235788 861.5939698 795.7935422 803.0928403 797.9281532 806.9549585 816.8998109 822.5711554 912.5733111 908.9003175 1125.405495 1239.355333 1272.75591 1299.407863 1301.021813 1290.661374 1237.731991 1260.95247 1257.150439 1254.797363 1259.661549 1262.505541 1005.289008 1007.237743 887.4510171 851.522869 784.5305575 789.3831789 783.090864 789.2791875 792.4661757 792.7288642 804.258554 797.7873857 856.100912 973.6679515 977.0647445 1078.208001 1079.707455 1067.539484 1021.973817 995.1607324 989.8472623 910.8243829 917.9562118 875.6923998 835.5032961 829.3988975 755.8041539 785.5146001 788.2601096 798.2161537 793.4977873 790.956869 796.8053436 800.920439 815.1326113 812.2104372 864.5496889 867.3978717 939.5457176 920.9425737 920.2872976 915.6704725 906.7867784 894.3673356 894.504908 895.0443617 871.13479 830.0256415 810.8201299 813.9734096 802.4582565 811.602598 807.5132669 813.0753755 803.8918699 818.162007 817.1246718 815.6607457 904.5737278 906.3238397 1117.999085 1231.377211 1255.45933 1271.108137 1263.124721 1261.300722 1222.631487 1258.088832 1259.202674 1259.986432 1267.150474 1273.954649 1017.049839 1017.589175 898.8723955 868.22252 806.0260557 811.2738453 802.6531269 807.1350972 811.1424488 814.6558002 911.3646505 906.1364056 1107.770616 1219.869933 1245.372658 1260.644003 1254.794533 1244.112371 1190.511163 1224.888533 1232.321496 1236.540865 1246.704129 1245.915368 962.3019262 997.4941016 891.9881725 868.669314 813.569897 815.4062649 797.7686948 795.0032561 793.1298002 792.464119 881.3204516 884.5340446 1103.117444 1231.028808 1258.510675 1274.510012 1267.372661 1246.038379 1193.018413 1240.979632 1256.26299 1258.088971 1262.41426 1250.874127 979.9532245 1016.821157 906.3384245 877.2144968 818.5502226 825.8210747 818.80202 817.5330393 815.3905646 813.8258339 902.7765349 905.4409602 1115.054654 1225.913647 1251.750143 1272.792218 1267.469175 1260.186577 1215.507865 1242.067053 1236.66041 1243.190616 1263.900101 1274.686268 1020.891304 1028.144253 915.6659012 889.1399977 830.4743333 832.5489094 818.76311 817.8280763 816.5717993 814.911935 906.2075332 907.9933633 1121.708601 1231.150035 1253.674137 1271.756465 1264.622701 1255.699208 1201.437319 1229.662226 1234.940452 1239.397557 1246.508335 1246.280125 980.111412 1011.777026 900.7961536 875.6682056 821.0434815 827.371151 817.5251799 819.7690222 820.687922 820.1986742 830.0220536 826.6866974 879.7324222 995.8250501 995.0369008 1089.709755 1085.544403 1071.986154 1027.716605 1010.764134 1004.226691 935.1856172 952.3397441 921.9144736 894.7825944 900.8727975 809.4311269 820.1946263 817.3392113 823.4051575 814.8256228 808.0430858 807.5068086 803.6895096 811.1587654 805.4598294 853.6015334 854.2432314 923.7830906 904.9484868 902.3991167 896.9094511 894.2514802 884.1300243 884.6350962 883.7778809 863.7961786 823.5915602 803.2641577 806.8163367 790.8823169 794.1046838 785.3137909 790.0192668 781.5898972 796.6824628 795.7353499 793.3024667 881.4727463 880.9572697 1092.76539 1214.183275 1252.316429 1281.682343 1285.903029 1280.021776 1230.65895 1256.963051 1251.772276 1247.431015 1248.163874 1249.385431 1010.816516 1024.597927 908.3607749 873.7105872 808.2184989 816.9383351 813.3559241 820.2742442 821.2384875 820.206291 912.7725714 912.6311313 1125.178697 1248.100946 1289.739427 1325.018125 1333.149976 1322.913471 1266.599707 1287.102541 1286.359937 1290.326233 1300.075583 1305.609999 1042.742125 1043.383928 926.2342862 893.9971168 830.0174575 830.2662007 817.3599876 817.128045 817.0540562 817.0413086 907.4202691 908.9347145 1124.132488 1249.655756 1287.803074 1307.758227 1302.978651 1296.178067 1250.349546 1278.238978 1276.686189 1278.83424 1286.151759 1291.611384 1030.899231 1032.359036 916.6583863 889.185657 830.0620735 832.4974898 819.4123999 819.1636939 818.7888897 818.1062069 907.7171258 909.8473809 1125.665214 1243.089721 1272.516328 1290.063771 1285.865874 1278.317934 1229.273048 1255.5945 1254.270727 1257.293999 1265.407188 1275.189473 1024.953366 1032.714651 916.8590825 885.5990744 823.8736381 829.4919456 814.8867613 812.3528773 810.9092731 811.0433742 904.7884642 906.5700467 1117.587987 1236.427645 1273.294528 1302.853713 1306.553688 1301.90745 1252.385886 1278.809529 1278.374839 1281.271774 1290.107711 1296.166009 1033.480913 1036.394993 920.4507288 890.40471 828.4001988 828.1361193 814.3142783 813.1997425 811.5918024 809.5667806 817.4986048 817.2590566 877.9364448 1001.694314 998.5026482 1088.679667 1077.989271 1062.386655 1021.932955 1007.503933 1001.643834 931.0099243 947.9392591 910.8662156 883.6875232 891.0449695 799.1046892 808.5523804 806.5899368 814.4931407 806.2446962 800.3314499 801.629546 801.1273779 811.0140622 807.9271959 863.0777231 866.9684419 933.9335533 912.4663267 908.413894 898.719148 892.6228364 880.9605941 881.4533741 882.502177 858.7135915 814.6966929 795.9877187 800.0086904 789.2396763 801.8854641 802.2194697 809.2393491 800.71548 816.4184513 821.5619241 820.4730527 908.8700158 909.3767278 1124.008638 1249.148409 1272.018721 1283.79151 1273.748338 1263.582754 1215.845911 1242.384964 1234.960094 1239.070235 1256.874132 1269.093527 1019.623899 1030.393149 918.8308134 894.2694305 833.4554857 832.4544601 819.3841413 819.1843244 818.8327884 818.1424784 910.4529693 911.9588889 1119.838201 1232.212633 1254.533508 1269.546782 1260.852722 1252.013148 1195.747671 1225.149059 1227.55768 1231.834867 1238.265032 1238.045832 1007.777436 1033.852414 922.2171202 893.5864198 832.6544673 833.9232689 819.7138557 818.1096096 816.809066 816.3136747 906.4954797 909.534184 1113.050149 1220.576391 1245.947005 1263.3661 1258.816445 1245.998068 1192.925334 1233.330306 1242.182487 1249.458818 1244.894958 1242.329018 1014.775613 1035.653972 922.2949263 893.8522645 832.5403804 834.5555681 821.6801794 821.5306862 821.4736556 821.4503928 911.8272237 903.6011412 1101.814087 1213.423756 1236.46414 1253.916159 1247.751499 1234.171917 1198.218305 1235.582959 1240.013793 1242.070973 1241.131764 1239.144631 995.244286 1007.145953 889.7223382 863.1593392 805.8190911 815.3055727 809.4910221 815.9553697 817.1115626 816.5068452 909.3178714 904.2967105 1110.130486 1225.754872 1260.607258 1289.443532 1292.116816 1286.18433 1240.397535 1268.433021 1267.39139 1268.979754 1277.082717 1284.649987 1030.157437 1036.854059 920.9090695 889.4385683 827.1996361 831.1804954 819.3135634 821.2094303 821.6414571 821.4848605 831.6300445 827.8927487 876.4729351 991.770237 984.775946 1073.919393 1065.597851 1057.82865 1017.104398 1007.249236 1006.805914 934.4031253 945.1911799 899.1978938 869.6361139 883.7353945 790.2972422 796.4460299 789.7139344 796.5005969 790.2023048 785.0694269 787.4985426 789.1412938 801.2331474 795.4742053 850.0756083 846.9235852 917.2577596 899.3330514 898.4821154 895.3416404 890.058661 880.7551819 881.5770296 882.4450592 858.4497895 812.9095712 791.1531793 791.9316281 778.8707936 792.1617736 790.309858 790.1422514 774.6649285 782.7799165 782.9769544 783.6359586 875.2399487 876.9295731 1094.158195 1213.630065 1249.255901 1271.811651 1271.302701 1268.083515 1222.446788 1252.413821 1248.649696 1245.188714 1247.002748 1244.648029 993.7691535 1000.866696 884.6316873 852.6375583 785.6575676 789.1680801 779.3106425 773.1257442 767.5543751 769.3019974 870.0403258 872.9145717 1084.795984 1198.760969 1235.326755 1260.864796 1260.396649 1254.102768 1201.020482 1225.971428 1223.251966 1226.314433 1234.947362 1235.265449 968.4419316 991.7143784 881.5823063 845.5486664 783.0959127 789.8972207 779.2466529 786.2524354 799.5858425 803.7448584 896.7207537 882.0331849 1099.579346 1192.185204 1202.917568 1223.093728 1238.176234 1245.058999 1210.510089 1254.46106 1261.210116 1264.734768 1271.634397 1269.133923 955.8724383 952.2589386 874.4513119 849.125208 782.2290028 789.4667287 793.8515828 788.2921231 783.252607 784.0969064 882.323793 883.7375733 1090.69407 1173.271494 1190.444795 1231.988002 1253.590643 1264.685645 1227.213773 1263.875782 1269.061315 1274.629908 1284.93176 1282.653035 964.5108383 951.8833161 872.4165738 848.8443744 784.7354415 792.1985986 787.6143536 784.6192174 782.0519283 791.5515207 889.2708122 888.9428911 1113.697612 1214.072633 1225.658948 1241.110642 1233.641872 1240.425749 1210.747795 1254.881697 1256.513698 1257.200982 1260.812599 1248.331042 970.4370181 1002.387138 898.2071183 863.5528916 796.7654975 801.7820361 805.7048423 794.8686413 796.6022273 799.036547 810.2464665 806.4729247 871.5043046 974.1986871 979.6739519 1072.243228 1072.891155 1077.125424 1035.83115 1020.940821 1025.978597 955.7656398 966.5034475 930.5041053 905.170224 904.0903223 811.1016129 812.7577233 802.4638399 806.4542503 783.5154785 783.5181209 797.4654403 798.7010822 815.3265823 820.5272361 878.1925224 854.813234 915.8198425 896.4019228 894.3612055 886.9560357 883.6694075 876.6605744 879.3569813 881.8214699 859.8203394 827.1299735 804.4700569 808.865793 786.7773971 786.487877 783.1042518 786.2776699 786.5070117 802.8708773 802.4355645 811.7718054 911.6055418 912.872514 1128.827541 1225.300499 1247.033133 1267.382388 1262.05322 1257.076349 1211.975145 1239.664395 1233.68841 1229.545445 1246.348199 1259.859412 1006.187072 1022.625561 912.9156581 874.7287585 812.8999202 829.9095353 814.3376542 815.9077433 820.311793 820.013235 913.4191317 909.1566887 1129.97965 1240.764244 1257.415936 1270.252648 1260.73027 1251.991278 1194.328531 1225.41906 1227.910297 1227.771137 1232.896654 1231.856752 976.1647993 997.3306458 892.4025926 861.6530281 804.9361102 808.9643087 816.8986573 810.7072544 816.2864773 814.5679008 908.8602852 907.5232754 1112.735346 1188.427891 1199.833268 1224.123815 1239.014177 1248.964544 1216.539516 1252.950924 1256.170979 1261.690305 1268.013199 1264.967896 953.404101 969.2022771 885.8223077 866.50762 810.9841632 818.243007 813.3294942 820.8955109 821.2090948 817.8781193 908.0139108 911.2464058 1132.511058 1227.874884 1241.016209 1268.626983 1259.083064 1239.272501 1195.494991 1235.864894 1241.796528 1248.906668 1252.345807 1245.138397 970.0701565 995.0916958 895.415967 864.6795874 801.0042559 802.7355455 814.447759 805.8403201 816.9087919 813.1052389 907.1504808 915.8259916 1130.377543 1229.05865 1260.755035 1270.49954 1265.479184 1255.514829 1196.027181 1231.764415 1238.098826 1241.168129 1250.799259 1251.838847 962.6446753 991.2993073 897.6544453 862.1792443 796.0379677 798.1881169 803.3873999 794.9938242 793.4826494 805.8080818 825.653369 827.4712672 875.9734892 977.3214172 969.2017799 1061.847083 1060.588417 1059.199668 1021.96505 1009.925282 1007.47221 933.9029518 948.0671278 912.2428031 891.4425489 898.1383333 811.7426983 808.484662 800.2701574 803.9816328 801.1444905 782.4227214 779.0336482 779.8879927 795.3787444 796.3332421 861.5516098 858.2818635 926.1642553 905.304471 902.3608825 897.5616995 894.4968123 886.6899007 885.7413636 886.0599983 862.9646944 819.2021194 792.888187 793.6604524 785.5385183 789.1097882 785.0321901 791.2871468 794.7929324 800.4070336 799.5932019 807.3130576 894.3264952 897.8956365 1107.342426 1215.253874 1258.307566 1290.012478 1290.086161 1282.52186 1230.222993 1263.227256 1264.315899 1263.637202 1272.389531 1276.212481 1023.397361 1031.322368 911.3909317 869.6612704 802.2129951 806.0974675 800.6215222 796.8340784 794.4991125 794.7726563 898.2657798 902.6957077 1118.344177 1231.030853 1265.230852 1296.253841 1295.98572 1284.929815 1233.849692 1260.084827 1257.184917 1253.419399 1263.473512 1270.463958 1017.473468 1028.040322 911.9122977 870.6034281 804.5140322 812.4057843 815.9013159 804.8312811 799.1616674 800.4844249 890.5465826 892.21325 1109.731609 1224.416108 1259.623576 1282.120204 1279.245857 1274.112489 1222.631201 1254.558054 1249.79096 1248.31569 1265.366801 1273.033344 1017.143473 1022.901749 903.5008142 864.7940426 800.5814895 803.5213998 798.72332 791.3337667 794.7921295 796.8861567 886.6800427 882.5153096 1102.531713 1219.587235 1254.686099 1287.544351 1288.542613 1286.130753 1237.007952 1260.15578 1254.102764 1252.725096 1261.279318 1266.140692 1008.216552 1020.387901 907.6373725 869.4287712 802.5657371 811.8494907 803.5300283 802.0930257 805.9199059 818.8574426 911.3533018 909.898742 1130.971036 1215.947079 1237.06659 1254.063974 1254.689756 1252.411688 1208.083248 1240.971087 1238.647162 1235.96991 1242.948542 1239.798686 967.5221413 975.5034637 856.3500757 813.3593702 772.1456884 773.0191555 752.0559293 762.5280083 767.8472582 775.5114122 794.80211 800.1695422 867.0818578 962.271153 957.5170975 1057.995211 1062.87968 1063.627731 1031.688017 1020.380087 1013.938605 936.8323292 950.839063 918.499498 887.0506858 888.6428985 789.2577874 792.4081678 788.8741644 791.8289957 788.9064587 780.1174203 779.8657863 782.6614908 786.5495541 787.6110014 862.9010453 849.1479798 911.1763298 888.3951271 886.1597637 891.8131395 892.9810813 886.5582092 887.7965014 889.6517785 869.1465198 827.0319666 801.4645158 812.7364546 796.303554 798.5730502 791.3807379 792.3888316 779.8837819 791.0610551 793.9436388 795.6072334 891.0700795 898.9522878 1117.004529 1226.603762 1257.968437 1285.098889 1291.623771 1292.953944 1251.092646 1260.36001 1252.921804 1253.804085 1263.634995 1271.140238 1021.536854 1030.443878 915.033963 871.9557683 816.3966758 822.2717147 809.5734252 819.0076101 822.0664392 820.1561103 912.7537622 912.0463677 1132.769959 1233.397733 1266.661354 1288.331867 1278.921203 1266.099739 1217.842063 1244.748181 1235.056019 1232.845433 1245.813335 1263.198533 1018.763864 1024.857599 907.8906192 873.2193465 807.4740481 813.2648082 803.2290416 806.4276079 819.5246428 823.1498842 907.0606678 911.2100384 1136.14861 1235.769584 1251.979346 1263.782117 1260.17558 1261.942201 1215.871193 1238.240618 1228.699242 1230.409719 1238.671513 1236.010422 1000.909455 1024.181506 900.636349 858.2045071 794.562453 797.6631166 795.1605401 787.1632982 786.5821367 788.8034712 892.2268667 895.867644 1114.543799 1217.006508 1240.81103 1260.181384 1261.097425 1251.27204 1194.683235 1226.297755 1230.693871 1236.551103 1251.817516 1250.457186 957.3957468 989.8371436 884.5961884 850.1947401 791.6031049 795.9351542 782.8575726 779.7059962 781.1323277 782.851031 875.6382585 880.3889225 1102.57616 1215.159012 1256.539018 1290.398189 1285.5326 1274.364054 1220.82065 1248.652192 1240.056167 1229.128384 1237.229267 1260.924734 1013.562558 1029.615263 909.8990353 862.9494214 790.8442255 793.6290332 786.4722544 788.1000535 793.8050387 796.4883153 808.163406 809.132278 872.1635111 984.5429064 989.8843744 1091.754309 1093.776028 1083.566982 1043.920919 1030.000939 1027.607152 951.582488 959.3015227 922.1500132 892.6977588 902.6486308 812.287394 813.3245716 802.8419731 806.7880853 801.5686789 797.19169 806.2641455 809.8316506 820.5447319 820.1861438 884.2135442 882.746733 949.4176126 928.4808826 930.564498 925.567405 914.5414073 900.372258 896.7322873 895.5754735 877.7189834 834.1061403 814.1397262 831.7422998 819.2545979 829.8199824 820.112314 821.1078528 810.0955767 821.2548022 818.7530814 819.5674947 911.62021 909.3496795 1126.801536 1243.482694 1265.046242 1275.30202 1271.555426 1262.892566 1215.540689 1245.936993 1241.448879 1242.614704 1258.690438 1271.554632 1024.300863 1043.59061 926.2489115 894.3570998 831.7796975 833.714344 820.9756272 821.2759374 819.9927127 819.6563164 911.6277527 912.0856729 1134.489542 1248.177764 1270.590639 1281.128345 1276.65851 1278.839805 1244.350598 1285.940902 1294.763786 1297.252057 1306.494244 1302.017062 1034.448655 1043.068875 919.6118561 881.4027376 818.9177567 823.6959176 809.0458847 806.9413428 807.0112684 809.2815766 899.0779702 893.0385524 1112.172353 1216.635322 1241.629825 1241.108689 1228.09249 1230.798879 1190.711079 1220.098145 1222.199096 1224.811455 1236.29962 1243.42631 999.1933608 1023.975041 907.5365896 877.5909248 813.3588494 817.3059777 807.928371 808.0407008 817.0686475 821.5915863 911.0913101 911.6984539 1136.845991 1233.65222 1235.954863 1244.994476 1234.363495 1237.584548 1203.917401 1246.186762 1247.486339 1240.366766 1238.700998 1232.196463 984.8111511 1023.645139 905.5245532 864.8213311 798.2015636 802.9951368 796.3000867 775.810329 773.5185003 783.9180635 885.9600364 888.7113932 1105.370126 1213.347592 1245.976062 1269.473162 1271.178165 1262.314598 1215.901223 1250.602832 1257.354676 1262.44878 1269.781413 1276.380801 1024.374306 1034.919901 911.0888741 873.8967741 808.6696259 814.9239673 798.2589787 801.8590166 811.7964803 815.6736442 821.3415669 827.9296608 892.3912489 994.1332617 993.7655776 1082.128432 1079.897847 1077.858142 1044.734026 1031.059701 1027.99469 952.0287878 959.7914345 923.7340481 889.1116346 894.4633361 787.4653355 785.1547239 772.5495747 774.4923365 763.3572917 752.1183186 754.40405 751.5469188 759.4889445 762.282675 834.3571626 828.3481187 892.2229856 874.9672978 873.3503733 878.0612013 881.2408357 875.1239873 873.7548861 875.2331055 853.2758338 805.5799592 774.9132212 789.0993296 768.5084817 779.4497393 780.2156776 789.8851169 775.4815244 780.7300571 784.4968257 788.8787284 812.7403103 816.3860215 876.8336686 853.1092783 895.653931 867.0775974 871.1361331 873.0240722 865.519823 853.58585 855.1598163 855.4555801 826.1236648 779.2625934 766.847009 787.3598188 779.9832474 782.2701165 781.6021327 786.8825198 773.7799895 792.594076 801.1704986 797.8836803 904.2127395 905.961741 1138.337215 1239.547531 1251.236976 1259.945903 1256.683673 1251.194973 1198.31161 1229.895936 1228.140326 1222.752934 1227.773109 1227.056098 987.6421364 1018.251014 900.6523933 868.8177927 803.4623437 812.2375125 807.3988879 808.5747137 815.7630826 821.9890619 912.8813505 912.0707229 1136.374259 1247.840949 1260.023651 1274.084914 1265.746628 1266.329666 1215.14743 1239.583583 1245.919437 1256.739091 1273.834346 1293.355038 1046.282736 1063.602416 928.0981342 886.2366859 830.5302761 835.4968474 822.305878 820.4599927 817.6427189 815.9551663 905.6832581 908.6386704 1137.635926 1251.624362 1287.10922 1300.617505 1284.567983 1265.502467 1211.721379 1250.624675 1263.772992 1267.938496 1280.545959 1282.813396 1014.453093 1021.936116 894.000312 854.5821914 793.062927 795.1236608 788.1487465 791.6588993 786.2281762 775.431307 864.8667366 870.0432439 1091.736215 1195.049171 1222.354013 1248.448432 1240.380063 1237.281789 1200.757568 1238.690008 1243.49709 1255.480582 1271.862572 1278.152241 971.9337769 961.6949918 835.992091 817.8659381 758.4863738 765.9265871 768.4378095 774.1971588 768.9616818 766.6257964 785.3219222 785.3298297 868.3753978 960.938892 954.2256858 1056.808157 1058.245396 1051.192896 1007.298199 989.3890262 989.8230862 916.1172786 937.2042686 905.7084027 885.2709079 900.371961 797.0097287 797.1344833 790.2163276 796.778778 789.4583737 780.2259894 782.7559662 781.0189688 789.6504756 789.6659546 852.6688353 842.6851864 919.1371486 903.9099853 897.7331544 894.3634961 890.9531187 883.2470803 882.0532292 882.0733615 859.5939374 820.8311671 796.5148629 806.0299982 779.9118687 787.6686422 781.626699 775.999016 760.7982896 772.2643426 772.3345202 772.3562427 862.6723849 872.3599052 1101.553633 1210.181539 1241.755991 1272.869698 1269.99984 1266.169969 1222.130385 1251.895065 1250.437565 1253.292999 1262.143011 1267.711094 1015.364521 1031.53827 904.0762075 863.2251689 795.9086324 796.9156754 781.7192649 780.2794254 783.6974075 789.0429907 884.1651839 884.1038678 1113.120218 1216.08104 1253.745707 1279.949203 1270.567596 1259.988878 1210.629256 1231.144668 1226.309281 1231.384053 1239.681727 1236.625492 999.4413567 1030.565917 896.2409145 869.3283864 815.1176866 822.5051337 810.3894636 809.6752076 813.3225624 820.6663413 911.5137286 910.7807179 1137.525243 1224.874983 1251.400889 1268.650119 1269.936867 1264.650938 1215.375067 1236.548789 1228.888565 1230.64569 1238.902964 1260.711901 1022.323789 1048.679747 927.9191735 889.124416 821.3598998 822.2360589 815.412683 817.862574 821.877728 822.0370563 912.350845 913.1359193 1136.732339 1233.938636 1262.354536 1273.109517 1266.324459 1256.938695 1198.273963 1230.184275 1232.314584 1233.830485 1240.965604 1245.43285 1011.970718 1042.936289 925.8806161 900.2327238 830.9031937 825.8127742 809.0454835 818.8819741 819.7641324 816.6819396 914.8721832 914.5752415 1141.513097 1223.87408 1224.473871 1235.204924 1234.901911 1247.221525 1217.823131 1261.206191 1268.665177 1278.896878 1286.408859 1276.667995 956.0129548 958.9336927 854.7136908 829.5982798 753.7421114 766.3640873 764.9957416 773.4945856 778.5369466 783.0126829 791.651513 796.8560888 870.4781336 967.7706111 943.3929073 1025.094122 1031.430303 1038.41718 1013.624372 1014.235682 1016.136371 919.1544916 921.463314 874.752539 856.0307546 911.696041 806.8048983 813.342505 811.592343 814.7183174 805.6949684 803.9611069 805.9913773 809.4200807 820.5748692 818.3568071 885.3897467 883.6891977 932.0040418 903.6889533 898.6794546 888.1639791 887.490317 876.3166184 875.7451096 876.5953807 855.027445 808.7393054 784.158517 808.75405 785.4773464 797.3343263 792.5261395 795.6824612 776.7900727 781.6816696 776.7240216 786.0620845 882.3159927 882.5893169 1107.436867 1211.751191 1245.40768 1265.364022 1261.777328 1251.315589 1205.175891 1255.733255 1259.359183 1259.29919 1268.3216 1278.618766 1025.381238 1044.982345 914.3553779 874.1784855 807.2019679 808.038755 804.1202164 808.2396718 802.1926147 800.1049661 898.4385202 900.9344464 1128.924538 1233.563067 1261.997316 1284.23594 1266.443617 1258.107672 1209.741498 1227.394244 1226.955164 1229.430391 1235.756412 1236.439446 1000.392781 1024.24454 894.7045697 866.2765862 803.1337173 803.3565775 793.9164397 792.3552421 790.4186206 790.9023627 876.0539255 870.2927346 1089.263142 1198.821529 1225.23515 1248.661239 1242.692062 1233.313183 1198.804345 1238.992121 1240.288675 1239.183428 1240.058141 1238.142138 997.222218 1024.742203 895.1990218 857.4361474 789.5239506 793.3608719 782.4087516 782.2074511 782.1453946 782.1213766 869.3915522 864.3326317 1090.251239 1195.899977 1225.137908 1252.649459 1251.994095 1236.940594 1198.997593 1243.783615 1254.074802 1253.245395 1256.043104 1249.724032 965.8669909 1015.680262 884.5965022 839.917481 773.618132 768.2882718 759.3449542 763.7020243 763.2839967 765.4905717 868.1400239 872.3465461 1090.740611 1203.070909 1236.933864 1258.651992 1255.191503 1239.893887 1195.532133 1230.494083 1234.594184 1236.604884 1240.873032 1238.833357 985.6079077 1020.807983 890.0321229 849.1540054 778.5950759 778.9192316 764.1600822 763.0938436 763.1215507 763.1277438 773.1503167 770.7804809 837.2725457 942.5143802 947.2681958 1043.197939 1031.506611 1028.943596 1004.420612 1010.534299 1012.176191 931.1596614 938.7869303 891.8271439 842.0726553 850.5778954 735.406653 732.3595927 721.1904037 734.740183 733.4675605 725.5501497 723.934412 730.1445148 748.1780991 757.8530611 839.35959 810.4855559 869.533934 849.1255328 857.4081405 860.8903175 860.702547 855.2055133 856.9357249 855.5039657 828.1034977 780.4736455 748.4732501 755.1215913 721.9352597 719.8567143 715.6440505 730.4007037 731.0687679 747.5544917 745.6189774 745.1499065 837.6794147 838.6646217 1067.389099 1175.278316 1214.248312 1243.861887 1247.01574 1236.557329 1187.763421 1226.09914 1242.31815 1245.576234 1251.456792 1243.919487 969.7265974 1016.63981 889.9518275 854.7825986 792.5738245 798.7335023 787.6069905 787.2912426 787.3499757 787.1956921 880.2007762 876.1612449 1101.750779 1212.841801 1256.096379 1281.102786 1266.441408 1256.105925 1208.509421 1235.927205 1231.115749 1227.34563 1235.695461 1243.995124 1007.553741 1028.566829 897.006109 852.802529 786.5045939 789.2583171 773.4644407 774.9262577 776.6373141 780.7345878 868.8181998 867.1676924 1096.085708 1200.372628 1237.275093 1262.564427 1263.778184 1255.896348 1199.026387 1225.150181 1228.043451 1229.502662 1235.322366 1234.724722 988.2787787 1013.568524 878.8368792 839.149766 773.7042086 775.8015834 757.72857 755.1129525 755.4604311 755.5339313 851.3280351 854.7962349 1082.819081 1190.503237 1228.248004 1249.433742 1247.204661 1241.134355 1192.770512 1228.343081 1231.573612 1235.203492 1239.829582 1239.287669 974.3030652 1003.147796 871.5246448 831.7567588 760.3624303 759.4408148 747.2004332 747.3106812 753.2131439 759.3737102 853.8507971 853.6053874 1082.823094 1189.92301 1221.71981 1245.598615 1238.159636 1238.273522 1201.298615 1236.266517 1238.017818 1247.579571 1257.280328 1245.749356 989.3433469 1022.52829 883.0549735 843.6910426 777.9733825 782.8448728 772.4253405 772.0355375 779.1385128 796.9270931 811.9057133 806.7724046 886.1523155 981.221071 964.0712208 1054.232837 1049.796314 1033.1591 998.6848161 993.6051713 992.3825356 920.2631418 958.2509371 921.9504799 898.5790186 915.0443428 804.5119784 809.2530446 795.9602529 788.2553501 778.7583695 776.0153904 779.7500879 779.9017633 789.923238 792.8452331 874.2736599 860.9746014 934.8133788 926.1856498 933.9030411 927.5816401 926.4630218 920.7907442 916.7050875 918.3782646 896.5737081 851.9740351 838.7452668 841.2526572 802.0551968 800.4846195 790.9670967 792.2601223 779.860229 786.1563452 784.2663681 784.4886454 875.0099739 875.9835901 1104.813033 1203.94626 1231.972112 1256.037125 1269.243414 1291.980458 1246.767202 1273.916471 1280.272669 1282.050174 1292.981272 1299.039212 1043.605693 1057.55836 930.2825022 888.9115553 824.2859762 831.0669745 820.5111382 820.7857832 816.2071448 820.7792975 912.9150035 913.2676261 1140.750165 1248.01927 1275.101749 1301.42311 1303.270765 1297.734577 1245.684133 1275.61589 1277.580248 1276.578067 1290.931459 1300.432457 1044.711197 1058.678452 927.0064356 889.5803363 824.3090573 830.6473172 821.3097998 821.3370841 820.6532971 817.5486001 904.229309 903.2294043 1131.306806 1243.165239 1287.140034 1303.344347 1299.400811 1287.816438 1235.460564 1254.805143 1248.10557 1250.13313 1267.709108 1279.84538 1030.914448 1045.161049 914.6517729 882.2072362 820.5455484 822.135562 811.9597231 819.8608356 817.3649782 815.4437096 904.5961274 901.9442446 1132.026326 1244.127716 1273.53159 1264.358272 1271.961738 1258.589114 1211.939382 1241.149623 1234.559467 1231.002989 1238.040848 1239.797021 974.1513576 999.9470302 874.8699083 846.5954944 784.3703441 795.7860854 784.4681002 788.5217008 802.630525 811.0666538 902.9523888 904.8634352 1140.734395 1241.356437 1241.432603 1250.624265 1252.523545 1248.054976 1198.36131 1227.844036 1232.590736 1240.520177 1243.752378 1246.340449 987.6588003 1018.868023 891.8817599 864.1411006 795.4421446 802.4444271 793.3249236 793.1435634 779.8803059 787.1141834 824.9115901 826.4845817 890.1181762 980.390338 978.0745522 1069.904002 1068.739251 1064.884475 1026.610558 1012.420544 1003.535322 934.0061663 952.1111447 913.7263871 893.0098597 903.6932804 797.301686 803.2477633 784.5957775 782.1173371 767.0703458 748.2199785 744.454221 744.6580177 762.446088 758.017542 825.2784453 813.3035067 891.5844558 879.3241826 879.5569615 877.0621856 870.998267 864.1411275 874.845821 889.025062 872.0691797 835.330465 827.9721833 838.9175214 812.4957603 812.789209 803.8245159 809.7783883 799.4102087 802.8378852 809.9139442 810.6086555 820.3871811 820.2447628 892.4958558 887.9059492 952.5671226 924.6363495 919.8967078 911.3187566 902.619946 894.0102047 896.9468803 904.4620659 885.3071284 846.4912372 841.9830036 845.7931559 817.2440034 821.4165493 813.1230423 819.4538253 809.2815474 819.0724418 818.6815011 818.0077781 910.0451742 909.0580049 1133.22103 1242.648051 1282.133387 1300.864645 1300.097478 1299.545299 1248.489213 1276.323914 1268.561344 1270.136321 1281.243848 1297.521779 1055.130319 1069.099285 937.7651238 897.6194864 829.7059875 827.3619031 813.2320192 813.5870446 807.5127342 800.9609399 888.7314613 887.2497045 1115.737271 1230.191618 1276.728326 1300.351836 1299.298082 1294.478316 1237.595153 1265.152922 1264.203419 1272.706418 1283.480775 1288.924006 1045.009885 1054.099062 927.5918763 888.1444581 822.07156 826.1708626 807.6709082 813.8827436 817.1557663 820.7553681 907.3351225 910.0928701 1141.753759 1243.920547 1268.525842 1284.739407 1286.923301 1283.502698 1238.49853 1260.908963 1256.380324 1255.637089 1265.558196 1262.737441 1005.203625 1011.135813 880.7909367 842.761749 779.3158391 778.0702685 757.8562895 759.1429296 773.7205497 775.7745945 865.9877082 861.8904883 1083.276882 1187.524268 1226.551174 1262.027726 1263.066874 1260.130376 1216.839474 1252.134748 1254.500507 1268.716444 1268.397357 1268.135785 1022.564747 1034.512272 908.3145407 873.3084308 807.3247993 813.0004062 802.9936058 802.6547055 806.0742776 804.0059353 811.9681545 823.180798 904.7859837 1011.049729 1005.545046 1103.847601 1096.469167 1097.855908 1065.223062 1055.324022 1052.478812 978.6854137 996.6925996 958.16575 934.9582993 945.0158226 834.7413303 835.181273 831.0911952 834.4046942 819.8547462 805.1357193 801.9054173 799.321833 808.7894628 808.573689 880.3875425 876.2400723 956.1137567 939.1518293 938.7947744 935.2904878 921.9588024 905.4299901 903.6560917 906.3149538 887.7304583 853.5295057 849.075774 854.2932225 824.1683367 827.6969298 818.5308523 817.5748186 802.6012496 812.0394704 809.9662919 808.2680447 903.2173702 899.4504928 1115.276399 1222.011438 1258.304414 1292.253918 1295.10129 1283.591597 1244.325397 1274.730389 1266.811563 1270.556374 1276.341629 1279.741681 1038.510054 1045.749519 903.5652157 881.3251233 811.5858223 798.9516051 803.7287137 809.5087719 846.7032862 862.5477967 938.2498457 924.1871071 1144.16258 1256.475722 1267.790872 1297.813392 1311.574895 1298.455801 1253.645689 1280.829194 1256.968238 1261.50157 1278.257592 1284.108971 1047.896384 1053.441747 918.7983783 893.8272854 829.9447674 829.6095591 816.2060581 814.7281863 811.54855 806.3835356 898.0595819 888.9488136 1121.23315 1235.129033 1277.513948 1306.229437 1302.78821 1292.395442 1237.290547 1259.632576 1253.15066 1260.441594 1283.980888 1311.877928 1072.131678 1072.665432 938.2914672 899.2542567 831.2933353 831.4312182 815.1030917 811.1457239 808.7049405 805.8499321 892.7296746 890.6419937 1122.637638 1241.880922 1281.462794 1294.295589 1281.12079 1275.437728 1233.111857 1242.645189 1233.365221 1228.705135 1240.815533 1246.311557 1021.579129 1028.537597 882.1408621 855.560332 801.7724588 804.422748 799.9691248 801.4614166 809.6169908 816.7080098 901.156937 901.0785244 1130.564791 1247.039907 1269.15283 1276.742737 1267.87214 1275.235406 1240.977746 1256.972618 1246.380163 1234.137141 1252.553352 1273.414656 1017.001496 1027.861085 894.1970166 854.1105587 792.0764918 797.0461192 797.9631645 797.7389651 815.3542104 811.9509099 818.2915259 825.7517861 897.2957373 1005.681203 989.4860502 1076.440028 1067.156661 1052.179854 1000.816558 990.0936343 990.0391984 917.5468771 942.4753923 916.3532902 910.1330372 925.3000721 830.1928311 841.3303568 830.0949658 829.0279782 815.3729754 801.7343245 798.6045715 797.2427568 805.4906687 802.4815424 872.8612689 870.9606675 952.5061729 949.6032244 960.0337193 955.6310814 946.3603614 931.4204563 925.6151265 928.1799385 909.2873402 873.3804463 865.5335635 861.0464458 827.7564973 826.2910747 815.3053133 816.1638326 801.6077341 810.4472472 808.8495946 804.1804312 894.1158589 900.5803461 1131.940375 1246.258346 1286.189427 1322.429595 1327.022277 1317.528513 1263.969448 1294.650839 1285.486094 1288.399371 1297.147164 1301.735853 1059.336504 1056.688409 923.9322347 886.7141589 818.8564001 820.1209733 807.6898899 802.8619119 800.5092585 800.7247942 893.8096583 894.2846566 1117.737689 1225.101625 1248.079363 1276.95644 1277.877385 1273.742874 1235.88715 1266.182639 1263.007982 1266.259048 1266.155206 1269.672693 1027.593367 1039.216831 915.5011193 877.0561296 819.7848077 822.33379 804.0464288 819.8269108 820.1661267 820.7252483 910.9531846 909.7325569 1137.54829 1255.698035 1288.280965 1310.972756 1304.625153 1293.727479 1245.683858 1275.130388 1270.294528 1269.246891 1283.87448 1294.698755 1048.922559 1055.654645 922.5096965 882.3696869 814.66344 820.4384557 820.6623489 820.8926285 816.7750658 810.5789964 897.7029077 896.9331621 1127.09206 1247.900703 1284.335965 1299.863837 1291.783319 1283.798799 1231.606538 1252.521144 1245.347744 1243.078653 1254.243441 1271.1817 1028.31744 1040.706464 908.5347274 877.7302476 817.4670747 824.3927365 820.3411307 818.5564322 811.7429362 818.9538347 909.2246904 909.6334109 1139.08505 1256.490931 1291.166723 1317.517302 1313.931411 1297.622198 1250.184506 1284.874394 1278.312956 1277.689472 1294.077428 1300.631384 1049.978765 1047.808519 920.9709416 882.7973683 815.267574 811.5854684 796.9014911 797.229214 796.652925 800.2841602 824.4681207 828.0797886 898.7884597 1006.424349 1004.249544 1105.160492 1105.406679 1101.01969 1076.346935 1073.437784 1073.413874 990.9268128 996.8898912 968.8090977 950.7088764 946.7919943 831.6554523 835.4186586 822.6873284 826.928346 817.0070039 809.5191788 809.6241429 807.310208 816.9248244 815.7391033 887.4573172 885.9218974 958.9345787 950.2744344 952.8729082 947.5365119 934.9992961 927.3039995 926.1731344 924.3611145 902.9948929 870.6870843 866.7584687 859.1717274 825.8853168 823.6178261 811.5479509 810.581584 796.2291303 806.788583 806.1357244 804.0387457 894.1162107 896.5110062 1126.591262 1242.829883 1278.564835 1315.707184 1313.017475 1311.414471 1266.920005 1282.601687 1277.343283 1279.593075 1294.492567 1316.47235 1076.005808 1067.490574 931.6280397 890.7153085 821.9956704 821.7126983 807.781848 804.832076 800.3452962 797.1204563 888.8115085 887.2936152 1113.446636 1232.854491 1272.434014 1316.292284 1317.804312 1313.142436 1271.544089 1288.806786 1291.805387 1312.175714 1330.717754 1326.395813 1066.557986 1056.043861 919.4823387 889.5692313 833.5330928 830.9496552 816.678793 823.6845793 821.2944629 816.3015431 897.416318 901.229525 1128.658518 1251.478321 1274.154545 1306.885258 1295.852488 1301.024638 1269.052534 1285.406386 1277.9019 1287.283333 1294.959929 1278.951002 1044.860993 1056.653428 923.2863722 897.1550326 845.6923803 844.5956696 808.8805741 818.0307123 824.5400534 815.4649157 898.5958635 889.7444328 1118.829647 1240.750685 1282.824919 1319.92753 1314.369787 1305.232575 1255.778054 1278.533449 1270.797834 1266.812932 1269.560355 1276.679294 1031.392215 1049.893979 931.3952708 889.4808661 805.4178244 791.0869819 776.7792359 769.0636259 770.4339437 786.9874829 889.7112201 907.1393195 1145.462074 1262.304416 1293.073091 1325.236971 1326.956371 1325.755607 1279.924748 1314.601696 1317.485303 1317.747336 1333.974254 1336.092584 1068.274717 1059.520603 924.5724608 885.8351136 820.4159228 821.3903338 808.9200422 808.5990511 808.3072039 807.237992 817.0539968 814.9361593 884.6230852 998.5068804 1003.299882 1113.193433 1122.696748 1125.826898 1095.368163 1089.771344 1089.186785 1010.086089 1017.710193 977.9934016 952.3055457 945.2350381 834.3175823 833.6993151 823.2931833 824.5644055 812.2081578 801.0210961 796.1154241 789.7445825 798.4836876 796.6982861 866.1679398 867.8121743 944.3919761 942.2188209 954.4916307 952.7240165 943.5452827 933.6971792 921.9687082 910.3964273 895.0351581 855.7694516 857.1177125 853.660923 822.7466039 829.7264012 818.4002148 815.5020546 799.3400468 804.3559641 800.3910957 794.9491317 794.4375678 885.2968676 885.2833239 1108.966893 1228.580436 1274.227474 1300.277139 1305.362433 1312.161609 1262.995495 1289.872406 1294.884193 1312.007926 1334.284353 1349.881107 1076.763763 1067.357915 932.0340532 889.9998381 819.5472115 820.8834348 811.3737378 813.9335678 814.639397 814.2786779 906.9738266 908.639479 1129.273478 1244.729488 1287.173093 1322.754694 1331.32521 1325.928974 1268.489027 1288.85844 1285.886779 1295.007748 1309.106376 1332.937982 1063.478015 1064.145808 934.221299 899.4107236 831.6559007 830.2459015 820.6382737 819.5611935 818.1749811 817.3273338 909.8026417 913.9996634 1139.364586 1245.697763 1275.249001 1310.051373 1318.011455 1314.113522 1271.712013 1297.736027 1302.004221 1310.852159 1313.682148 1332.456072 1068.377044 1073.124871 939.8064373 898.8264743 831.349793 831.4090127 816.8931265 819.3135995 816.1260755 813.7942504 904.5547416 905.5638305 1131.119902 1238.751587 1279.280547 1309.542061 1309.31068 1312.51374 1265.675554 1294.127154 1294.617178 1292.317842 1299.806672 1330.643957 1065.584771 1061.410206 927.0445851 878.4747265 817.3432568 822.1603684 808.9187924 815.2626371 818.0069383 817.5914708 902.7587851 905.0183698 1131.996065 1233.07561 1269.600569 1297.150865 1289.919196 1277.952061 1226.03102 1258.642409 1260.068885 1259.467928 1281.532546 1299.205722 1037.71724 1033.50077 901.7289832 868.3679175 799.0210152 788.5324054 765.2650156 770.9087095 768.1454014 765.6382983 779.2950805 781.073924 849.9973113 845.5579085 916.0849584 901.2774251 907.8480946 898.7528481 892.8364064 889.7215619 887.9339205 901.3764151 892.4068105 858.4420365 830.5133276 828.6787115 798.7491136 830.9942338 818.4444106 816.9226348 802.3869803 803.125733 803.4215607 792.5626878 787.8249352 792.5556248 863.8347345 859.5306721 931.0698658 911.3390021 915.1034907 919.1815485 920.3107738 911.6945984 918.1234923 924.8781896 905.3971234 870.3153426 839.9086405 836.3252618 803.2168451 803.9202056 802.9392854 795.48608 790.502448 799.4029313 803.2779122 806.3893497 909.7460515 914.2976499 1135.912606 1241.208496 1262.788164 1284.125451 1283.309602 1275.580134 1237.79268 1269.140455 1258.785102 1264.84533 1280.56803 1303.126721 1047.621646 1044.685655 912.8467498 886.3257425 828.4944904 835.206596 818.9836588 815.9974312 813.7031205 813.1266964 903.9449739 902.8157188 1129.10574 1242.002759 1261.787327 1286.109507 1294.470171 1292.56669 1228.107285 1259.341979 1267.343333 1271.340062 1281.420684 1291.735462 1036.041196 1027.83777 894.7585758 870.3024275 796.2040832 799.8074472 804.4224979 821.1254395 823.2788752 821.53662 910.7093797 911.256396 1137.340323 1241.482549 1263.248056 1282.653971 1288.520349 1284.663085 1237.370403 1265.044901 1262.880656 1257.518986 1274.969182 1290.065285 1035.142686 1041.763385 919.1068995 886.7248967 824.8033098 827.455536 804.7171556 819.8193755 816.5370148 810.2209028 896.4861396 897.2138669 1127.936386 1245.212288 1278.291981 1300.116672 1306.921368 1306.772518 1251.980074 1271.859868 1264.818323 1263.17185 1280.509221 1303.56109 1042.447053 1049.615347 931.908906 902.7235213 830.3920466 821.634251 821.1629394 816.5610792 812.1154294 807.7528484 895.722568 892.5840736 1118.547794 1235.917769 1283.71738 1321.946585 1297.439667 1276.172132 1232.716245 1265.217633 1255.228136 1263.719296 1288.996891 1304.888152 1039.36981 1047.5559 929.2252329 902.0161421 830.265422 826.3258766 812.9480438 812.1299165 808.3694384 805.7782522 817.6766819 824.1130395 900.626467 1010.597189 1020.974797 1128.67221 1131.751148 1114.065921 1059.237309 1043.159402 1043.336903 970.5710347 990.8231142 972.0215917 932.9267296 927.479684 822.0042436 829.6324332 823.0791484 831.591249 811.6192089 809.8439995 808.5962171 808.2934438 816.857321 814.0082464 881.8985248 877.0856115 958.1801327 945.9732736 950.168088 955.8201019 952.5176663 937.6175374 930.8923486 934.6913953 928.0662428 897.3164846 864.470186 856.865293 824.6719418 822.611856 808.5999686 805.3168585 801.2929961 798.9455737 807.569455 815.9072161 909.4623691 914.3073904 1121.919056 1247.538281 1305.872994 1339.484264 1355.739952 1358.589432 1308.661353 1324.770969 1291.433065 1275.508458 1285.385975 1305.190411 1054.516225 1055.943259 931.1396439 903.2934232 841.8211288 845.647101 844.3810589 848.5652702 843.6576391 840.5350211 926.9609195 926.3381252 1159.498388 1276.151525 1313.557684 1353.775878 1349.715607 1331.846505 1284.401503 1311.557319 1300.313726 1302.767814 1315.49546 1328.564788 1072.825903 1077.235745 980.9419799 942.1805806 878.3140405 867.3143339 849.5897844 850.127347 845.812952 809.5500311 912.1825296 923.0429916 1133.19898 1243.601215 1296.267674 1344.411937 1333.064629 1341.484296 1278.10993 1295.907551 1302.121763 1292.315334 1316.216712 1346.772343 1080.245917 1070.707308 933.3893359 889.4844085 819.8075934 818.6265204 788.1820347 784.3853235 782.8017844 779.0682663 790.1034519 788.5558283 862.7587769 860.2519181 946.8508499 945.5424337 955.8605755 958.5163464 958.6584566 947.8366637 930.8815805 931.8108901 928.220324 900.5767309 868.3802051 856.707646 819.9023955 816.591208 803.0215687 801.3098561 797.8312026 795.7266973 794.9047455 791.9297107 881.0285968 878.8517387 1111.200037 1224.340655 1270.101927 1308.741177 1321.471547 1328.138332 1285.02038 1299.108306 1290.506908 1298.730874 1318.912573 1334.286635 1061.477703 1051.493145 927.6434147 894.7373197 833.4433358 830.0465187 813.407376 813.7655267 815.415358 816.0500748 826.229644 826.3651045 899.1094579 1005.202324 1015.31142 1125.719795 1130.43657 1119.98102 1080.643994 1076.173978 1075.445569 1003.7529 1015.308584 985.4246831 944.5145766 932.704096 826.8313721 829.0690006 819.2332652 825.7063239 811.5403025 809.3147762 806.9341156 804.415719 814.6373464 814.1475638 885.695542 877.737563 958.3342067 953.2155228 957.2268182 956.6135151 951.3751986 928.8478709 924.8559922 929.9359771 917.3016955 876.7932253 849.1610465 845.1966951 817.0008911 818.3768619 809.9024977 810.9754157 820.459809 821.6455092 821.8661785 809.7771837 883.4503917 858.3513124 1110.474631 1251.893745 1291.189722 1320.935834 1327.339349 1328.069379 1277.855068 1305.200063 1303.396692 1312.239814 1332.407678 1345.271795 1071.953254 1065.524416 947.8773941 914.0827845 847.9779056 854.4906303 849.4401398 846.7180481 844.5281737 843.8857097 933.9535882 933.5579803 1162.814855 1266.574673 1307.048821 1345.987114 1351.305159 1355.0784 1317.845838 1355.541851 1347.065143 1345.635298 1354.735078 1381.666293 1105.579592 1095.091607 966.1638233 917.6455593 854.056278 853.0942973 842.1157593 843.6939195 848.5918 838.8535783 920.3383067 925.8384612 1159.699844 1274.340289 1315.883875 1348.217508 1360.918156 1367.135592 1329.74873 1365.186465 1362.211738 1353.862219 1358.824471 1366.595391 1103.659939 1088.165155 944.388387 893.9992337 823.611771 822.9551358 810.3091302 806.7091894 800.4021846 803.3761261 884.0200711 881.7234602 1108.26357 1215.829256 1261.882046 1306.355867 1313.787765 1319.644149 1282.98531 1314.936178 1325.376786 1325.330106 1331.973362 1343.668045 1066.666291 1062.50515 917.9628894 872.8026275 807.5970703 809.4506786 792.3736249 794.4023895 793.0916432 791.5619561 882.8472777 886.7170904 1121.016441 1232.865134 1280.516541 1319.989116 1331.97326 1328.260492 1280.650172 1312.071504 1303.012879 1296.109802 1318.917954 1345.958561 1075.734734 1065.720604 927.7205135 882.7617501 813.2874669 812.346388 796.9061441 793.5245272 790.3624917 788.5927765 796.3830249 795.7926903 870.72211 983.3116962 999.2356184 1108.959921 1117.787242 1123.410918 1096.66974 1090.670331 1091.53007 1015.04368 1027.332018 997.7100557 958.2581036 950.3507597 838.4756445 838.0486856 827.9972356 828.458794 804.0340449 803.7909793 803.7199958 803.6956007 813.8773696 813.8422914 886.9243249 878.8052875 958.8947066 953.3987482 957.192814 943.5708145 939.0708326 921.9700297 922.8526835 923.5134115 900.8916158 862.4194905 836.6209575 836.2277993 806.2196576 810.4087665 802.5412235 798.2580925 794.4586814 794.7401914 794.8340787 805.1059154 910.4726183 914.4075407 1136.566757 1249.904931 1290.663505 1318.972246 1322.949805 1315.546485 1263.630745 1291.939785 1291.218868 1291.809547 1296.977636 1311.415392 1048.384447 1044.580876 917.4523301 876.9701538 804.471431 818.1667622 805.6259927 800.3318095 798.5483317 795.134172 891.3673914 894.0847969 1121.588092 1223.376671 1264.416932 1297.855067 1296.794339 1291.059774 1251.777217 1280.050263 1281.442673 1280.62921 1291.393089 1316.012243 1056.249846 1046.501779 924.9393239 892.8808091 826.8087306 821.9421134 813.5022515 815.3885982 815.1241607 821.1011573 912.1706252 913.2403052 1142.347943 1250.771965 1286.244326 1312.056479 1317.60109 1313.373223 1261.20751 1290.845591 1281.850375 1286.642321 1302.663056 1313.788167 1051.654903 1052.742455 916.9189218 881.5812042 816.0690739 817.6374542 806.1593603 787.5138608 760.201572 753.0889047 848.5010384 859.620818 1088.026799 1200.577213 1235.520017 1268.295462 1301.539115 1331.37426 1269.434094 1305.859009 1322.324876 1329.060972 1333.009236 1341.583069 1063.607059 1056.982151 922.1747272 881.6669621 811.4453454 809.3965007 799.9504606 799.4833358 800.1479816 799.4450686 893.6144567 892.6084187 1121.383073 1231.566508 1268.847172 1306.324672 1319.256996 1322.063351 1278.466934 1312.495419 1313.80074 1313.82884 1324.771295 1330.773762 1055.778844 1049.760245 915.8432432 874.7281367 809.5129967 807.9440618 795.05493 796.6648653 795.577339 793.9610471 803.8278344 803.4108651 868.2641935 975.752982 983.2689428 1095.825986 1111.429253 1128.982614 1095.908741 1086.057185 1084.39725 1005.322241 1026.443241 985.1170872 942.5815416 930.3101471 815.5445383 813.2230687 806.8653672 814.0780238 792.7356909 795.5029559 795.1563106 786.2664752 786.4937974 785.8386103 866.8281745 866.4770342 940.5480425 936.4795837 944.9759855 956.5301227 958.7609595 943.5449544 944.851007 951.0286237 922.3909011 889.9157505 858.986746 848.9808519 822.7382737 828.3124629 817.7122263 821.8222782 804.6906873 805.981122 810.2297413 811.223842 906.2557547 900.103016 1128.509305 1240.185183 1279.810243 1319.747729 1336.161596 1339.735655 1283.339659 1308.799522 1308.489969 1318.531834 1336.065219 1347.134957 1064.486227 1061.174514 927.3040672 876.9003521 814.090878 817.3818293 800.1801286 791.4793651 786.7874073 790.7865505 883.8277108 879.5515468 1102.066076 1214.971839 1257.597327 1293.807143 1304.42904 1308.997694 1270.402539 1306.408215 1310.931878 1312.137081 1323.057771 1333.935553 1058.595289 1050.551469 913.7351731 870.8538136 808.7906653 808.7654911 795.9569328 795.8438947 801.5064929 799.5090632 889.2125115 885.6455144 1107.349054 1223.840232 1267.713726 1306.169612 1318.918091 1311.556443 1270.183703 1309.076127 1309.907243 1306.653698 1317.127215 1331.536021 1054.976931 1045.070243 913.8824569 875.6674662 815.0762515 824.1313664 819.2931458 821.0078573 818.6425074 816.4081514 904.5367101 907.5976308 1139.888788 1254.421314 1292.884636 1325.293824 1324.904612 1324.705206 1265.718517 1277.549456 1285.923185 1315.148802 1338.319605 1353.033104 1076.837914 1065.338627 928.0424867 884.6504926 814.1787347 812.9770404 796.5184324 793.2169401 789.5936555 787.6967301 876.2809803 877.9815393 1107.237518 1221.337685 1263.074805 1302.936769 1319.537326 1325.884336 1285.897229 1321.087512 1320.997616 1319.732822 1327.397684 1339.13223 1063.217288 1050.94815 913.5346903 873.8347447 808.6387063 811.7813005 799.4212927 797.0534735 796.361937 794.5787073 803.5624267 804.1511511 876.1588862 985.4133871 992.0902513 1103.103778 1115.53992 1118.587095 1087.225711 1083.514731 1086.222831 1009.850864 1021.520733 990.5944425 951.5266823 944.0389539 832.0444909 829.230449 818.4459787 819.8123302 796.5519438 797.1013957 798.6619662 799.1203397 810.0520956 809.8792881 881.2630226 876.5000519 951.9481094 945.7768035 955.6003743 957.339458 957.4767381 952.7998731 954.072565 953.7864056 928.8112032 888.8231015 856.4049873 848.5400504 816.484007 815.7612895 804.1935979 803.8478334 802.1163422 802.4718173 802.3386844 802.1997937 892.8167888 895.1953082 1124.52786 1236.803156 1275.829604 1312.890499 1321.909247 1323.619105 1281.410388 1315.882457 1304.846292 1302.825791 1321.778601 1340.425477 1080.401976 1085.479994 953.8274009 908.1221467 844.2826065 846.208327 854.7951409 849.5094695 838.0337148 831.1158167 928.639018 923.2059107 1146.580367 1253.024254 1291.119359 1345.790565 1377.845364 1387.76735 1333.7602 1345.850955 1314.849055 1325.810235 1367.783501 1388.981796 1080.986584 1062.674619 938.1781218 901.5565479 833.8172801 839.3712535 812.3355703 800.6744386 800.201569 813.5792184 896.8626088 890.6377565 1110.028151 1222.930965 1265.291041 1301.738299 1310.52271 1313.919102 1266.225527 1315.892084 1320.90434 1324.43366 1338.554162 1346.909346 1066.040163 1052.887917 915.5480768 875.078349 810.8826114 815.6658117 803.4874208 806.4846203 799.5411968 795.1677511 883.4843327 886.1115876 1114.717397 1226.930103 1265.457293 1301.285838 1314.598397 1337.356615 1314.986425 1349.297213 1350.283186 1348.328139 1357.314485 1365.431459 1091.403984 1098.251912 960.0646707 919.8576496 853.3456763 848.4174561 836.0471337 843.9272569 842.8462847 838.903246 932.8303604 935.6574804 1159.688694 1271.423174 1313.647975 1352.677191 1365.757501 1366.563579 1325.713803 1348.695763 1349.261465 1351.40059 1341.434526 1368.54083 1108.064464 1104.094742 953.6976783 914.2817516 843.335054 850.6161443 823.6181162 812.1386117 806.4213867 801.9367669 812.360991 824.9238772 892.2709386 990.9620633 991.4585963 1101.781767 1107.813094 1110.895284 1084.236538 1089.180558 1102.54227 1002.70159 1019.333697 995.2356094 953.9275341 939.2664896 824.2614927 824.2805567 816.3366296 813.7165419 797.0618677 811.1880323 809.321111 811.3216821 817.8712937 815.4574191 872.0716412 869.2606084 936.6694907 929.8475419 948.295706 955.3750261 959.9308405 968.1950583 981.5956522 972.6854328 943.5170517 899.3791676 874.2139764 873.2146235 842.7377392 830.7445036 827.6704887 832.4777842 823.5314982 825.6033442 826.6962875 827.2476896 829.2595968 834.8324059 903.6991616 892.9829065 970.5781128 963.7832362 969.8948661 973.7883614 972.0214809 962.1694137 958.2938989 960.5864382 937.6210251 884.5918637 866.211026 871.3029182 837.2115578 843.9199303 839.8228193 840.6747187 825.5932241 823.5861141 821.1794475 812.5042126 892.6740345 891.6522769 1115.893434 1224.295389 1257.899722 1298.374335 1315.738279 1328.898016 1292.989608 1337.287808 1347.204107 1339.61618 1334.584684 1350.371653 1062.004175 1059.104679 940.2866159 899.4219227 827.4035066 823.5059446 809.5770093 809.0439119 803.2611914 796.1219715 887.2762676 886.0050482 1106.092137 1224.667269 1259.462465 1293.066553 1305.171241 1309.237635 1272.955561 1305.233334 1305.606668 1314.250299 1340.367494 1339.272663 1063.372674 1060.590506 925.8986335 885.2303688 809.4989928 810.9498516 800.0816977 795.1157432 797.1027051 790.3715791 883.3201544 884.8372083 1109.192993 1227.128609 1261.638311 1307.102031 1330.97708 1329.486824 1284.881649 1321.532152 1318.400664 1314.17055 1328.254411 1343.885912 1078.89665 1071.979357 928.8984588 881.7677738 820.4100941 816.1499971 799.9407536 799.7647687 797.0083093 792.0411482 884.2567664 886.6702856 1115.129262 1225.655371 1265.72743 1302.242149 1315.720141 1321.273861 1294.133075 1334.637419 1319.552583 1306.320916 1323.346653 1343.531156 1064.777676 1055.95096 920.9145812 879.9289174 811.0499396 811.6483553 797.3448067 800.1970234 792.465614 791.3403216 805.9931251 800.443718 870.051648 980.1873918 994.328352 1108.434719 1124.041185 1129.444609 1090.775945 1086.221589 1087.829986 1009.817805 1019.18002 987.7957646 946.7885187 942.4191353 830.1274514 826.3457555 816.1606232 817.016735 791.9738489 789.026179 786.7916654 787.5827873 797.3047787 794.181446 867.1487372 863.9774062 943.68905 939.4662388 950.4260857 953.9334838 955.9637376 950.1688428 950.6045756 950.6076805 926.8563139 883.7266039 850.2164286 845.5630806 827.5305211 829.2562997 813.9372051 815.5885836 ================================================ FILE: src/pymgrid/data/load/RefBldgLargeHotelNew2004_v1.3_7.1_4A_USA_MD_BALTIMORE.csv ================================================ Electricity:Facility [kW](Hourly) 148.1716309 148.5637443 130.6879266 130.6690805 139.2221808 153.8726234 256.4756964 320.7084781 357.9570079 315.1836593 268.6060494 263.7456677 269.1206335 249.5530441 247.0542057 236.5507521 250.3809745 271.1830729 341.1280501 356.4264103 383.8722985 355.3177966 297.2660023 214.9469398 134.6953429 125.141486 116.1815521 115.2941118 123.1371643 157.5403401 279.9277184 361.1296496 300.2770814 278.63365 235.5504206 264.397363 275.4186452 260.8347152 251.6045419 229.3334553 243.1714289 272.7789763 346.6804962 361.2140493 390.9236009 383.3154841 307.9105671 220.1212552 131.7218588 125.0893895 117.8189457 118.3867877 128.0770467 164.0614184 302.3230665 380.9936849 311.016585 273.4157539 210.5435897 200.5159283 194.4766399 184.0817423 183.7762829 183.163297 220.5701638 267.6722337 338.2920305 353.1688105 382.6822695 368.5722034 299.6644298 215.1903253 127.6733016 123.0320022 116.0404341 116.3519194 124.9488217 160.4158554 322.089835 314.0778704 272.604271 267.3309902 213.3065688 216.6131607 224.0304121 212.0379213 205.8452652 197.8326387 227.3263266 260.8357985 326.5251945 334.6842755 357.7260634 346.9965397 272.7627112 188.4189235 137.1347337 124.8741692 114.4074416 113.0436572 120.5502011 155.5443722 280.0199479 359.2948048 288.9070876 259.9462724 208.8081778 212.5813795 216.020637 207.9755842 203.5978824 193.3639349 219.853817 270.0470278 341.6906458 348.4532033 379.7943361 369.9097096 284.4442267 192.6835352 138.928399 125.7599559 114.6122777 112.7816614 121.4256033 157.6439739 284.4818495 363.3919947 302.8980894 278.9846489 227.3845312 242.8043337 247.5756605 245.3111965 242.1420716 220.5166083 242.0021818 270.0259755 333.6935131 346.4309795 379.1025573 359.5603459 280.0494353 196.6773554 139.4477876 136.6391873 116.5859743 115.563679 123.9071888 138.202167 228.4317739 332.1763516 385.3632645 339.7697008 250.3638471 219.4184272 207.1406791 191.2234336 190.0064763 186.6471739 221.7562454 258.0779117 334.9152276 341.905268 364.3716072 362.3437876 309.5616635 223.8899808 136.4437771 138.0971394 129.2777826 135.8626113 143.2729392 157.4014997 270.4802421 301.7232122 350.415934 296.4560057 229.3215719 211.4528553 197.9424049 177.0375512 177.6800784 176.20659 206.9727756 233.8515175 303.3511554 318.8364397 349.9675335 326.4991203 274.3897899 192.9590824 133.5583725 119.9889467 108.9976773 106.9804915 114.6261805 149.865624 274.2698026 350.0627522 287.597988 262.1258767 213.3451678 214.7780375 213.7450746 198.804748 188.5707233 182.8745543 210.6481464 265.0297849 335.8670627 341.674721 372.7384202 362.5799024 276.9758062 185.3564565 132.5369282 118.8580983 108.1342134 107.0163595 114.5756281 149.7006654 276.3724097 353.5378806 292.6270765 267.7815595 218.9343514 222.6872728 225.8261958 216.9478137 215.4924545 205.635357 222.862534 273.0405826 343.5716324 349.7697746 381.4352855 371.7449227 285.9699894 194.3212477 141.1895932 127.8854098 117.2419884 115.3581541 123.3794862 159.9198563 285.9853485 364.7269754 287.5361592 248.4661688 187.5125459 182.6548729 182.7614487 203.1395621 232.9707368 215.2002837 232.0276408 269.9234971 334.8155193 343.7579733 372.774043 350.55545 271.6881308 179.6317423 126.9384165 117.747519 108.8939974 108.5239346 116.661015 151.2524125 273.155248 353.9513878 287.6605897 317.5892938 261.0052249 242.4882351 223.6611798 199.7740769 189.7416935 185.1937715 215.7574789 257.447329 320.9340432 332.6915495 358.9830204 347.1172921 268.5520243 185.2391642 136.0087904 124.5169648 114.6420084 114.0294951 122.2850604 157.1987683 281.6810668 361.1367295 290.2441689 281.9308828 253.3187677 266.1989999 233.7789462 201.9673766 198.1391922 198.3712028 228.0915855 274.7073374 345.7601658 361.9310711 401.12787 390.552883 310.1911584 218.9646898 128.1115482 137.2077919 123.9561769 126.7859983 136.0803204 150.0688135 278.1985062 308.2857704 362.5177065 319.3764602 261.9820333 258.4487428 258.2351375 243.0583085 247.3794081 239.6192148 255.5904457 282.9973868 355.2389786 358.1516109 377.1375997 369.9381922 313.271727 224.4053318 141.4433927 142.6895522 125.7091192 125.9613927 134.4643516 149.2299553 263.4394751 290.1227902 342.0251505 290.1681223 237.4409941 233.8349491 234.0769354 212.356951 215.6789854 213.5722665 233.1278231 255.6763679 318.9624957 325.578309 356.2141187 336.1478731 286.9443418 206.0361811 158.0260841 152.3164169 131.6212263 129.9674313 137.5220018 151.6374694 232.7026776 341.8212701 397.9468001 358.2726254 263.5787341 229.5765737 217.0132681 189.0881991 186.5574561 185.7866489 219.6676402 259.433294 331.9821565 346.3814881 377.2242827 355.1572027 301.6408234 223.3033625 123.4874721 118.0339914 111.2563235 111.8121787 120.7017565 154.6279686 286.6649073 317.8483253 270.3857421 243.0955644 200.1091953 207.7490067 213.3334485 201.7084012 187.1834799 179.5664576 210.2900474 266.0212188 337.3885123 343.8342788 375.1636594 363.8621424 278.061013 186.6456464 132.5630437 118.024987 106.4293583 105.1972918 111.7500961 145.3367401 270.7582877 346.4437697 284.6332418 260.0714376 211.2422098 215.5333093 219.9495304 213.9133933 211.4739878 201.2704251 216.5292177 266.3755192 336.1585153 342.2185028 373.0244289 361.8988783 275.1915589 182.5759246 129.7889803 118.2859724 108.5356756 107.499956 114.3260519 145.6442805 268.9008857 345.0318505 284.2845645 262.4807375 215.6084866 220.0195686 225.6212497 219.0945664 217.685645 207.9752606 222.0356022 273.0619824 343.2253795 349.6912803 381.3179727 371.5656591 285.2831774 192.8751173 139.5969319 125.9456267 114.9335067 113.6586711 122.9117095 159.5792718 286.7883426 365.4602011 293.4033179 295.5395301 213.4904843 200.5225563 200.3800208 179.2503756 178.2330421 179.737034 213.4235485 252.3800406 309.3245568 320.1539641 355.664838 348.7743783 271.7457821 186.2271772 138.0525556 134.1934133 113.5295017 112.2675812 120.716845 135.5577632 226.3847669 311.0408109 353.4471266 330.3087845 265.2306714 232.9544355 211.3789761 191.5031654 186.2930687 184.0119622 214.4063131 254.5778164 330.1807003 336.3143274 354.4111228 349.3094025 293.9859997 208.7852096 138.9481977 137.3614551 118.9444852 118.4389725 126.0757683 139.5426748 218.2931116 291.22177 342.461407 283.4336637 227.1025846 221.3949033 217.6306699 199.6624149 197.8163651 187.6202566 209.5438403 253.2774404 323.0817298 337.8083468 364.6531023 334.9813947 278.1389287 190.0060491 127.1468703 114.0872243 104.3714772 102.9970504 109.5789305 140.8294449 262.5082137 335.5389052 270.4071125 236.0876971 180.2256549 177.9040716 178.9155615 167.2432679 174.7552426 174.159988 197.1127973 251.1683206 324.4020103 332.8949026 365.6669656 356.1292168 271.1315827 180.0866162 128.997761 116.7407004 107.0359297 105.9023585 113.4210417 145.8912198 272.8597513 345.79675 275.309446 235.2659698 174.2289238 168.8150855 167.6655963 158.5793525 158.1439173 157.9859714 189.969268 251.0240319 324.6559742 332.3833051 365.1632752 355.846385 271.7465716 181.4547884 130.0908687 117.1859781 106.2794361 104.5046491 112.2015218 148.5580366 275.5477489 351.5365716 286.5008409 251.2316345 193.0666404 195.8162077 252.3184025 234.3907318 204.0558047 189.6411951 214.4183355 256.1538433 327.1630592 342.6093385 378.9937938 367.096835 291.6295536 212.2558745 124.4800386 116.8682775 109.1617604 109.4806718 120.4192921 170.2168463 298.4762114 396.3606445 305.7109736 265.6145774 200.2577739 198.4191163 208.8090089 197.0525875 199.1780409 195.3251792 225.3284372 280.5537673 352.796034 364.9332058 395.5347961 384.8383853 309.126531 218.9728433 124.7344799 125.043321 121.4341786 124.1049285 135.8137706 173.7272505 340.466437 384.1668403 322.7246776 277.3312885 216.407922 208.5634045 205.1478507 195.3752933 193.294031 182.1287178 216.0961043 273.9712999 344.7607561 358.6718041 388.4890838 377.8071225 303.9067391 215.9014731 130.0022777 134.6506363 119.3522867 120.9660686 130.7595506 146.4917783 269.22978 293.9977034 352.9168434 307.7712658 236.5547681 228.0203947 227.6301958 206.4840653 202.3244888 198.6373286 227.1291712 265.7588028 337.7695599 338.2908705 359.5841201 357.5093537 306.2071301 219.6147419 144.7241612 144.0336727 126.1238977 126.3542226 135.1079419 150.3008083 245.2102792 320.7227159 359.9727809 306.4842502 244.6520789 227.6974183 216.5639219 194.0502815 192.0499355 190.8546594 217.601334 261.9119537 333.6981972 349.2257456 380.7162813 356.3000988 297.8763996 219.5936328 123.6405172 117.6612787 110.6642499 111.3134157 119.8842306 154.329703 294.7034857 312.5423743 267.0790453 261.937275 211.1728868 210.224648 203.6596052 189.6715239 186.470162 182.3491249 208.1819364 257.2972462 325.0795276 339.6963507 367.1949744 346.5918538 270.3977939 183.0345796 132.9654059 122.2091956 112.390141 111.0837684 119.3731775 154.3633988 277.8123731 355.6795781 294.2962495 269.9150427 218.5542044 215.2641064 227.1800531 238.9506707 230.3511619 210.4509851 228.4498879 271.6712911 337.0772974 353.9802893 388.1211542 381.6554266 312.0703346 223.7252461 122.3369403 118.6830986 113.9869992 120.6551326 147.115346 182.6268281 318.7730945 395.3478702 324.9925681 282.8848957 230.8382298 238.6016351 254.6639064 257.4141202 271.3089083 270.2315432 270.0945456 301.5777886 369.168748 379.8028658 410.2732698 400.4575522 319.5789443 228.1254857 127.850537 130.04018 127.0251293 130.59291 143.0785269 216.8046701 327.4870119 421.7003421 356.2486111 317.1967406 251.7161158 249.3712666 255.7897678 236.2567029 211.6559512 200.6220494 227.0627898 269.8006745 347.3933924 363.0192407 393.7302078 379.3871566 302.6446263 216.1725929 130.1515742 125.968022 119.951073 121.4267299 131.3245652 167.927223 324.5050616 328.8514683 290.2449693 288.9936761 239.2520249 227.8847222 223.8905446 210.9269861 203.2586917 193.6798409 218.2999907 269.092602 345.0434853 360.5839771 389.1660606 373.1063528 300.2624599 219.3327912 129.5173359 131.7190749 115.3605908 116.4541022 140.5935503 161.2234354 277.6030973 289.7090248 353.2194252 306.7760995 234.5121182 213.2870837 206.9244595 194.8148071 190.3289008 193.1100307 220.9613714 259.6160658 331.986129 322.5744282 331.6371515 328.9683144 281.6493292 194.6801381 148.344487 143.6103255 123.0508823 121.1176226 128.9986097 142.2967504 221.9118271 288.4284595 354.8118864 296.0733246 241.2900976 234.0578558 239.4435912 248.4750622 226.2222468 206.0921033 224.9434362 247.0997237 320.2617725 336.9892955 367.3233829 341.6657424 288.4913236 203.7405242 140.8884312 125.6527986 113.6738576 111.3654166 118.3280132 153.6903322 278.8921971 349.9024363 291.6003741 265.3863021 215.5941621 218.2874781 223.5895216 216.5054432 213.6570488 204.9048041 218.8593705 269.3431232 340.7218431 347.0012124 378.9811043 367.4927146 281.0853526 187.8833422 134.0975674 119.8566263 109.3053748 108.1152909 115.7287498 148.2334678 274.3794449 346.0214207 288.1985877 263.1760307 214.1170683 215.3385071 217.0918191 208.8417872 200.7083131 189.2051406 212.0107285 267.8978521 341.6776565 348.3474925 379.9156771 369.7764342 285.2055058 193.8491888 140.1741109 127.2343997 116.659726 115.609565 124.4274835 160.5036157 286.6989698 361.5832279 328.4138517 338.0806562 261.7680182 247.8907693 240.7240821 228.4246024 227.0649281 210.7266278 225.4521588 268.3933292 336.153863 346.8767018 379.1023226 364.3622639 281.3840849 194.8577533 137.1681931 126.849509 116.7066323 114.98199 122.9194109 158.1826279 281.7604467 357.0025721 296.0552006 309.7171208 268.3817849 260.2243274 247.7852849 217.8081413 205.7946642 200.5666964 224.818592 270.8324423 341.9887301 358.3902034 388.7184775 376.2580748 301.5077875 216.059554 125.362911 120.2260338 113.8450869 115.0726715 124.539286 159.5498788 314.5564199 340.8242128 311.6480443 281.5939506 230.361498 228.8966898 231.1396807 221.8469705 220.6941938 216.7911855 234.849403 274.916342 345.0517531 357.565715 387.7437842 373.8602037 297.0918278 207.6326994 132.0028449 132.2175012 114.1399281 113.9745314 122.3529399 136.7876613 225.8735302 288.0179572 355.1848707 357.7976699 287.1375993 262.9731722 241.8353273 213.2878049 209.8321344 211.7155499 230.5583064 265.6382139 344.865484 350.9948082 377.6248955 372.0154732 312.9385857 223.9179236 138.184486 140.0251312 123.3729774 124.2662909 133.4064597 167.7530118 266.2489237 305.1012619 352.6964686 296.6595368 233.3796216 216.5463078 208.7001866 186.6971256 188.5180611 186.5104269 212.2179462 251.2368519 326.9896005 349.7938421 378.6453355 352.0818952 288.0540295 203.4811551 135.2331835 124.6838042 114.9399622 113.7339599 120.9805768 151.7362616 255.986837 330.9334384 279.5539107 248.7533251 196.4366947 194.7002319 192.3819456 183.8245084 182.6144683 181.084178 207.7835915 261.8278717 337.9232025 344.9433887 376.5411952 366.2245012 281.2332849 191.5819027 138.1660647 125.1621731 114.60242 113.2281419 122.1060797 158.5496848 282.9920323 359.6961013 291.0406471 305.3917042 257.5712431 245.7949398 238.6230782 222.6012209 213.9260362 208.0105571 225.6960333 262.6522254 331.8437544 346.8698243 375.4024717 368.4360037 293.1401736 206.9568507 129.9738091 122.1753146 114.1922573 114.5034125 123.200024 158.634751 284.280901 400.7005938 330.5955573 287.2373924 224.7645659 219.5945109 212.969514 200.4864795 198.2262872 202.097608 230.1099674 278.6396706 357.4454089 368.5955947 398.2624719 388.8162267 310.1212099 220.0093502 126.0763636 126.1937231 122.0734193 124.3200524 134.5336142 171.7608114 327.5707581 366.8838282 304.569585 274.5110541 228.0584378 233.0362946 243.0060071 238.545152 238.5481241 234.8230002 244.5042015 281.2506932 350.3483809 362.1583567 392.8264911 378.8068084 305.0948034 216.4119647 130.0378931 124.0971269 117.2452735 118.3888716 127.8810946 163.3941755 315.2021061 341.423738 320.2034084 293.3038859 240.0834682 246.5844678 251.9035149 243.1879912 236.5821424 229.3406301 243.8844887 285.0906598 358.4802299 374.8926194 402.6983399 390.2206405 315.7548287 223.6200774 127.9183513 133.2425201 118.6992569 141.5693188 147.5600005 160.3711088 280.4789125 305.3159259 376.9264015 345.0747657 279.3001655 277.2041093 280.7163768 272.1981484 271.9188608 264.2070391 277.6891845 299.8355035 374.3879733 376.8885579 397.0530855 389.6918115 332.57372 234.7156509 142.6750502 146.7270405 131.0234894 132.6003704 142.1959145 163.3696343 287.8457991 301.3500592 369.1301014 300.4042456 254.2542397 238.2602181 226.8743371 203.0679323 205.0374435 199.9784602 223.1882952 262.143313 340.5741117 358.7852961 389.6596275 370.9222814 314.4770037 233.122066 145.2715856 152.7892896 138.3191704 140.3387188 149.860097 164.992384 289.2709073 323.3527986 378.5086461 307.7789077 250.5838312 238.9204941 228.8905673 206.9927362 205.5315217 203.5663459 230.4553353 268.2870403 348.3909829 366.0505241 397.9052922 373.5951129 316.8871427 233.1470012 132.0068422 130.5466087 125.2291959 126.1570775 135.6727504 172.3361887 323.4563789 337.1197496 301.9334691 264.8435528 202.151993 183.8028987 181.4245613 186.0805645 209.8344433 203.9771595 211.0046592 258.9649682 336.4687175 344.7557285 378.2081933 369.2550119 286.1559025 196.4513853 143.9620613 130.6119905 119.4907775 117.6225748 125.5560722 161.90806 282.7945018 361.5499002 302.3347634 343.0133469 275.7647158 249.6860887 239.0352059 226.6873415 223.8612419 211.3424372 232.0183674 273.9510555 350.5358371 363.8436658 394.8098081 384.1872744 307.536937 219.1390271 123.0873407 120.0833754 115.4664923 117.8624247 127.8951338 163.8713974 320.9552298 377.211453 323.1368661 304.6723207 259.8705239 276.735813 299.7926065 294.6072019 260.8811696 217.7249334 237.1670796 282.0812839 360.1476287 375.8382865 411.6320879 396.5163772 316.3949974 225.0552806 133.6353354 133.0553903 128.5056684 129.6643159 139.2168126 175.1608294 331.4198941 350.6715516 319.653132 286.4498017 221.0066673 228.2254111 222.5215444 204.7507313 205.6623099 204.1269903 227.3572176 267.6246283 342.1642132 355.0024348 387.0633061 372.7623664 299.9529525 216.4101613 132.0821799 133.3650941 116.1369787 116.1689091 124.5797269 139.3957034 238.0221692 270.5154258 354.1446662 348.5475272 273.7693236 245.8145598 232.6461215 217.1574079 214.3755901 205.5415411 228.3457812 255.0303061 336.5900844 344.2633117 361.9803276 348.7863304 287.7647295 199.2015046 154.3800522 149.720016 129.4307617 127.758943 135.0742043 149.0713083 223.6008111 300.5076675 359.9226919 315.3608869 302.604409 296.8023188 268.4727786 242.5140253 239.3365549 227.2299099 239.6316247 262.7836411 336.6170636 350.9367728 382.951132 359.8380636 306.9085687 229.1321239 134.1773448 126.5496068 118.7501123 119.1100844 127.8964688 163.3931916 294.4416938 347.3457629 310.2075109 284.7099036 217.4201346 202.1708402 197.2345321 187.8678963 187.4595235 186.6815106 214.038992 256.9521169 331.0180972 341.5311519 373.5656067 364.1075112 291.9529473 209.0984243 129.7441288 121.4272712 112.9037509 112.8347171 121.831705 172.9793511 305.6729224 333.6841564 302.0459427 307.2554482 243.9462992 235.8278053 238.6316039 230.3789001 227.3755886 224.1963142 241.8538366 274.2777349 348.5197775 361.8237369 393.9675455 378.058675 299.5083774 210.2105561 128.2803367 121.5931368 113.6936094 113.4500072 121.3631093 155.5995447 287.7655276 308.4942376 274.7042775 279.4650913 262.4778586 263.4830094 254.9522937 241.10493 238.7757657 228.3295902 244.5364914 279.3993195 355.9444536 369.6885167 396.4077282 381.3794279 305.8458405 217.4592122 125.9497987 121.2022744 114.8347313 116.015973 124.9461566 160.3540651 315.203518 341.4226928 317.0779931 301.2333367 246.1374193 239.5672579 226.3196775 209.7197983 205.9716764 205.8920834 232.0915099 275.990762 358.3637745 373.5482056 402.0781633 389.8955588 315.052013 223.7068385 131.793207 133.0876362 127.6156285 129.4336429 139.8148601 176.3285622 327.6251998 381.1658191 310.338741 279.4642038 220.9740138 216.0314233 216.3905897 212.2596501 220.8203736 224.7272966 245.6980698 280.6526808 361.87596 379.0801342 406.3369664 390.6114742 310.46578 221.2472043 135.2628321 140.3227089 123.5703578 123.3334195 131.1367997 135.7470648 256.3674329 249.5450369 322.9743937 291.6041905 242.472945 261.7836008 278.0798007 271.0599328 262.1510358 243.0117528 252.8973572 269.9686685 348.991056 348.7730958 365.4090242 353.7855639 300.7620472 214.2373749 155.3800617 151.9803 131.7101497 129.8390932 137.8807322 152.7026032 222.2960805 303.4946836 354.7187597 309.4914955 271.2746724 281.4338213 270.306043 228.352335 210.7904519 198.6368812 222.0670579 252.2418802 334.6283044 353.0292201 381.3768856 354.1301805 301.4622372 225.6851165 129.3890049 122.5599954 115.5525834 116.2158612 124.9444964 160.2876627 288.3965358 357.3588238 283.8879653 264.6353109 206.9564793 193.0233681 181.0901434 169.326917 178.7357808 189.988311 223.9037976 251.1698819 318.433501 326.2543573 361.510377 353.9367101 274.9610316 188.2722267 135.7396109 121.6466966 110.258563 107.8201474 115.4139594 150.3439998 264.9336913 348.157679 289.7233948 262.3644054 212.142534 215.3745461 223.9575497 249.0361747 253.1035147 242.071977 247.5630227 269.7364247 343.956944 349.9886739 379.1817478 363.4206764 280.2767737 194.3699014 135.8380871 125.6181176 116.2298427 115.1464561 123.0074069 158.1686037 281.171262 320.0239892 297.7905392 310.0379385 254.0110531 255.6895028 251.1102861 240.5756126 238.8576463 230.6397605 243.7524691 276.4019343 350.0368237 369.4901964 400.0596988 380.845985 306.8331366 221.372997 126.1647802 121.9040099 115.8762528 117.0957339 126.2200137 161.7197877 299.9740084 359.1543184 325.6940987 287.1847514 222.6026909 215.1824245 210.3405967 199.7234848 199.53416 198.2479709 226.6386344 266.896304 351.1562921 368.3248146 399.5952036 386.9600209 311.6305688 221.5869797 123.4947387 126.2440037 130.0999146 129.6834982 138.9287229 175.2344978 323.4252754 365.1555908 314.183073 279.4309517 218.3693558 213.9634962 213.4441066 206.7020565 206.6686741 209.0467409 236.6388586 274.2439813 356.2811028 370.8991612 401.2056171 391.6850424 314.2516662 224.577946 133.5056802 141.9244082 128.1742878 130.5897111 140.9338422 157.0569719 302.310747 314.3745593 380.3076258 327.8631859 255.0235566 249.0959379 270.9512996 298.3146043 300.9085399 301.2751227 331.5577788 360.2710913 429.0323657 429.4483225 443.8752347 427.3400633 358.135702 254.1922363 144.1045362 138.0078673 144.2620228 156.4009661 173.2741648 311.2568159 332.1296147 392.2062869 311.5248254 254.2194876 255.1009736 261.9053245 234.6910956 239.0970783 234.062463 263.1055544 288.7333504 358.0334678 382.6214351 411.0349151 385.9854587 327.8057182 243.0042973 149.3816623 137.2646738 131.9813747 133.3218227 142.9407397 180.1166329 338.4310754 385.0928337 335.6014223 303.4174692 298.9930244 309.1386741 306.9213079 297.6342698 297.9520516 297.7114493 328.4734574 364.7431953 417.8721848 438.5320854 462.3937456 436.3448249 371.8708492 305.4046671 188.6739419 137.5074445 182.7744583 138.6935501 164.5694308 213.3983271 328.0448292 398.8067125 344.8220584 308.9831811 258.9671098 266.0933359 254.4657911 254.1542258 263.5902378 258.1751083 275.5096936 304.9837659 374.3696652 397.063563 425.0500753 418.0119823 335.5248988 231.7673749 133.2000658 135.3618235 131.9681058 134.2915053 144.5654348 224.6246334 319.9661898 386.5930531 332.3079195 298.2751808 251.4141029 275.6313737 305.6926278 294.9791312 296.151 296.0264356 325.4138504 359.4006587 414.3668364 435.7205522 460.5407124 435.7479366 371.2248932 305.3902952 179.9042187 149.9673067 164.9400893 137.2525667 182.4922021 213.2711355 322.7891257 417.0675179 365.7660537 352.6198443 304.0800404 303.0185213 301.2237396 291.0112199 292.3491827 294.0018988 323.7124442 356.4943572 411.4135782 433.9674488 458.6467938 433.9985292 369.9814152 304.5970779 185.8875713 139.252871 175.4278378 178.5778934 185.547924 201.8266346 323.3702001 424.5175283 364.9889892 341.5378256 304.6641023 307.1905103 305.5938498 295.4961347 294.2593715 294.4346106 321.9127112 355.6073791 412.3684021 433.7416635 457.4228098 431.270444 368.6948173 268.2463228 135.0676766 165.5324547 155.5901432 176.4880805 141.3822169 174.4301081 313.4507877 329.7664457 401.6522808 347.0134992 270.382601 253.3128238 269.4367631 267.4183248 286.3733695 297.7310758 326.8628192 348.4796291 411.6721404 414.8191278 426.1440022 414.7635911 355.9330204 258.0950221 146.7599263 167.0773468 152.4631789 153.1257808 161.9310336 176.4779153 312.2741451 324.5409397 390.4323771 339.5560552 285.4583753 274.1785749 279.7523903 265.9611755 268.6062234 252.0113132 267.9472872 293.8120393 365.1219077 397.932056 430.4398397 396.1113011 342.2071983 249.3916669 153.7842498 142.7225626 137.9241581 140.4286077 149.3631157 200.3499459 335.7086195 392.9197301 334.8468502 294.4076853 230.1644422 221.7893187 218.1147922 208.1261398 206.6444635 193.1223441 231.912418 272.558142 345.1027689 373.4600571 402.1049908 391.5023867 313.1733082 222.5661582 131.6595585 130.2570667 124.7401672 126.5342966 137.2815483 174.4534278 339.569145 362.3036008 312.9883565 282.3148864 229.3407667 232.4828279 242.2593191 236.7001614 244.9036858 246.836384 270.5376588 306.0851695 374.2368968 394.8881996 419.1103042 406.9216071 325.7098029 232.7256397 126.227392 129.2187042 141.1196561 139.5698365 146.51114 181.8507696 346.0127956 375.3503168 327.8372996 297.9842655 244.5516793 252.2543367 260.6693687 258.9798606 262.1004845 266.0608543 283.7266288 312.5032965 378.3865777 400.7507806 426.9779442 420.3585325 334.7832668 237.67834 138.6433866 141.560698 137.8706687 139.5956791 177.9488144 174.1074614 343.6011593 408.9680775 337.1860191 330.8376119 303.8885645 305.1220356 303.6700598 293.4206179 293.060578 293.4539625 299.5545389 312.7195185 377.7917394 396.7657782 423.3809159 410.3410351 323.9788351 228.6566245 137.9639548 136.6169409 131.2583942 132.5657469 142.4808544 179.2943607 346.9686558 343.353044 310.9469234 282.7705682 224.563025 216.7676952 210.4256708 197.8740049 199.6104004 200.3147858 229.098546 265.8667791 335.2265662 366.6469502 396.7570991 384.4907701 310.5655803 222.8853668 125.6033696 132.0011607 116.7026072 118.470888 128.2997885 144.3722281 262.5897789 300.676039 361.2256046 324.3983601 257.8407822 240.9179155 236.0667094 220.805784 217.1847681 219.8766219 250.5763311 279.1309991 355.0763497 372.5035923 392.8048029 386.7045945 326.958832 236.9167949 128.6574548 143.256249 128.6599528 130.7962088 140.6022081 156.3789303 294.6282334 308.6852878 367.8330577 319.8325873 262.7690333 257.9187351 261.8784916 246.6661356 251.2504121 248.5854315 268.9727317 289.0897776 354.1303453 379.9995818 404.1363752 375.6993857 316.8712246 232.8537263 140.8429469 124.5846519 118.1481551 118.8864492 127.7703201 163.3922262 307.3970123 317.5432101 280.3570308 291.6032291 243.9882673 239.9964095 242.7985421 232.2930044 231.5707398 230.4014278 255.1318807 287.0196069 353.8923747 376.8154238 401.5045225 386.3218639 311.4806109 221.8122552 126.75987 122.5303015 116.6012904 118.1192625 128.2532407 164.1521957 307.7490088 352.4055776 318.8575018 289.851814 231.6308179 230.4589316 236.4533129 236.952836 239.5803062 239.7219181 265.9423453 303.2593562 369.1009133 391.1245252 420.9221044 409.7291052 330.9225061 234.0460561 125.753807 124.7362539 120.0544398 122.1628333 132.1182499 168.0859205 335.9055688 354.6001357 322.2655307 292.0082566 234.9001033 233.2026148 239.8737673 234.4144282 241.0268396 238.0175982 261.7261087 294.9205726 360.3207604 385.1737645 414.7008103 402.444999 324.5932987 229.307937 126.3865688 124.5379112 119.999175 122.423159 156.2502511 188.5003088 342.1436874 358.9093478 311.437676 276.5456679 214.9899718 206.9106605 202.4242816 192.1877938 193.1887982 190.5015065 223.9729563 263.0466442 333.7922661 360.598138 391.9973432 379.325301 305.7731023 217.6512303 129.6602937 127.0321312 121.6897252 123.4819797 134.189586 171.1893825 319.3124212 369.74406 308.5630866 275.9020826 217.5151231 210.6627148 209.2339433 199.881131 201.1951134 202.6887085 233.5544247 273.4693519 343.8548531 367.7526266 399.8572259 397.2640361 320.2008653 222.9423208 126.6042933 137.8288716 124.3072797 126.7045539 136.9135662 152.9675939 302.3517851 308.0402241 370.6841452 311.9634289 247.1392116 229.5032962 224.4157424 213.280157 213.7397243 213.8939974 240.752937 269.9849311 346.1284505 366.6583061 391.6282675 385.2734402 328.7910465 237.1857162 136.1119938 152.637281 138.2590641 140.339091 150.2781621 166.0431697 300.5320717 321.8967775 379.6635 319.7130465 253.3404731 241.2338042 236.0606516 216.1290491 216.4352628 216.0661132 243.9434508 274.7624964 346.8437686 377.997947 409.5949794 384.3429979 326.5371937 241.8633709 142.0201544 132.2324931 127.9930823 129.5605421 139.6627351 176.7532116 342.4101561 374.5093612 324.2480856 267.1656455 216.160342 210.0706664 206.6764732 198.6093473 200.1494815 210.7115237 230.2660646 271.0676126 343.2824945 369.2210281 401.8707322 391.5160923 312.7245451 222.0603972 125.934902 126.543654 122.6670438 125.4650029 136.6174985 174.021825 337.4535153 379.3470501 306.0152625 278.3891298 219.1189101 213.6104559 211.8832703 202.8788197 202.7856977 203.4651999 231.0504708 270.3047757 340.3425541 365.6229309 398.2270882 387.5856691 310.5993749 221.8334997 130.8568019 130.3220667 125.9557082 127.8313031 138.0781857 175.4285554 338.6213302 371.3905177 318.1360307 280.8977557 224.9589581 218.4794503 216.6537784 215.7652738 226.9608066 230.7322366 263.9860962 313.2228828 384.2771864 399.3413279 423.9074862 411.9461983 327.411774 236.0549304 137.0667638 140.3622244 136.4224197 137.8281969 180.9782692 195.2255828 322.2033421 395.4177258 322.9952312 287.7941525 227.615909 220.9926147 221.2731941 214.1087592 213.1379908 214.9240571 241.9912222 283.4726428 356.0305174 379.4956498 411.0157587 402.6670519 321.0826283 226.017145 134.3769679 133.8751396 128.1670979 128.5513971 137.819884 174.3398054 344.9305632 351.8189272 306.3470933 279.8045373 222.8523767 220.5166309 226.6839349 224.5156673 225.1971178 224.8532842 254.1825595 293.1052397 362.9464987 381.2147335 412.0697814 398.8674779 320.2142223 226.0886809 124.8864598 132.4551526 117.6622158 119.8027673 129.5898759 145.4320423 284.233627 292.2245657 368.6109439 328.9622397 254.1266047 238.3167584 230.3558303 217.7134821 221.9867118 226.9532055 252.8483866 281.379915 358.6694668 372.842621 396.8859158 390.1415182 332.9061463 239.8007595 128.7612922 143.953615 129.4998596 131.8200662 141.7571718 157.7105565 288.0425049 321.4732961 385.8091056 330.509197 268.4854624 259.3492683 261.940896 266.2706859 275.4858446 265.0123554 285.8070659 311.4227425 383.1763067 403.2586882 426.4928247 397.825632 338.1911346 258.0753847 153.1474793 144.1676003 140.0812706 141.69467 179.9514164 176.0060238 339.8968367 408.3205236 342.5737944 309.9741626 273.8343131 300.6860028 308.099929 298.22472 297.5160034 296.5845667 325.8409349 360.0279998 411.696578 430.0185532 459.5732996 432.3100982 352.8638084 275.4707341 139.0855448 151.2064434 177.2687558 180.172873 164.6542216 202.8814397 323.1074851 420.9984789 362.0422245 316.1559579 241.3146734 252.5875946 257.7129581 253.0530429 254.7425332 247.9919671 272.4433886 310.5288312 376.0683854 392.2003171 424.2993445 411.2192088 328.055277 232.8094625 136.6274386 137.5958877 133.3804648 135.1499527 144.6096631 202.2025098 319.8614704 371.8525854 321.9366397 286.2967088 224.5516486 224.3195417 235.0642602 232.9741428 232.4144492 230.2152949 255.0023729 291.9843084 361.0791225 381.7242863 414.1023466 400.3989465 321.0198601 227.5112392 125.6166765 123.2114068 118.2467685 120.2931073 130.0116858 166.1593881 328.2146958 353.9908556 324.1698068 291.5393952 231.6060099 230.1484975 235.6257723 232.7305021 236.8475319 237.5211986 264.1504146 300.9407301 364.3057749 381.510754 413.960839 401.6158167 323.306485 230.2403693 125.801349 124.1864957 119.7783305 122.3428217 150.6858853 202.9186597 346.1600441 379.8386036 329.6756755 296.637327 238.799624 235.2186314 241.6921381 236.286801 238.5897368 236.8635063 259.8289787 312.056333 379.757629 389.9751796 425.9580352 416.2606564 332.8336905 235.5840707 132.9681284 147.2951425 134.7625791 137.4129785 178.6796033 157.0986827 309.2537421 332.0033882 399.2450089 340.5358818 267.6852223 265.3227 278.732856 278.641842 295.8112305 300.6193746 329.8594828 356.3762245 419.1993994 406.5563186 422.7462889 414.8759822 355.9981096 259.4606138 140.1692316 162.6613879 150.0837415 153.0987089 162.8454995 203.6793717 295.4908409 351.0384587 396.052713 347.0319822 285.9854281 298.7740008 313.6321074 294.2899183 294.3665074 294.408045 323.7419526 351.2658106 411.3146519 422.6137156 451.0697765 422.5021623 360.1781539 268.0904581 157.3185053 177.57211 130.1978853 181.8201243 127.0359659 211.1386303 328.7835606 410.6380539 352.7034371 338.8632932 306.4211999 308.097759 307.3149715 297.0167881 293.827988 242.9037478 251.5416538 292.5945067 348.6490958 380.286884 419.3258434 407.4996343 323.9638371 228.1714255 132.7770091 132.6113478 127.840499 129.647289 139.9738358 176.8887792 339.9903481 366.2846647 327.4123265 290.5948288 231.4871468 228.7343798 229.9680255 226.762494 228.4581365 228.198009 259.4842751 303.2549106 372.6141887 387.2408941 419.9877086 405.9905184 326.0880698 231.5242945 126.368871 125.5444331 121.0984354 123.4876536 133.7536281 199.0776057 313.9159035 390.8818467 340.268165 300.3546898 241.6044776 241.9727604 257.2851359 262.7693213 264.5406081 256.3050566 275.6041985 317.4540983 382.2383675 393.94763 429.1379338 417.2966225 341.5621729 238.9991762 138.390872 141.3254467 136.7620129 152.1478627 163.3113159 215.9897582 305.9750961 400.889829 341.8133585 302.3318077 244.7685565 257.4874695 297.5334093 296.9219909 296.4144151 296.3977427 325.2278638 359.1132301 411.3800649 427.3797767 460.6575795 435.9174764 371.093541 297.6789434 141.5481689 160.3526473 157.6585961 177.8234137 163.3133722 192.158011 338.2435384 413.5410472 348.9777709 315.4719929 259.5018877 252.9317074 261.8329725 273.0614664 293.1683833 294.4564648 321.7176199 351.4383666 411.0439101 426.1700734 459.4041163 432.1750647 340.344059 246.6227846 133.3111391 148.7913227 184.2522835 113.0803075 181.4114109 174.5014611 280.5161354 344.97997 411.4160632 371.3985238 319.5315035 311.9623286 311.0222587 296.5544672 301.5041358 302.5252044 329.1927894 357.0323774 420.8374799 423.9698786 442.917332 433.1971531 380.1845077 294.1330819 200.4941087 154.5759761 153.6823894 170.9672861 175.4762498 193.9862353 288.2157499 385.9932352 416.4532842 361.7767287 319.1771661 316.6177886 315.8393709 294.7758233 298.0381451 298.4018971 328.7646541 354.6418694 414.6367803 425.7357625 453.2276901 423.9207831 368.4626783 293.6088668 210.3015432 144.4676546 180.1260663 161.6927866 146.3332172 212.1716689 325.7752286 411.6797105 364.3125433 327.3193257 268.3995324 287.9953234 301.8926276 294.0722295 293.5525595 293.3382158 322.6256419 356.3459853 409.334485 413.9636708 449.3825233 433.1585264 351.8824947 264.2039892 139.33957 148.1857402 175.6538967 161.4856729 145.5259206 202.516949 326.6125971 413.4962021 354.7401706 306.4814161 238.9563369 231.935528 232.3989203 229.1115026 249.2961062 282.7890993 324.8057686 358.8964307 411.1383126 426.5583903 457.1954962 432.6708178 346.2090165 248.1927215 135.1720298 140.9213129 151.0897298 154.5539744 185.1017161 152.3397438 331.5817527 406.0486774 356.8969479 339.3694689 306.2319037 307.6152491 306.8232733 296.6952304 296.231572 296.0059866 324.97653 358.7321267 410.8736555 423.5242325 459.8043881 435.0152298 370.0222993 273.7388761 194.6579303 130.0103526 183.3730654 117.0015208 180.8214319 200.0840134 320.78273 414.5166887 374.2188017 353.01454 305.7359656 307.5459268 308.276226 297.9833865 297.2087647 298.0314139 327.7902362 362.5345681 415.0737685 428.3739234 464.3954931 439.4481603 374.2209999 308.0451 250.3553506 242.8211363 233.1109723 215.043481 203.6003613 228.5323988 340.8517331 418.2561492 376.8861782 348.8368899 301.2793634 301.7295536 300.4584072 291.1636087 290.3567741 288.0022862 316.3141663 352.2099971 405.6551083 419.4648546 455.6909031 430.3195761 366.3021214 301.8283076 218.5491735 207.256208 178.8266509 169.6502749 182.6543761 187.7350529 300.6235944 349.9145135 412.3799988 363.5030257 287.4009975 272.3574805 266.2612612 256.1344121 254.6144345 249.0418709 275.0628098 306.4743837 382.2930213 392.413464 426.1388291 416.5629127 358.8438994 261.3611517 140.9688339 164.0567779 151.9090401 154.426667 164.8162092 202.6821753 281.5338175 349.3327183 402.9909194 347.1237089 279.0362745 265.6863336 259.4451993 239.2725656 239.6836447 239.9130749 265.7007514 294.6167623 368.8563369 390.8799238 433.4718057 412.9945337 350.8272047 258.1914417 148.8194364 141.3537435 137.8925323 180.474975 121.5474924 210.42897 310.1768718 395.2591925 342.1941313 308.4122888 247.5637077 252.5438716 280.3859186 294.0819072 295.6984185 295.4433458 324.3892485 358.5108984 410.9013495 424.0148765 460.1367412 435.3509947 370.3362997 293.2860216 163.0640944 171.9106664 149.459249 159.1489131 187.5323403 212.6600783 309.2357738 420.7780066 348.9874884 343.4473931 304.4098292 306.4584523 304.298316 293.4288457 295.0774561 288.6276177 310.6170729 356.2595003 411.9779205 424.4331215 460.0053408 435.6859611 346.9421416 248.3299514 136.321493 142.4539369 186.3894711 115.8018982 182.4003499 190.3741059 315.8512877 409.4542367 347.5622323 312.9994901 242.4172947 235.9746858 239.1441637 231.9886961 242.1020525 245.8503249 262.3419103 294.7767801 365.5399111 384.4865631 426.8053851 416.2229909 334.0726944 238.0115888 132.1104388 135.5207962 132.3631321 148.0552289 160.1593448 209.9058247 300.969129 393.9751169 339.2172045 296.5969154 230.4365639 222.3477088 219.8082855 209.5887035 210.6729188 211.4430372 239.3113338 282.1814824 355.3088348 370.7290607 413.2602744 402.2654153 320.3393646 226.6868657 126.791696 128.473698 125.3157248 128.3382259 139.4202348 218.667126 298.0286661 385.3985935 332.0445113 291.1879606 223.3205316 219.4627761 222.0104808 214.8088059 227.1343315 218.757014 247.2593356 290.221427 362.6008801 374.3741004 417.7329316 407.186757 324.6146798 231.6739114 129.6804471 143.0061991 130.2823257 133.206634 181.7876307 132.8572416 301.0847544 322.1919253 396.6428493 344.229404 269.6834616 258.0755196 258.1358248 257.2302528 264.1759593 273.6943845 315.6123169 353.2846409 422.8718674 418.5898329 439.8925769 423.2142391 357.1721606 254.4316633 137.3084761 158.9368063 145.9231484 148.4597923 158.6874364 171.874871 293.5619028 361.2017468 417.0988828 362.5847017 320.6849566 317.5288115 317.9870747 299.6239216 299.0214517 298.7147493 327.3046926 354.0407045 414.228442 419.7829528 453.2586227 424.9569552 371.7274242 305.9064335 195.2019709 160.0077372 161.4005788 177.8955505 184.9629411 200.2547046 327.1114856 418.4924751 359.3377519 324.8579258 282.6540632 297.0912712 306.1451249 295.9405363 296.3898314 296.7429752 325.4757401 358.7559483 410.287427 419.6868765 452.4180967 433.7307772 350.7161293 254.1129294 140.0364835 176.6637992 138.5591502 178.6058326 143.5351878 191.5094167 329.6932974 416.6213097 372.4602574 352.8756763 306.3045209 309.0768734 307.8902075 298.2815375 298.0519781 298.0216737 327.5072198 361.7185098 413.7363327 423.2198846 461.6046939 436.6690544 371.8458103 305.783006 207.5136339 208.7756009 190.2379559 187.7935388 191.3461693 197.5694001 322.5220537 420.6356303 380.9666718 354.0673951 307.3596783 307.6398222 304.4041743 294.1184687 293.3655959 292.480608 320.9818263 356.3736076 410.1230937 421.6951615 460.9135298 436.4814712 370.9587556 304.5810784 212.398506 195.6689431 192.2804333 189.9352676 174.5639282 203.158882 330.6627574 420.1630252 379.8000665 353.5776316 306.515201 307.7929156 306.8898448 296.9779719 296.406161 295.8728385 325.1416362 359.2905665 411.0629275 421.1424926 459.640673 434.4403938 369.4345449 304.06067 193.4470047 175.8909306 159.0312208 168.6435187 177.8063668 219.1969808 327.8914421 417.0097649 377.6151092 348.1784354 298.654081 299.0062588 297.7100926 287.9229601 286.3140125 285.7905739 319.9041621 358.4824326 409.9310261 419.9466804 458.9124232 434.085294 369.5496657 304.2351281 196.9107194 207.1542127 170.5745999 168.5931553 174.3198906 180.4625965 273.1862213 362.9769563 415.399602 369.7923032 317.96916 310.4824551 309.9602161 300.4422819 300.7214582 300.3244709 328.9742249 355.7647616 421.002098 411.2399224 436.7657219 425.8658045 364.4573829 265.6074886 148.7137567 170.5276011 155.8892778 156.8610317 165.306068 200.9303867 290.9842701 349.8060903 411.9091677 360.9542189 318.4198276 315.6081021 314.6539929 295.1326451 295.1993401 295.2316677 323.8127443 350.6816467 411.3592452 417.0517384 451.390566 423.6301733 370.9932579 279.9070359 206.3211014 133.343519 186.8052072 140.7468524 167.075332 207.9604947 333.0579779 415.8429739 375.3723791 347.2392228 298.1212566 297.6204227 295.4241353 284.8679718 284.2061804 287.7618434 323.9727389 360.517268 411.4701882 421.0540468 460.2200274 435.8248602 371.096424 295.8955942 195.8734656 132.3952823 177.7637154 158.7668751 144.3344216 206.2804419 330.5641861 413.8696263 364.7369296 326.2552875 258.5089128 289.6643222 305.3014116 295.8427573 297.3830627 297.3141295 326.2691433 359.9536056 410.8217497 417.7179416 459.5281592 435.1385325 370.3933669 305.0610931 190.2727243 159.594214 161.8913946 178.4286505 185.4578375 198.2151377 332.2795267 420.6739139 379.8803399 353.2487818 305.8691129 308.3880197 307.7213747 296.9135726 294.4745142 292.5300041 320.5883548 354.9559205 407.6944591 415.9022898 457.8344198 433.276421 368.2202422 302.0363058 247.7043245 237.2324185 225.6817513 214.4202562 186.3593154 212.75035 338.3176411 415.6825405 375.8033065 349.1748099 301.7085015 302.5394551 301.0824049 290.1809626 288.7174069 291.2951462 324.4495862 358.7789881 408.6187389 416.2225699 457.8103362 432.8251355 369.1353598 278.6927841 183.5237635 152.4319515 158.5488302 176.2827143 172.8328065 195.8882565 325.1821098 418.6551549 357.7578007 316.9700792 258.1386762 256.397562 261.0582456 258.9096022 260.8418547 259.9204474 286.1693376 327.2261883 400.5097174 412.2765641 459.5667832 436.1331017 362.7347986 262.6949422 136.1392623 169.3167139 158.8081495 179.024151 163.8727013 148.8975789 300.9543903 344.2280119 410.6420443 354.6951017 274.4835382 254.2592332 245.966088 234.2577816 233.6394984 231.5375215 259.7967694 293.6731107 375.3771673 381.9108778 419.932964 412.1337769 353.9905891 257.8526662 138.0758882 160.1268585 148.4277367 151.6250081 162.2356947 208.3123339 276.5397081 352.8828578 410.8344155 361.8213686 316.7425006 315.5863576 313.7063666 294.5027386 292.2931541 291.6519081 321.9271119 349.0401749 408.7184538 412.0401871 449.0083123 420.7233464 368.0231699 305.8352988 207.8614352 131.7049212 184.1355478 135.2897977 163.9240026 192.9023401 328.6499783 416.6948406 375.0906098 346.3476508 297.6361836 297.7478178 296.0720102 285.5528285 284.2408912 284.0225398 313.3857433 348.8100686 401.9424137 409.9646677 452.1056014 426.6787581 359.7167971 292.2230808 231.4740067 222.5094146 199.8677428 208.2884624 219.9972115 241.2458949 336.0598537 409.2947647 367.9358315 337.737827 288.2485085 287.5855496 285.1862768 275.2928099 275.3590069 274.6881542 305.3113152 342.1466485 396.2013751 405.6620363 451.6607507 429.6669985 366.6267857 301.8912047 183.359721 169.5103775 166.7313634 165.7660286 172.4612766 203.0692924 315.680137 419.0169896 379.6827104 352.4502221 303.2735877 301.9721655 299.6816397 289.9375082 289.6170015 289.1555693 320.0989327 355.2255998 408.6007691 416.8587521 459.0312709 435.0157936 370.2064306 286.7607967 183.4750355 150.9325979 158.1637285 176.2321912 172.1123894 192.6123968 325.0283811 418.852484 370.4576185 349.9528126 304.834801 306.029814 305.1007808 295.5585049 295.2739314 295.4111238 324.7100321 358.3587129 410.7187928 418.1925203 459.9638948 435.5625483 360.2792479 264.0259504 138.8019544 184.4019521 161.5843216 137.5455687 183.0289148 204.1735366 327.4216303 421.0838387 380.6721645 353.658101 306.3593136 307.4079047 306.2129605 296.6252698 296.4261101 296.333685 325.5161952 359.3073839 411.2401236 418.1456048 459.90987 435.6784834 371.2212045 284.271174 175.9000853 161.0814702 181.479641 158.5817215 163.5917701 178.827594 302.6246722 361.5490188 416.0232655 359.5562893 275.8147766 256.1050562 256.3595549 260.2549055 267.2568043 270.1922312 314.8769607 354.9728325 421.7301662 415.3992068 439.8754573 433.2398465 380.6467893 288.4985546 142.2838432 202.9913144 139.3536169 150.2125293 188.6716622 181.4334597 284.5156417 381.9475325 411.3513758 354.618269 309.6511354 305.4172248 303.365477 283.593553 280.5736401 279.1555141 308.1980585 336.0683257 396.4451666 399.1501747 432.6703311 406.432006 353.8807802 292.1363009 274.0917475 260.8113433 241.0685785 243.0150356 241.3722485 245.4497708 323.9128891 370.882552 400.0272364 343.7144862 298.9288575 294.8751617 294.5971848 277.3022104 279.0741308 278.6434058 304.8796688 341.7863638 405.0484484 404.4748828 436.4202156 410.4002199 359.7335644 294.3842319 284.5373029 244.5159621 240.5415011 235.4687098 247.1447163 261.98447 370.3458635 412.3426771 370.0239734 338.1191378 284.9264619 286.8884375 288.7448009 280.5937049 279.7711711 278.0715059 309.2594686 344.1163242 396.4167564 400.0643615 444.1865582 420.4596103 353.3641012 281.6029181 278.3339417 272.459523 260.9162421 261.5752751 264.0619678 285.7594377 375.0579935 408.9987277 365.9996755 336.4642791 285.8935748 286.8712958 289.0800855 281.3388099 279.7317569 276.314288 304.7180149 339.0403988 391.8396704 397.2478376 439.4931241 421.2738033 357.0094688 293.2492643 272.3003411 246.2719937 223.0417806 224.9197092 215.2295455 241.7170236 348.5577604 394.821751 374.0474882 366.0691372 316.6566028 317.9535996 317.0081041 309.0176965 308.2741191 307.4584621 333.3191174 371.1751476 425.5329276 432.809338 472.3138208 451.0163946 384.8760692 317.099838 243.9104503 244.3965783 204.5282794 222.6653223 227.8495772 251.2754956 350.8298493 434.7672151 390.534736 357.1555663 303.9353135 301.9128059 298.4285094 286.7236945 285.533347 283.4722341 313.4602148 352.3109272 407.4346794 415.5285983 455.6165144 435.7037503 368.1328716 301.9017743 268.7543139 268.2351502 252.7572191 246.2087946 248.3753497 251.5114261 327.7250738 380.4847596 420.438225 371.3450839 316.8536021 309.6581568 306.477634 295.6600973 296.4113269 295.6825927 321.8498755 348.6480106 416.8720775 414.677333 442.6924567 434.5576448 379.7303638 306.088598 267.2624893 277.3187912 253.0886803 256.6557349 252.3093254 262.4547944 326.3007209 384.8890934 420.9217601 366.5475227 323.0208325 322.2777028 323.5152515 307.2912059 291.0188652 272.4217298 325.5335767 357.1670467 392.4557217 372.5713018 390.298776 355.5892071 291.5922839 199.136403 245.2127903 209.0588456 225.1813512 222.2557359 219.2706135 240.3179615 328.0640003 394.747098 357.4549898 332.2638416 285.2651298 288.3772826 289.2960752 281.070367 282.516592 283.5914292 313.8731517 349.1270857 402.1130085 410.2553939 449.6498019 427.7112284 366.1673117 297.8348991 217.9085187 226.2446811 191.8624052 187.2829847 198.9365034 216.9491259 320.776077 417.7099055 377.8337678 350.6669887 303.672678 305.65512 304.3949657 294.4108053 294.6977372 294.3777799 322.5688483 356.6385053 407.8189755 414.7794912 453.8047953 431.0943542 366.1849848 300.4667453 202.4315578 205.4600532 176.8943846 177.7696099 195.668538 227.439319 324.5177966 410.5456465 369.6721262 340.7006265 293.9106489 296.8282661 295.5149189 287.9453725 294.1507743 298.1316546 327.6488816 361.7798206 413.2773153 420.1560029 458.9386109 436.8181486 371.8369219 305.917946 222.8761385 208.139725 203.1224736 200.7459359 186.331814 204.7062057 338.1279773 419.6842013 379.0443856 352.502073 305.2430488 307.4421354 306.8093868 296.6517044 296.8456434 295.4732621 323.9832193 358.1482046 410.7223282 416.6516645 453.0296744 430.2216136 364.8063232 298.615378 194.8576962 196.016852 168.1674895 171.697491 194.0249767 222.9822264 324.0727715 412.1439553 371.4328194 339.3537423 290.200659 290.9721424 287.9066966 277.9617921 278.0817303 278.2399525 310.5279219 350.19955 401.8870373 406.928083 442.8907683 423.3905448 359.4212965 294.0213527 262.2544788 260.9224226 233.4569666 238.1920772 232.8001588 237.4669 308.165714 367.2312393 406.8062205 361.3913902 311.5669638 308.051061 310.6323722 301.4415059 300.582427 300.3149657 330.5244348 358.5188745 421.1118222 412.0542193 435.1604168 432.2904412 380.0025538 308.2211551 211.4961788 207.6351288 202.9837748 184.7253112 172.7129298 201.50639 302.2735318 386.2309648 415.1879489 359.9563554 317.5009831 314.3179285 313.5826792 294.7449069 294.5190232 293.8976241 323.6425052 350.6884275 411.9057104 414.2870632 445.0873266 422.5566209 369.7348129 307.6402137 199.9290395 142.9969956 184.7071342 160.6805908 165.4611693 203.6868188 336.9894823 419.8139363 379.3552258 352.6028428 305.3533045 306.94944 307.5280857 298.2999624 298.7946684 298.4532963 327.651523 362.4025618 414.5079804 419.8858527 453.8502197 434.9159321 370.3084173 304.772836 196.5313734 196.5003966 171.1954899 169.6841022 176.6844487 190.0680911 321.9506757 420.7745674 379.8294613 352.6280982 306.4302937 309.396706 309.6765537 300.4197678 299.8042311 299.4017157 327.4102776 361.1416211 413.0626637 419.2830692 454.6757329 436.2462781 371.7188068 306.0900691 220.7417764 197.1336248 199.2806674 199.3064603 183.580556 202.6254824 338.4566548 418.9620963 379.148027 351.4133966 303.0257763 303.8923823 302.2951656 290.0467378 288.2005065 289.1558023 318.6323063 353.4723095 406.4028081 413.2604099 449.2828151 429.6246133 365.2183338 300.54201 184.0581092 177.4263099 170.502767 179.5053029 185.0369433 215.3232063 308.3682709 414.9855036 375.4263961 349.1672231 303.0019547 305.1535919 304.629314 294.3746673 291.8742091 290.4110115 319.654732 352.933544 403.4594813 410.2492396 446.4395188 428.0246341 363.5847644 298.0050625 202.8533055 192.4528167 181.6649066 181.1081494 186.1538301 188.9232484 329.7594187 415.9291835 373.9799796 344.902003 296.8765931 298.0569018 297.091106 286.4969448 285.7007894 285.9998849 315.4403358 349.5639925 400.8817836 408.053035 445.7216333 428.2386992 364.7568012 298.9619701 217.192662 215.0361829 189.2234118 195.7500246 201.3783853 187.0568408 291.1370097 369.1376007 406.8960803 360.6351134 308.6838865 303.4376548 304.5470056 295.4963346 295.931298 297.1730744 328.4862605 353.8788361 414.2494173 405.8993377 427.0314266 423.323338 370.7531397 299.3538842 215.3261293 214.3117297 208.3818421 191.8072555 180.0673297 206.0488037 303.3897698 377.4328644 406.7066234 351.2440443 306.4356259 302.9863664 301.2260116 282.1232579 282.7092886 282.5130894 312.4783386 341.3992012 400.7836882 400.1036546 430.3282504 408.582066 356.692248 295.3095996 244.0359592 222.0085331 215.1152978 213.9475883 211.9430078 233.668469 346.7339578 410.5425373 369.591086 340.6854499 291.6905086 292.0496427 291.277239 281.5324269 280.1816113 280.0664243 310.0160234 346.8168221 401.346232 408.7043477 444.3863798 423.2306524 357.4897035 293.3270638 215.60393 207.2289219 202.7301957 203.608162 209.2071013 205.6855432 330.2683687 415.9843414 375.3816404 346.1369526 297.2471816 298.4559668 296.8545762 287.1280379 287.6516338 287.8729715 318.6189559 353.4959458 405.8205235 412.6737123 448.4235217 429.1691768 363.8822344 299.3863505 252.1051377 239.9979 221.3314452 231.9785701 219.1915949 250.1866566 336.655405 415.3608736 374.7551622 346.0570015 297.558392 298.359133 298.2906604 289.3263472 288.3014727 287.0137045 315.9063622 349.9823492 399.7181297 406.0072175 442.2756306 423.1152785 357.680357 291.1153758 240.806744 231.617751 223.2647018 220.2652121 204.4727913 228.5920449 344.9696478 408.841675 372.0842048 352.9807506 307.0475801 305.2554536 305.8908866 297.0425882 295.5917218 297.1676001 327.0016581 362.2216598 413.9160031 420.0131593 448.7631922 424.3663936 357.1124459 289.4319945 259.4254185 244.5576502 233.7502506 225.5358555 236.7637128 253.7023945 353.3280075 406.4395383 366.2539614 337.017619 288.0189903 288.4468618 285.748749 275.5839144 278.8515521 282.5208657 309.1942649 341.8098092 402.7398171 419.3520953 456.3168459 437.2480543 371.2622236 305.3181279 256.5901028 253.9578642 233.5616455 221.5580555 227.9253343 226.7213407 315.729922 376.3280785 414.822815 369.8611145 317.7583206 309.0772728 308.2163207 299.3536859 298.8369468 299.3800735 330.0198339 358.0422755 422.5276823 416.5343844 438.4699453 434.3824134 380.996026 309.1308945 238.1012124 238.8217669 188.0974752 194.0165867 206.7785668 211.4064432 306.472911 384.7276361 415.2634891 359.5519756 316.6982897 314.8133044 314.6015114 296.4787259 296.6221224 296.8140328 326.3225361 353.6561387 414.0068136 416.2295563 446.2508443 423.3760876 371.0753729 308.2651238 236.9236253 209.9818625 205.8638386 204.3010543 209.6836476 209.9551531 331.5979679 416.6312173 377.4367498 351.6991273 304.536546 306.258137 306.3170718 296.3415192 292.8774419 289.6932251 318.3161382 351.7755792 402.8933558 410.6170334 445.635118 426.267148 363.743009 300.8706683 250.3714952 241.327934 213.8357415 227.8414551 214.8518776 255.5003079 344.7699523 418.1005993 375.7796365 344.6082396 295.5037685 296.5025052 294.5596631 283.533977 280.8233622 278.2420067 305.7167807 340.834696 393.2230066 399.9460216 436.7511976 419.0170202 354.709362 288.6073704 262.5915736 249.0124914 241.5534788 235.547808 234.0245353 248.3012224 353.2578082 411.4951275 373.7250702 348.3038408 300.9120373 304.4135032 304.1589805 294.3001387 293.3024019 292.7480531 320.7829545 352.9145022 402.4700046 408.1317511 444.8446011 424.0293606 354.7955695 288.9784726 262.7757188 246.1313655 236.4632448 226.0598488 231.6165374 245.3044068 344.4760599 413.8562259 375.7545888 348.7625389 302.4001406 302.7894282 300.1461205 289.8857913 288.8226911 284.1217021 309.6861806 344.2503722 394.527457 401.6660874 439.284369 420.9231323 351.40038 284.0339902 256.1050353 243.0915082 237.2177017 234.3633103 244.7892904 265.3324925 360.7590463 407.6002074 367.286061 339.4546059 293.2123501 295.8757329 295.6819882 286.9960348 287.4554017 286.7917289 315.573323 351.6777689 404.9643077 408.2925887 441.7126466 420.1114722 351.5148741 283.2188 258.774834 254.0452335 234.8648153 232.879942 243.4002228 243.4074166 321.3973266 366.3052163 403.9608247 356.8564319 305.915617 300.4369821 301.098016 293.0515066 293.1023727 294.027983 326.2490803 353.4991025 416.2773542 406.7947317 425.9217462 419.6968401 367.1315045 297.3586109 231.7091268 238.1356132 206.3641941 200.5530377 206.0154206 209.398549 308.1649774 381.548023 410.5636535 354.1485405 309.9259185 305.563129 304.7115807 286.9721161 286.3486279 284.4345491 313.9016746 341.5050507 401.9977813 405.6640206 437.2381544 414.7369802 361.957674 300.3497042 212.5409158 195.022732 180.7312595 193.4414914 183.9198408 210.7655965 337.5640588 413.6085582 372.9121766 344.5904684 295.857702 295.3648044 292.873972 281.2249596 280.7492929 285.1389004 317.0445208 352.3020206 404.9567738 412.5848766 449.0891977 430.4556295 365.2761131 299.6323076 260.5834527 267.7384348 247.2717825 244.6884269 248.4141281 256.7332617 325.0031641 371.9617541 400.3622262 343.5501248 299.3050491 297.302906 298.6229521 281.5885968 283.3344218 284.1097576 313.0551985 342.326707 403.3410883 406.3408027 436.375104 412.6323021 358.1451684 300.3337514 272.3079438 243.2820649 214.3993792 205.9902908 221.0763048 243.9835158 330.3495727 416.4415384 377.3522635 349.0934889 299.7467978 301.314767 301.3707847 291.1898474 291.2839194 293.1251822 320.4707014 354.8976295 408.5828371 416.9461479 454.9031467 434.8445975 368.5285113 301.839835 234.0800977 225.2742481 198.5037476 195.0152264 214.8119737 238.1522838 322.2176705 414.5885936 374.7744178 348.1573703 300.2680804 300.5687227 304.0550029 297.4561554 296.7245344 296.2356795 325.5623958 359.7043844 411.3022858 418.3636627 453.2426382 433.5723958 368.6434954 303.0359483 205.3262084 197.5433368 188.4422015 200.485922 208.9000081 209.5887106 331.6184447 417.4672875 376.9138926 348.2161164 300.5123933 301.4790003 299.6465998 289.7567406 290.2915888 290.2141553 319.68975 354.6727613 406.6490727 413.1503259 448.4310934 428.1299583 362.8835183 297.3744004 228.2165935 229.2116171 217.2601118 219.5300403 213.8553617 219.4982363 314.6389301 365.1501163 403.3661445 356.9217766 304.5951666 296.6411738 295.3710598 285.4929408 284.77207 284.2470406 312.4392804 341.2092621 407.0681408 401.6236331 422.5874739 417.2781881 364.6882454 293.3867956 260.0832666 265.7067063 246.4199285 245.5686473 248.5546816 254.5268267 323.7063634 370.734925 400.0768027 343.7791094 297.842456 294.3387924 293.9019321 276.8975567 275.2805167 274.5194123 305.7077814 332.9602413 394.0390359 398.109347 431.0086865 408.1711045 354.3530004 292.7266735 275.9587956 253.7210822 239.2858405 240.615142 241.1697924 266.1697614 358.8888613 404.8626345 364.1658956 335.8162647 287.2617009 287.3439544 287.1195559 279.9245611 280.5445445 279.9897519 310.4230257 347.4958889 398.8735173 403.4976517 436.6886292 418.2523954 354.6714582 288.0623705 265.2249061 256.2843675 245.3024951 240.8486702 249.1990906 268.2115829 362.3370022 405.3753644 362.4122602 333.7658934 286.1443417 286.9535884 284.1873746 275.3250123 274.5035383 274.5126956 308.2200265 344.5277917 394.6780505 394.8388907 430.0058887 410.9929495 343.9109261 278.229949 262.1462424 255.5473007 247.347484 246.835233 252.4908234 272.5896172 358.9494328 397.3837972 354.2441325 325.1183013 278.1168645 285.6440307 287.6847473 277.3828392 276.3836718 275.2713213 301.9790569 339.531179 392.3922895 397.7656949 434.9106727 416.7293665 352.4378997 286.2206924 269.8701455 257.843513 245.545212 248.2954215 248.2611835 273.9845332 366.5648964 413.4728376 368.319254 334.6244825 283.9717174 288.1614478 286.4810369 272.1866975 272.9413304 272.7286499 301.129947 333.5645666 387.2111875 393.4915748 430.9983433 413.5487171 347.2042178 279.7540955 271.7123343 260.8090963 249.1041192 251.9604759 255.1382574 283.0150188 370.1126369 402.2919315 357.6510632 326.1353963 276.2103599 277.5699365 279.922216 270.4861803 271.8180978 268.8330268 297.9889324 339.9493711 393.695858 399.077558 435.5073984 427.1434923 372.1994134 306.610104 240.6083701 229.5294625 225.3685327 224.1994298 222.6377458 213.8967586 319.9852727 355.1737108 407.1706053 381.2774731 327.5212394 316.5036529 316.0777785 306.7375388 305.9289762 307.2311804 340.0608583 369.3004371 435.220913 430.0187509 452.777137 448.6825381 395.4882043 316.911736 238.4484584 264.8498562 218.0335968 236.9836414 213.0166373 240.0154366 326.8331854 362.3921508 400.9380261 373.3603169 330.7223905 326.8902358 325.9076027 306.958169 307.1483438 307.1066219 336.5982523 365.3266604 426.7961067 430.697308 461.955043 439.2198855 386.0962838 314.7605579 247.4144143 245.8303326 208.8946297 226.7968897 221.3027337 232.7212926 360.5246175 434.2172265 394.8090562 366.475468 317.0090026 317.6146417 316.6058476 306.2922564 306.1140847 306.9492788 335.4775923 372.0911113 425.427239 432.9839235 468.6539111 446.0210817 376.8655279 313.3731451 266.8300959 255.7922413 250.8070302 241.2870596 249.4300819 272.4201243 364.3895648 432.6781131 386.5969628 350.4663843 297.6503599 296.077799 297.3164787 286.5851391 285.0504131 287.6112652 315.5005999 349.0285164 401.8398852 408.9360547 448.8475241 426.9799088 360.2301596 294.5769593 278.870117 270.3191087 261.7074361 258.7052304 266.3285214 285.8340112 374.2646182 411.5744756 365.97436 335.346294 281.5318636 282.2072663 282.2335138 274.1478268 274.4791764 273.065671 300.8708738 331.375124 382.8849457 390.1331045 427.7517749 410.3918873 343.7394349 280.4442906 267.4632498 261.4263116 254.2532565 252.8543139 261.7398975 282.0788048 369.1960716 408.5115398 363.4262949 331.3890152 280.2994455 276.8389867 271.9244635 262.6684339 266.3283571 269.7384397 300.2808855 334.0141726 389.2334926 397.8114029 435.864384 413.5934382 343.9165244 273.5480666 263.2208248 265.6236438 260.7176283 259.0186967 265.7950214 285.5060706 373.2681793 413.8795516 367.0659812 333.7311979 279.1168347 280.6842578 282.3630537 274.1025147 275.5457769 277.3206046 307.9732026 341.2605339 394.1276746 400.0147286 436.6846036 414.6089596 347.1685978 275.9756696 268.5299175 275.4456052 257.3635277 254.3609771 260.8609893 265.6814322 336.2928264 354.8908553 393.151922 341.7679496 289.8908975 284.4026298 285.8222601 277.7808394 278.9474898 279.6352204 308.387594 334.2595264 399.5859625 392.160337 415.22914 406.9764172 353.6422898 279.7908962 266.7369605 282.159348 265.0286082 263.7152832 271.4615596 276.3530588 337.7531527 366.8569849 394.1070468 330.3809784 289.4908613 288.9686853 289.6943151 272.017505 272.2120806 271.7006075 301.5099736 327.2785619 386.7789094 388.7249575 420.9462128 394.8063705 341.272624 276.7722897 273.2300988 264.6025357 256.8986579 256.630539 263.2521589 284.1502262 370.6659924 395.8744531 351.5883038 327.2427292 283.0142279 287.9903855 291.4436371 282.1653642 283.3416064 283.7470058 320.1410433 348.5276199 397.7448318 403.0160975 441.7483776 419.7392397 348.9607578 278.0603729 259.3300078 268.154936 259.1238933 258.495499 266.3914657 287.6569528 373.6918491 398.3980244 355.2060232 329.5687067 285.5966181 290.7035188 292.2945767 279.856351 280.442934 283.9244656 314.729752 342.9864182 395.2532998 398.9381327 436.1401213 417.2065573 351.1751938 281.4007915 264.2475365 271.6893395 258.489258 255.0554486 261.9334859 285.8072066 369.8280901 399.0148107 351.6414431 327.2233998 279.1895868 277.4295255 272.0008763 276.2402528 273.4103351 264.3551687 293.2766846 328.7645974 384.3265206 391.6106276 429.3734576 407.6444187 342.7328744 275.854184 267.2929221 264.0763325 256.2031651 254.6439479 260.8365853 280.2000505 366.5635005 425.227497 381.5791183 349.5481949 304.2748528 309.188585 311.0223278 303.7095881 300.7216536 299.1320519 325.131201 361.9192939 417.5933885 425.2645464 455.9985292 425.9509309 357.1801516 289.8411481 268.381452 261.0705914 254.2078933 250.739703 259.9249032 281.4964177 368.165243 421.4382412 380.9484249 351.1502258 303.0289495 305.4537548 305.2599979 298.9834001 303.1799207 301.2877834 326.2946042 360.8502896 411.7161072 411.3665029 451.916909 438.5632702 370.4240041 303.193798 269.5020708 265.6417398 248.871374 240.9207223 249.6387791 251.2471179 323.8003839 387.0149837 429.8958572 383.1593311 325.0667534 311.0637795 313.9868706 310.5889267 311.4116467 311.7112102 340.6286732 366.1874257 428.7496102 422.2181766 445.6848758 436.0515925 382.611033 308.2018274 268.294352 273.8324788 259.1361741 255.6903682 265.7909826 271.7162296 332.609974 387.5579071 424.2517382 370.628231 323.5042337 317.8846526 312.3639161 292.2537916 293.1394203 292.0730387 314.004198 338.3354232 398.3267521 402.3037773 438.5543345 414.7973163 361.7626269 297.8879029 282.8340898 262.4419689 255.8130492 252.982273 260.3817311 284.1483568 369.0581047 413.9863639 374.5846402 346.0964038 297.2301168 299.619754 301.2411399 290.670215 288.2170939 287.5528768 314.7127725 350.127197 402.6659764 409.8945311 453.8841876 429.0015905 361.001988 292.7785464 267.1399544 258.091321 251.7031326 246.5174333 255.5243965 272.0650437 359.550537 425.2069863 390.4109355 356.6667564 308.5327805 311.26224 311.5697281 301.5193272 294.1844234 288.2434454 316.5609289 349.6563489 402.1183283 413.8407929 458.6600055 433.3481847 366.2091355 297.4470313 269.3041419 260.9531767 255.1148536 252.13814 260.3715531 282.9228141 368.3801779 413.0803761 369.4723493 338.2247745 287.1320708 286.2599634 287.6986701 280.3452396 278.6364154 277.4395549 308.0678592 349.0163739 402.6675957 408.378938 452.4036081 424.4113042 349.6509869 279.5899693 268.3742373 262.5582683 255.1144927 254.6287751 262.2149669 285.3946744 368.7403906 394.0673942 348.7012907 319.7844281 272.7569528 276.9804995 278.7471113 271.0996789 274.5747405 275.3032459 305.0003048 338.9723265 392.0918425 398.1063345 437.0684068 411.4352177 343.179765 273.6062235 269.4865018 265.6800298 257.4424565 256.0843022 263.4382842 286.5297014 371.6853784 405.4836935 361.3931218 330.0232955 278.8121099 280.5298817 281.6690231 274.0475804 275.5581641 275.8308032 306.798898 341.7306351 393.3189349 397.3020707 436.6765929 412.0889009 345.2324227 275.8712934 263.7713628 275.2851212 256.6434784 255.8836022 262.1744474 273.3250971 338.7689488 354.5162491 389.6908766 343.4689996 289.4631825 282.8000901 283.2690364 272.7993846 271.139607 267.3997367 293.6731817 324.3427342 396.2056841 398.9803691 427.5932075 416.3620749 363.1225246 292.6462872 267.8208395 273.510073 258.1086112 253.9461621 262.5580651 270.1845525 328.7765706 387.1191921 415.3310609 352.8700969 306.5716579 302.6372594 302.691216 284.383167 284.0127503 286.1279021 317.117733 346.0981591 405.4567552 414.1724164 458.9389847 428.6783692 371.0983074 304.3059388 277.0430103 259.0965206 241.4557522 247.6201932 246.0783459 278.6509617 359.0700332 421.332808 376.3346663 343.9129518 293.5059228 297.72291 301.1352121 289.7206932 284.7896708 282.0499217 309.9250327 346.213966 398.9220642 404.4001706 447.4340298 425.1383783 358.4961707 290.9783228 269.268475 260.2375777 246.3161624 249.3838394 251.5229496 284.3798332 365.2346567 411.5184315 363.0751753 325.8967939 274.5538197 277.4711561 278.2873304 270.150736 272.5023077 274.2368504 303.5060678 336.4844539 387.6059705 393.6325644 434.602388 410.3959339 342.9610582 278.8703144 274.4540791 267.357157 259.6270536 256.3736724 262.9524925 287.0020005 368.9815683 420.6844913 376.0169725 343.4730653 292.5476971 290.2000956 286.4811613 276.3161268 277.501691 275.432468 307.5522699 349.5306305 399.4741288 404.9569625 441.148407 418.090416 355.2961307 291.939094 264.969927 256.9435496 241.2961461 245.8567255 243.079714 278.3138907 361.2811463 411.170153 369.1170128 338.7738581 285.9697204 284.4215978 284.3220465 274.1160221 273.6233555 276.8259375 308.6018099 347.6694051 403.6498754 412.3628053 452.5795512 435.4696668 372.073447 305.0116707 245.7729197 243.1623473 208.5264418 225.5160026 227.418254 243.0352785 334.488554 429.7089671 387.50396 356.7458727 305.6403403 303.5163664 302.0893814 292.2856514 289.0333255 287.74724 316.6965915 352.4875813 405.2703512 414.3761964 452.7558717 426.7260343 360.0329614 300.5942284 266.3907807 263.5416905 244.8124832 231.2359335 227.775951 237.0314751 307.057259 341.980407 408.896291 382.3363669 325.7319157 314.3319355 313.6397907 308.6733443 311.5079443 311.5568037 338.5161845 361.8762087 424.5495555 424.1565417 452.8265787 443.9747354 389.8029438 314.156343 261.8789706 275.6386527 246.5506391 252.2624392 238.2390704 265.8315381 314.7400484 389.0752915 421.5637187 364.0051972 319.0779929 315.5077549 310.1856175 291.3508659 291.0973458 290.4579874 320.171822 350.7426836 413.4372638 421.1676743 455.5974256 426.960548 373.514448 308.5025392 269.5816956 255.0475499 232.9619856 238.1006962 225.8693923 267.5514683 347.2007422 423.7760634 380.1279379 348.8282206 298.3254056 297.8836135 295.4809722 290.7441941 299.2034075 293.9277632 313.1122131 348.7510668 401.7552596 409.6478406 447.4884067 421.708104 353.4323168 285.8481231 268.7672704 261.4379417 254.3724867 252.7216749 260.5403445 285.217319 367.9458522 413.4744019 367.1101105 333.7052094 281.5916032 279.1683312 281.5185938 270.0964695 271.0689925 270.5467363 298.3662382 331.6074956 386.0018841 400.3959815 437.3449166 406.5719719 344.1755399 285.3142669 272.8525739 264.4805678 256.2276876 253.172895 260.9596198 286.0614795 371.8794879 407.5037275 362.44365 332.8533714 281.5495583 279.4581699 280.3118113 271.833136 272.1207683 271.1050318 299.9047856 333.1798668 386.1111525 398.8485926 434.5153407 411.4532942 345.4083928 276.3676159 259.2830201 264.6008147 257.0130092 256.4808986 263.0342607 289.8216071 373.9844488 396.0113779 353.2954647 329.5468221 285.2247837 289.5033869 292.3384995 282.8190871 282.4362873 283.0536891 316.2112784 341.0576964 393.2298837 405.8170375 441.0100588 417.7840878 351.707687 281.8368233 248.7495368 265.0705772 259.217295 258.755482 265.7614822 292.2139166 375.463053 397.8681383 353.4657297 326.2551755 279.843985 282.0223873 283.3686245 275.2443563 276.1899923 276.0869832 305.1297111 351.6073663 408.0634663 420.9840928 458.2364201 433.7317181 367.7744299 301.1068969 273.6628648 273.4909971 256.8360224 253.026273 260.8411873 268.1079095 338.0350929 379.7727482 420.2604188 370.9647501 316.1198978 307.2170415 302.3233167 288.4657773 288.5890787 288.5061784 309.7040666 335.3824486 398.6372685 395.6667527 416.084063 406.1094789 353.4416258 279.5576494 268.5097164 279.1968919 262.4905103 259.853287 268.6648777 278.7283342 338.1600526 374.6069902 406.0749252 348.3983659 306.8285441 308.6968911 308.3080529 293.1485071 294.1180366 297.6650193 329.7378217 360.2513125 422.533656 431.9667205 461.4677334 434.2505044 385.570627 321.9156433 280.3980374 253.0787605 248.0455139 241.0640768 252.0931654 273.005795 362.5303394 418.7942963 393.572857 366.5247644 316.5417324 316.3335542 315.5786525 293.6323926 293.4220995 304.2360811 332.8845658 364.8818638 416.5850845 431.1874608 469.8558649 445.1167305 373.3414546 303.4580027 271.5281863 261.100154 254.2464146 250.5352688 261.0042359 287.1646713 373.534091 419.134526 368.9571781 333.1261006 285.0196751 283.3991815 281.5879526 272.9694773 272.6065489 269.3393607 298.8393153 331.7256469 384.3551379 399.0322388 433.5278097 412.845571 347.7705365 284.0094348 272.8859438 266.3542674 256.9198087 250.4212528 257.1071417 277.6293792 363.5290886 420.8873732 370.810474 364.1528244 316.9915286 317.7855912 316.8061639 306.8317464 306.6389637 306.5398837 335.310592 371.4675345 424.8412092 441.0582727 475.177728 449.871722 365.3408198 282.2210022 235.0453915 226.5777266 226.5195797 231.2568504 233.5801326 260.5938808 344.8729294 350.2580034 311.4744033 314.1725859 295.6932781 313.6838377 314.9024251 307.1375845 307.1127997 306.5831548 336.4684121 372.2236938 425.9247852 441.6720205 475.3905089 448.9258069 377.5554501 290.6321706 211.2105709 231.5263012 189.8598327 203.0559975 229.4330582 251.3879783 349.2183327 369.5623663 339.3410652 342.71238 311.1759205 314.8877761 316.7049616 306.9713333 306.5694961 306.2875991 334.9454875 371.8489596 425.3503104 440.7351784 474.8685702 451.2023171 385.1063911 305.0649966 220.3817853 239.7968493 212.7997224 199.029202 187.5488937 208.7223768 309.8474054 319.0624707 380.2331145 382.8666369 315.5780908 321.8451729 321.3884705 311.5075542 310.6870666 310.3304711 340.1148044 368.943402 435.0985998 438.8563435 458.8564004 449.0667458 395.6187632 322.2619726 251.5383067 272.0494496 233.7678658 246.5978945 231.2423996 250.9202503 332.1956948 386.4163079 412.1951977 367.6415564 321.2523415 318.4904423 317.4715701 296.8807989 295.0193779 294.1051551 324.6646931 354.3440915 416.083334 428.3556492 457.386402 429.7157714 377.2775565 312.975554 222.1461751 125.970534 192.4314765 180.1800888 195.2360536 235.7122016 348.2128055 426.1455241 384.6530978 356.7112794 305.8984088 306.4336376 304.6361944 293.5610288 294.5305646 295.7203741 324.3945688 358.6924446 412.8034205 430.7325642 466.0430856 442.4424376 376.80015 308.0032605 202.4888657 143.0809404 195.1873396 193.0951175 196.7919591 237.4338069 342.3959628 420.488491 373.5185107 356.7262832 303.612589 299.0652144 299.9068311 294.2672871 294.8108388 296.5256716 324.7365347 361.6420192 417.6290883 435.0776896 469.8304697 446.0999064 380.592556 299.2442743 222.0956317 177.6973916 189.9986779 215.997815 223.7546487 256.0333719 349.1932068 367.3971548 323.7471495 321.4281487 308.733319 318.216298 316.5890564 306.367515 306.1076251 306.3159903 335.258603 371.7559174 425.8402248 444.3727912 474.0933878 449.2459636 382.4624064 313.1998174 225.837117 196.8837647 191.1795152 194.7621743 200.5710533 218.0127638 355.2505291 407.33284 381.4241647 361.1819849 314.302416 313.2183705 308.4122558 296.9633362 297.4282993 297.0919107 325.0848561 360.0632428 411.8931708 430.0320785 461.1454088 437.8678289 371.3810801 302.0599386 256.7217088 249.9326171 231.5413714 218.5720822 228.6411022 261.592672 370.167864 422.8736617 380.5071272 354.5154321 311.3049047 314.009962 310.1831865 297.4272821 295.6859095 295.7686807 324.9104511 361.5997981 414.6366502 432.2846868 462.8292864 437.8739051 370.5164722 302.1770592 264.792593 267.2932099 240.6655714 245.1636241 234.6694088 259.6169769 325.065599 384.6704307 425.7242848 372.5786213 311.4241258 298.2014174 294.39095 282.3326437 280.8535207 280.6980134 310.5655637 340.3139552 405.5724423 412.4209666 429.2283804 418.0853963 364.2535282 291.2586768 274.3100407 282.737666 265.0068242 263.0229582 267.9636462 281.6755702 343.0212845 368.5345166 399.2428429 340.7131735 293.5637834 289.085296 285.6427352 267.874832 268.6405969 268.4237057 299.9667905 336.0300664 398.2444463 412.9608447 439.2286871 409.1020442 355.0181231 291.4050128 287.1217731 286.1621512 269.060569 266.1703176 266.4406805 281.1372116 341.4776583 381.1817954 413.797537 356.8821878 311.5910756 307.9758859 304.9339008 284.4675919 283.5161427 283.834534 313.7012748 342.0431659 402.3614556 416.3706683 441.9451495 413.2460309 360.5594262 297.2115582 284.7104162 264.2467616 257.8569993 256.0775004 265.3938197 291.4616515 382.5578595 418.1318925 372.4783947 335.146568 279.1490757 277.3118718 277.4592205 268.3168183 268.2149912 267.5759922 296.0459286 330.4937933 383.6491578 403.5274635 431.1159905 406.9564293 340.6690948 273.429868 269.9489068 266.3349704 258.1645917 257.4765848 264.0565109 290.5929888 378.9905728 394.5937479 348.2221836 319.3304608 270.4039885 272.2551572 273.2015249 265.2123218 267.4024322 270.7417597 306.5567874 350.5929436 403.4617741 424.1389505 451.5132438 426.1694294 358.4661555 290.4287006 274.9308319 266.0550378 258.1585453 252.0035623 256.306278 283.3429094 375.1094573 418.5971243 375.7223625 346.3154174 297.3212467 298.3549265 298.3046919 289.9735588 291.7266748 294.650913 326.8585884 365.3607479 419.9957025 442.0440287 470.8873704 448.4378149 383.3500338 315.8637538 262.2929701 253.9440613 248.9694679 242.5418444 245.5017783 270.7473443 365.2493795 403.3812311 351.4404259 335.2488544 293.6720074 305.6494084 316.1454244 305.4004954 305.5536564 306.7845415 336.6209249 372.1758245 425.9744524 440.5905751 454.7913468 419.9427286 342.4338664 256.9339506 201.1228223 243.7222126 210.7824144 215.5492471 225.2124655 239.4755734 319.9166174 268.5613284 296.1974695 276.9273393 256.8274777 278.7174112 302.2609575 310.950753 311.7882005 311.8134356 341.318916 369.2295436 435.112085 427.7000249 425.2711613 407.4602008 345.0623943 260.3274556 208.8324883 213.7645502 185.7590976 224.83135 228.2714822 242.0464916 306.1455976 360.0946678 392.4780787 338.8243734 296.0064396 294.3796449 296.8148328 279.6257266 281.0054393 281.8373472 312.3680099 341.249337 403.3221499 421.2923196 444.2561337 415.3108715 361.8821632 299.6421736 233.149055 214.9821781 212.1510277 196.5269843 211.0931965 228.4277507 340.4353758 414.1652929 374.0160283 346.3845675 298.3701074 299.3837749 299.1012244 290.2262124 292.0064083 293.4973036 323.0391165 358.0223871 410.1189558 433.9838178 458.7512544 433.3697761 368.955649 303.99778 197.4220608 188.1579604 173.3995804 171.0584425 177.8077425 216.2289394 327.8595794 419.0303225 379.1457823 351.4083791 303.3488397 303.958365 302.8447902 292.9313929 292.9515552 292.9982044 323.0085734 358.0545272 410.7029131 434.5132916 459.2805669 434.2162735 369.1375611 303.0973456 194.8836855 186.595055 174.944912 173.2508525 179.3401229 223.9392174 320.161597 419.535458 379.6183435 351.7878339 303.6143439 303.1562902 300.2101352 288.7752063 287.9249231 288.7129199 318.8939526 353.7184251 405.6751368 429.3332698 453.2962423 427.675942 361.867595 295.0972115 236.8011247 239.5102159 234.7728007 234.7011531 243.4251019 267.7181828 366.5093503 403.4859539 362.0029897 333.4711798 285.5543641 286.4634123 285.390442 275.8766076 275.3116668 274.4387757 303.9004525 339.5388653 391.7904947 415.5603309 441.4814446 420.0094896 358.4035654 295.8050174 217.9386692 213.9603304 183.8832979 185.3749605 195.9431827 230.5288157 319.6776057 421.2349832 380.5500292 352.6171332 304.3020321 305.3923346 304.9067478 294.8238491 294.5793269 294.4818071 324.0381891 358.6104561 411.1149861 434.9752345 459.788794 435.0117458 370.4612557 304.8794096 191.6860213 170.6190054 162.7840533 178.2503293 185.0541153 198.1223916 289.628928 376.6858983 415.4344332 369.3316544 316.8019147 308.819455 308.2160669 298.3636066 298.4264962 298.8236456 329.0208555 356.7475298 421.9906435 432.178967 442.4303293 432.3316751 379.3753509 307.9381813 205.0230365 222.5510646 147.9864272 190.7134903 165.7240294 203.132048 308.2278619 386.1376723 415.0280975 359.3179781 315.7194351 312.5674566 312.8333596 294.2382171 294.5015965 294.388892 324.1084075 352.1682891 415.9236799 432.7854893 452.0572846 423.2723191 370.2232447 307.9393404 215.3154725 205.0873247 153.4709784 175.4889066 188.137572 224.6986265 332.6313569 419.0456878 379.7974145 352.1359545 302.6068457 302.5138819 300.8702377 291.0670948 290.2978233 290.7344412 320.9713287 356.0819714 411.0083805 432.1683603 456.6287417 431.1327046 365.7040352 299.9214044 214.5450649 213.0319917 193.8638285 179.8446403 189.3365943 231.8866936 351.4074624 418.9472975 378.9028157 351.1366369 303.7889433 304.4687277 302.4794858 292.0021698 292.093148 292.7598423 323.1398806 358.067048 413.2166741 432.8314609 457.7585931 433.3750323 363.7209114 264.1925088 147.8006912 156.0481354 176.0722757 163.1728079 145.33936 212.6895881 326.5379542 407.1099743 353.4936798 324.0022456 282.9433122 302.0277107 302.4887468 292.3289837 292.213665 292.5446903 321.6474239 358.694239 414.4715571 436.067495 460.7192235 435.79119 370.6997467 305.0006408 200.510958 142.2340603 193.5250073 142.8023847 169.4375411 216.788956 347.0654953 420.9049533 380.2954296 352.0643601 302.6418692 302.0269539 300.1284135 289.4795006 288.775862 288.1765999 317.6251526 352.387396 407.3435877 428.5614235 452.709498 426.8716401 360.7471216 294.5589445 220.0242265 195.083184 200.0997922 204.0774583 212.491039 230.7026056 346.3564064 411.7430935 371.2777239 343.0130053 295.8798324 297.589351 297.7025609 289.0351328 289.5980612 289.5994843 319.19154 354.9282123 411.8496649 434.2112497 460.2016887 435.5983326 370.8397886 304.8736592 196.9383268 142.5560373 177.8924363 179.6125156 162.1931172 185.1648062 289.34191 363.7483368 415.2239979 370.570031 317.6921288 309.3247661 308.5620877 298.996993 299.7803593 297.5365436 326.8620874 354.0816012 427.8599149 432.6649445 442.8308892 432.8128376 380.1088748 292.1830893 147.5781829 208.9688909 140.9928061 152.3339873 166.1608666 213.01078 297.1456108 357.1544474 413.6494913 361.1737768 317.2406039 313.2645043 312.5533666 293.4865128 293.5988761 293.7515182 323.4785325 350.8678567 417.5202091 431.9935195 451.8403049 423.5192465 370.5252464 300.9013294 191.6807934 154.6073084 142.9991549 179.1599335 167.8602221 194.195118 346.0488644 419.4382759 366.0553959 339.3045217 294.6656298 305.951419 304.6737074 293.8551728 293.9103193 294.6098455 324.3399946 358.6783987 416.8899762 435.5916441 460.5538502 435.728772 370.7383501 304.9976245 177.1388515 150.4067589 166.5219096 139.1030097 183.865548 213.2682205 337.3969918 421.9757253 381.4567159 352.9937088 304.6328773 304.8737552 303.9228996 294.3725493 295.3568829 296.1363149 325.8252149 360.6425199 418.5216651 436.5553087 460.8241653 435.535479 370.7438042 304.8408699 192.3341271 183.7189593 172.2116798 170.345383 176.593793 221.4583065 322.6107352 420.1435473 379.3143475 352.3927125 304.8468824 305.8177577 304.9304923 294.7568071 295.0537621 295.5481288 325.0890558 359.7004461 416.9999003 435.4691579 460.37488 435.4894351 370.276077 304.5044458 190.4522994 146.4896276 178.3036735 181.4604736 187.2515344 203.5641261 321.828536 419.4336545 378.7043748 349.8025878 300.6813241 299.581434 298.2825218 287.7612516 286.4919034 285.748899 315.0717227 349.9385168 406.9987701 424.5788567 449.2435353 424.6761918 359.9191194 295.0618799 227.5927375 230.2103402 204.7112178 213.3342449 230.9420638 265.6672687 364.1619776 407.6114198 367.3743578 338.0983803 290.2240896 291.5166859 290.5364342 280.7735525 281.4891033 282.5996846 314.024744 350.4612491 411.5377098 427.1074181 452.3352396 428.3416537 364.5565177 298.9085369 214.6967167 220.949866 187.1854268 199.3830155 210.7944178 222.4200204 295.8125803 370.4323271 409.1559057 363.1509713 311.3389662 303.7197274 303.4323385 293.9760347 293.5990012 292.9276665 322.1880282 350.0998661 424.5868289 427.4317707 438.2008184 428.2400643 375.4541972 304.0162971 202.5409821 158.1270036 158.3829571 190.0165539 164.3694213 190.2767541 311.713251 383.7284762 413.1853215 357.4153579 314.4276591 310.1113436 308.120566 288.6736257 288.5566854 289.8228122 320.6918995 348.5349767 416.796102 427.3115442 447.2762424 419.9060057 368.2556209 305.7451473 202.5860749 160.0577608 180.0157825 182.8246428 180.6448269 218.6659488 345.9561845 413.3869827 372.8267388 345.228495 297.1971643 298.3124453 297.8983733 288.4343648 288.4943763 287.8468884 316.8751752 352.2315922 413.1437153 428.9400484 454.1220092 430.3341658 366.5741017 301.8516148 194.6192856 131.2140955 176.6038996 178.5279523 162.3772167 202.2031113 329.8589459 419.5302451 380.4006795 353.2943788 304.85949 307.0895226 306.0405147 296.0010089 295.4277802 295.701825 325.1311337 359.1860559 419.5417703 434.3696405 459.2631228 435.1216623 369.5184408 274.2702613 136.6557188 157.7128235 156.3488793 177.1254552 162.288195 200.6959032 329.1458155 418.109509 363.2280824 343.8923628 303.1903845 304.5427999 302.995955 292.8175042 293.3938146 293.990285 324.3579503 358.8128498 420.0677171 436.4795226 461.2643946 436.5194827 367.928052 268.1668894 138.6093576 148.9383661 179.8896518 160.4587877 145.6458062 202.2457188 344.046258 416.931827 361.7740958 340.5434577 298.9856431 307.2000453 305.9634789 290.9425353 294.1865859 294.3099026 323.4437264 357.7982742 421.7999693 434.9570639 459.7283312 434.3628315 371.4143665 273.2386045 139.226103 148.9058215 180.4004478 160.7590534 146.4465906 203.1921891 347.7339112 416.6751382 354.7667897 317.6815864 273.615863 296.0630458 305.5483096 291.3663628 293.0051892 293.1944363 322.7280291 357.2220791 421.4009198 434.1648404 459.0930809 434.9305942 371.5075903 272.3457015 139.2414153 159.7464664 180.4727437 141.9573811 165.6161103 198.5625151 294.6572611 344.8893104 411.4013582 360.4386164 283.7383343 297.713647 307.6344077 297.6847615 297.3282281 297.2638695 327.488742 355.0139357 434.1340896 432.8517742 442.9629836 432.9694095 380.1677601 294.2520963 148.0881015 174.3282019 161.7276059 163.1127589 188.7250497 157.3132553 312.3001524 350.3089289 411.3745905 360.6259726 316.5024928 312.6800782 312.0295499 293.2656204 293.9572446 294.7040137 325.2582726 353.5625841 425.7121232 434.141127 453.4616013 424.6709784 371.4015652 308.9556175 206.07114 170.874046 164.0940998 176.027633 176.3044028 195.2304415 301.2070598 386.0494444 415.4271967 359.0251382 314.9665959 311.2260841 310.6902892 292.1775274 292.7919175 293.3863061 321.3393714 349.4917371 421.9277726 430.4662152 450.0061992 421.757458 368.9366559 276.0845915 163.0561805 159.0683516 179.9612053 141.6521613 192.548331 159.1406731 351.0242946 404.2582617 343.7103171 324.5797347 278.7527542 285.5438924 295.3308595 292.1065025 292.0494182 292.3328316 313.1281841 339.7129483 415.487015 423.8363009 452.2495084 434.5317612 357.0654167 265.0537103 142.7040788 152.1080015 184.2488523 159.3188181 148.914491 216.8394395 352.3199329 412.7369994 371.7656333 344.4615339 297.3626638 298.6365167 297.7187991 288.0417046 289.2558266 291.7799119 324.1896519 359.9570577 426.418973 436.4197487 461.1090861 436.2657899 364.8558411 273.0102085 136.491451 143.1698412 177.1840277 157.1906796 142.4745424 199.9321039 346.1063906 410.0686354 353.78793 325.8984186 277.9999962 292.2274447 304.1494745 291.6167046 288.4111183 290.2696605 326.2660584 356.4944302 423.7642865 420.6657616 443.2999527 431.797756 345.9049872 248.1194406 134.6959815 141.5403855 139.2984508 182.179116 124.5653797 200.6912099 339.6901541 400.9144191 327.1779679 311.1748222 261.0802933 259.6963138 262.4237498 250.7739946 251.2234977 251.6833302 273.1727749 305.9871532 384.5142838 394.1568598 423.7669202 412.7565867 330.5220562 235.4929071 137.7071281 150.190734 135.9766145 137.3815296 146.8163079 208.5903649 282.1545506 311.0521342 383.7164466 345.6800194 278.7838902 271.835355 273.6100139 273.4882379 279.0827322 279.1900123 310.0765734 328.2429528 401.1164406 401.3800888 422.2139465 420.6465413 356.2319011 259.055166 147.9492097 170.2902275 156.3881128 157.7030814 167.1044877 182.0942474 314.6103425 339.0306451 395.8194042 337.3219974 273.7101455 261.3459681 256.0008534 235.4484852 248.1234402 258.1869556 289.4821983 312.8511386 393.4592527 405.629481 431.1059209 404.1251886 346.0739766 258.8673549 150.0577159 144.6997486 142.1527756 156.2771825 163.2689401 212.8332904 326.7941402 406.7008376 348.1990763 323.8090184 296.4434055 304.6630074 303.1471984 292.8101835 292.2276382 292.2856416 322.5495411 357.9863353 424.8142333 435.1050678 460.4138286 436.3126058 371.4641791 305.6736223 194.0599091 153.2433791 186.1316543 187.7657992 180.3135769 217.8090346 326.6406097 424.3487075 380.5654179 350.9129353 301.3701938 301.6834501 300.4578185 291.0582837 290.0804481 288.2066314 317.2874666 353.1457352 420.4772619 430.6087435 455.0645592 429.6075336 364.3101867 298.3657299 196.7447138 173.3779035 174.3967612 188.6097513 194.8246779 237.3005518 344.7281227 413.7363367 371.4265909 342.8292007 294.2471337 295.0946012 294.6571675 285.3580529 284.6631959 283.5116001 312.5752928 348.663391 419.8943709 429.0145281 455.1394092 431.182877 367.0388405 302.050475 197.198559 135.00124 179.1219697 178.7061286 173.3739872 212.0466691 331.2907059 422.5207648 380.3687692 352.8995529 303.3550094 303.5599271 302.6623947 293.1527584 293.2414033 293.4413632 323.7354294 358.7187928 428.3186671 435.8532205 460.540528 435.9323368 371.5241861 306.3113011 198.4492427 139.2943794 189.8954336 121.5495864 183.3433967 202.7934703 339.9033039 416.9114243 346.7974121 326.2805321 277.2987415 285.5008903 294.626915 292.7481711 291.1745858 291.7130385 316.3230252 343.7369554 419.5269564 420.7017849 443.4400342 429.2371487 343.5777099 246.9811779 141.8676192 157.7620019 144.9359118 184.7288556 127.6395177 196.7097032 298.9411238 340.3262789 405.379988 351.2637522 282.0513011 270.3133093 275.4595042 288.8652255 302.5601226 302.4141002 331.7613006 357.2591017 439.6288583 433.657959 443.9651474 434.0038261 371.9482667 268.9489745 139.6176562 163.2263371 150.6900047 152.825693 162.4395273 177.5232295 311.2758906 337.9028157 389.3689719 347.8167063 290.4223089 289.1157648 290.4267555 269.6495027 268.8626128 269.1610909 291.2091002 307.9688543 387.2798199 400.9340882 430.3814857 403.0124871 342.613013 254.0645501 153.5695016 143.8706264 138.806031 139.717633 148.5457141 210.6674608 331.0090307 390.2414761 333.1325487 309.8141417 262.8689527 268.6144034 275.3991636 265.9636357 268.4901699 264.7455969 284.8542274 312.4413996 391.0993396 400.5870159 427.8373237 413.5458402 332.0668659 237.5992354 128.7330331 132.7581981 144.9874598 142.0552425 149.6331286 185.069311 349.9443808 377.6773789 324.1550495 294.6981959 248.3136131 247.3341395 242.1802073 231.26734 234.3381636 232.5321732 268.8971505 300.7860414 379.8584023 385.2570479 422.7016815 412.6153636 330.9458606 248.9865076 131.526155 136.3220574 133.8142488 136.8024149 159.7575166 192.422906 342.4470085 400.042175 333.515824 291.0993121 227.5707686 232.6765803 277.0327352 294.2877592 292.4108463 292.1558115 321.6869991 359.9337906 427.8653357 436.5285186 443.7329229 411.3125692 329.1420895 232.2323635 126.118333 128.3036712 125.3897899 128.293651 152.5973511 189.5140825 339.3970869 374.8423921 320.0336011 286.7598863 228.8334913 222.9108763 218.82363 211.6607656 208.129426 206.0876184 233.8097699 276.5262259 361.6685514 374.899663 404.9258011 393.8327742 313.2579319 221.3962149 130.624777 130.0202659 125.5175815 127.9223415 139.0728088 176.2742252 345.1813444 373.694257 318.1096487 286.9345341 237.2464044 242.5838847 245.3337519 237.2222403 246.3018775 249.3884698 272.7501444 302.8542888 378.9053258 388.8845372 418.0467718 406.8725231 332.7480958 233.5563184 136.1614425 148.7497115 134.9136768 136.8343958 146.7774359 202.4419571 290.4964505 324.0904501 385.0739867 331.4930898 252.7283214 235.1983853 230.5578064 219.1029412 219.4217103 219.45793 246.2562033 280.2086503 372.434285 381.1130141 404.4330294 391.0796523 325.235779 238.0287301 134.4986465 151.0357748 136.3654418 138.1171531 147.905981 163.7303823 300.6344769 311.2215081 368.0090992 321.6496881 267.1486053 259.3189799 256.8436453 237.3328066 242.6101113 244.2462414 261.854003 283.2304396 363.8156655 378.5926288 408.9449147 383.1729813 324.9963841 239.7760386 148.245754 136.3446975 131.324886 132.7859703 142.2220962 179.0251767 336.1082084 375.941454 320.7455401 285.4707157 224.639496 225.4969947 237.5115616 239.8490551 233.2650928 232.520293 260.7967419 295.8016 372.4313114 383.3136656 418.3533992 402.2664826 320.5602965 227.1409287 134.4731979 134.5905737 129.7714719 131.3129966 141.3415275 178.1901805 334.0344401 375.2103238 323.1586321 299.2371718 254.8000585 262.4903492 271.8524581 269.2164731 266.7819213 273.6557113 300.7020123 332.1167655 404.1603421 408.9417203 433.0742083 421.7386811 341.2660315 242.7310845 139.7411626 144.3450818 140.6037906 142.7299438 197.4027829 156.0134668 347.4942824 412.472902 334.2347798 317.7975389 281.1060317 300.8065549 302.0838417 291.8363837 291.7462742 292.1268201 321.6831756 354.8737288 407.279714 413.4117487 442.442994 429.916246 343.533089 248.7853515 143.0933866 148.7948509 144.2731602 144.7014792 181.5451039 175.77212 340.9445288 393.6945128 343.6074107 329.1044669 291.6613845 303.1754659 301.5961239 291.5132875 291.474247 291.0559606 320.7687657 361.9808947 426.7165514 434.1950768 459.1197715 434.2241645 361.571117 262.317173 148.0397083 154.8044552 150.7983787 187.5061676 131.6724575 204.5780266 341.6819556 409.0908365 347.9442592 331.6238095 301.4723956 302.9855427 301.5651626 291.4144688 291.5283695 291.377591 321.5345563 361.467326 422.8067545 428.2386335 458.8769667 435.0516544 353.0718649 253.9776694 139.9680682 159.0059093 146.6583834 174.9037577 145.4535985 201.7808811 285.5684597 343.7758583 402.905235 348.0026896 268.3123489 247.9319991 242.0407427 232.6711685 232.5006762 229.2127202 255.9981745 290.8864619 378.8697573 389.7673137 412.570712 405.8524123 349.5152923 253.5182403 136.5015745 158.6448622 146.9968474 150.0017278 160.6546735 176.8280214 310.2269797 347.3615272 399.9852609 342.1740333 295.4251705 310.7997771 314.1466432 294.4556779 294.4424362 295.502745 324.751119 337.191406 401.3743184 414.3330929 446.6542404 416.8034998 353.6785345 262.6934639 149.0989293 153.0947956 150.1407529 144.1174691 181.3979723 123.5056797 199.2941192 329.3324541 406.8694007 370.5945162 350.7171533 302.0115182 303.1205458 302.0062972 292.5744959 293.0013499 293.5203532 328.8107719 367.3841117 426.5550337 435.5554706 460.4081919 435.9158911 370.1035681 270.3899381 138.4063102 146.4919138 144.1327359 177.5275586 145.9951844 194.6018355 338.0282142 412.5819697 370.6442178 342.4116921 301.638436 306.2868667 305.6594305 296.7777261 291.1806127 282.6538241 301.9420902 324.9713298 395.7113042 405.8393858 433.6931009 421.7563056 339.1032858 243.9043283 138.1712095 142.4866622 139.0879807 188.0087099 121.5173639 213.7713183 319.2894176 402.7124823 338.7157203 277.9572616 228.9511028 222.6184542 219.5866748 209.1236423 208.5332956 206.6723979 239.4856789 292.3958523 365.2314369 379.797172 411.2754258 401.2290119 321.5039842 227.6344974 131.925767 132.3538823 128.0706124 130.4518748 140.064628 176.8490262 337.5016941 390.0291314 344.6256317 328.8424567 280.7191485 288.7712821 301.959116 292.5275131 292.4145731 293.223975 318.9849701 350.2479873 417.5997852 417.1905192 439.849332 426.1897956 340.698722 242.8618532 140.1282387 143.958627 139.3692749 141.0768619 151.1421039 210.9638441 328.4164196 403.2625303 355.2175578 345.0087982 302.4012459 302.6855448 301.4918592 294.0870759 294.0555624 295.2641636 316.3804209 356.7810485 405.6072392 419.3200161 439.870364 429.1703087 344.8834712 249.7545632 149.0554508 164.5712923 152.4519785 155.4782745 166.2915017 182.0372866 305.3917131 350.0591777 407.201652 342.0809969 272.5707569 259.6152333 258.0208125 253.7900608 277.4460037 291.5209392 303.7657506 319.5069805 379.9102575 394.0570268 429.0022567 403.9898267 345.4623505 257.3894713 144.595762 158.3986995 146.5083305 149.6371485 160.3537589 176.1251827 302.7968091 343.446944 396.3609205 339.918387 278.1730731 258.0629151 243.7339493 217.0396767 218.9459228 216.4181442 247.1641624 284.0206723 358.5536287 378.0931986 409.3386012 384.5822338 324.9798228 240.5228325 136.0853117 136.222347 131.8459256 133.5135565 143.078582 180.3030363 342.3547185 374.9503596 321.793459 284.0215511 221.7715771 216.1001997 211.4779174 202.7453425 202.3557141 201.1602817 237.1642827 286.2253912 360.06247 377.4684161 409.4625968 405.9813022 322.590519 230.129071 132.3051122 134.4922024 131.4592269 134.5817173 176.1913885 174.1875852 342.6054944 411.9064226 347.1700602 320.7202628 296.3246699 307.5416286 306.6077322 297.717084 297.6087511 297.5990063 335.7446883 378.6924901 430.9204057 437.6872709 462.0571877 437.1754725 372.242416 306.1656971 142.7285871 147.8046106 176.1084254 181.4177652 141.5277469 194.0025854 345.1554236 407.6954097 347.0073137 320.928335 262.5272003 274.0845727 279.8874782 263.8980419 256.9979474 243.8395481 267.9424438 314.3504569 387.7326206 400.6472682 428.1219447 414.5206265 332.575622 237.2061484 138.3279602 139.618784 135.0162066 136.3320235 145.7985163 214.2132871 324.3391785 380.4762946 323.5627437 287.0342919 227.3815361 241.0482298 252.0131821 240.5936223 228.525273 220.7310873 249.5899147 294.090755 364.5543937 378.6250483 409.1662932 398.3909584 321.2820965 231.608747 135.2327591 136.5197938 132.4914425 134.6041766 145.0651849 182.1290193 345.2734626 382.8846887 326.311105 288.2520105 225.2183066 213.9719461 215.6691747 204.8175148 201.1633412 199.5781749 237.8804123 297.2416985 394.0062327 433.8077842 460.9301359 435.0032139 370.2117289 304.5134211 135.7834487 146.2524799 133.6080321 175.787076 164.3757144 158.4172778 317.8465035 376.1866082 415.8796539 369.8372593 315.9871443 308.001169 307.0134803 297.7516668 298.0855676 296.8476282 312.6862535 317.6699168 390.6418298 397.1825189 417.9034357 408.9388713 350.1384378 254.6038035 152.20274 162.57139 148.2957519 149.6359796 159.4253256 174.6664265 307.6468599 330.483306 398.0063102 340.2545139 273.3243552 271.5488613 279.8973599 262.4284668 262.6229835 254.7075088 270.6845545 299.7753839 372.6285329 390.8895838 421.1858148 394.1498904 333.1687908 246.4241328 138.2429293 138.6891903 133.6850884 135.1215491 144.5369296 181.1606033 337.4632062 375.7934315 350.5338499 331.3052206 280.2660938 278.681846 278.1002101 270.9552428 268.4045316 253.4970625 271.3395719 306.4125611 373.8583588 389.8498534 413.6320438 399.4504924 322.2308544 231.1962498 130.9782066 141.6896244 134.2432025 134.794878 144.4962747 181.1132862 329.3076906 365.3015262 310.8765823 280.3419107 220.3362503 209.4882048 203.4813868 191.984689 192.2518622 190.1336817 228.219781 271.5601519 342.3122648 356.4356655 384.7264341 373.5646765 303.155391 214.9622733 125.093261 133.0123225 124.5190601 124.3425451 132.7829304 169.1765067 330.2776423 342.4809476 304.0461874 272.5037983 207.5241565 203.6276682 198.6734201 186.9513156 185.6728544 184.6044678 223.2294776 266.752155 337.022307 353.4949833 383.627974 368.9201268 292.8498912 208.7318729 135.0708334 140.3859577 132.7853334 132.3610064 141.0546582 155.9912589 282.3051845 297.4703929 357.5377647 302.4454326 237.0905848 219.7850866 212.5688488 189.8165098 188.9806083 189.103902 227.9119974 274.002615 341.9669474 359.0817714 390.3608093 364.9107632 312.5837593 232.5708736 126.8924762 127.2107013 123.4612775 126.5237484 137.6800608 174.7131512 329.2093481 382.0463207 326.8024563 287.7001044 234.4334201 237.1966435 233.0293653 223.0925394 224.3355191 215.4145905 247.1122807 290.4186355 361.4117277 375.0000126 404.235273 393.5287053 316.054811 223.7394385 133.321112 141.4392483 127.4746662 129.6845203 139.629454 155.3176367 295.0743864 297.0515493 375.3668248 330.6947365 259.9272364 247.3318539 237.3841883 219.2895935 218.8432158 216.171994 247.0219254 273.2248106 346.9609795 353.5701331 374.063072 366.1575037 310.4071183 221.3281858 141.8984747 142.8323445 125.6816506 126.0018029 134.1761969 148.6824098 240.6581063 271.4783973 340.9362492 323.6091157 286.4318949 285.1797569 268.9829267 243.2247355 232.9183932 218.3748956 239.1581621 261.0501908 329.3649313 343.4093715 368.7136086 335.9104751 283.6051709 205.4708943 147.0250612 133.9080645 123.1519051 121.6648303 129.6898248 165.684677 290.8083108 361.8882783 290.6281457 269.159549 229.1236918 227.6615544 218.8574156 196.0926956 191.9688444 187.4575148 223.2100578 266.2173991 336.6312539 348.3614833 379.6862637 368.751521 294.5920816 208.0040231 121.8892294 116.1153582 113.7816321 122.8126473 132.1747921 168.6877013 324.1933324 353.8007703 300.3323321 266.7021911 205.6899721 199.358307 195.1648948 185.0404236 185.8577141 184.420153 224.1082254 267.5542681 335.2957211 351.080959 381.0449851 375.4382587 297.6274443 208.191736 126.2294969 121.8940327 115.5512998 116.3978862 125.6208731 162.0024351 329.1094233 343.6414228 305.2022696 278.1951214 219.6582557 212.4552173 213.956179 203.9823918 200.9453996 196.2511406 232.117386 276.2674204 348.5041471 362.8981478 391.5086444 379.776072 304.1293041 217.4697891 125.8125188 130.8229324 124.3488277 125.0101603 134.2093537 170.5707705 319.6649263 369.6041512 312.7759969 284.6741378 227.8511416 219.6938501 212.2388291 203.1553008 199.3952019 195.599466 233.4523165 278.4758906 350.7386184 366.0983924 395.7853276 390.5680857 309.8116834 219.2100451 129.8027624 128.9470161 124.1633176 126.0588223 136.5661406 173.9797588 334.5127366 378.5820117 321.389086 277.1441107 214.5940063 206.7117478 203.0732835 193.2786691 192.7508175 192.794429 232.8421168 280.6945387 354.2597655 366.6164622 397.1095237 387.0114426 311.9375861 212.4439074 128.0124124 135.0174315 121.0416134 123.8564999 134.5517704 150.8306103 288.3796783 301.4625298 364.2022043 316.3694709 242.5080296 227.4051201 222.591039 211.4882958 210.5059635 207.1434558 242.3731817 276.8382131 354.4722231 362.2423295 384.0861143 377.621058 320.7596566 230.8655808 143.9199324 150.2897706 134.4810515 135.9307725 145.6135361 161.0604976 290.7503995 307.8373344 368.7252434 316.9567227 256.8035988 249.5990105 237.7089164 208.4488089 204.0370087 199.479483 235.9355905 271.9973184 345.3806554 362.4261915 396.5684651 368.8008052 311.7069396 229.2666088 133.0984998 130.4517685 124.3454682 125.2027328 134.4962707 171.4716278 319.3010678 355.9921571 318.7285403 286.7589003 247.4413373 248.1579429 246.1292689 236.320156 227.758947 216.3500473 246.8372388 283.9050259 351.1317692 366.6598344 397.114168 382.8938184 309.4192927 222.4279194 125.5962801 121.8664931 116.292245 117.8265273 127.8721563 163.6798572 309.5000313 356.142772 308.3405376 274.7975806 211.096707 202.1794511 198.2337718 187.9717625 184.9122491 183.5342546 224.0778028 268.2430117 338.4148824 354.1487694 384.0601451 373.4067999 301.4265901 214.7310851 128.1510235 124.6125606 118.4250116 119.7407549 129.4308641 166.1506128 322.1043698 358.2120369 305.1397748 267.7383482 206.1055318 198.5878555 193.307287 182.8787887 179.9903125 176.9319415 215.3994456 257.5786248 327.0771032 340.1449898 366.7400284 350.144014 278.4060044 198.6522861 127.7860454 118.2193259 109.2331926 108.6895214 116.2998653 150.3983613 272.2664326 351.9955866 284.3051824 254.0545729 219.7151487 219.9566491 199.3916631 180.7368172 190.365756 192.3768978 224.2854559 251.8573742 320.2302309 331.9434287 366.1193613 357.3792903 276.9336664 189.0247518 137.0512092 124.2184428 113.6593817 112.0255609 120.317024 156.4373373 282.7533967 360.9830857 296.8444744 270.8307284 240.6207502 270.2531255 259.6466593 238.9405425 231.5029703 211.4532266 235.9237336 270.0190249 337.3997647 346.9376554 377.5812322 367.1973171 300.4486381 217.752625 131.7331105 132.6882237 115.9910017 117.1241107 126.6773654 141.5603895 230.6086833 351.78126 369.7419058 314.3961371 237.9174679 215.8224057 207.367059 192.7126916 191.8001291 192.8266459 231.0301574 260.8903523 333.5839043 325.3724357 329.962666 324.2210799 277.4412973 191.8508951 145.6420133 140.6025069 119.9923181 118.0348244 125.5658604 139.6014534 220.0320458 289.8004908 351.9653335 290.6278543 235.8359844 231.5037747 224.7813824 206.8885895 206.4324256 208.1980872 221.4240412 251.8737458 323.4925734 338.922646 367.782294 340.658977 286.4099629 199.6990557 137.5817028 122.7957467 111.3280786 109.2477486 116.7741388 152.2881483 278.0491805 352.9467081 295.9358904 273.2755472 223.1351211 226.5234092 230.1196473 221.0118717 213.1862861 199.0017445 223.2223236 269.5113109 340.5158654 346.3677259 378.0010046 367.3526696 281.2650976 189.510244 136.4161092 122.6465943 111.5131565 110.1715852 118.0404614 154.3477492 280.9585374 355.4611442 290.5909775 261.4716518 200.3970045 186.3718463 181.8408344 170.1891281 167.8163777 167.9320194 225.1824212 260.3224164 330.990018 339.4713957 402.6432824 406.1349719 311.2775931 215.1327786 125.72236 117.9645778 110.0905142 110.6830758 119.4297567 154.6904684 277.0960803 405.0655793 315.4816288 268.9264882 205.1375338 197.4762246 190.182206 175.5768668 173.1559511 173.1125728 213.6230536 257.0789293 326.8048913 343.7772097 374.8133099 362.1976768 299.0152968 209.8996766 120.4288305 114.4325402 111.1537576 118.0060996 125.9890158 162.1118096 313.062592 353.3798234 298.5501983 265.4189311 204.0044016 195.0497416 190.7042065 180.9495658 181.7629043 192.2964633 226.3192636 276.2661947 349.7850483 362.720104 394.2361124 388.9512702 311.1927523 218.6353189 124.2253431 124.7400208 121.8880331 124.8036455 135.139331 171.8103277 340.5286297 377.0151988 322.8944471 288.4427925 226.902012 227.4044353 234.4751371 229.1911022 223.2882828 211.6575109 241.3940647 285.0831875 357.5944488 368.7680052 398.9942334 386.4177659 310.2163053 220.8561414 133.9234977 140.5093976 125.5847797 127.0658272 136.0339653 151.665241 281.5360857 301.2666338 369.217184 340.0084545 280.8081275 263.6952056 263.4318861 253.2777817 252.1862764 247.8839172 266.4978573 290.1871442 364.5102621 369.5227044 391.3343795 382.7016955 336.2733507 237.112383 149.0921966 154.5707214 138.6199492 139.3828533 148.4821172 163.7810575 283.3712878 310.8299943 370.2934023 327.5405118 280.1057742 267.7872486 272.9424555 240.4247853 228.3025886 219.4373325 248.5489202 277.1070885 346.7231114 361.3236636 392.9432571 372.8182215 317.3757503 237.1630425 127.1930758 123.2258435 117.5873124 119.213254 128.4585121 164.0568989 309.6123439 360.0975901 307.7712356 273.2817139 211.4210187 201.8029284 196.5792486 184.3113893 179.7022599 177.0821887 219.0077204 262.2985498 334.152633 353.0027201 385.4643777 369.3005346 294.175096 212.0481393 128.2582992 125.8765593 118.797109 119.3817891 128.9116646 165.1457378 320.9953248 362.2958861 302.2371425 267.7725366 205.623465 198.6582611 195.2071857 184.6962503 182.5410612 181.1433037 222.9894511 267.6162062 339.1064845 352.1379771 383.1541649 371.8347265 298.8186339 214.6174917 127.9181446 124.054491 117.8905601 119.0311563 128.2372751 164.3761486 314.790754 356.4654423 301.3185024 266.5198996 204.1734322 197.1453699 194.4315162 185.6425156 183.8628603 182.3227033 222.1853632 268.2955049 338.7159082 352.8095298 382.703043 377.4513249 301.5065787 211.5110198 126.3044713 123.2098369 117.9647646 119.9346159 129.785673 166.6246153 314.1224852 387.1637026 314.9874608 271.9892595 208.2515933 202.0692207 199.9596891 191.3573146 192.6473564 193.2112388 233.7541757 274.4693416 340.5920407 357.3399858 388.0333093 373.6495041 299.6597773 212.9767583 126.3153717 122.954449 117.4731604 118.868483 128.6354208 164.8186711 309.7728127 356.3510562 300.8467885 273.7674944 213.2311133 207.2904353 204.3875459 197.3923287 197.9697246 193.2657505 228.5444685 266.0303077 333.9910926 347.9312537 378.9327261 368.2761941 297.4160143 212.8767232 126.6591037 128.1724749 111.3788487 112.1159586 120.9234483 136.0566155 225.1539504 345.0169601 376.6326999 327.0519442 246.9381792 230.1018588 231.0781346 221.5260742 222.4477452 214.7567808 243.8189971 274.1334336 350.7085807 356.2369181 376.7598834 371.592911 316.2848559 229.7391414 145.9861354 150.3274089 134.4707524 135.3875552 144.3124698 159.2021627 276.6386941 309.8121046 373.8656044 337.4402291 285.0147239 280.0621669 276.6675628 257.0614189 246.3039946 230.7598866 255.8026343 282.0266985 351.9385968 375.3103291 400.4396361 374.774256 320.9190913 239.3139917 148.4529555 155.5143417 140.6212469 142.3996941 152.6354538 168.4064546 299.5984282 336.9378722 380.7493877 312.8960369 246.7786463 233.4234707 226.7240598 208.5011907 193.193798 197.1813604 235.5415693 269.6254189 341.6056741 355.6715218 383.7918227 361.0996017 306.272391 224.6911387 134.1451838 128.6771621 121.6567561 121.2183202 129.811066 165.3848631 317.3189224 309.0449412 271.4370364 257.1744821 217.9273527 227.6402137 239.3022504 241.791069 233.6359894 220.8388898 230.3181358 274.3504933 344.1101764 350.7304319 382.3063108 371.7002408 287.1190509 195.9648881 141.5078858 127.0578779 115.5489718 113.4414011 120.5876616 155.8810844 282.0322143 359.1350554 295.1788594 269.9154793 221.4268135 223.8847948 226.5141344 216.6896783 209.462591 193.2265413 222.910191 272.2830072 344.0421655 350.8406315 382.2245854 371.8181733 287.0528198 195.3448678 141.548587 127.2594069 115.6964696 113.3055501 120.7975271 156.7579992 282.3966582 359.2952248 294.8135426 268.7747219 217.1572181 214.590908 211.1323458 216.6439291 217.104537 187.1543713 218.4708532 267.4412286 339.3768947 346.7456353 379.3580591 367.7785553 282.1329995 189.7474391 136.075293 122.8528353 112.1072284 110.3277699 118.4273664 154.2910823 280.6092548 357.1208796 293.0204211 267.1876325 217.8746555 220.1146418 223.7841488 242.3440951 229.5920942 208.6638108 235.1293997 261.7859716 322.5952367 331.6476802 373.1303953 388.6937426 318.7618092 212.6215285 132.8783621 131.7368286 112.8739921 112.1602436 120.7620377 135.6270395 224.345663 316.5306649 382.4805954 353.5525378 286.9989585 265.9278139 260.0965177 245.4889152 243.5211541 235.2447602 252.0157292 279.6890905 356.1013287 362.5476389 381.1131452 377.6594291 320.4605484 229.9785806 138.4982424 142.4884046 127.0395079 128.6585891 159.5056564 170.2520702 285.6974736 314.0970301 364.4282456 309.9590995 252.3435616 241.9927125 232.7428731 215.7117725 215.4603366 210.9969736 239.4515203 266.9633219 335.6164448 349.5370964 378.1382471 355.8221342 296.9441734 214.3529583 ================================================ FILE: src/pymgrid/data/load/RefBldgLargeOfficeNew2004_v1.3_7.1_5A_USA_IL_CHICAGO-OHARE.csv ================================================ Electricity:Facility [kW](Hourly) 259.5994047 254.9422169 259.2125219 254.9498296 271.4424828 291.6203295 344.7845507 322.2421466 317.9351637 276.94954 232.2942368 228.0401559 232.2662149 228.0199412 232.2298104 228.0062132 323.8808254 364.8792133 369.1616801 340.4861823 346.480453 317.5687737 297.8285541 268.7398949 311.0618492 306.3809705 311.1240833 306.4254368 323.3813646 368.0434289 431.5481955 516.2074327 1053.540619 1014.946697 964.9972808 964.4292017 914.1750608 963.5501266 963.4153792 963.4543642 1055.123382 950.86865 751.6148668 727.166011 577.6894554 553.1536711 349.3569381 299.992179 287.7699824 287.7699824 289.7004496 289.3154446 301.9257744 350.9054012 428.2393602 509.482735 1048.670372 1011.858038 962.8811242 962.8405962 913.0077851 962.7377781 962.6910859 962.6796406 1054.266419 949.9364175 750.6277116 726.2003692 576.8023843 552.3823696 349.3569398 299.9921804 287.769984 287.7699841 287.7699844 287.7699842 301.1503997 351.2904512 427.9569492 509.1222121 1048.482367 1011.895757 962.9785445 962.9038736 913.0568989 963.2448444 962.7442347 962.7568188 1054.501823 950.3846074 751.269862 727.0026012 577.7602871 553.5919157 349.3569411 299.9921819 289.7029281 289.320647 289.7193189 304.6754992 321.1627222 366.32651 428.5224174 513.497888 1052.471728 1015.160055 965.5764727 965.8399753 916.3575218 966.1774958 964.9833779 963.7202758 1055.526321 951.5631376 752.5877409 728.5151853 579.5036691 555.359684 349.3569424 301.5402292 289.7124757 289.3455098 300.4690873 308.5606183 317.3577172 370.2278788 428.5828244 514.5071878 1052.096156 1013.849036 964.0378715 963.6940877 914.0858042 964.2142091 963.0369131 962.9412877 1045.998924 950.2738971 751.0290555 726.6440682 577.231234 552.8469548 349.3569439 299.992185 237.9292618 239.8605186 239.4762096 239.8655992 251.7010065 276.5371332 427.9218751 409.6374308 649.9567547 613.0918804 564.0550324 563.9587664 563.9371931 563.9021886 314.8822524 314.9264605 398.0145126 377.0699502 347.9300494 323.4856535 323.4856536 299.0422658 274.5958551 250.1514593 237.9287588 237.9287588 239.0865988 239.8606083 251.6976195 276.5321745 325.0327236 307.1474915 298.2159629 261.9373907 212.6595298 213.0479719 212.6600672 213.050459 212.6627843 213.0559821 295.7340576 349.8890865 357.1756627 340.8232553 344.2931006 316.4453108 295.4628502 267.6118201 308.6869477 305.2736909 309.7780431 306.8311184 322.897662 368.4804718 429.7887411 516.7804901 1054.697878 1015.897229 965.6363591 964.5532114 914.1603925 963.5860029 963.4870778 963.5981093 1046.757276 951.1351306 751.9403712 727.6425327 578.4356745 554.2492657 349.3569485 301.1510939 289.7091608 289.3259471 301.2342419 308.5368953 317.3438682 370.1795383 428.6979831 512.8074765 1051.530562 1014.070507 964.4015112 964.8044982 914.8687254 965.0960303 963.8954175 963.482398 1046.663108 951.1244462 751.9397729 727.8757959 579.3612776 556.0722545 349.3569496 301.9271964 289.3260356 301.248049 308.556895 305.1689466 320.8679143 366.8420861 428.8732507 516.3353606 1055.424937 1017.548049 966.6842815 965.9117692 915.5695754 964.8107559 964.6143037 964.4586981 1047.181711 951.1906255 751.7553605 727.2060761 577.8766945 553.9224991 349.3569508 300.7654386 289.3186071 289.7174608 297.0061899 305.0905869 320.7842598 366.739019 428.6918189 513.0936296 1052.210135 1015.315736 966.0740737 965.423429 915.2755029 964.6711984 964.2482975 964.2703727 1047.555015 951.9204225 752.6669935 728.271114 579.0539803 555.0180229 349.3569521 301.1529673 289.7146807 289.3304969 298.18069 304.7298786 321.2265978 366.3591409 428.6097231 514.0614485 1051.807134 1013.998422 964.0444406 963.7260565 914.2887571 963.8218464 962.8611028 962.8322717 1045.827289 950.0544777 750.7572228 726.2786095 576.7719234 552.3301061 349.3569538 299.9921944 237.9292706 237.9292707 237.929271 237.9292706 250.1514683 274.5973811 427.4272514 409.0386784 649.4535035 612.7407216 564.1771968 564.5280232 565.7548252 564.9561983 315.206337 314.7202042 397.8701476 377.0102687 347.9300624 323.4856665 323.4856664 299.0422823 274.5958644 251.3083206 239.4729559 239.8610006 239.477664 239.8656868 251.7040871 276.5380943 325.0428852 307.1529723 298.2195457 261.9355547 212.6648445 213.0494181 212.6669871 213.0512243 212.6658769 213.0505514 287.1950756 360.6015861 364.0648649 344.6217025 340.4254815 320.2066089 291.5687216 271.3574262 254.9308133 259.1553688 254.9582044 259.1858886 267.2004954 295.8724432 340.5534836 326.4970889 313.717822 281.2358627 228.0894208 232.2807482 228.0445601 220.7502067 225.7245881 232.2533752 302.5615476 369.0829994 364.8610591 344.6346588 340.4165338 320.1999037 291.5367136 271.3254244 304.7279719 308.9625533 304.7541541 308.9838579 316.9921746 370.5846294 429.8354984 510.6697233 1049.691524 1012.854179 963.9507417 963.7701008 913.9173443 963.5112744 963.4102656 963.5928624 1038.533156 951.8184331 753.1786488 729.2712087 580.3740965 556.5101601 349.3569582 301.5421428 301.2197512 308.5638876 305.1448924 308.6866258 318.2772757 371.7978924 429.1632472 516.6280684 1055.602739 1018.739666 969.7554536 969.2338023 917.6926036 966.6625091 965.6067523 964.8831837 1039.852769 954.0683388 756.7082468 733.313642 583.960772 559.5836919 350.3236455 309.2250615 305.0950371 308.6289822 305.2034528 308.7405054 318.6146371 372.2732544 429.0839727 516.5989693 1055.556491 1018.488494 966.9723507 965.5006251 915.6529814 965.4322372 964.4516829 963.6410542 1038.194449 951.1453122 751.9678839 727.6652462 578.2359654 553.7739615 349.35696 300.3788071 289.7031172 289.3230818 289.712843 289.3341967 301.9418725 364.7247119 428.2632542 509.817145 1048.987084 1012.085666 962.9471882 962.8519569 913.0309954 962.8416331 962.8742858 962.8984895 1037.419529 950.2199226 750.9596354 726.5951317 577.2131342 552.8858929 349.3569615 299.9922018 237.9292779 239.861657 239.4772899 239.8680757 251.7049026 276.5473475 428.1295594 410.4617166 650.512545 613.3922394 564.2339595 564.1424315 564.1186942 564.0593558 315.0167079 315.0690186 389.6253148 377.2544598 347.9300724 323.4856768 323.485677 299.0422953 275.3676288 251.6961276 239.8626497 239.4770587 239.8669805 239.4798683 252.0936367 276.151912 325.432968 306.7677003 298.6169748 261.5539848 213.0584342 212.6663885 217.6600321 227.9911407 232.2216006 228.0106809 306.8302142 365.2281928 371.1186655 342.0649188 346.882324 317.7694509 298.2045096 269.0297989 311.54975 306.7605112 311.6950005 306.843092 323.9930371 368.4824158 430.9867187 517.6694407 1056.151964 1019.073192 969.9913064 969.8791255 919.9381166 968.5992391 967.2095489 966.2867286 1041.287931 954.6743695 756.0164784 732.3808477 583.2986749 558.8710126 350.1306972 301.5460849 308.1558068 304.7260517 309.0299261 304.7889749 321.336155 367.4599431 429.1027171 516.4574584 1055.499024 1017.863819 968.4536449 967.8194676 917.2030381 966.375799 966.0897037 965.7687833 1031.504121 952.6512377 753.271821 728.8821064 579.5060147 555.312617 349.3569649 301.5416971 289.7123998 291.6403945 308.9109673 304.7173285 321.1786099 366.3569508 428.6569442 511.7444534 1050.200776 1012.884082 963.6898522 963.4864269 913.4649489 963.114324 963.024287 963.0119531 1029.008808 950.3851238 751.0863285 726.5382167 577.0326928 552.5869613 349.3569657 299.9922061 287.7700092 287.7700094 287.7700092 288.1562911 301.5365636 350.903103 427.7864619 500.4204225 1048.312345 1011.570295 962.6443652 962.5957424 912.7647833 962.5606366 962.5397708 962.5364881 1028.530459 949.883382 750.5660467 726.1335596 576.670129 552.2421335 349.3569661 299.992207 287.7700103 287.77001 287.7700098 287.77001 299.9922079 349.3584911 427.2649827 500.0669413 1048.123891 1011.42588 982.6396434 989.5058296 947.4634393 969.3150261 962.4735319 962.4743876 1028.457758 949.7976426 750.4727801 747.5741803 604.7659837 552.1044524 349.3569668 299.9922079 237.9292835 237.9292833 237.9292837 237.9292836 250.1514812 274.5974017 427.230501 400.3853242 649.4920438 612.8092832 563.8939361 563.8983806 563.8782623 563.8376007 314.7489973 314.7568989 380.8516643 377.1031315 347.93008 323.4856844 323.4856847 299.0423052 274.595877 252.0825486 239.4751297 239.8640472 239.4777884 239.8677204 251.7025337 276.5392281 325.0379365 298.6115358 298.2197988 261.9391197 212.6571723 213.043445 212.6561403 213.0431738 212.6555982 213.0425932 278.6341668 349.8653867 349.4794363 325.425285 325.0378401 300.9856023 276.1513813 252.0993783 289.3276781 289.7212587 289.3326443 289.7313401 301.5611982 351.3293274 428.3674559 501.0691627 1048.765682 1011.875036 962.8587698 962.8037524 912.9730795 962.7414436 962.6979547 962.763549 1028.800873 950.1880288 750.9180825 726.5292929 577.1418683 552.8583634 349.356969 299.9922096 288.1562121 289.7022666 289.3206293 289.710764 301.5553593 351.3112665 428.1356029 502.6041183 1049.992619 1012.730891 963.5808252 964.7375099 915.1371711 964.4532846 963.0957686 962.8807003 1020.303088 950.1611828 750.8537505 726.4384338 576.9823465 552.6409384 349.3569692 299.9922103 287.7700127 289.7014076 289.318949 289.7156418 301.5532434 358.2209975 428.1412898 502.9610317 1050.490369 1013.291417 963.7796778 964.050932 913.6128517 962.9752073 962.9906527 962.9648835 1020.424599 950.4723496 751.3275701 727.0230317 577.8736729 553.9192562 349.3569696 301.1512262 289.321871 289.713905 289.3410885 293.5693733 320.7719484 366.7245423 428.4427549 504.8550539 1051.81444 1014.444953 965.0875383 965.6258585 916.326893 966.340042 965.1782431 963.5781474 1020.489206 950.4638727 751.2887563 726.9924679 577.6791118 553.4345608 349.35697 299.9922111 289.7021024 289.319483 289.7153818 289.3278144 301.9514466 350.9256468 428.0530723 501.7412896 1049.427321 1012.422349 963.1670275 962.9125364 913.007018 962.7404277 962.6727106 962.6853439 1020.121422 949.9988076 750.6959691 726.294367 576.8494128 552.4494808 349.3569704 299.9922115 237.9292872 238.3156069 239.8612199 239.4773624 252.087852 276.1498694 427.8705757 401.1897842 650.1007695 613.3007056 564.3090488 564.2051344 564.1307699 564.031222 314.8539644 314.895579 372.4427545 377.1993758 347.930085 323.4856894 323.4856897 299.0423118 274.9817583 252.081316 239.4752298 239.8634923 239.4801365 239.8690995 251.7096854 276.5418239 316.5046528 298.615428 298.2341923 261.9487918 212.6766428 213.0595813 212.6726235 213.0585338 212.6735177 213.0588384 270.1085568 349.8825073 349.4994904 325.4451208 325.0670229 312.5140152 295.3694211 267.4850634 308.564419 305.1136173 308.5978479 305.1659336 320.8882799 366.7955889 420.7298143 503.2513608 1050.631594 1013.833708 964.6007606 964.2764574 914.7108477 964.7136552 963.8791594 963.4176409 1021.156284 951.2501297 752.2274514 728.1492523 579.0771922 554.8397452 349.3569717 301.151134 289.7099705 289.3269695 289.7309124 308.5078227 317.3200883 370.1473782 419.99585 503.0497194 1050.705161 1013.76231 964.5729071 964.2879616 914.8440084 965.0340419 964.307374 963.1969833 1020.570243 950.5581347 751.3940511 727.0990121 577.8929461 553.7544444 349.356972 300.3785625 289.7030773 289.3249365 289.7152041 289.339824 317.2868689 370.131354 419.8608719 502.9173676 1050.275751 1013.030299 963.7987962 964.8749327 915.826314 966.1053817 965.2309897 963.3739253 1011.591318 950.1186523 750.8894282 726.5473908 577.1730678 552.8468225 349.3569724 299.992213 287.7700156 289.3141404 289.7037877 289.3221711 301.9327605 350.9192166 419.4118289 501.7902506 1049.42059 1012.264351 963.106771 963.5808646 913.2091929 962.6539477 962.5652556 962.5324706 1011.465273 949.9664073 750.7492191 726.3536629 576.8948091 552.4400113 349.3569724 299.9922134 287.770016 287.7700157 287.7700156 287.7700159 301.1500513 351.2899118 419.037699 500.3423057 1048.433797 1011.625162 963.5007106 963.7498514 914.7976046 965.0474325 965.7909552 964.2072714 1011.417067 949.782511 750.4778216 726.0719753 576.6535412 552.2481906 349.3569726 299.9922137 237.9292887 237.9292886 237.929289 237.9292888 252.0812252 276.1432756 419.0415847 400.9703559 649.9367362 612.9475668 563.8879115 563.856964 564.0274008 564.554751 314.6402779 314.6627213 363.5987327 376.8931699 347.9300877 323.4856916 323.4856917 299.0423148 274.5958822 250.1514864 237.9287796 237.9287796 237.9287797 237.9287796 250.9224253 276.1404879 316.4849233 298.594562 297.8234196 261.1560583 211.1111752 211.1121934 211.112194 211.1137213 211.1121937 211.1111752 259.9999665 349.0847421 349.8566792 325.0272039 325.4147841 300.586959 276.5296436 251.699101 289.7065324 289.3192222 289.7083514 289.3211612 301.9349021 350.9131381 410.7166485 500.4752668 1048.383112 1011.633532 962.6536311 962.603996 912.7882519 962.5805604 962.5419594 962.5309526 1011.443464 949.8955539 750.5762989 726.1295184 576.6448563 552.2073392 349.3569729 299.9922136 287.7700161 287.7700161 287.7700158 287.770016 299.992214 350.5165974 410.482658 500.2270591 1048.153446 1011.392797 962.4913433 962.7944832 915.6028846 966.4322599 965.693005 964.0532036 1011.381573 949.7624308 750.4503275 726.03264 576.585551 552.1550138 349.3569726 299.9922139 287.7700159 287.7700158 287.7700159 287.7700161 299.9922135 349.3585006 410.2920924 500.1837718 1048.276388 1011.572508 962.6735458 962.631681 912.7904612 962.5653366 962.5336606 962.5328584 1011.416907 941.3737552 750.743482 726.3903479 576.9996125 552.6713381 349.3569729 299.9922136 287.7700156 288.9289168 289.3181986 289.7081381 301.5492691 351.3042121 410.7945742 501.8194314 1049.550117 1012.530988 963.5839902 964.8856798 916.0510386 966.3911131 965.5946796 963.7313969 1011.767087 941.7536962 751.153182 726.9281204 577.75031 553.5986301 349.3569728 299.9922135 289.7009874 289.3198197 289.7224807 289.3422459 311.1872628 366.3107129 411.1892834 507.1945628 1053.539246 1015.168118 965.416577 965.9114847 916.3965824 966.3094205 965.2869282 963.6930958 1012.238316 942.1860135 751.5659522 727.242252 577.894402 553.6814025 349.3569724 300.7640221 239.4759586 239.8728032 239.4879325 239.8958135 251.7296488 288.08677 411.0927993 402.9256036 651.5072067 614.1038055 564.6744988 565.604806 566.584966 566.5546689 316.0325771 314.9977367 364.0445212 369.0286255 347.9300868 323.4856914 323.4856913 300.9707968 276.1406915 252.0877596 239.4802527 239.8748885 239.4872031 239.8917676 262.4443028 288.0643031 323.2973101 302.4716614 298.2401911 261.9667174 212.6734289 213.060592 212.6662115 213.0555509 212.6649079 213.0549377 261.5558996 341.3330514 349.4869714 325.4359076 325.0472753 301.003492 276.1657505 252.1217521 239.5045316 258.326886 254.8656155 259.1105855 267.1003694 295.8073718 314.8135779 317.8700934 313.5934916 261.9894646 212.6861933 213.0774273 212.6785658 213.0726694 212.675696 213.0687738 261.565605 350.5494608 364.0809063 344.6440605 340.421104 320.2152187 291.5482751 271.3422978 304.7272027 308.9669465 304.7399451 308.9775012 316.9667783 370.5672471 403.8155192 501.5654741 1049.070068 1012.165202 963.1852286 963.3702074 913.4678435 962.8989266 962.8152653 962.7840967 1011.740548 941.7468588 751.1591907 726.8595502 577.6070242 553.4257194 349.3569715 299.9922127 289.314042 289.7045922 289.3254984 299.6821845 316.9075282 370.5169557 402.8964999 503.4382732 1050.261347 1012.875195 963.4235854 963.0747817 913.082149 962.7622735 962.6765372 962.6138714 1011.497465 941.4518623 750.742408 726.3136732 576.9015973 552.5371633 349.3569714 299.9922126 287.7700142 287.770014 287.7700143 287.7700143 301.5374961 351.2915388 402.1781298 500.6472565 1048.436879 1011.534095 962.564934 962.5570858 912.7481921 962.5852985 962.6019658 962.6106617 1011.52114 932.8779348 750.6647341 726.236086 576.7678609 552.3717408 349.356971 299.9922122 287.7700138 287.7700136 287.770014 287.7700139 301.1503073 350.9038561 402.0265526 500.3979669 1048.431793 1011.748868 962.8210876 962.7688957 912.9302787 962.6965783 962.6546007 962.633515 1011.516461 932.8425998 750.6093602 726.1614981 576.6688696 552.2206842 349.3569706 299.9922118 237.9292863 237.9292861 237.9292865 237.9292864 250.151484 274.5974062 401.8752065 400.5268142 649.5397338 612.7950825 563.8500084 563.8241968 563.814438 563.804974 314.686908 314.7480124 363.6898841 359.85777 347.9300838 323.4856883 323.4856884 299.0423105 274.5958799 250.151484 237.9287772 237.9287771 237.9287772 237.9287772 250.150975 275.7545982 299.010911 297.8227807 296.6665574 259.999964 211.1111729 211.1121901 211.11219 211.1137163 211.1121898 211.1111728 259.999964 330.8412241 349.4685956 325.4104553 325.026522 300.9696489 276.1395903 252.082902 289.3170992 289.7038093 289.3186366 289.7065066 301.5440038 351.2973973 393.6085384 500.3456707 1048.197826 1011.509383 962.5853113 962.5584777 912.7431009 962.5424208 962.5181129 962.523614 1011.435263 932.7879127 750.5677973 726.1221932 576.6343979 552.192038 349.3569693 299.9922102 287.7700122 287.7700119 287.7700117 287.770012 299.9922098 349.3584943 393.2040923 500.0858982 1048.105125 1011.374004 962.7719177 964.505573 915.7454535 966.0745736 965.3466168 963.4226825 1011.319043 932.6768415 750.4747122 726.0849087 576.6619502 552.2327403 349.3569691 299.9922096 287.7700112 287.7700116 287.7700113 287.7700111 299.9922092 349.3584934 393.1566271 499.9879486 1048.069045 1011.395426 962.4800827 962.4601046 912.7078827 963.710583 963.6612165 962.7219419 1011.30164 932.6469806 750.4308679 726.0040446 576.5406129 552.1213475 349.3569681 299.9922093 287.7700107 287.7700105 287.7700108 287.7700108 299.9922083 349.3584922 393.1664665 500.0502374 1048.090726 1011.354613 962.4633855 962.4526327 912.6260456 962.4486228 962.4390833 962.4478297 1011.348271 932.6910646 750.4658335 726.0394955 576.5745056 552.1486374 349.3569677 299.9922083 287.77001 287.7700102 287.7700099 287.7700098 299.992208 350.5164588 393.2932089 500.2706512 1048.193403 1011.437855 963.2670424 965.0671958 915.1007078 965.1940941 964.6119705 963.1102594 1011.387123 924.2983086 750.7218189 726.4124875 577.0221457 552.6648234 349.3569667 299.9922078 237.9292824 239.0869142 239.86274 239.4786593 252.0937519 276.1530486 393.6188072 401.7163682 650.3178662 613.2805209 564.2750882 565.5039582 566.7091796 566.8983177 316.127989 314.6818953 363.5629596 351.211992 347.9300783 323.4856828 323.4856828 299.042303 274.5958754 250.1514801 239.0854687 239.4726383 239.8609485 239.4777665 252.0881843 276.151015 282.7068413 298.2198156 298.5986844 261.5451814 213.0398671 212.6555873 213.041276 212.6566226 213.0401805 212.6551288 261.932597 323.8472817 349.8669615 325.0393371 325.429261 300.6030618 276.5455062 251.7163177 289.7210073 289.3363171 289.7236089 289.3390004 301.9478876 350.9287016 385.3107448 500.6270629 1048.516321 1011.724318 962.7529052 962.6943572 912.8490157 962.6567127 962.6468907 962.6164624 1011.481882 924.2816809 750.6327416 726.2170625 576.7452102 552.3376031 349.356965 299.9922056 287.7700068 287.7700072 287.7700071 287.7700068 300.7643974 350.9032928 384.8811701 500.3423662 1048.361061 1011.631042 962.6865224 962.6490127 912.7986312 962.60025 962.5845791 962.5892888 1011.505146 924.3084685 750.6347202 726.1796903 576.7140428 552.3004356 349.356964 299.9922048 287.7700059 287.7700061 287.7700063 287.7700059 299.9922038 350.9026913 384.8332828 500.2798519 1048.314315 1011.58169 962.6514394 962.5763774 912.7468438 962.5530906 962.5336259 962.5578833 1011.478686 924.2900271 750.6253052 726.1983736 576.754776 552.3188169 349.3569629 299.9922041 287.7700052 287.770005 287.7700053 287.7700054 299.9922028 349.3584835 384.778999 500.2078574 1048.195572 1011.461881 962.5323018 962.501807 912.6601651 962.4580955 962.4632762 962.4706912 1011.373257 924.181411 750.5041566 726.0742774 576.6042209 552.1747063 349.3569623 299.9922029 287.7700045 287.7700044 287.7700042 287.7700043 299.9922023 349.3584819 384.6686697 500.0457569 1048.123237 1011.422017 962.4928361 962.467333 912.6409417 962.4609739 962.4511059 962.4489668 1011.357656 924.1708025 750.489668 726.0578424 576.5857511 552.1626029 349.3569611 299.9922022 237.929276 237.929276 237.9292764 237.9292762 250.1514739 274.9835717 376.2203116 400.4768628 649.5188539 612.8059235 563.8836937 563.8778042 563.8691667 563.8515353 314.7270882 314.7765933 363.7009722 351.3149462 347.9300701 323.4856745 323.4856743 299.0422922 274.5958695 250.1514739 238.7013199 239.4744642 239.8637669 251.7001473 276.5361972 325.0357224 298.6071569 298.2168815 261.9345494 212.6533995 213.0394519 212.6537528 212.2699117 211.4976444 212.6529546 261.541882 298.593979 315.2977128 325.4181401 325.0321914 300.9782636 276.1459438 252.0919831 239.4827651 289.7137443 289.3256656 289.7180645 301.5511079 351.3101927 427.9932082 500.5673031 1048.316411 1011.460468 962.5032907 963.0474192 914.4079678 1004.758176 988.7831266 1002.910478 1037.601501 898.4700033 716.2530321 726.0052328 576.5380068 564.7378207 349.3569583 299.992199 287.7700014 287.7700004 287.77 287.7700001 299.9921982 349.3584755 427.3711992 500.2730326 1048.390704 1011.536766 962.5264769 962.5030732 912.7812722 962.7808434 962.6196531 962.6249312 1011.571768 898.7681502 716.604924 726.4422298 577.1119646 552.876889 349.3569574 299.9921978 287.7700001 288.541812 289.3148872 289.7041896 301.5409207 351.2973307 427.7364231 500.8198762 1048.517026 1011.480177 962.4951248 963.0744662 914.7556877 966.0995379 966.275512 965.187771 1012.235209 898.4343006 716.1997113 725.9667066 576.491447 552.0685248 349.3569558 299.9921969 287.769999 287.7699977 287.769998 287.769998 299.9921955 349.3584718 427.2459221 500.0278332 1048.11645 1011.401298 962.4677462 962.4501985 912.612992 962.4366529 962.4310762 962.4405447 1011.33754 898.5072108 716.3470438 726.1723233 576.7306501 552.3918245 349.356955 299.9921957 287.769998 287.769997 287.7699967 289.702209 301.5405675 351.2994836 419.2346985 501.8411316 1049.312408 1012.127193 962.9575857 963.007275 914.3256192 965.5777965 965.7004143 964.5992791 1011.710732 898.4684528 716.2322995 726.0210386 576.5995151 552.213712 349.3569534 299.9921945 287.7699969 238.3150423 239.8603179 239.4786505 252.0914795 276.158405 419.3072495 401.9336741 650.6512283 613.5458486 564.3674592 564.1867672 564.1761807 564.8044928 315.2410659 314.6967687 363.5863451 325.6101525 313.7553923 323.4856635 323.4856634 299.0422782 275.7520315 252.0814052 239.4759367 239.866775 239.4815067 239.8785947 251.7134998 276.5677648 324.9450885 308.6059808 298.2476837 261.9707117 212.6720475 213.0589679 212.6605518 213.0468288 212.6570075 213.039802 261.5428909 298.5967278 315.3007807 325.4257408 325.0398053 300.9936059 276.1606241 252.1173246 239.5020839 289.7476912 289.3504961 289.7579926 301.5819113 358.250614 419.7820957 501.182098 1048.744797 1011.746743 962.7652647 962.6999318 912.7697181 962.5428232 962.5419172 962.5907121 1011.515738 898.717923 708.0108309 726.3656374 576.9615155 552.525935 349.3569501 299.9921906 287.7699927 287.7699917 287.7699917 288.9283167 301.5380179 351.2916734 419.1434219 500.6581981 1048.570448 1011.762469 962.7415487 962.6711929 912.8174827 962.611133 962.5293902 962.5047115 1011.392228 898.5663773 707.8278997 726.1275224 576.6515091 552.2295974 349.3569483 299.9921894 287.7699918 287.76999 287.76999 287.7699904 299.9921881 349.7447454 419.0235689 500.306512 1048.208825 1011.406723 962.4682764 962.5649996 913.5062963 964.4657855 964.4670505 963.4415851 1011.330261 898.4619265 707.6935311 726.025297 576.5903656 552.183656 349.3569471 299.9921881 287.76999 287.7699885 287.7699889 287.7699889 299.9921863 349.3584571 410.3282745 500.3558796 1048.302204 1011.44451 962.476697 962.4672552 912.6365473 962.6594965 962.4294665 962.4083911 1011.302352 898.4665777 707.7317561 726.08574 576.669533 552.2683346 349.3569458 299.9921867 287.7699886 287.7699871 287.7699875 287.7699874 299.9921849 349.3584548 410.3418959 500.2357017 1048.196655 1011.392127 962.4586145 963.2783925 914.7092801 965.7195118 965.565238 964.2780176 1011.605427 898.4402906 707.6710021 725.9838393 576.5114598 552.0880113 349.3569441 299.9921853 287.7699873 237.9292585 237.9292587 237.9292589 250.1514565 274.5973622 410.2085467 400.4586189 649.4610354 612.7346708 563.8447589 563.8252484 563.8541385 563.9130896 314.8114366 314.7994068 363.704475 325.7143093 305.2117121 323.4856497 323.4856498 299.0422608 274.5958523 250.1514566 237.9292585 239.4740477 239.8619599 239.4778103 252.0866104 276.1473855 308.3346871 298.2171521 298.5992441 261.542839 211.8813453 211.1121559 211.1121559 211.1136645 211.112156 211.1111499 259.9999411 296.6665345 305.2102011 323.4841389 323.4841389 300.1967205 276.1372808 252.0800702 239.4743113 289.702507 289.3181401 289.7048953 301.5416577 351.2943118 410.5294609 500.2541091 1048.261069 1011.530381 962.5914853 962.5632987 912.7356956 962.5308562 962.5108148 962.502273 1011.375491 898.5454035 707.7932473 726.0867868 576.6089266 552.1708453 349.3569394 299.9921807 287.7699829 287.769981 287.769981 287.7699813 299.9921791 349.3584448 401.8683125 500.2449043 1048.149587 1011.387307 962.4591912 962.5756109 913.7406445 964.7538184 964.3230801 963.2627931 1011.308244 898.4305612 707.6441921 725.9541259 576.4784906 552.0589846 349.3569378 299.9921789 287.7699813 287.7699795 287.7699793 287.7699795 299.9921775 349.3584424 401.5312514 499.9677305 1048.080697 1011.361589 970.7245259 1112.52435 1289.676295 1401.469159 1439.37685 1452.688234 1503.603125 1384.499023 1162.29986 1164.493467 1004.336523 974.2146681 349.3569367 299.9921772 287.7699793 287.7699779 287.7699781 287.7699777 299.9921754 349.3584399 489.8752791 574.7210692 1231.80947 1408.769493 1414.938644 1441.025168 1413.731027 1469.071767 1445.618497 1432.736437 1476.379777 1282.682854 908.2498219 811.9116624 639.5074598 657.1855751 349.3569345 299.9921755 287.769978 287.7699761 287.7699759 287.769976 299.9921742 349.358437 503.5762941 651.4360903 1249.681066 1318.892875 1390.232792 1410.304163 1373.187766 1428.490164 1431.699977 1426.487546 1467.320228 1346.259207 1135.97818 932.6099412 576.385303 577.1921656 349.3569329 299.992174 287.7699763 237.9292473 237.9292471 237.9292473 250.1514453 274.5973435 402.3161403 400.2885123 649.4081159 612.7066834 563.792053 563.7710457 563.7516058 563.7431911 314.5801143 314.546201 363.4641521 325.4327396 296.6680299 323.4856337 323.4856337 299.0422402 274.5958409 250.1514452 237.9292471 237.9287449 237.9287449 237.9287449 250.1509427 274.5968405 299.0106111 296.6665252 296.6665252 259.9999317 211.1111405 211.1121415 211.112142 211.1136436 211.1121415 211.1111405 259.9999318 296.6665252 297.4383214 325.0282808 325.4157129 300.5867728 276.5283766 251.6974777 239.8631885 289.3174277 289.7058434 289.3187217 301.9295146 350.9081581 393.4058481 500.1903352 1048.22542 1011.51543 962.5965433 962.5732867 912.7458465 962.5367355 962.5186549 962.5132263 1011.413231 898.5875584 699.2840793 726.1160297 576.6393058 552.1946284 349.3569275 299.9921685 287.769971 287.769969 287.7699687 287.7699688 299.9921669 349.3584253 393.141287 500.047418 1048.125632 1011.390045 962.458319 962.4625234 912.6380001 962.4486995 962.4328174 962.4316142 1011.330351 898.4900342 699.1918339 726.0367997 576.566365 552.1315864 349.3569257 299.9921667 287.7699692 287.7699671 287.7699669 287.7699669 299.992165 349.3584223 393.0770422 499.9778644 1048.056931 1011.334717 962.4208026 962.4401407 912.7452974 1008.772067 990.7331184 962.3848547 1011.269995 898.4173791 699.072005 725.9347799 576.4660091 552.0491221 349.3569241 299.9921648 287.769967 287.7699654 287.7699653 287.769965 299.9921628 349.3584197 392.994114 499.9612889 1048.054841 1011.324301 962.431408 962.4210105 912.5939078 962.4157919 962.3904069 962.3974369 1011.300969 898.4553482 699.121502 725.9591686 576.491211 552.0696384 349.3569219 299.9921631 287.7699652 287.769963 287.769963 287.7699632 299.9921612 349.3584162 393.111432 500.2752971 1048.385684 1011.615108 962.5995501 962.5653421 912.6761457 962.5204691 962.6169652 962.4097024 1011.29749 898.4412614 699.1065587 717.4248132 576.5122904 552.097792 349.3569203 299.9921612 287.7699631 237.929234 237.9292341 237.9292343 250.1514319 274.5973225 393.2224033 400.4943791 649.5029331 612.7435737 563.7933352 563.7891204 563.7648058 563.7568656 314.5946214 314.6180513 363.499946 338.1123148 296.6680108 314.9419491 323.4856154 299.0422164 274.5958276 250.1514319 237.9292341 237.9287343 237.9287342 237.9287342 251.3088357 276.528188 282.3108468 298.595333 297.0519692 259.999921 211.1111298 211.1121256 211.1121257 211.1136193 211.1121256 211.1111299 259.999921 296.6665145 296.6665145 314.9404522 323.4841188 299.0412169 274.5953275 250.150932 237.9287342 287.7699571 287.7699574 287.7699572 299.9921548 349.3584068 384.5187382 499.9933324 1048.080766 1017.903384 962.4569418 993.5908491 1049.246104 1210.620958 1247.244321 1306.975491 1352.741419 1194.351576 893.7514502 883.5861911 764.0512138 751.7944008 349.356914 299.9921548 287.7699572 287.7699553 287.7699551 287.7699549 299.9921528 349.3584036 467.8685116 499.8771372 1120.63707 1159.646041 1109.071224 1120.32931 1059.248534 1088.607861 1018.826421 962.3779029 1011.27503 898.4329877 699.1060534 717.3990532 576.4804837 552.0622317 349.356912 299.9921528 287.7699551 287.7699531 287.769953 287.7699528 299.9921506 349.3584002 384.5487131 499.969561 1048.063288 1011.344571 962.4273562 962.4233019 912.988504 963.6850033 963.170727 962.4857947 1011.277115 898.4283051 699.0870099 717.3944795 576.4952532 552.0868039 349.3569101 299.9921508 287.7699528 287.7699507 287.7699509 287.769951 299.9921486 349.3583967 384.7379005 500.0756337 1048.111897 1011.371853 962.4357362 962.4206875 912.7477664 963.4674814 963.0995492 962.4148012 1011.606701 898.9963837 699.0952099 717.3869574 576.4831079 552.0743401 349.3569076 299.9921485 287.7699508 287.7699488 287.7699487 287.7699485 299.9921463 349.3583933 384.7738239 512.6006729 1048.049679 1011.326877 962.4131882 962.5633891 913.6772927 1035.693337 1019.431679 962.930349 1011.301534 898.4129886 699.0685252 717.3828374 576.4610696 552.0417861 349.3569053 299.9921463 287.7699487 237.9292195 237.9292193 237.9292192 250.151417 274.5972991 375.9982393 400.27668 649.419889 619.2766297 563.8232861 563.7994372 563.7774407 563.7583557 334.226289 321.1595703 363.5190087 332.0030615 296.6679904 314.9419278 323.4855946 299.04219 274.5958127 250.1514173 237.9292194 237.9287222 237.9287222 237.9287222 250.15092 274.5968001 272.2221068 296.6665024 296.6665024 271.0283703 253.7178005 211.112108 211.1121073 211.1135926 211.1121079 259.9073302 556.76552 597.8438202 426.0478922 306.3967735 323.4841068 299.0411957 274.5953155 250.1509199 237.9287222 287.7699418 287.7699421 287.7699421 299.9921397 349.3583824 375.8808107 499.9463334 1048.037414 1011.33226 962.4347331 962.4331136 912.5953748 962.4163237 962.4009255 996.1146762 1011.307217 898.469791 699.1572413 708.915346 576.5310854 552.0996219 349.356899 299.9921397 287.7699418 287.7699397 287.7699399 287.7699398 299.9921374 349.3583789 376.0362282 499.9975279 1048.074754 1011.352626 962.4281238 962.4210165 912.5847308 962.4113379 962.3941844 962.3775447 1011.275586 898.4244586 699.0880496 708.8724008 576.5172855 552.1016355 349.3568968 299.9921376 287.7699396 287.7699372 287.7699373 287.7699376 299.9921353 349.3583747 378.5295883 499.9699001 1048.043962 1011.328131 962.4187004 962.416392 912.7640774 963.2818355 962.8620663 962.3844118 1051.205784 931.6941208 699.0663625 708.8176137 576.4467561 552.0349677 349.3568941 299.992135 287.7699373 287.7699352 287.7699352 287.7699349 299.9921326 349.3583712 376.1439119 499.8866424 1047.994521 1011.301029 962.403679 1102.265637 1130.505316 1209.128516 1173.53354 1136.66366 1182.050462 1046.826806 780.8422644 708.8115844 576.4167686 564.6135144 349.3568917 299.9921326 287.769935 287.7699327 287.7699326 287.7699325 299.9921303 340.8147009 376.4490948 499.8602858 1048.000966 1011.321487 962.4207189 962.4178334 912.5854573 962.4100515 1012.003148 1028.241889 1044.112268 898.4424689 699.1076145 708.8487713 576.4558663 552.0275017 349.3568896 299.9921303 287.7699325 237.9292032 237.9292034 237.9292034 250.1514009 266.0536065 376.0207182 400.1585163 649.2957511 612.5980579 563.6886785 563.684028 563.6840449 563.6832974 314.4888835 314.4833769 363.3835138 325.312896 296.6679679 306.3982383 323.4855724 299.0421609 274.5957963 250.1514007 237.9292031 237.928709 237.9287091 237.9287091 250.1509069 266.0531109 272.2220937 296.6664893 309.2224367 309.4566188 280.9438235 211.1120876 211.1120881 211.1135632 211.112088 214.9298212 279.2880495 307.7125569 306.2132774 306.3967603 323.4840937 299.0411728 274.5953025 250.1509069 237.9287091 287.7699253 287.7699255 287.7699255 299.9921231 340.8146894 375.8380372 499.861316 1048.034604 1011.482743 962.4169702 962.4008838 912.5655705 962.4010674 962.4529904 962.3735246 1011.268015 898.4082905 699.0605411 708.8037042 576.4244642 552.0066408 349.3568825 299.9921233 287.7699253 287.7699227 287.7699228 287.7699229 299.9921208 340.814685 376.2487421 499.900014 1048.011013 1011.322283 962.427094 962.4227257 912.5967174 962.4210368 962.4111786 962.4128623 1011.303272 898.4558681 699.1236868 700.3338292 576.492216 552.0597651 349.3568796 299.9921205 287.7699228 287.7699204 287.7699204 287.7699203 299.992118 340.8146813 376.2061131 499.8982425 1048.010947 1011.320446 962.4152601 962.4023657 1065.150485 1136.739922 1127.453386 1065.485917 1011.608502 899.4386678 831.1640935 802.0557913 771.9761524 797.831135 349.356877 299.992118 287.7699203 287.769918 287.7699179 287.7699177 299.9921154 340.8146773 376.4979992 682.8410549 1450.274101 1504.030689 1526.329813 1544.65632 1484.723969 1532.370224 1533.902616 1529.565333 1576.722126 1474.464884 1286.645784 1294.813358 1167.753661 1131.386402 349.356875 299.9921156 287.7699177 287.7699151 287.7699152 287.7699154 299.9921132 332.2710061 891.2149628 1033.457837 1618.544718 1583.337151 1527.724961 1523.869543 1480.504242 1538.627406 1477.935189 1291.059373 1058.198544 902.1831518 699.2400214 700.2745268 576.3556308 551.925592 349.3568719 299.9921129 287.7699152 237.9291857 237.9291857 237.9291856 250.1513833 257.5099117 377.8641667 400.1621442 649.3200033 612.6405297 563.7316199 563.7262507 563.7210908 563.7238413 314.5672908 314.589625 363.5022562 325.4460148 296.6679435 297.8545472 323.4855476 299.0421293 274.5957788 250.1513832 237.9291856 237.9286949 237.9286949 237.9286949 250.1508928 257.5094195 272.2220796 296.6664751 296.6664751 259.9998817 211.1110905 211.1120668 211.1120664 211.1135313 211.1120667 211.1110905 259.9998816 296.6664751 296.6664751 297.8530795 323.4840795 299.0411487 274.5952883 250.1508927 237.9286948 287.7699074 288.5420693 289.3143295 301.9244413 333.8173086 437.1668619 500.0038763 1048.077836 1011.397638 962.4382817 962.4279481 912.5922893 1027.616288 1068.47199 989.6808551 1011.26934 898.4112688 699.0738468 700.2955894 576.4849458 552.0670576 349.3568646 299.9921054 287.7699074 287.7699046 287.7699046 287.7699047 299.9921027 332.2709891 376.0768518 499.8982834 1048.018805 1011.449402 962.4224462 962.4081807 972.8507978 1114.27591 1217.756819 1312.973597 1396.699866 1273.382199 1014.307651 899.3196196 670.5705362 577.205866 349.3568619 299.9921027 287.7699048 287.769902 287.7699019 287.7699019 299.9920998 332.2709853 376.4674153 499.8411018 1047.96619 1011.287856 962.3903912 1061.556841 1075.713755 1206.313296 1207.159443 1130.71353 1062.430207 898.4040046 699.0605773 700.2649772 576.4027752 551.9752742 349.3568587 299.9920996 287.769902 287.7698994 287.7698994 287.7698995 299.9920971 332.2709809 376.7128003 499.8201081 1048.602538 1012.298208 962.6709224 962.3986312 912.5646281 962.7823982 963.0975202 963.4763916 1012.784254 898.4027219 699.0455699 691.7060779 576.3919616 551.9626595 349.3568561 299.992097 287.7698995 287.7698967 287.7698967 287.7698966 299.9920943 332.2709767 377.0630669 499.8621348 1048.011113 1011.328928 962.4322697 962.4300996 912.6016212 962.4260828 962.4360003 962.7157434 1011.890428 898.4611824 699.1264296 691.7877879 576.48502 552.0518966 349.3568532 299.9920942 287.7698965 237.9291667 237.9291669 237.9291669 250.1513646 248.9662146 376.1616069 400.2029321 649.2974926 695.4393447 747.3420649 788.2477777 837.9546973 885.156261 659.555762 640.7322704 671.8596515 631.1973357 296.6679171 289.3108542 323.4855216 299.0420951 274.5957603 250.1513646 237.9291668 237.9286798 237.9286798 237.9286798 250.1508776 248.9657258 272.2220644 296.66646 296.66646 316.8902837 331.9451707 211.1120437 211.1120444 211.1134968 211.112044 392.3053299 629.5786147 618.214989 606.6285796 371.5988682 323.4840643 299.0411217 274.5952731 250.1508775 237.9286797 287.7698882 287.7698882 287.7698881 299.9920861 323.7272966 375.8790967 573.561169 1269.654794 1344.026844 1392.274025 1413.490372 1353.025986 1408.673833 1403.973369 1396.03403 1445.073442 1316.680845 1116.895148 1082.011841 794.5076656 716.144414 349.3568452 299.9920861 287.7698885 287.7698856 287.7698856 287.7698855 299.9920832 323.7272922 491.7564671 680.7751192 1322.362098 1424.674755 1437.192794 1439.086976 1385.501842 1437.975574 1440.807847 1441.92357 1489.252967 1371.726658 1138.746506 1046.251439 879.5478955 802.3678304 349.3568427 299.9920836 287.7698855 287.7698826 287.7698826 287.7698826 299.9920805 323.7272876 597.679734 815.0939468 1470.303611 1455.7296 1416.405338 1406.380081 1355.110095 1408.365828 1413.14006 1414.687624 1469.312504 1348.078353 1132.419699 1113.467627 990.7564919 911.6561212 349.3568398 299.9920806 287.7698826 287.7698798 287.7698797 287.7698797 299.9920776 323.7272831 448.0888734 643.4996129 1261.766538 1293.855872 1332.611277 1355.461674 1284.478987 1376.578515 1408.175896 1418.034422 1463.949707 1346.833488 1148.449466 1120.347308 979.4985298 826.1971557 349.3568367 299.9920776 287.7698798 287.7698771 287.7698771 287.769877 299.9920747 323.7272782 378.5122513 619.4649477 1301.899398 1420.910828 1422.330381 1442.402931 1387.807465 1440.992092 1460.289148 1457.817916 1519.997238 1404.216252 1164.221208 1134.258804 1002.85158 914.3757608 349.356834 299.9920749 287.7698771 237.9291471 237.9291469 237.9291469 250.1513447 248.9661834 378.1198323 400.0381301 649.2189089 764.2183238 809.1152735 847.1912263 904.2580834 960.2430462 766.5955203 789.3555555 854.7765149 820.7353158 549.88859 280.7671598 323.4854934 299.0420598 274.5957402 250.1513447 237.9291468 237.9286638 237.9286639 237.9286638 250.1508617 240.4220311 272.2220484 296.6664441 296.6664441 259.9998507 211.1110595 211.1120199 211.1120201 211.1134607 211.1120203 211.1110593 259.9998505 296.6664439 296.666444 280.7657151 323.4840485 299.041094 274.5952572 250.1508616 237.9286638 287.7698684 287.7698684 287.7698684 299.9920661 315.1835975 377.9662992 499.8468231 1047.995741 1011.316339 962.5613817 963.0270004 912.5864783 963.4031351 963.7669273 964.0087954 1013.088685 898.454505 699.110695 683.2190511 576.4535787 552.0235585 349.3568251 299.992066 287.7698684 287.7698654 287.7698654 287.7698654 299.9920631 315.183593 377.0825243 499.8703065 1048.007262 1011.324811 962.4260357 962.419353 912.5902487 962.4159124 962.5079708 962.8398696 1012.008621 898.4545107 699.1155926 683.2215866 576.458044 552.0237555 349.356822 299.992063 287.7698652 287.7698623 287.7698624 287.7698625 299.9920603 315.1835879 379.2751485 499.850661 1047.997315 1023.935446 1051.00813 1093.237135 1131.119603 1250.811507 1253.829428 1191.146331 1171.861438 963.6335573 699.0619928 683.1763938 576.4040201 551.9738902 349.3568194 299.9920603 287.7698625 287.7698595 287.7698595 287.7698594 299.9920572 315.1835836 376.9085706 512.4635883 1047.985182 1011.295977 962.3930099 962.3882438 1000.175721 990.7361079 962.5516112 962.9733345 1012.218531 898.4207602 711.7043695 758.9225009 663.448092 657.455317 349.3568164 299.9920574 287.7698596 287.7698565 287.7698565 287.7698564 299.9920542 315.1835788 376.9866846 568.4966074 1246.753173 1425.79768 1453.434294 1481.774896 1435.823799 1476.063797 1467.282207 1472.203781 1537.2403 1429.174299 1222.328793 1212.005548 1105.345433 1062.474796 349.3568132 299.9920541 287.7698563 237.9291264 237.9291263 237.9291265 250.1513243 240.4224832 815.1549767 889.0646065 1186.147732 1189.816133 1158.648189 1156.406549 1155.2619 1159.391009 894.5553217 894.3494174 960.4662748 923.0347461 296.6678599 280.7671313 323.4854642 299.0420224 274.5957198 250.1513242 237.9291265 237.9286471 237.9286473 237.9286473 250.1508451 240.4220027 272.2220318 296.6664275 608.3377403 716.0883847 716.8070085 407.8207123 343.7344696 532.2633064 352.6442374 574.7979219 691.3288907 625.4805267 689.3495604 583.7874677 323.484032 299.0410646 274.5952407 250.1508451 237.9286474 287.7698474 287.7698475 287.7698475 299.9920453 315.1835646 604.6652197 758.526073 1419.773992 1421.455224 1387.239934 1406.77913 1381.034236 1455.40235 1466.736093 1483.566798 1545.302552 1427.378088 1218.884148 1187.169386 1063.54287 1021.143992 349.3568045 299.9920454 287.7698476 287.7698445 287.7698445 287.7698444 299.9920423 315.1835594 781.1510015 919.4956661 1504.973207 1493.759599 1467.883789 1493.952889 1458.408824 1528.500309 1528.643649 1529.227511 1587.004201 1480.340391 1258.898937 1201.247345 1077.883392 1042.779341 349.3568016 299.9920424 287.7698446 287.7698414 287.7698414 287.7698414 299.9920392 315.183555 760.0440663 929.6846557 1502.41048 1463.397604 1437.259829 1474.720024 1446.228464 1512.681152 1507.495608 1503.134642 1544.915556 1420.389967 1217.802121 1186.463584 1083.571126 1056.838599 349.3567984 299.9920393 287.7698415 287.7698385 287.7698385 287.7698385 299.9920362 306.639883 659.3629134 713.3607302 1303.409284 1343.029701 1265.831889 1234.338465 1213.310233 1338.439595 1342.534912 1391.238144 1481.725633 1371.627532 1178.94367 1159.387403 1057.97484 1025.072273 349.3567953 299.9920362 287.7698384 287.7698353 287.7698353 287.7698353 299.9920331 306.6398789 691.301441 775.9409697 1455.796243 1490.832874 1465.307059 1482.809545 1414.042928 1446.989148 1445.418157 1442.070223 1476.736351 1301.042989 1080.76728 946.046141 742.0747207 674.3199863 349.3567922 299.9920331 287.7698353 237.9291051 237.9291052 237.9291052 250.151303 231.8787835 483.5912404 504.29909 782.0444645 759.74649 705.1696186 705.5308127 809.3824723 997.7737412 783.9989243 778.0581797 826.0160996 743.3811729 296.6678302 272.2234352 323.4854351 299.0419847 274.5956986 250.1513031 237.9291052 237.9286304 237.9286303 237.9286301 250.1508279 231.8783063 272.2220149 584.1209887 735.3617683 643.8868987 687.0382592 211.1119699 211.11197 310.8704316 421.0782754 573.2713548 754.4333932 836.6219486 794.2625233 347.64666 323.4840151 299.0410349 274.5952238 250.1508283 237.9286305 237.928628 237.9286279 237.9286277 250.1508255 231.878302 272.2220125 296.666408 805.5019614 659.1614855 699.2025046 416.3552225 538.5600173 594.5452844 615.0336488 813.8020227 828.8509518 909.1527986 848.3495174 863.1797036 505.9231208 299.0410306 274.5952213 250.1508258 237.928628 287.7698231 287.7698232 287.7698231 299.9920209 306.6398593 952.4353889 1079.38794 1623.309902 1569.670099 1508.557447 1503.41526 1455.443252 1496.979502 1506.636997 1518.798089 1568.282029 1457.665095 1252.721086 1233.623775 1143.544337 1132.70648 349.3567802 299.992021 287.7698233 287.7698202 287.7698202 287.7698202 299.992018 306.6398537 889.8632256 979.5848856 1530.375294 1507.651348 1464.28628 1457.412102 1403.718969 1466.455623 1482.756524 1486.404021 1530.973204 1406.438781 1183.346208 1105.847438 1008.469256 975.7452437 349.3567771 299.9920181 287.7698202 287.769817 287.769817 287.7698171 299.9920149 306.639849 856.6109648 980.8794498 1538.229951 1527.61861 1500.281162 1518.571806 1482.475587 1532.223625 1527.452798 1526.650741 1575.400461 1458.856174 1261.850247 1228.377551 1115.285525 1075.056147 349.3567744 299.9920151 287.7698172 287.7698141 287.7698141 287.7698141 299.9920118 306.639844 863.0315829 966.2892785 1528.638979 1524.846217 1501.597129 1509.270817 1452.356237 1500.336769 1478.724709 1468.81454 1513.336081 1369.313452 1135.290684 1094.183605 984.2717437 928.2101057 349.3567709 299.9920119 287.769814 237.9290838 237.9290839 237.9290839 250.1512817 231.8787493 378.6755062 504.34866 819.5164053 859.2127656 915.9822292 956.3924533 968.0774962 980.3929941 737.4532565 749.314525 805.8966676 761.790433 635.4610173 393.229642 323.4854049 299.0419463 274.5956772 250.1512817 237.9290839 237.9286132 237.928613 237.9286129 250.1508109 231.8782768 272.2219976 373.8969639 510.5512303 469.488137 368.1285181 211.111944 211.1119442 211.1133473 211.111944 444.5970631 656.9704626 642.9642295 452.4885126 272.2219977 314.9403309 299.0410053 274.5952066 250.1508108 237.928613 287.7698049 287.7698049 287.7698049 299.9920027 306.6398296 805.7216163 958.8726189 1530.258532 1523.866829 1504.878845 1521.828953 1481.363804 1541.028748 1531.328116 1522.172397 1556.022432 1444.063763 1249.478545 1228.596362 1130.672216 1115.291556 349.3567616 299.9920025 287.7698048 287.7698018 287.7698018 287.7698018 299.9919996 306.6398248 936.8550685 1058.302278 1603.93633 1557.718282 1516.007819 1531.252791 1409.03679 1425.180514 1330.669751 1212.697256 1189.159173 1025.174805 806.0130985 780.3493877 650.7841095 638.825305 349.3567588 299.9919996 287.7698018 287.7697987 287.7697988 287.7697988 299.9919966 306.6398203 463.5133847 631.5792034 1168.254401 1115.624107 990.5231766 962.7109261 912.5916303 963.1127659 963.5856195 1075.823102 1208.917903 1079.609486 842.3399244 796.6176587 596.2403994 551.9794373 349.3567557 299.9919966 287.7697989 287.7697958 287.7697959 287.7697958 299.9919936 306.6398147 377.376805 539.5903109 1169.80442 1158.324779 1149.947527 1181.43027 1209.855959 1344.935095 1386.368574 1397.3133 1447.825564 1308.990795 1055.997001 1022.417819 897.9231486 834.5755172 349.3567528 299.9919937 287.7697959 287.7697928 287.7697928 287.7697928 299.9919906 306.6398106 490.1056621 684.049617 1374.704712 1457.977682 1435.384012 1484.719901 1472.339943 1542.754496 1537.362824 1528.79369 1573.081637 1468.107169 1280.374896 1263.483956 1161.114332 1150.595487 349.3567496 299.9919905 287.7697927 237.9290626 237.9290627 237.9290627 250.1512605 231.8787153 870.9963313 848.9155188 1102.126268 1077.400482 1034.691158 1032.571675 1020.367764 1015.556045 793.2256454 818.5104643 872.8307261 825.8955248 296.6677707 272.2233757 314.9417089 299.0419081 274.5956562 250.1512606 237.9290628 237.9285961 237.928596 237.9285963 250.1507943 231.8782468 272.2219809 296.6663767 296.6663768 605.3416911 701.9126698 470.9229608 638.6268488 528.6222043 686.4068851 841.0227305 791.2629325 476.1227959 296.6663766 272.2219811 314.9403144 299.0409755 274.5951899 250.1507943 237.9285964 287.7697838 287.7697838 287.7697838 299.9919816 306.6397956 406.2211757 575.4606228 1124.257447 1119.692175 1069.613242 1090.803695 1033.443851 1068.676426 1068.966947 1022.194188 1013.5788 898.5310554 699.0898336 674.6552459 567.8768652 551.9871461 349.3567407 299.9919816 287.7697838 287.7697808 287.7697808 287.7697809 299.9919787 306.639791 380.1171618 499.8069474 1047.981166 1099.243908 1067.909266 1067.087583 1060.117508 1168.330804 1256.024343 1356.808298 1414.969467 1200.392213 936.5558471 910.2712588 949.4192214 1021.826573 349.356738 299.9919787 287.7697809 287.7697779 287.7697779 287.7697779 299.9919757 306.6397866 488.1730755 628.250424 1311.272574 1425.193048 1396.153846 1291.994372 1151.640485 1180.630214 1132.428739 1111.853387 1160.708707 1021.144886 804.2730655 744.9492593 593.1090476 602.4586616 349.356735 299.9919758 287.769778 287.769775 287.769775 287.769775 299.9919728 306.6397814 377.4794772 499.8447294 1048.007398 1011.32857 962.4310703 1056.415751 1023.320584 1067.295763 1067.86115 1021.137737 1012.58686 898.4427961 699.102574 674.6672488 567.9015549 552.0190068 349.356732 299.9919728 287.769775 287.7697721 287.7697721 287.7697721 299.9919699 306.6397768 376.9363835 512.4529491 1056.407768 1011.314448 962.421681 962.4197077 912.5867962 1056.334288 1129.625953 1149.425409 1199.883955 1041.80068 803.7312411 744.5706517 654.3731427 674.7377077 349.3567289 299.9919698 287.769772 237.929042 237.929042 237.929042 250.1512398 231.8786815 605.7904363 722.2088033 1108.758078 1108.367037 1077.802194 1082.387964 1089.240653 1092.585862 841.1106251 846.0580152 899.1138065 860.4608059 665.6742788 455.7828669 314.94168 299.0418704 274.5956354 250.1512398 237.929042 237.92858 237.92858 237.9285797 250.1507773 231.8782183 272.2219642 557.8905833 658.9031576 704.0904493 537.8976488 462.0504545 211.111894 211.1132727 529.5256965 572.6094278 618.0895662 718.9716074 778.5090991 644.1900851 314.940298 299.0409466 274.5951734 250.1507779 237.9285798 287.7697633 287.7697633 287.7697633 299.9919611 306.6397631 851.3493784 981.3956064 1543.05383 1507.458093 1446.400965 1441.01569 1400.154353 1467.508712 1483.794651 1488.763929 1539.867001 1420.748538 1214.471402 1173.926044 1054.929253 1032.692422 349.3567203 299.9919611 287.7697634 287.7697605 287.7697605 287.7697606 299.9919583 306.6397592 854.4957641 989.7219175 1557.275371 1530.128613 1491.398178 1515.511575 1484.243236 1540.869616 1544.870041 1544.258302 1590.711047 1480.383946 1261.527353 1241.21193 1132.913605 1076.216698 349.3567174 299.9919583 287.7697606 287.7697577 287.7697577 287.7697577 299.9919555 306.6397537 856.8861007 985.827887 1572.180857 1580.758936 1531.553681 1526.271935 1477.721929 1522.645618 1521.367691 1516.929135 1563.89807 1455.768866 1272.051666 1254.684968 1134.235313 1130.567868 349.3567147 299.9919555 287.7697577 287.7697549 287.769755 287.7697549 299.9919527 306.6397495 940.6120708 1062.905856 1607.815796 1559.689184 1515.509428 1515.381484 1470.867013 1517.027745 1492.379867 1485.494251 1540.997118 1444.38148 1283.892195 1260.077945 1133.280798 1099.42299 349.3567116 299.9919525 287.7697548 287.769752 287.7697521 287.7697521 299.9919499 306.6397448 904.619676 1013.73885 1573.342157 1579.492228 1525.825285 1504.01948 1444.963237 1485.543884 1494.15214 1498.768334 1542.722712 1439.432704 1243.480525 1236.782327 1137.992999 1130.37203 349.356709 299.9919499 287.7697521 237.9290222 237.9290222 237.9290222 250.15122 231.8786504 941.1859393 996.8950834 1246.064135 1185.918373 1106.164678 1102.287095 1112.059668 1120.321215 865.4365342 861.9259758 916.3710228 881.3154724 713.820193 639.8983052 570.063095 299.0418352 274.5956157 250.1512201 237.9290222 237.9285642 237.9285639 237.9285638 250.150762 231.8781905 398.5199785 623.4790737 726.9289937 614.0110679 653.7976312 572.7617128 509.7106494 452.6925324 554.3233535 729.6790009 699.8687858 813.6901335 746.6695235 784.6934752 434.5589717 299.0409198 274.5951573 250.1507621 237.9285644 287.769744 287.769744 287.769744 299.9919418 306.6397317 929.6987905 1050.420046 1600.877611 1569.858668 1516.695164 1519.567585 1472.451536 1524.86254 1523.404328 1523.153168 1574.472934 1458.809859 1260.736327 1236.955949 1131.94229 1119.884836 349.3567008 299.9919417 287.769744 466.755514 287.7697411 287.7697411 470.5780365 306.6397278 975.4962125 1067.169037 1607.40359 1572.223535 1523.546923 1526.332562 1473.27689 1525.339951 1525.330693 1530.092118 1579.540932 1458.662723 1258.29145 1201.341995 1092.765709 1082.240019 349.3566983 299.9919392 287.7697413 287.7697386 287.7697386 287.7697387 299.9919365 306.6397235 910.0407644 1022.657513 1575.529424 1546.894888 1513.111255 1516.796342 1467.729936 1518.082445 1516.658233 1515.176934 1560.089017 1427.24277 1227.699497 1209.51394 1110.927657 1098.35435 349.3566954 299.9919364 287.7697385 287.7697359 287.769736 287.769736 299.9919338 306.6397197 956.678566 1066.771963 1604.861758 1546.993979 1506.031946 1527.332357 1487.976448 1527.075485 1529.501993 1522.618165 1556.244 1441.286263 1267.897082 1266.027801 1151.454526 1123.355544 349.356693 299.9919338 287.7697361 287.7697334 287.7697334 287.7697335 299.9919313 306.6397152 953.5795423 1084.3189 1602.217132 1543.709746 1485.312149 1485.120785 1455.746088 1516.605339 1516.305053 1514.319824 1564.013794 1452.947883 1262.789138 1245.310786 1123.698089 1110.35666 349.3566903 299.9919311 287.7697333 237.9290037 237.9290038 237.9290036 250.1512014 231.8786204 906.0282404 902.3960151 1166.408383 1160.16705 1134.355609 1143.580749 1155.440267 1152.654769 892.0913924 889.7011957 932.9708496 889.2002635 296.6676882 272.2232932 314.9416264 299.0418014 274.5955972 250.1512016 237.9290038 237.9285497 237.9285498 237.9285496 250.1507469 231.8781651 272.2219338 296.6663295 296.6663299 259.9997366 211.1109451 211.1118486 211.1118485 211.1132035 211.1118488 539.4031557 259.9997365 296.6663301 296.6663299 272.2219339 314.9402673 299.0408942 274.5951427 250.1507475 237.9285499 287.769726 287.7697259 287.7697259 299.9919237 306.6397027 935.5104332 1066.017061 1624.26249 1577.161142 1517.461284 1506.368979 1455.798056 1496.967524 1496.346507 1503.754502 1557.978748 1448.513213 1259.02964 1228.603138 1129.790244 1088.88226 349.3566827 299.9919236 287.7697258 237.9285453 237.9285453 237.9285457 250.1507436 231.8781577 272.2219305 296.6663259 296.6663254 599.6140248 576.8936021 583.5307466 786.6311549 685.5987121 375.2526153 530.1203668 455.3431046 445.7604665 296.6663259 272.2219304 314.9402636 299.0408867 274.595139 250.150743 237.9285453 287.769721 287.769721 287.769721 299.9919189 306.6396955 951.5812981 1063.596135 1582.16202 1534.998953 1492.276034 1496.654823 1452.822291 1514.64591 1531.052124 1510.145613 1557.108279 1436.518288 1224.671118 1193.125518 1089.588451 1077.110612 349.3566779 299.9919187 287.7697209 287.7697185 287.7697185 287.7697185 299.9919164 306.6396922 915.3434092 1034.106874 1574.708571 1534.974044 1505.820637 1516.682061 1467.546332 1518.335735 1515.751158 1517.899677 1570.108416 1453.090383 1255.473859 1237.011605 1136.834368 1121.997396 349.3566755 416.4353664 342.7350107 287.7697161 287.7697162 443.2711944 299.991914 306.6396881 910.1364411 1051.007539 1603.137195 1566.540238 1520.795631 1523.078371 1471.479415 1525.41353 1524.368411 1523.639894 1572.542409 1454.651519 1258.788104 1245.308651 1151.425458 1142.589722 393.1330103 649.5171699 374.3799528 237.9289869 237.9289868 237.9289869 250.1511848 231.8785943 927.5029181 977.2998225 1214.64888 1171.540053 1122.59498 1123.247963 1122.274541 1121.82325 874.4463524 874.8331388 924.4827834 886.758204 820.1411534 733.4407712 790.1877239 725.0717902 552.7673272 510.9506219 416.0921868 453.0391919 350.998544 237.9285361 250.1507338 439.4232887 778.2873778 891.2679498 824.5035748 866.6954731 754.851773 831.1359377 758.1777277 830.6340114 761.0469517 835.9059625 814.6821106 920.5755688 851.3285454 896.6635288 855.9108964 781.7903168 676.5295159 341.2369347 364.0623949 374.7148386 331.2185342 420.7831438 299.9919074 315.1833442 949.7399508 1076.404172 1614.062574 1568.734305 1516.310961 1516.256104 1470.663839 1516.554679 1514.944598 1514.167578 1562.385725 1450.086642 1264.097348 1252.479326 1157.170105 1147.118732 349.3566664 299.9919073 329.7186964 368.6885141 287.7697073 287.7697073 338.865574 389.0042217 950.92573 1083.166977 1607.568471 1561.345394 1511.715799 1512.889212 1467.967815 1512.3818 1510.730105 1512.459378 1560.431649 1450.123465 1263.406823 1253.153977 1159.238034 1144.504314 392.1586446 477.5451394 561.0830122 287.7697051 287.7697052 378.5305117 299.9919031 315.1833377 924.5197301 1054.849608 1624.794618 1579.820307 1518.166924 1517.976406 1471.71078 1515.173838 1516.830713 1513.218714 1558.608807 1448.028941 1263.443871 1256.447325 1162.636907 1127.974269 349.3566623 299.9919031 287.7697053 335.055821 378.9514103 287.7697034 299.9919012 448.3148647 910.7991501 1038.42767 1573.59482 1543.233833 1512.656555 1517.754311 1467.262135 1515.592376 1514.995384 1515.592453 1547.351823 1430.930988 1244.735414 1226.526221 1143.693946 1137.993018 349.3566605 299.9919014 287.7697034 287.7697015 287.7697013 287.7697014 299.991899 315.1833304 948.6814014 1066.870803 1587.438923 1545.261029 1501.233455 1520.388307 1480.750455 1520.881469 1519.690518 1517.061295 1562.236925 1459.242419 1284.004472 1252.252833 1134.928399 1115.692685 349.3566582 299.9918991 287.7697013 237.9289723 237.9289724 237.9289724 250.1511702 240.4222364 888.1978424 908.0721168 1179.817909 1158.241674 1123.501881 1131.477391 1142.19544 1147.678816 896.2320656 891.0703648 949.6453979 914.3923834 739.608719 669.5843974 637.5762317 299.0417448 274.5955656 250.1511701 237.9289723 237.9285251 237.9285251 237.9285246 250.1507223 240.4217886 272.2219093 570.9160323 745.0140931 643.2604161 697.3289078 598.502235 648.2594202 572.0946211 617.2374343 649.2654352 762.9970573 744.3774325 816.0097884 625.9451298 314.9402428 299.0408504 274.5951182 250.1507221 237.9285247 287.7696956 287.7696956 287.7696957 299.9918935 315.183321 928.9743743 1065.020895 1626.225687 1575.791084 1522.118497 1525.127412 1479.299425 1519.291175 1508.827076 1505.007445 1563.363852 1447.238616 1244.200697 1216.523644 1125.272014 1128.738915 349.3566526 299.9918934 287.7696957 287.7696938 287.7696938 287.7696938 299.9918915 315.1833183 936.5866531 1054.88258 1580.457461 1561.929008 1515.229098 1515.465565 1467.471037 1516.569558 1515.545401 1515.613789 1564.374611 1435.903822 1242.108699 1228.232526 1133.160526 1115.393396 349.3566506 299.9918914 287.7696935 287.7696918 287.7696918 287.769692 299.9918898 315.1833163 956.2964688 1071.705833 1586.363772 1534.356637 1483.599972 1484.203434 1433.793735 1514.300481 1497.508943 1496.059719 1547.271686 1422.395483 1224.343462 1227.154451 1129.133332 1114.638419 349.356649 299.9918899 287.7696921 287.7696904 287.7696905 287.7696903 299.9918881 315.1833126 910.0542424 1025.053329 1576.9523 1553.967343 1514.194374 1511.892991 1460.369883 1518.576486 1518.80463 1513.120623 1550.358674 1422.486311 1219.285496 1224.945656 1125.541439 1093.12845 349.3566472 299.9918881 287.7696904 287.7696888 287.7696888 287.7696889 299.9918866 323.7269767 972.7388414 1067.490697 1607.781233 1570.702792 1522.927837 1525.914986 1474.662338 1530.954376 1538.78676 1548.230445 1577.168934 1452.720056 1259.129858 1235.575715 1130.898743 1117.338089 349.3566455 299.9918864 287.7696886 237.9289601 237.9289601 237.9289602 250.151158 248.9658839 946.0514345 966.2599856 1215.343456 1177.677994 1122.13559 1115.803813 1110.448622 1104.062302 864.0753399 874.9332379 924.3288131 880.2415829 499.8517879 375.6451544 323.4852321 299.0417232 274.5955535 250.1511578 237.92896 237.928515 237.928515 237.9285156 250.1507134 248.965438 321.3217706 758.5442532 681.8847954 736.5786016 631.2264289 685.9216251 544.9189652 532.8058085 509.4248311 667.826395 683.4402256 773.5697758 700.1269698 686.9346557 409.5114541 299.0408338 274.5951091 250.1507134 237.928515 287.7696839 287.7696841 287.7696841 299.991882 323.72697 849.0953703 965.6112926 1527.951089 1509.048645 1474.821639 1481.923606 1445.210709 1519.588047 1516.322771 1516.775135 1577.957123 1456.177305 1249.766207 1221.418811 1108.39388 1079.453417 349.3566409 299.9918819 287.7696842 287.7696828 287.7696829 287.7696828 299.9918806 323.726967 921.3392979 1053.319089 1621.846623 1572.315937 1505.604539 1502.893178 1457.895268 1500.131872 1498.778844 1500.931118 1555.233789 1469.746761 1290.608574 1248.532582 1123.454408 1104.604342 349.3566398 299.9918806 287.7696828 287.7696812 287.7696812 287.7696812 299.9918791 323.726966 926.1031705 1045.90564 1614.225611 1561.412599 1499.405546 1514.410922 1477.448472 1521.162 1518.700706 1516.556066 1562.765974 1461.566305 1285.821502 1252.000826 1154.709864 1132.050915 349.3566382 299.9918791 287.7696814 287.7696802 287.7696801 287.7696801 299.9918779 323.7269628 975.0095364 1067.540076 1607.087791 1566.568765 1517.563072 1517.178561 1467.841894 1519.195242 1518.340325 1516.335959 1565.127141 1460.896549 1270.055921 1228.365483 1117.83789 1083.576294 349.3566369 299.9918777 287.7696799 287.7696789 287.7696789 287.769679 299.9918769 323.726961 857.9416072 975.6239226 1543.420228 1525.969872 1495.045325 1514.390247 1476.724425 1544.770696 1537.40302 1535.588627 1591.535272 1467.981159 1248.393392 1215.241484 1102.976053 1075.323098 349.3566357 299.9918764 287.7696786 237.9289504 237.9289505 237.9289506 250.1511486 248.9658691 912.6035862 935.9471685 1173.565429 1138.071434 1109.52709 1111.904051 1113.700879 1134.22145 904.0664431 874.1352131 894.0972461 841.5402532 296.6676141 272.2232182 323.4852182 299.0417069 274.595544 250.1511482 237.9289504 237.928508 237.9285085 237.9285083 250.1507055 248.9654259 272.2218923 296.6662884 296.6662887 259.999695 211.1109032 211.1117866 481.400368 540.7003776 546.1166247 525.1665371 736.7068161 736.4019549 797.4890588 558.251627 323.4838925 299.0408214 274.595101 250.1507056 237.9285083 287.7696756 287.7696756 287.7696756 299.9918731 323.7269559 880.6927538 1007.121017 1587.060779 1586.42212 1535.065786 1531.101448 1486.108132 1527.263199 1525.017263 1522.775918 1569.4532 1465.004302 1286.687583 1266.064785 1162.55557 1139.753481 349.3566327 299.9918735 287.7696758 287.7696746 287.7696745 287.7696744 299.9918722 332.2706216 960.1798502 1078.173078 1624.571784 1595.465684 1527.762933 1512.427672 1462.269563 1503.634535 1504.276836 1507.442674 1557.10287 1458.551681 1288.735208 1256.302394 1149.751816 1118.933086 349.3566315 299.9918724 287.7696743 287.7696734 287.7696734 287.7696737 299.9918715 332.27062 914.0116924 1048.128378 1615.260126 1556.765494 1499.09414 1495.038378 1465.739446 1509.386869 1509.988958 1514.612756 1555.199206 1474.105465 1282.614747 1259.887078 1143.488392 1112.58799 349.3566305 299.9918714 287.7696738 287.769673 287.769673 287.769673 299.9918708 332.270618 925.8273452 1049.534951 1581.085903 1561.601691 1515.156061 1515.32454 1466.991181 1516.205581 1514.150073 1511.834739 1546.140292 1424.813374 1219.756276 1219.766614 1116.635659 1088.74906 349.3566299 299.9918708 287.769673 287.769672 287.7696719 287.7696718 299.9918696 332.2706176 913.7296058 1027.539851 1605.705289 1569.60682 1528.761578 1536.056312 1480.719026 1542.874558 1547.836225 1540.329905 1587.276401 1462.749809 1259.440793 1245.766103 1141.257488 1118.779193 349.3566288 299.9918696 287.7696719 237.9289442 237.9289444 237.9289444 250.1511422 257.5095249 978.0189177 970.6431837 1213.814308 1173.871868 1124.937053 1124.651587 1125.113405 1125.06905 875.7642392 876.834845 926.7503949 888.7730764 711.7135133 781.1891681 323.4852096 299.0416942 274.5955376 250.1511421 237.9289444 237.9285035 237.9285029 237.9285032 250.1507015 257.5090839 272.2218883 296.6662836 296.6662831 389.1868054 631.5881751 724.477055 742.9298033 833.5100201 764.6382032 840.7014365 814.9316037 924.2433293 799.9625763 867.2649356 416.8397339 299.0408129 409.0691118 250.1507012 237.9285029 287.7696701 287.7696701 287.7696702 299.991868 332.2706136 966.2644428 1070.262675 1607.916283 1566.499118 1515.223209 1516.302962 1467.147452 1518.805073 1518.030064 1517.468831 1562.30528 1423.328497 1219.436001 1213.02224 1098.305825 1081.014292 349.3566272 299.991868 287.7696702 287.7696694 287.7696693 287.7696694 299.9918674 332.2706138 929.2561337 1000.789428 1550.544742 1533.515023 1495.081856 1500.460538 1447.743976 1508.957277 1521.576109 1530.130038 1571.397593 1436.283053 1210.815549 1180.091732 1061.978753 1030.871849 349.3566264 299.9918674 287.7696697 287.7696692 287.7696691 287.769669 299.9918667 332.2706125 761.5655009 939.7971146 1514.504993 1500.007628 1476.091059 1495.189789 1445.30325 1507.745098 1509.591273 1512.872646 1568.695284 1454.065342 1247.779698 1220.970158 1097.658127 1059.225181 349.356626 299.991867 287.7696692 287.7696689 287.769669 287.7696689 299.9918666 332.2706113 857.9588231 984.9252504 1566.306295 1573.835949 1541.312849 1541.097378 1498.830553 1540.428654 1542.38793 1544.834817 1594.257511 1481.515059 1271.798132 1243.53287 1117.16121 1098.01026 349.3566254 299.9918662 287.7696685 287.7696683 287.7696684 287.7696685 299.9918664 340.8142776 948.644293 1069.673566 1579.965819 1510.56661 1454.294748 1461.281181 1411.861498 1461.013639 1457.724189 1457.291592 1509.119619 1398.714204 1199.577737 1198.266026 1101.473384 1096.389471 349.3566254 299.9918662 287.7696682 237.9289409 237.9289409 237.9289411 250.1511391 266.0531872 947.1623459 979.9401269 1236.247202 1195.071272 1142.93946 1139.110125 1126.355637 1112.005929 861.8372281 857.4778681 890.8022296 860.8641804 296.667601 289.3105388 323.485205 299.0416885 274.5955346 250.151139 237.9289413 237.9285016 237.928501 237.9285009 250.1506994 266.0527468 272.2218862 296.6662817 296.666281 259.999688 505.8867225 211.1117762 211.1117762 211.1130956 211.1117764 211.1108966 259.9996884 296.6662819 296.6662813 289.309219 323.4838862 299.0408091 274.595095 250.1506992 237.9285008 287.7696678 287.7696679 287.769668 299.9918659 340.8142768 937.230243 1069.97774 1608.195794 1569.850164 1523.662574 1527.045634 1475.182226 1527.505714 1523.578017 1524.234281 1575.22233 1458.390934 1260.698286 1257.278594 1143.376025 1121.67537 349.3566248 299.9918656 287.7696677 287.7696676 287.7696677 287.7696678 299.9918658 340.8142772 913.8897148 1033.362715 1609.103923 1566.820684 1520.83688 1522.216095 1470.951394 1523.906051 1524.372376 1523.740076 1570.285369 1455.907526 1259.943048 1256.738837 1144.644163 1122.245154 349.356625 299.9918657 287.7696678 287.7696677 287.7696677 287.7696678 299.9918657 340.8142775 911.1036941 1021.366861 1589.870904 1567.296269 1521.448213 1523.618475 1472.106841 1525.402213 1523.407456 1523.186364 1570.948393 1454.462432 1260.897426 1219.119346 1099.079475 1073.757708 349.356625 299.9918659 287.7696679 287.7696679 287.7696678 287.7696678 299.9918657 340.8142779 963.2511484 1093.085415 1619.535863 1559.707926 1497.807465 1497.17048 1452.647101 1495.515687 1489.680053 1489.865624 1547.933673 1442.426019 1267.892071 1280.960054 1167.882397 1139.222599 349.356625 299.9918659 287.7696681 287.7696681 287.769668 287.7696679 299.9918657 340.8142779 887.2646163 986.5039211 1554.699801 1548.734488 1520.198378 1537.562544 1493.66712 1539.667722 1531.328128 1528.783674 1575.379154 1476.931824 1281.729913 1276.832006 1141.418145 1118.013247 349.3566251 299.991866 287.7696683 237.9289414 237.9289413 237.9289413 250.1511389 266.0531872 938.0228798 961.858101 1223.678549 1195.556091 1135.493157 1135.207372 1134.264052 1131.863748 885.3605225 887.6028161 941.4935425 902.6313888 296.6676009 297.8542052 323.4852053 299.0416899 274.5955346 250.1511389 237.928941 237.9285016 237.9285021 237.928502 250.1506992 274.5964148 272.2218859 296.6662821 296.6662824 259.9996886 211.1108969 557.7592839 750.7673823 739.0608629 810.786836 723.7552131 856.8697554 818.6228636 886.0988392 490.2785201 323.4838859 299.0408103 274.5950947 250.1506997 237.9285021 287.7696691 287.769669 287.7696689 299.9918666 349.3579461 917.0866099 1032.05308 1609.127129 1566.065768 1517.632049 1519.298285 1468.126253 1519.875241 1520.85242 1520.430432 1561.860165 1436.66173 1258.812666 1265.856343 1145.045973 1119.778597 349.3566259 299.9918669 287.7696691 287.7696696 287.7696696 287.7696695 299.9918672 349.3579461 946.418046 1057.481441 1582.409758 1555.400809 1515.164874 1515.283931 1467.053577 1514.858671 1514.142176 1513.678205 1562.118698 1451.366422 1273.015467 1283.310801 1157.003961 1138.262596 349.3566262 299.991867 287.7696693 287.76967 287.7696701 287.7696701 299.9918679 349.3579467 952.7494202 1068.557142 1591.084839 1540.317919 1514.351644 1515.868265 1468.084713 1517.343441 1515.799255 1516.896734 1564.74027 1454.317722 1247.154364 1245.47329 1142.092276 1134.642971 349.3566271 299.9918678 287.7696699 287.7696704 287.7696703 287.7696704 299.9918683 349.3579484 902.010592 1003.407872 1580.594199 1581.316138 1536.234815 1536.996892 1478.960935 1521.522521 1524.888957 1524.880608 1568.451168 1466.956107 1260.354056 1234.150714 1072.829832 1020.935284 349.3566274 299.9918684 287.7696707 287.7696712 287.7696712 287.7696712 299.9918687 349.3579489 516.9925733 663.7599867 1327.833925 1417.39437 1375.549982 1378.982911 1329.832148 1397.179942 1414.703502 1431.139046 1490.746091 1371.693101 1152.911593 1146.468602 1005.925346 980.3870636 349.3566278 299.9918687 287.7696709 237.9289447 237.9289448 237.9289449 250.1511428 274.5968593 717.3538203 768.9757966 1067.068554 1044.684374 1006.327053 1012.273989 1019.383365 1035.857185 790.7356004 797.9724642 854.3689058 807.4978922 517.3199453 306.3978773 323.4852102 299.0416951 274.5955382 250.1511427 237.928945 237.9285053 237.9285048 237.9285046 250.150703 274.59642 272.2218899 324.8209919 624.5089919 586.8554764 595.7419202 328.6013001 512.4468525 629.3056421 548.835759 538.4561362 643.1961297 415.9540713 296.6662852 306.3965558 323.4838898 299.0408158 274.5950987 250.1507031 237.9285047 287.7696732 287.7696733 287.7696734 299.9918714 349.3579529 737.8423485 946.0224416 1533.365882 1521.91172 1499.21919 1527.686245 1493.360959 1517.061624 1519.960387 1528.473318 1568.839821 1472.132049 1280.096277 1259.112243 1089.142422 1040.673241 349.3566303 299.9918713 287.7696736 287.7696745 287.7696746 287.7696745 299.9918722 349.3579536 870.7705299 1002.780384 1568.266516 1557.591448 1538.536227 1539.70562 1481.55139 1512.919917 1511.992522 1503.049497 1544.357394 1438.968406 1247.396661 1256.878984 1131.414249 1110.742629 349.3566314 299.9918723 287.7696744 287.7696753 287.7696753 287.7696751 299.9918729 349.3579558 949.1428117 1063.638268 1595.051332 1540.003689 1496.997402 1516.666532 1469.264959 1524.089276 1520.656434 1519.381632 1564.299316 1456.937694 1280.563203 1312.040575 1156.089629 1116.050146 349.3566324 299.9918733 287.7696754 287.7696762 287.7696762 287.7696762 299.9918741 349.3579579 887.6651332 985.66877 1543.107955 1520.764402 1483.673485 1494.491132 1452.84592 1519.399669 1519.257219 1520.578604 1565.227956 1456.902193 1234.887731 1237.224446 1089.038819 1051.68608 349.3566334 299.9918742 287.7696762 287.7696773 287.7696772 287.7696773 299.9918752 349.3579594 846.9899782 987.5994606 1573.375621 1585.196118 1538.503445 1535.25376 1485.443674 1524.10329 1519.571946 1521.261647 1568.611414 1449.381529 1259.943899 1280.71901 1144.855968 1123.285628 349.3566345 299.9918752 287.7696773 237.9289514 237.9289513 237.9289514 250.1511493 274.5968707 955.0934434 986.5117318 1219.899652 1144.736031 1104.529361 1094.368479 1081.500928 1069.673957 805.6429079 797.2275832 844.3307379 799.9849038 296.6676151 314.9415527 323.4852197 299.0417079 274.595545 250.1511493 237.9289514 237.9285103 237.9285108 237.928511 250.1507084 274.5964301 280.7655617 296.6662905 323.7288105 436.4202687 405.1264484 211.1117902 211.1117903 475.2950779 457.6986626 517.8504141 709.3537798 688.2491103 561.7566126 314.9402289 323.4838955 299.0408257 274.5951042 250.150708 237.9285106 237.928512 237.9285118 237.9285112 250.1507095 274.596432 280.7655631 296.6662924 363.5862447 621.4647692 211.1109074 344.8385282 641.5338454 716.1174308 600.2485791 211.1109072 259.9996981 296.6662921 296.6662922 314.9402295 323.4838959 299.040828 274.5951049 250.1507098 237.9285121 287.7696825 287.7696823 287.7696823 299.9918801 349.3579675 953.0307732 1077.121294 1631.549703 1585.854534 1528.049508 1519.855253 1475.406041 1513.381086 1505.801484 1493.083265 1550.346971 1473.969198 1283.658811 1269.629548 1084.914621 1038.55535 349.3566393 299.9918801 287.7696825 287.7696839 287.769684 287.769684 299.9918817 349.3579689 520.0808528 663.6178469 1312.411491 1387.117748 1366.137555 1395.317634 1357.346598 1424.203178 1431.9998 1429.810305 1479.395612 1354.522126 1131.355955 1147.495195 994.0277003 948.7060371 349.3566408 299.9918817 287.7696839 287.7696854 287.7696853 287.7696852 299.9918829 349.3579715 465.1124608 644.0012403 1333.659085 1418.732478 1390.659954 1405.160549 1370.43287 1446.456089 1463.018733 1467.73663 1518.305626 1404.594219 1200.432232 1224.25122 1073.122688 1045.68665 349.3566423 299.9918831 287.7696853 287.7696866 287.7696866 287.7696866 299.9918845 349.3579746 661.6008343 854.959573 1525.576862 1521.767217 1491.381423 1503.736256 1447.48638 1510.431689 1500.762721 1465.83642 1501.989386 1376.534783 1148.822959 1112.462934 900.4877977 847.5284806 349.3566437 299.9918845 287.7696866 237.9289611 237.9289611 237.9289611 250.1511591 274.5968863 398.532536 543.2432716 973.3462284 1080.394343 1056.717183 1062.809594 1063.202777 1065.232435 817.5571987 835.0791932 886.6274141 849.9097051 536.0139575 323.4852338 323.4852336 299.0417248 274.5955546 250.1511592 237.9289613 237.9285191 237.9285186 237.9285184 250.1507168 274.5964443 289.309237 296.6662994 296.6662989 259.9997053 501.3350676 413.0027643 311.8500981 211.1131355 211.1118025 211.1109143 259.9997052 296.6662992 296.6662993 323.4839033 323.483903 299.0408404 274.5951119 250.1507169 237.9285192 287.7696918 287.7696917 287.7696915 299.9918893 349.3579819 902.9602066 972.705729 1498.688452 1473.341653 1431.506013 1422.146119 1386.440842 1479.763456 1487.727159 1490.446854 1533.023798 1395.704564 1181.15238 1184.739127 1027.928823 985.5225294 349.3566485 299.9918894 287.7696917 287.7696935 287.7696935 287.7696936 299.9918913 349.3579842 556.4356505 667.60727 1319.429032 1432.649892 1416.491246 1438.743704 1402.432022 1469.882475 1482.224557 1493.437838 1544.920816 1422.220369 1211.562324 1211.636466 1049.493184 1017.41988 349.3566505 299.9918913 287.7696935 287.7696952 287.7696951 287.7696951 299.9918928 349.3579876 691.7133109 898.5824921 1529.299914 1525.073322 1508.655399 1533.775454 1485.734508 1530.114038 1520.629284 1517.643779 1565.799144 1462.570371 1291.17132 1303.760193 1141.682909 1132.968643 349.356652 299.9918927 287.769695 287.7696968 287.7696968 287.769697 299.9918948 349.3579907 933.006667 1016.734696 1602.210601 1568.874918 1519.65207 1517.217459 1469.387974 1516.605498 1514.718767 1514.792023 1564.428204 1454.319643 1281.78349 1296.875394 1148.769467 1132.023015 349.3566538 299.9918947 287.7696969 287.7696988 287.769699 287.7696989 299.9918968 349.3579937 948.2572524 1046.577702 1620.680546 1585.432712 1505.676965 1507.948761 1473.473257 1518.33505 1515.827345 1519.565638 1570.779451 1465.116354 1277.209624 1291.978515 1145.90208 1122.95884 349.3566557 299.9918966 287.7696987 237.9289736 237.9289736 237.9289737 250.1511716 274.5969064 967.5142551 966.0000718 1234.500541 1187.084498 1129.609998 1126.923385 1138.496484 1154.072505 905.2800405 905.0864999 928.8582445 856.4685881 313.7549799 323.4852505 323.4852506 299.0417484 274.5955671 250.1511716 237.9289736 237.9285287 237.9285292 237.9285295 250.1507271 274.5964623 289.3092471 296.6663088 296.6663092 259.9997162 211.1109249 211.1118179 211.111818 211.1131577 211.1118183 211.1109246 259.9997162 296.6663097 313.7536427 323.4839134 323.4839139 299.0408582 274.5951227 250.1507273 237.9285293 287.7697048 287.7697048 287.7697048 299.9919026 349.3580036 962.1696118 1079.333081 1609.025687 1551.677915 1489.377758 1492.765376 1470.565548 1518.775006 1516.403074 1515.442271 1565.339689 1449.288434 1267.73318 1293.114772 1148.090865 1129.720031 349.3566619 299.9919027 287.7697049 287.7697071 287.769707 287.7697072 299.9919049 349.3580066 958.72282 1034.871761 1612.46705 1580.522425 1516.396292 1502.179187 1457.273214 1517.591231 1515.789911 1517.802165 1566.396763 1460.9046 1293.132659 1314.644738 1167.460815 1139.586637 349.3566638 299.9919047 287.769707 287.7697092 287.7697092 287.7697092 299.9919071 349.3580096 912.4816997 982.6694803 1544.263784 1559.63115 1520.830593 1507.801525 1469.747318 1515.553746 1515.050551 1516.349264 1566.312961 1466.389417 1293.805206 1303.451516 1156.685417 1135.871683 349.3566661 299.9919069 287.7697091 287.7697114 287.7697114 287.7697114 299.9919092 349.3580136 983.4232468 1078.925712 1626.98009 1580.053927 1517.135006 1514.369927 1471.324851 1518.594966 1532.765705 1537.57344 1551.831116 1408.872378 1207.347698 1212.026802 1056.384201 1022.244994 349.3566681 299.991909 287.7697112 287.7697135 287.7697134 287.7697134 299.9919112 349.3580168 404.634967 620.6468584 1313.389413 1366.822419 1387.470703 1419.000222 1379.024206 1435.916055 1436.817627 1436.765682 1474.324324 1340.115529 1151.869917 1144.52604 995.9584253 888.0009078 349.3566704 299.9919112 287.7697135 237.9289887 237.9289888 237.9289888 250.1511866 274.59693 404.1262448 412.6772636 739.1339117 833.2550706 865.8469892 960.4756233 985.6265982 1006.877936 776.5634357 798.5588676 845.7652675 799.5218848 322.2986672 323.4852719 323.4852722 299.0417742 274.5955822 250.1511866 237.9289888 237.9285416 237.9285413 237.9285409 250.1507392 274.596484 297.852926 296.6663219 296.6663218 259.999728 211.1109367 232.5689949 539.6086468 538.2905273 586.5338448 440.8304653 438.9187994 296.6663213 322.2973212 323.4839261 323.4839262 299.0408792 274.595135 250.1507392 237.9285409 287.7697203 287.7697204 287.7697204 299.9919183 349.3580283 403.4675272 512.4097784 1065.986408 1201.054239 1241.061959 1366.894322 1325.191235 1387.881235 1399.883075 1408.226184 1453.971891 1328.11339 1139.628016 1132.888202 894.7750052 715.9082736 349.3566773 299.9919181 287.7697204 287.7697228 287.7697227 287.7697228 299.9919206 349.3580317 416.6689363 554.3563026 1225.397882 1236.371952 1283.388858 1422.386122 1397.491751 1466.054877 1474.276514 1456.373347 1487.583865 1359.871707 1164.143351 1158.3898 1045.375146 1029.304359 349.3566797 299.9919205 287.7697228 287.7697254 287.7697253 287.7697253 299.9919232 349.3580356 972.5047547 1079.823057 1616.907196 1563.114193 1506.304098 1506.606511 1460.710281 1501.035412 1499.405359 1499.128877 1551.50326 1448.224065 1277.492648 1281.548838 1159.469649 1108.619713 349.3566825 299.9919233 287.7697255 287.7697279 287.7697279 287.7697279 299.9919256 349.3580392 578.1662838 647.7518893 1219.806789 1305.00124 1406.950593 1418.1483 1365.59454 1421.437312 1410.866973 1406.70872 1442.851157 1314.946805 1073.667735 942.452325 710.5519791 621.6069488 349.3566849 299.9919257 287.7697279 287.7697304 287.7697304 287.7697304 299.9919281 349.3580433 412.7117605 499.7651694 1047.976546 1012.395645 1090.189593 1221.704565 1301.106552 1383.403261 1393.507031 1397.96656 1449.286638 1329.806919 1147.138038 1076.321115 842.2357254 752.7346699 349.3566871 299.991928 287.7697302 237.9290057 237.9290058 237.9290058 250.1512036 274.5969574 424.4742637 485.8019943 876.3256445 991.3006499 1009.373566 1024.775003 1026.504789 1030.087864 789.1220267 790.4127846 831.3668206 785.3235942 330.842358 323.4852952 323.4852957 299.0418054 274.5955991 250.1512035 237.9290058 237.9285552 237.9285548 237.928555 250.1507532 274.5965078 306.3966066 378.7981831 846.2411039 711.7090307 710.7445491 627.0281061 715.1512042 605.6659854 698.921113 594.5317315 726.4676438 598.3828606 330.8410016 323.4839398 323.48394 299.0409034 274.5951488 250.1507532 237.9285552 287.7697379 287.7697379 287.769738 299.9919357 349.358056 847.9453159 897.7661846 1444.853786 1447.774322 1427.61618 1432.694896 1386.036639 1439.192236 1444.655851 1456.956517 1508.679651 1386.449446 1102.183052 973.1162268 834.0688448 762.975224 349.3566949 299.9919358 287.7697381 287.7697406 287.7697406 287.7697406 299.9919384 349.3580602 411.9492817 543.3625662 1203.24354 1252.102547 1282.174462 1346.799408 1291.371706 1325.776189 1296.842849 1239.023073 1332.778241 1328.317567 1212.199377 1169.432962 1027.333225 1029.978978 349.3566977 299.9919385 287.7697407 287.7697435 287.7697434 287.7697434 299.9919412 349.3580642 917.838552 1016.015075 1558.804271 1521.662883 1499.897804 1527.91816 1473.835262 1517.262955 1508.844083 1511.118471 1569.526256 1479.339759 1327.520236 1291.534689 1131.421362 1076.942313 349.3567002 299.9919411 287.7697434 287.769746 287.7697459 287.7697459 299.9919438 349.3580688 493.6057845 612.3570573 1180.527381 1184.505957 1228.86204 1252.129463 1144.583801 1173.977672 1233.211107 1240.364832 1260.337114 1116.855397 933.1917542 899.1436017 707.3293676 633.9420753 349.356703 299.9919438 287.769746 287.7697487 287.7697488 287.7697488 299.9919465 349.3580732 420.2670191 499.8257821 1047.969519 1011.289556 1061.913899 1111.0393 1078.495896 1133.995766 1136.15831 1113.380124 1095.284229 898.6734726 741.8080647 725.9248497 576.4361597 552.0120823 349.3567057 299.9919466 287.7697487 237.9290244 237.9290244 237.9290245 250.1512223 274.5969864 419.3095986 400.2781342 649.34386 612.6288615 563.8105118 565.4572089 567.2282141 568.0722538 372.871185 414.5229009 461.0942629 381.1794591 339.3860504 323.4853219 323.4853221 299.0418386 274.5956178 250.1512222 237.9290245 237.9285704 237.9285706 237.9285705 250.1507679 274.5965344 314.9402882 296.6663501 296.6663502 259.9997572 263.5065845 427.8812515 568.6603379 531.8875227 588.8402054 541.3866215 569.9059021 368.9568586 339.3846838 323.4839551 323.4839551 299.0409297 274.5951639 250.1507682 237.9285701 237.9285722 237.9285726 237.9285727 250.1507705 274.596538 314.9402907 296.6663528 296.6663524 259.9997591 359.6715967 630.3549893 724.5493776 664.5397726 712.0711574 610.4551023 527.7434493 296.6663527 347.9283524 323.483957 323.4839573 299.040934 274.595166 250.1507705 237.9285728 287.76976 287.7697599 287.7697599 299.9919577 349.3580906 493.8663582 528.7932866 1048.013953 1011.314115 963.1585879 965.4227996 916.5907505 966.994773 967.1641091 965.6900809 1012.421431 898.4311241 750.3647235 725.9463043 576.4597635 552.025952 349.3567169 299.9919578 287.76976 287.7697629 287.7697628 287.7697628 299.9919606 349.3580958 419.1490589 499.9734943 1048.06519 1011.336041 962.422608 962.4252788 912.7590435 964.7828203 964.560667 963.4335692 1011.564065 898.4311083 750.3662718 725.9414793 576.4544296 558.5623959 349.3567196 299.9919605 287.7697627 287.7697656 287.7697657 287.7697657 299.9919635 349.3580997 419.1904966 499.9188747 1048.029998 1011.334418 962.4333744 962.4230527 912.5871499 982.0279145 1007.834894 1002.060727 1011.281664 898.444261 776.5340982 765.1747268 576.4466938 552.0148354 349.3567224 299.9919633 287.7697656 287.7697685 287.7697685 287.7697685 299.9919663 349.3581044 419.1683394 545.8621813 1160.746541 1192.076494 1318.940425 1434.505587 1413.285413 1477.821801 1478.444952 1478.276609 1528.064084 1403.977298 1244.779796 1217.974012 1073.588022 1057.216217 349.3567256 299.9919664 287.7697685 237.9290444 237.9290444 237.9290444 250.1512422 274.5970194 918.1680218 894.3090278 1149.203807 1108.260764 1059.235478 1089.3384 1125.855507 1115.156995 866.0380428 870.0073636 923.2827368 884.5660505 347.9297455 323.4853497 323.4853493 299.0418751 274.5956377 250.1512421 237.9290443 237.9285863 237.9285861 237.9285861 250.1507842 274.5965627 323.4839709 296.6663667 296.6663668 259.9997733 237.0540886 395.8799594 397.1700793 336.138806 377.0531705 418.4004786 329.7430614 305.2100331 347.9283667 323.4839711 323.483971 299.0409578 274.5951799 250.1507842 237.9285861 287.7697773 287.7697773 287.7697773 299.9919751 349.3581187 427.104179 499.918426 1048.003195 1011.3052 963.6016868 964.7219436 1017.10281 1097.535094 1134.508316 1145.700398 1178.574104 1051.111996 861.6653176 807.3891766 614.2978325 564.6212288 349.3567342 299.9919751 287.7697773 287.7697803 287.7697803 287.7697802 299.991978 349.3581231 427.5311804 499.893499 1047.987224 1011.302327 962.4206684 962.4330203 912.6072199 962.422055 962.4135329 962.4137171 1011.313285 907.0157968 750.4065593 725.9807079 576.5028363 552.0746494 349.3567373 299.9919781 287.7697802 287.7697832 287.7697832 287.7697832 299.991981 349.3581283 427.4931427 499.9636159 1048.027442 1011.320686 962.4202247 963.0156785 913.5456734 963.3462174 962.4975185 962.4017154 1011.287313 906.993445 750.4011437 725.9741268 576.4963955 552.0675225 349.3567403 299.9919811 287.7697833 287.7697863 287.7697862 287.7697862 299.991984 349.3581331 427.5192411 500.0161711 1048.047093 1011.327139 963.0946984 964.0894024 912.9446259 1034.659997 1107.688556 1154.774803 1230.468984 1141.578998 963.1400619 865.8060991 709.6776142 624.2953187 349.356743 299.9919839 287.7697861 287.7697891 287.7697891 287.7697891 299.9919869 349.3581374 427.6843053 499.8837076 1047.983394 1017.752065 1029.493584 1108.952217 1102.069786 1104.152607 1077.85993 1038.036708 1013.961735 907.0677393 750.3469147 725.9218791 576.4364302 552.0061747 349.3567462 299.991987 287.7697892 237.9290651 237.9290651 237.9290652 250.151263 274.5970521 427.4900205 400.2318884 649.3465651 630.1748385 707.3983813 907.3089841 1005.632433 1020.426052 756.9382459 756.2743415 802.4530259 763.9695744 347.9297746 323.4853788 323.4853783 299.0419123 274.5956585 250.1512629 237.929065 237.9286031 237.928603 237.9286028 250.1508005 274.5965921 323.4839875 296.6663829 296.6663831 259.9997899 500.8285874 522.36231 567.8812549 552.938389 615.7162277 563.6511506 665.4815467 389.8803928 347.9283832 323.4839873 323.4839874 299.0409878 274.5951962 250.1508006 237.928603 287.7697982 287.7697982 287.7697982 299.991996 349.3581527 427.0539235 629.8883119 1281.781625 1354.062648 1415.640243 1445.637874 1423.197719 1492.693905 1497.052645 1493.017526 1535.837419 1413.556593 1230.237162 1196.051037 1036.587129 987.0560237 349.356755 299.9919959 287.7697982 287.7698012 287.7698011 287.7698011 299.9919989 349.3581573 427.8811369 508.3932374 1047.974804 1011.520063 964.8575147 967.4304802 918.84405 1067.726927 1115.699415 1115.674328 1129.1515 929.5282666 750.3498815 725.920267 576.4372018 552.0075858 349.3567579 299.9919989 287.7698012 287.7698042 287.7698041 287.7698041 299.992002 349.3581621 430.6684362 508.5027294 1048.015855 1011.436657 964.2805448 966.4424666 917.5297015 1091.478295 1179.117863 1245.101543 1262.346369 1097.479341 824.0878977 725.9195477 576.43135 551.9964436 349.356761 299.9920019 287.7698042 287.7698072 287.7698072 287.7698072 299.9920051 349.358167 428.2944822 508.4205675 1060.63898 1011.33533 962.4422633 962.4400379 912.6092994 962.4306901 962.4113711 962.5261098 1011.693204 915.5597193 750.4026974 725.9766091 576.4931911 552.0547031 349.356764 299.992005 287.7698071 287.7698102 287.7698102 287.7698103 299.9920081 349.3581718 427.7915711 508.4625504 1054.588466 1011.352314 962.4418345 962.4336918 912.6006223 962.422978 962.4105203 962.4123342 1011.311931 915.5548043 750.3935353 725.9624938 576.4831005 552.049416 349.3567671 299.992008 287.7698102 237.9290862 237.9290863 237.9290862 250.151284 274.5970862 427.2479369 434.939205 668.9928969 612.6756084 659.1971544 816.5496375 949.7757193 961.1276997 766.7929901 776.4663318 821.0887453 806.2404984 347.9298035 323.4854085 323.4854084 299.0419505 274.5956796 250.1512841 237.9290862 237.92862 237.9286199 237.9286197 250.1508176 274.596622 323.4840044 305.2100666 296.6664001 259.9998069 235.8447923 577.3985118 561.4572204 635.9374717 581.9883318 629.5671078 496.6801851 322.2974004 347.9284003 323.4840047 323.4840045 299.0410169 274.5952134 250.1508177 237.9286198 287.7698194 287.7698195 287.7698195 299.9920172 349.3581859 575.0482473 641.9397718 1241.196149 1331.770897 1394.507489 1380.638815 1341.348052 1391.206905 1378.174475 1362.710336 1373.952292 1078.541591 750.3517998 725.9317499 576.4540191 552.0277181 349.3567765 299.9920174 287.7698196 287.7698225 287.7698225 287.7698225 299.9920203 349.3581911 427.4068714 508.6346824 1048.073777 1011.410593 964.2119114 965.8600999 917.4168587 968.5744132 968.2001852 966.4568317 1012.834701 924.1032804 750.4156359 725.9859215 576.4976233 552.0715364 349.3567794 299.9920202 287.7698225 287.7698256 287.7698255 287.7698256 299.9920235 349.3581961 427.5122598 517.0304733 1048.020608 1011.316184 962.4211917 963.0815168 915.4378544 966.7771001 966.4750815 965.086266 1012.104465 924.0799567 750.4011013 725.969927 576.482746 552.0555227 349.3567822 299.9920232 287.7698255 287.7698285 287.7698285 287.7698286 299.9920264 349.3582014 427.583981 517.0559022 1048.021439 1011.530471 964.8967336 1088.947522 1201.842269 1329.745389 1338.780666 1341.920829 1390.562959 1288.337163 1004.675786 920.6414492 766.1448731 704.8147111 349.3567855 299.9920264 287.7698286 287.7698316 287.7698317 287.7698317 299.9920295 349.3582057 427.9949994 516.9829213 1047.996655 1011.350922 1052.306265 1156.777301 1114.906894 1152.713675 1127.613482 1106.690363 1110.565102 924.0918721 750.3672819 725.9338752 576.4450336 552.0131981 349.3567887 299.9920295 287.7698316 237.9291077 237.9291076 237.9291076 250.1513054 274.5971203 427.5813224 417.3539719 649.3968734 612.7162068 563.8050118 563.7762598 563.7452959 563.7419206 314.5906569 327.235804 376.6028883 351.099478 347.9298335 323.4854385 323.4854384 299.041989 274.595701 250.1513053 237.9291075 237.9286371 237.9286371 237.9286369 250.1508347 274.5966513 323.4840217 313.7537506 296.6664171 259.9998236 211.1110325 211.1119802 211.11198 211.1134006 211.1119799 211.1110327 259.9998238 330.8410838 347.9284171 323.4840216 323.4840217 299.0410471 274.5952304 250.1508348 237.9286371 287.7698408 287.7698408 287.7698409 287.7698409 299.9920387 349.3582201 393.0775177 499.9742831 1048.034389 1011.948902 965.2767715 1038.318634 1074.892537 1090.309177 1170.262856 1358.113841 1476.147363 1255.224883 1036.52111 1004.326084 787.3153651 714.3399091 349.3567976 299.9920385 287.7698437 287.7698437 287.7698437 287.7698437 299.9920416 349.3582256 393.066519 512.4329754 1160.754977 1205.019868 1212.862431 1185.331054 1076.487247 1105.00061 1046.616976 962.4096741 1045.485653 949.7248829 750.3802882 725.9441046 576.4607514 552.0342034 349.3568006 299.9920415 287.7698467 287.7698468 287.7698467 287.7698468 299.9920446 349.3582303 393.3222255 499.9285518 1048.052061 1011.344292 962.4444324 962.4406867 912.6095668 962.4377975 962.4302551 962.4344703 1045.508894 949.7484749 750.4318914 725.9996975 576.5177242 552.084411 349.3568037 299.9920446 287.7698499 287.7698499 287.7698499 287.7698499 299.9920477 349.3582346 401.7492605 499.9084119 1048.003705 1011.991439 965.4669493 1076.589669 1148.238763 1331.993112 1352.920442 1353.964262 1367.390304 1134.014201 881.4425197 854.2258045 703.5971377 644.7104978 349.3568065 299.9920475 287.7698527 287.7698528 287.7698528 287.7698529 299.9920507 349.3582393 404.5512276 499.8637513 1047.980353 1042.765322 1066.150458 1118.990755 1067.86513 1117.971494 1093.717299 994.0338685 1046.556256 949.7111231 750.3764882 725.9414646 576.4489219 552.0130605 349.3568096 299.9920505 237.9286515 237.9286515 237.9286516 237.9286516 250.1508493 274.5966762 297.8530362 296.6664318 296.6664318 259.9998383 211.1110471 211.1120014 211.1120013 211.1134335 211.1120014 211.1110471 294.174505 347.9284318 347.9284318 323.4840362 323.4840361 299.0410718 274.5952449 250.1508494 237.9286539 237.9286539 237.9286539 237.9286537 250.1508515 274.5966807 297.8530385 296.666434 296.666434 259.9998405 211.1110493 211.1120054 211.1120049 211.1134389 211.1120048 211.1110495 294.1745074 347.9284342 349.4705901 325.4129857 325.0286691 300.9723775 276.1423673 252.0857178 289.3200357 289.707605 289.3234131 289.711442 301.5501473 351.3030577 444.0330126 500.3630362 1048.336574 1011.53353 962.5636876 962.537169 912.7112526 962.5149917 962.4952492 962.4837712 1045.583286 949.8548251 750.5434812 726.1066932 576.6248259 552.1761255 349.3568185 299.9920594 287.7698645 287.7698646 287.7698646 287.7698648 299.9920626 349.3582583 401.617412 499.9972468 1048.081895 1074.182193 1136.567274 1316.642392 1367.262336 1428.740174 1428.924179 1421.980887 1483.531661 1319.056231 1009.154173 965.2390351 889.667996 892.6058374 349.3568218 299.9920627 287.7698677 287.7698676 287.7698675 287.7698676 299.9920653 349.3582637 401.6849926 499.8511899 1047.977515 1011.995334 965.3117323 967.0517754 917.2458199 1050.407471 1060.855698 976.3063999 1054.027142 949.7276337 750.3911218 725.9581812 576.467345 552.0332151 349.3568248 299.9920656 287.7698706 287.7698706 287.7698704 287.7698705 299.9920682 349.3582683 410.4761834 499.9147994 1048.003919 1011.591592 964.8545992 966.5209522 916.8425281 966.3427795 965.2518381 963.193633 1054.08053 949.7459541 750.4188094 725.9860344 576.5052133 552.0909054 349.3568272 299.9920682 287.7698733 287.7698734 287.7698734 287.7698736 299.9920713 349.3582723 410.5225937 500.0252011 1048.087267 1011.378692 962.4697521 962.4639576 912.6372784 962.4586696 962.4500627 962.4556527 1054.072766 949.7821579 750.4633302 726.0271985 576.5478704 552.1011744 349.3568306 299.9920712 237.9291493 237.9291492 237.9291492 237.9291493 250.1513471 274.5971868 774.5497531 930.3869329 1211.165903 1184.718358 1133.140921 1103.14634 1072.143092 1050.601759 742.4638469 608.8267348 497.472488 376.6681962 347.9298919 323.4854968 323.4854962 299.0420635 274.5957427 250.1513472 237.9286702 237.9286702 237.9286702 237.9286703 250.1508681 274.5967096 306.3967215 296.6664504 296.6664504 262.092515 232.0646199 228.9965532 234.1150997 248.8729906 231.4084167 260.4302514 302.7181904 347.9284504 347.9284505 323.4840547 323.4840547 299.041105 274.5952635 250.150868 287.7698819 287.7698819 288.9258624 289.3121254 301.9203766 350.9018373 410.3513766 500.0688184 1048.110926 1012.651331 966.3147968 968.2435837 918.6756384 967.61893 964.9908656 963.093301 1054.080785 949.7985934 750.4808146 726.0593273 576.5996329 552.1769842 349.3568393 299.9920801 287.7698849 287.7698848 287.7698849 287.7698848 300.7636231 350.9020113 410.3933811 500.5646665 1048.618647 1011.883601 962.9582698 962.8960851 913.0168867 962.7918039 962.8110847 962.8391448 1054.460353 950.1774924 750.9197726 726.5267629 577.0686152 552.6450673 349.3568417 299.9920826 287.7698877 287.7698876 289.7013246 289.316595 301.9278112 350.9073898 410.5933092 500.5988571 1048.658069 1011.939825 963.0055808 962.9333391 913.0908369 962.8848855 962.8711089 962.8764316 1054.465657 950.1614187 750.8627857 726.4365563 576.9697896 552.542893 349.3568447 299.9920856 237.9286792 238.3149287 239.8602563 239.4764872 252.0867082 276.1482033 308.3357033 298.2206377 298.6059177 261.5527342 213.0476875 212.6623164 213.0467955 212.6623725 213.0477038 212.6624393 304.6579263 349.4835447 349.8722722 325.0433113 325.4321504 300.6030092 276.5453634 251.7144625 289.719285 289.3317673 289.7186874 289.329005 301.9387488 350.9151934 410.7982576 500.3696972 1048.295012 1011.558799 962.6280188 962.6031656 912.7770287 975.2076253 962.5923578 962.586957 1054.189318 949.8960673 750.5761002 726.1345806 576.6533166 552.2124518 349.3568503 299.9920912 237.9291692 237.9291689 237.9291688 237.9291689 250.1513667 274.9835402 419.0715572 400.6654182 649.6682427 612.9446841 563.9988215 563.9668763 563.9579672 563.933441 314.8101855 314.8536887 406.592898 377.187818 347.9299194 323.4855246 323.4855239 299.4279624 276.5263875 251.6998154 239.8669425 239.4858247 239.8743303 242.5648856 271.2878029 291.5468584 336.1257603 313.6030319 317.7939225 276.9057319 232.2169455 225.7064676 229.9122056 224.1558688 222.6192326 231.8059937 319.9910722 368.6812998 365.2487144 344.2956389 340.8526955 319.9135813 292.0296249 271.0973146 305.23924 308.7368166 305.2618871 308.7614199 326.0738401 399.7851396 440.5407331 503.9378122 1051.190525 1013.936152 964.7772372 964.6722866 914.5856995 963.9903858 963.787098 963.4628449 1063.455148 950.62374 751.328696 726.7248418 577.2178163 552.7796295 349.3568587 299.9920993 287.7699041 287.7699041 288.9286298 289.7054956 301.5426976 351.3006611 419.6521332 501.5321638 1049.364073 1012.608061 963.6415434 963.5913106 913.756416 963.2392882 962.8930024 962.7184407 1062.831884 949.983494 750.6634725 726.2294941 576.8034617 552.4010943 349.3568613 299.9921021 287.7699068 287.7699067 287.7699068 288.5423156 301.5374009 351.291687 419.2829808 500.4643469 1048.286547 1011.548971 964.3699337 966.4655106 916.8988642 966.0422072 963.8718491 962.4910383 1062.67515 949.8328108 750.5130909 726.0947151 576.6169632 552.1767328 349.356864 299.9921046 287.7699094 287.7699094 287.7699095 287.7699095 299.9921074 349.3583301 418.8472252 506.6447722 1048.138108 1011.415175 963.6025062 965.3794659 915.4093731 964.4843683 962.8038338 962.4569991 1062.631448 949.791345 750.4613908 726.032936 576.566129 552.1318512 349.3568661 299.9921072 287.7699123 287.7699122 287.769912 287.769912 299.9921098 349.3583347 418.6819999 500.0137481 1048.125923 1011.430663 962.5103308 962.8350456 914.2553855 964.4030152 963.5223239 962.4635087 1062.631085 949.7975073 750.481445 726.0694857 576.6109123 552.2019947 349.3568687 299.9921096 237.9291876 237.9291878 237.9291878 237.9291875 251.3090192 276.5284501 419.0218067 400.9593125 649.8202285 613.0226455 564.3415217 564.4005445 564.4630408 564.3976371 315.2174538 315.5586958 416.0823101 378.2485299 347.9299464 324.6448783 325.0361155 300.9847621 276.1643524 255.9477969 258.7087468 255.2896345 258.7802704 255.3488371 271.052916 292.0703482 344.433262 314.1604787 317.5135831 277.3687188 238.4464872 228.4341736 231.8554349 228.3874172 250.1296854 228.3839597 338.5584289 375.7315873 368.7282561 340.8515449 344.3264695 316.4558336 295.4776085 267.6029302 308.6772865 305.2441435 308.7011419 305.2632953 320.9386632 366.8489631 429.676304 502.4118598 1049.444609 1012.344685 963.2448332 963.0684167 913.221039 962.9103959 962.8845463 962.9903605 1063.268293 950.4721662 751.2870307 726.9418835 577.6250761 553.2998266 349.3568769 299.9921177 289.3162186 289.7066196 289.328408 298.1527839 320.7533424 366.6839825 428.627134 503.0415708 1050.183816 1012.885842 963.5900513 963.3681554 913.3819397 963.1053281 963.0595599 963.0064273 1063.063222 950.1862492 750.9225897 726.5189786 577.0935177 552.6787354 349.3568792 299.99212 287.7699247 288.3491901 289.3143447 289.7018356 301.5388344 351.2939076 427.9425664 500.6979712 1049.023682 1012.647951 963.6929251 963.6310969 913.7512567 963.4456409 963.3064046 962.9982885 1062.992435 950.3236324 751.3079147 727.0068437 577.546946 553.1173125 349.3568819 299.9921228 288.9289317 289.7045414 289.3189026 289.7094935 301.5447103 351.302548 428.0912044 501.2310356 1049.089398 1012.276621 963.2382376 963.0795068 913.3263721 963.1730919 963.0977798 963.0758208 1063.336016 950.5559836 751.2671398 726.8454083 577.3361972 552.8783134 349.3568844 299.9921252 287.7699297 289.3156298 289.7044753 289.3211656 301.9321538 350.9156365 428.0188574 501.1846383 1048.856937 1011.943878 963.0095123 963.0815893 914.4131191 964.7130195 963.6871433 962.5831286 1062.791798 950.0077038 750.7693131 726.4097547 577.0128425 552.6210255 349.3568867 299.9921274 237.929205 238.7012514 239.4746349 239.8650757 251.7024488 276.5426297 427.8992317 401.6690485 650.336038 613.3403783 564.2122965 564.1467463 565.0968687 565.2847952 315.083526 315.0592687 415.2676253 377.2600753 347.9299703 323.4855743 323.4855747 299.0421639 274.5957983 252.0798069 239.4726052 239.861331 239.4755921 239.8651293 251.7009613 276.535761 325.035107 298.607188 298.2164847 261.9393846 212.6618643 213.0519811 212.6627602 213.052839 212.6632086 213.0498615 312.8157139 349.8733725 349.484415 325.4311782 325.0420458 300.9902706 276.1544662 252.1017535 289.3278815 289.7177658 289.3278696 289.7182644 301.5498763 351.3053042 428.0871889 500.510924 1048.299517 1011.594305 962.6760417 962.66202 912.8602593 969.1770602 962.6095215 962.5903822 1062.735637 949.8879627 750.5692966 726.1315952 576.6585035 558.7699531 349.3568938 299.9921347 287.7699391 287.769939 287.769939 287.7699392 299.9921371 349.3583778 466.8983475 500.3577274 1048.220491 1011.46237 963.3719006 964.4458387 915.4075099 965.3797662 964.1086745 962.6074045 1062.670703 949.8459365 750.5554851 726.1753232 576.7576219 552.3836964 349.3568958 299.9921368 287.7699415 287.7699416 287.7699414 288.9277801 301.5379845 351.2924282 427.7066913 500.8137185 1048.714528 1011.949566 963.1790132 963.4738956 914.7641064 965.1505204 963.9530813 962.8447825 1063.077548 950.3687572 751.2218512 726.9172735 577.5206019 553.2008754 349.3568981 299.992139 288.9292261 289.3195771 289.7101178 289.335857 301.9496977 350.9453742 428.0191001 511.3705022 1050.459828 1013.207982 963.8724164 963.5677208 913.4757744 962.9950209 962.8714778 962.8333597 1063.027921 950.2236517 750.8950399 726.4425326 576.91919 552.4271067 349.3569005 299.9921416 287.769946 287.7699458 287.7699457 287.7699459 301.9228144 350.9027778 427.5987164 508.9155158 1048.536471 1011.867858 962.932338 962.8011138 912.9399466 962.739443 962.7083808 962.7440843 1062.971707 950.1819315 750.9128439 726.5217479 577.0873729 552.6649157 349.3569026 299.9921435 237.9292211 239.088148 239.4765529 239.8649645 251.7031226 276.537407 427.890395 409.8015374 650.0071756 613.1434127 564.1105232 563.9601843 564.6334348 565.0615956 314.8212774 314.7281863 414.9747765 377.0251257 347.9299928 323.4855971 323.4855968 299.042193 274.5958146 250.5372102 239.8582478 239.474411 239.8613618 239.4761367 252.0844612 276.144839 325.4188397 306.7585002 298.5955622 261.5427891 212.6543374 212.2690368 211.4975638 211.1136035 211.4979398 212.6542387 312.8056875 349.0864194 349.0862892 325.0283207 325.0278508 300.5853477 275.7533979 252.0833548 289.317798 289.7073165 289.3215385 289.7127328 301.5480538 351.3065132 441.1398514 509.2405312 1048.387903 1011.561528 962.6138502 962.8040597 913.8256034 963.8142346 962.6639551 962.510887 1062.704296 949.8796236 750.6057032 726.1960611 576.7520016 552.3740022 349.3569096 299.9921504 287.7699544 287.7699544 287.7699546 289.700553 301.538022 351.2929699 427.722172 509.2510371 1048.502805 1011.670625 963.4337758 964.8853023 916.0711799 966.0278824 964.7160532 962.8786995 1062.666002 949.8387197 750.5182031 726.1322552 576.7274929 552.322959 349.3569116 299.9921525 287.7699566 287.7699565 287.7699566 287.7699569 301.1494913 351.2890242 427.547848 509.0761808 1048.408632 1011.582089 963.4916461 964.27904 913.2466205 962.5346636 962.5366932 962.5356679 1062.701144 949.8846234 750.6278539 726.2816214 576.8985621 552.5368484 349.3569138 299.9921545 287.7699586 287.7699587 289.7006778 289.3169571 301.9309695 350.9120894 427.8333411 509.9605136 1049.147223 1012.061682 962.9709102 962.7909992 912.9314526 962.645519 962.6336367 962.6256558 1062.798223 949.977905 750.7060923 726.272325 576.7584037 552.3151736 349.3569155 299.9921565 287.7699609 287.7699608 287.7699606 287.7699606 301.9220985 350.9030218 427.5405106 508.7722531 1048.160556 1011.439789 962.851072 962.493203 912.6620214 963.3503009 962.9120842 962.443352 1062.624428 949.7877757 750.4635235 726.0408778 576.5673446 552.1317599 349.3569177 299.9921584 237.9292357 237.9292359 237.9292357 237.9292355 250.1514334 274.5973252 427.312306 408.9272096 649.4942677 612.8051404 563.8882855 563.8256859 564.0166047 571.5980745 314.8983961 314.600109 421.3856869 376.8605117 347.9300135 323.4856173 323.4856175 299.0422194 274.595829 250.1514336 237.9287386 237.9287386 237.9287386 237.9287386 250.1509364 274.5968289 323.4841232 305.2101855 296.6665188 259.9999254 211.1111342 211.1121324 211.112132 211.1136293 211.1121324 211.1111343 311.2619255 347.9285189 347.9285188 323.4841232 323.4841232 299.0412248 274.5953321 250.1509365 237.9287402 237.9287402 237.9287402 237.9287402 250.150938 274.5968316 323.4841248 305.210187 296.6665204 259.999927 211.1111358 211.1121348 211.1121343 211.1136329 211.1121347 211.1111358 302.7182603 349.0848616 349.8579093 325.0289737 325.4176512 300.5890994 276.5325095 251.7011079 289.7094473 289.3216705 289.7125563 289.3253689 301.9421337 350.9181576 467.1674213 509.1165114 1048.376483 1011.572252 962.6676408 962.5960712 912.7758172 962.5837104 962.5602214 962.5371408 1054.172418 949.8906655 750.5755323 726.1372174 576.6669591 552.2490212 349.3569252 299.9921664 287.7699704 287.7699701 287.7699702 287.7699705 300.7642585 350.9030881 427.5891875 508.882231 1048.218765 1011.446264 963.8102003 965.8918043 916.9312706 966.7630741 965.2550026 963.1735644 1054.086988 949.8052305 750.4837669 726.0592385 576.6053459 552.2056955 349.3569275 299.9921683 287.769972 287.769972 287.7699723 287.7699725 299.9921699 351.2878695 427.5028223 508.9403381 1048.256125 1011.595636 964.8557082 967.205446 918.1859383 967.8744633 966.2865541 963.9453219 1054.073355 949.773318 750.4451329 726.0128108 576.5357597 552.1125538 349.3569289 299.9921698 287.7699742 287.7699742 287.7699738 287.7699738 299.9921719 349.3584334 427.3272162 508.6205266 1048.08233 1011.799443 965.5037594 967.8414232 962.6939414 1126.18499 1129.241354 1046.574049 1054.118681 949.7462813 750.4188905 725.9837441 576.4996957 564.6978764 349.3569311 299.9921717 237.9292486 237.9292489 237.9292489 237.9292485 250.1514463 274.597346 427.2068674 408.8561021 649.411493 612.6872316 563.7978351 570.3368474 563.8006252 563.7634241 314.5985415 314.6235865 406.3022769 376.8476607 347.930031 323.4856355 323.4856359 299.0422424 274.5958419 250.1514466 237.9287489 237.9287489 237.9287488 237.9287488 251.308784 275.7554332 325.4163424 306.7563042 298.5974739 261.5425488 212.2676926 212.6548618 211.8829805 211.1136524 211.1121476 212.8438977 304.2598994 349.8584796 349.4740253 325.4172701 325.0308971 300.9768731 276.1437096 252.0873912 ================================================ FILE: src/pymgrid/data/load/RefBldgPrimarySchoolNew2004_v1.3_7.1_2A_USA_TX_HOUSTON.csv ================================================ Electricity:Facility [kW](Hourly) 55.42814107 55.42067783 55.41204556 55.40128446 55.60842111 59.33672134 60.56892065 53.37843759 49.72861549 47.07702636 47.11429235 47.82046622 47.15738108 47.22037269 47.23848711 47.22973326 47.12139647 52.79723525 55.59601688 55.77826581 55.75749681 55.62477271 55.45760894 56.16341275 55.44239159 55.42910173 55.4184364 55.41601286 55.62028635 56.24950117 65.14944714 123.9782357 166.303517 165.8878803 169.7195258 170.4021292 171.8674425 169.17181 170.4161619 168.0622573 164.455359 126.031362 128.8995442 129.1218782 129.1093843 55.6697378 55.54964598 56.28156732 55.56986085 55.56624293 55.57242122 55.58160734 56.73188805 56.57165547 73.18792457 133.5867454 175.1946867 168.8562641 169.9774977 173.7485234 173.9210782 166.9036987 166.4152219 164.3404991 163.6347633 126.0903734 128.9596707 128.9545809 128.9516433 55.44317849 55.4836478 56.22882979 55.50110718 55.50114896 55.48494147 55.47340453 55.68206381 55.65440869 65.01320134 123.9548114 166.3163576 166.3420888 170.151262 171.0115971 170.7033938 167.1451641 167.5354952 165.7019196 164.1768358 126.1456105 129.3764602 129.7452795 129.7299741 55.53782512 55.43024228 56.19898936 55.44486862 55.42915044 55.41701606 55.41024244 55.61522508 56.51601725 65.16506905 123.9796009 166.3217478 166.1827819 170.0678466 171.4593692 171.7341476 172.0129157 175.1044989 175.0681151 168.8004172 124.8250267 128.8937191 129.1335992 129.1371492 55.61479375 55.48652843 56.22550779 55.50239655 55.51732839 55.52057291 55.5155834 56.5676543 56.39660113 64.7196825 123.3847277 165.7288635 165.9614969 176.8592037 186.7385962 194.8723612 195.4615943 200.7033209 197.7002253 188.3696231 143.4106722 143.5057726 139.6734614 137.9473267 55.59572977 55.61511986 56.32849933 55.6148438 55.60775101 55.60282607 55.59857514 55.8217289 55.80370926 55.81244723 50.03238361 47.18167835 47.21483018 47.23746099 47.92735692 47.26091733 47.31963412 47.34030434 47.33210908 47.22567372 51.50080408 55.77818638 56.02548786 55.9936552 55.84132132 55.65369041 56.33450507 55.6357233 55.62081924 55.60985377 55.60392593 55.83372267 55.82205343 55.83444689 50.04778799 47.19005799 47.21019816 47.21002764 47.89716271 47.20931569 47.2563686 47.2795953 47.26993646 47.17410784 51.4509655 55.72933663 55.96374914 55.93394632 55.79717188 55.61905411 56.30081293 55.61120676 55.6097347 55.60807627 55.60223385 55.83541329 55.83003622 74.17749884 135.8140315 181.5536325 175.6662572 172.9242389 172.356877 173.113856 170.4513401 169.7579357 170.8959275 168.049702 124.9408469 128.8907248 129.1426578 129.1804137 55.59908201 55.47937856 56.22860776 55.50334148 55.49947759 55.49001652 55.48223431 56.54305016 56.37599962 64.91061587 123.617165 165.8649266 165.8250268 169.812715 170.486396 169.7247604 165.9080704 166.138298 164.1683041 163.555827 124.5807631 128.9113982 128.9339876 129.0123945 55.38956694 55.41742221 56.19605239 55.44530484 55.43415259 55.41949466 55.40625649 55.60902969 56.45959617 65.17659768 123.9771944 166.286105 166.3143933 170.3413626 171.3166108 170.798786 166.8435797 167.2347283 165.3014126 163.974693 124.6512621 129.4273618 129.7244423 129.7142872 55.51201123 55.40092885 56.18353129 55.42200785 55.41341461 55.40464151 55.39729244 55.60292971 59.92469399 65.18455187 123.9843008 166.2796119 165.8576287 169.7017031 170.653565 172.3440869 171.4266793 172.4716655 169.1680911 165.6593267 124.687655 128.8781552 129.10176 129.09088 55.61737258 55.50540038 56.24730877 55.53293133 55.53666231 55.53160379 55.52891252 56.58992136 56.42234962 64.61690893 123.2945032 165.6894986 165.711909 169.7174824 170.4404325 169.7941458 166.0080132 166.7621532 165.9372595 164.7655773 124.9365325 128.8999072 128.9034082 128.905196 55.50185579 55.53512351 56.26787557 55.55841197 55.55374007 55.54444371 55.54201935 55.75965756 55.74290127 55.75444748 49.97881435 47.12904232 47.15118176 47.15059965 47.83907184 47.1600154 47.21524217 47.23972214 47.2315067 47.13629028 51.41855308 55.70077732 55.93638941 55.91893946 55.78839419 55.61077292 56.29305553 55.60338363 55.59749047 55.59265932 55.58610139 55.81021253 55.79407649 55.8042545 50.01963331 47.16097718 47.18091644 47.17558544 47.84579693 47.16911964 47.22373449 47.23819265 47.22479942 47.1232271 51.40139524 55.67799999 55.90073489 55.88311531 55.75630392 55.58896291 56.26959079 55.57672112 55.57463478 55.57262377 55.57084003 55.7964359 55.78073951 55.79673473 50.01639351 47.17090093 47.1986189 47.1929986 47.87125911 47.18714733 47.2284177 47.24896709 47.23822507 47.13904326 51.42081733 55.70285651 55.9311346 55.90842227 55.77899836 55.60828495 56.29420451 55.60071444 55.59121201 55.5813526 55.57647441 56.69883415 56.5117616 64.60006627 123.3070904 165.718204 165.7403997 169.7494385 170.4637822 169.9032748 166.1273918 166.3807594 164.4879421 163.623287 123.20257 128.9207658 128.9226262 129.6071032 55.54216588 55.57034003 56.29584262 55.58786129 55.55155784 55.51703036 55.49760524 55.69796827 55.67631443 64.96719403 123.9511107 166.3322425 166.3481219 170.3454716 171.0804818 170.3587438 166.4949134 166.5784232 164.5506138 163.7441118 123.6456152 129.5163846 129.7310975 129.7186872 55.50789379 55.40130877 56.17806361 55.41933521 55.4118515 55.40043852 55.39412466 58.30366708 60.29811769 65.23370818 123.9897784 166.2981936 166.3287399 170.0619006 170.9320122 170.5067518 166.5604072 166.481313 164.3439789 163.5762458 123.1727743 129.1746781 129.5345901 129.6874215 55.54148393 55.41949777 56.19102786 55.43353932 55.43823396 55.4336021 55.42889956 56.4890095 56.31711191 65.4400144 123.9706789 166.311204 166.3395906 170.1253469 170.5614134 169.7676891 165.7933786 165.8286738 163.8163617 163.7015738 123.35202 129.1060035 129.1926417 129.2594251 55.39951579 55.44549929 56.20859646 55.47286777 55.47107199 55.4567789 55.45037815 55.66291155 55.64265869 55.65147717 49.86996711 47.01252417 47.02711297 47.01924619 47.72198519 47.00953725 47.05156214 47.07201154 47.06500479 46.96818811 49.8256888 55.52986823 55.73724774 55.71253286 55.58233821 55.41438527 56.13037193 55.3992459 55.39970947 59.15141646 58.86050215 60.72908314 61.80929434 60.49706761 54.73177764 48.22575093 47.03614243 47.04564823 47.74270391 47.0502727 47.09426485 47.11564864 47.10598218 47.00393022 49.84718957 55.53894048 55.72268903 55.68772698 55.55761771 55.39198201 56.12179858 59.41161171 61.74236913 60.25478291 61.31851002 61.35507794 62.84747979 65.48818245 124.0578991 166.3150515 166.0248981 169.7487217 171.3181337 174.3312453 174.7800092 177.721579 176.6688217 171.5574926 127.5104964 130.9201844 129.202593 129.0855897 55.63568642 55.52468692 56.27092973 55.55847551 55.55838316 55.55926025 55.56398808 56.69918257 56.53892921 67.45524099 127.2047813 171.2223436 173.8981778 185.8020301 197.2230629 201.1985763 200.9791493 205.5223038 209.8430731 200.7059001 148.021241 147.7961664 142.9569626 140.2366682 55.61185656 55.63539255 56.34113406 55.59871608 55.54540581 55.50568679 55.47664183 55.67127847 55.64317117 64.97520672 122.4962739 166.2994657 166.3383293 170.0001969 170.9324231 170.8303027 170.1661391 177.0770956 178.6622572 173.1271777 126.887821 128.9324785 129.1192749 129.1673698 55.5813006 55.45285333 56.21446511 55.46365631 55.45213156 55.44826621 55.44335892 55.64542431 55.62310845 65.06756359 122.5330756 166.2149336 165.7717539 170.2503353 175.740371 182.708542 188.2243467 197.2147262 198.1687701 182.9489053 132.9501144 131.7160594 129.1198059 129.1737906 55.6010416 55.47753377 56.23365626 55.49033643 55.47476747 55.46149895 55.45106606 56.51041978 56.34619818 65.37112418 122.2609155 165.7600695 167.2789136 179.9432529 189.96295 199.8762692 206.0640347 214.674482 216.5676173 201.844621 147.1259982 144.780611 137.9392154 136.9446203 55.59340531 55.60928069 56.31796362 55.58684851 55.56432812 55.55083197 55.55263137 55.79150041 55.7803272 55.79727147 48.59211439 47.17195934 47.2039626 47.22970955 47.97697834 47.3274018 47.38649467 47.40894426 47.39800051 47.29052379 48.70376 55.82524916 56.06535172 56.02703906 55.87061042 55.68378627 56.3671369 55.68300766 55.67983837 55.67476286 55.66778792 55.91006467 55.88677952 55.88232283 48.66053379 47.26196072 47.32081957 47.34279309 48.02638266 47.34911458 47.40939747 55.50182366 62.46018357 51.03071385 48.74287222 55.85581255 56.0870359 56.04190644 55.88353655 55.68573176 56.36669963 55.67908115 55.67207677 55.65114218 55.63183418 55.84647154 55.81311245 64.24697305 121.8149941 167.7312096 175.2121165 187.7414265 203.289431 216.6015514 219.4816412 226.5763176 226.9592219 211.063299 144.6949396 138.1749063 130.8319107 129.0902266 55.64788046 55.53101804 56.27543212 55.53920762 55.52932109 55.5237521 55.51516854 56.56296345 56.39350783 64.87359302 121.9774345 165.6885511 168.5540426 181.7306001 189.2232242 193.454355 194.4147863 197.5285533 191.0344957 181.4676158 134.0427452 138.6010669 135.89392 133.9428722 55.57283954 55.62656719 56.38201528 55.68322383 55.69572676 55.70731967 55.71985545 55.98930698 55.88314877 64.34839868 121.8482321 165.7178286 165.7584611 169.8681829 170.934582 170.6995565 170.3515238 176.3090359 177.5390105 169.1050737 122.1004821 128.8821493 129.181733 129.3429247 55.5599645 55.44616426 56.21424604 55.47311281 55.46431731 55.44563976 55.42703511 55.62661041 55.6003828 65.07819748 122.5110064 166.2877048 166.3071746 170.052819 171.0971599 170.6005549 166.8898365 167.0586785 164.9331582 163.7961796 121.7617201 129.2888889 129.7146655 129.6980128 55.4866422 55.37741851 56.17483342 55.40567538 55.40356881 55.3954658 59.4327652 62.83624013 61.1592037 65.67433155 122.5744383 166.2986098 166.1952457 169.7750158 170.7916224 171.0122682 168.2936616 168.6581755 165.5379985 163.8662965 121.7312395 128.9186249 128.9566204 128.9749384 55.4326072 55.47797453 56.23476613 55.50914864 55.50930073 55.50461657 55.49684178 55.70445781 55.69080035 55.70504561 48.50191797 47.07619169 47.08884693 47.08893595 47.77647194 47.09766456 47.15082101 47.17463045 47.16346813 47.05407976 48.46535958 55.59643104 55.80089319 55.77868164 55.65487004 55.49501044 56.19172908 55.48641757 55.48473467 55.48171881 55.47737806 55.6897984 55.67433446 55.68380621 48.47180716 47.04258517 47.05308701 47.03604527 47.72771685 47.01589199 47.05130045 47.06419278 47.05184326 46.95059367 48.37613627 55.51612669 55.72516144 55.70869878 55.59180506 55.43490348 56.14865017 55.43483833 55.43673823 55.43550738 55.43423924 55.64728487 55.63248018 65.06014168 122.4883623 166.2509573 166.0672371 169.9527327 170.6258285 169.7956842 165.7482591 165.7604006 163.7800157 163.5940669 121.7502937 128.8996552 129.1247342 129.1117955 55.64565036 55.52574776 56.25249344 55.54162434 55.53744057 55.53351222 55.53022711 56.58494733 56.41451255 64.65183502 121.8963204 165.7166978 165.7355291 170.1468094 174.2240816 180.2009025 183.8096472 189.5126601 190.6934653 185.5528486 140.1465899 142.1501488 137.3959978 133.6752192 55.55394269 55.57427562 56.29387531 55.57493166 55.55536217 55.53876745 55.51462914 55.71288585 55.68296518 64.60548495 121.9363274 165.7348408 165.7268103 170.7889969 177.4971099 183.9156735 188.0182427 194.5270003 194.1275993 179.8450637 129.2590513 131.5412192 129.2570768 129.1100774 55.65841669 55.53001488 56.25590436 55.52531629 55.50965012 55.50309821 55.50641251 55.72372531 55.71845796 64.28506888 121.8784218 165.7077351 169.3190665 178.3693687 185.103924 195.7682814 196.1248728 197.0784361 195.8008964 186.4880064 139.2993616 146.4570153 146.9154178 148.8784815 55.84284835 55.6902559 56.41167638 55.69982174 55.70610399 55.7190597 55.72105966 56.91233934 56.64582174 74.00589471 131.2262045 179.4088409 188.5619988 209.4258948 231.0604128 235.6787082 232.6451385 238.3192563 234.0535516 208.9051525 136.0597109 129.6495868 129.0076828 129.4487843 55.38850613 55.41714131 56.19870646 55.43651413 55.43414519 55.42248773 55.4117773 61.9845516 60.73412759 61.72780579 51.76508103 53.14487465 52.0977941 53.78768644 49.10583687 46.97026308 47.02019126 47.04565664 47.03998785 46.94153468 46.92933443 55.48159268 55.68483848 55.66387458 56.61990262 62.01204248 61.16343249 61.47026813 60.63957376 62.81891302 61.38127405 63.59401035 62.69165458 64.2268491 53.2756045 53.82899466 51.2039825 49.3398523 47.6908461 46.98740221 47.03918368 47.0633039 47.05870308 46.9602636 46.95116773 55.51018845 55.70697507 55.68360387 55.56730629 55.40410165 56.12487276 60.10710556 61.51205376 60.18467637 61.32247142 60.30841206 61.39906648 65.41238569 121.1499182 166.3092148 166.2445888 169.8533122 170.414509 169.6571404 165.6780618 166.7001069 165.0813291 163.7654343 120.2643118 128.8723705 129.2206751 129.6128284 55.52459867 55.41220563 56.19491231 55.44384287 55.44496656 55.4357517 55.42771026 56.48519777 56.30608216 65.47661525 121.109146 166.2570145 165.8329589 169.6971028 170.7878228 174.5262577 174.4402645 177.6397646 179.3474686 172.9410017 124.7994464 129.1057469 128.9971562 129.3682557 55.39469768 55.43217353 56.20580487 55.438808 55.42580613 55.41365307 55.4028554 55.60950611 57.86484323 65.16822929 121.1078055 166.2139093 165.7288689 169.7000806 173.3707339 176.1818104 177.5187172 182.9469496 181.9432082 178.3024857 132.0999228 136.6020299 132.3765782 130.4548773 55.70398533 55.57684349 56.30843038 55.6044469 55.59929468 55.58271849 55.57617692 55.80020132 55.77736391 64.23189296 120.4386168 166.8443659 173.4302288 185.1512556 192.1306879 197.6462139 200.510888 205.6180424 205.7799937 196.1359924 142.003243 142.9338685 135.4697938 131.1429612 55.70475946 55.57723701 56.31772243 55.60486642 55.58605029 55.56720421 55.5501145 56.59557687 56.41434222 64.79593457 120.6418468 165.7525452 169.5296305 187.1122028 199.5219561 209.3815629 211.1064751 219.778089 224.8698487 211.6296187 150.7919267 149.8615149 143.1477959 140.0252146 55.61237271 55.6372955 56.35556549 55.64710095 55.64895714 55.63643434 55.62900652 55.85990374 55.85292503 55.86140414 47.21384113 47.22463042 47.28305399 47.31417002 48.0156241 47.34310377 47.38832592 47.40963749 47.3936117 47.27965868 47.26700567 55.82004503 56.06046884 56.01250718 55.84704802 55.66314099 56.34576578 55.65480272 55.6512356 55.65352481 55.65515323 55.89887884 55.8816764 55.88814138 47.24552515 47.25572491 47.28513082 47.29996943 48.00073 47.34683609 47.41732251 53.09745271 59.30053291 47.37401245 47.33798236 55.87896071 56.12124107 56.07844045 55.9184429 55.70948671 56.37357437 55.67066987 55.65448296 55.65114557 55.64649543 55.88016082 55.86191758 55.8687501 47.22731873 47.23654852 47.27009172 47.28334303 47.98276686 47.3227921 47.38849826 47.41950789 47.41631394 47.32309966 47.32543592 55.89030569 56.14548855 56.08152028 55.91136577 55.72258618 56.40476607 55.7173542 55.72078224 55.72274992 55.72112635 57.01233217 56.81485012 91.68134736 147.531626 198.135508 207.9608517 217.8781859 226.8119003 232.7860793 241.9925186 241.0560506 234.7884027 218.8780837 160.7023612 164.921475 163.6308403 164.9794445 55.78184812 55.74683355 56.42065069 55.70231287 55.67529098 55.65119449 55.64482222 55.86701257 55.8352397 63.07610522 120.391459 166.0025332 169.936001 180.9146461 190.6102865 199.199465 203.3128495 211.4475405 211.4557221 193.4077149 135.857925 134.5307237 130.3359832 129.1017654 55.61721007 55.5046317 56.26029097 55.53530256 55.53971522 55.53526164 55.53084505 55.73543034 55.69719955 63.1471909 120.4501264 166.7707981 175.3307273 190.9793828 207.6126316 223.4897628 229.1575948 239.4300065 243.7405269 226.4893843 155.0416245 145.4692905 140.318626 141.9652105 55.78834609 55.61543111 56.345869 55.62940213 55.61134845 55.58575085 55.56583853 56.61297126 56.43468551 63.28910846 120.4541839 170.5500949 181.6330004 194.5918054 206.253261 217.7693715 225.6052078 236.2824545 231.4635569 213.1864102 153.3997347 154.251359 150.4721317 147.7118456 55.67246133 55.69609235 56.41478999 55.70038346 55.69645441 55.69463583 55.69793635 55.94165962 55.91704876 54.49193061 47.26612567 47.25418228 47.2569845 47.24185554 47.91476889 47.22730041 47.25978741 47.26897928 47.25690883 47.1529539 47.14712985 54.29585517 55.96634326 55.94790969 55.8142203 55.63876439 56.32298889 55.63304107 55.62543567 55.62422881 55.6262143 55.86478793 55.85358592 54.43599009 47.22430081 47.24106853 47.2704232 47.29513421 47.99151028 47.31164357 47.35441289 47.37128422 47.3627555 47.26197933 47.24795218 54.37417155 56.03539275 55.99859538 55.84223225 55.65561144 56.34584945 55.65883458 55.66124798 55.65829175 55.65776793 55.90755031 55.89051258 80.08175237 138.0952846 186.0988076 197.1506744 212.9075002 223.6161372 230.3613434 228.6091987 232.9462403 232.275009 214.8709242 154.815388 156.0348015 154.242 151.6476071 55.88397253 55.73384578 56.44910717 55.74325071 55.73616259 55.73289276 55.73226155 57.00617379 56.81087821 87.6951342 145.8451927 197.2770408 207.0638011 218.3515338 228.9975558 232.0284451 233.5098535 235.260766 235.1688423 228.678393 166.3452965 166.100574 162.6484766 160.0137826 55.7537391 55.77226771 56.48050942 55.76214251 55.74761514 55.73595106 55.72427332 55.96733688 55.94030609 82.05129182 141.1440361 191.1296893 199.285015 210.9962852 227.1737815 227.5706072 228.6350582 233.1182377 226.929438 207.9935014 149.0771657 150.6541289 150.441354 149.8417915 55.86646177 55.72112875 56.43845678 55.73042048 55.7248666 55.72066989 55.71263478 55.95665766 55.94312566 83.92516059 142.9959977 192.9365659 197.7952325 203.497893 207.0764744 209.020452 207.2870659 209.1226082 204.1572866 189.9786291 140.7213211 148.5614981 149.0334363 148.2251711 55.84731582 55.68598628 56.38095092 55.67183586 55.67557745 55.67834445 55.66975085 56.8759945 56.65441105 64.9192774 120.4226595 165.7155598 165.7579072 170.084837 173.9243695 174.7493023 172.2140918 174.0926935 172.4003018 170.2132606 128.1623829 132.4887591 130.6057783 128.8967453 55.47385812 55.50459577 56.24757805 55.51949219 55.51067815 55.49830554 55.48957886 55.69805002 55.67913186 52.83093367 47.05578814 47.06435717 47.10385796 47.12135488 47.81885204 47.15909688 47.21406875 47.2383734 47.2499661 47.15850705 47.13979391 54.2518243 55.87372506 55.83987762 55.71820629 55.55064249 56.22570793 55.51969976 55.51264248 55.50549514 55.49914519 55.70587599 55.68566108 52.83580157 47.08048959 47.13386733 47.21115363 47.2517953 47.94756294 47.27972845 47.34536202 51.99628681 54.77230794 56.8520103 55.67044702 54.39746382 56.037511 55.9885948 55.81594089 55.61696934 56.29239717 55.59277907 55.57475261 55.55277268 55.54929622 55.75676789 55.72899711 61.46174467 120.4689628 166.313117 174.1167431 187.8743652 198.1971671 211.7454851 215.5657117 225.984707 232.2612574 220.3186281 159.4527292 148.8445588 143.1872208 141.6119639 55.79437743 55.62779204 56.33853629 55.61128447 55.61162461 55.61861943 55.61019501 56.65157571 56.4497848 61.73529467 120.4425987 165.7250847 170.0514987 185.4317668 200.7303515 209.5496273 204.5941874 206.2813022 205.911782 196.9864268 146.7541096 152.5887632 153.9162411 154.2577184 55.70677774 55.73315218 56.44969487 55.74129782 55.73647388 55.73317094 55.73555822 55.99857535 55.97982593 91.86509517 151.9069038 205.9921488 217.284089 228.8468281 247.8652135 231.2826682 215.178786 221.642964 219.3550076 204.8377899 149.9402389 148.7532452 147.8186947 144.4296761 55.81513354 55.66821466 56.38247363 55.67644084 55.66689506 55.65225535 55.63795643 55.85235595 55.82177015 61.32609021 120.3770595 167.9811857 175.0124316 185.368782 194.8617038 203.644216 207.1595478 214.9909695 215.1490834 199.289942 141.4916713 136.602387 132.4713437 129.088238 55.66315915 55.54463731 56.28082503 55.54356889 55.53566356 55.52050413 55.50735452 56.55687937 56.38000254 62.43369314 120.6983689 168.5011695 178.3140431 192.7319083 211.2678483 226.7225937 234.2249472 242.3726361 242.7090114 227.2888337 162.4574177 156.1362032 151.6922237 148.3631367 55.67360703 55.69906389 56.42728395 55.71020479 55.70163746 55.68960467 55.67959601 55.91669543 55.89606686 53.04236451 47.28541386 47.32926375 47.39198764 47.41565455 48.09313376 47.41111409 47.45232101 47.45335091 47.43848888 47.34425583 47.31592204 53.01954087 56.12981508 56.09632562 55.94865547 55.75474515 56.4391439 55.74833305 55.74698133 55.7432802 55.99879372 55.96751574 55.96704018 51.58394993 47.30158005 47.34462053 47.36567652 48.05589819 47.3894102 50.30585777 63.63316535 68.0228091 63.21145611 55.55819101 52.66311367 53.2859654 56.07667886 55.90375988 55.69626526 56.35243674 55.64304385 55.62386766 55.60374917 55.58062375 55.77767959 55.74810637 64.2601371 124.754933 165.7287656 165.758335 171.784622 178.1297651 184.7959583 192.0178362 203.8438099 213.363685 204.0071489 148.6017949 142.009145 138.9127631 135.9381486 55.71327638 55.56871667 56.2938249 55.56175244 55.54854522 55.53032737 55.51487999 56.55681076 56.37435936 65.24798323 125.3241804 166.2877749 166.3054879 169.8764238 170.7528439 170.4912548 167.1317903 169.5331335 173.0814445 169.0218225 123.678378 121.9781834 125.9966614 128.9058663 55.41957509 55.45753704 56.23550372 55.4821189 55.4660619 55.44813593 55.43690842 55.64332559 55.61542699 65.02614633 125.3717297 166.1836198 165.7300717 170.146151 174.8428491 179.6113011 182.2516604 187.1718826 189.7767743 179.697024 129.885741 126.2432912 128.5407981 130.0081799 55.68510637 55.56640654 56.30665911 55.59049815 55.59606585 55.59268949 55.58260186 55.79348357 55.77517153 64.19708609 124.6827004 165.6799328 165.7074188 169.7315174 173.4776816 175.81445 174.8137609 176.0702385 172.9746059 170.4877727 126.1210487 124.4280874 129.1223809 130.7149346 55.69019052 55.564264 56.29579533 55.57946115 55.58099585 55.58040756 55.58110469 56.70412333 56.54795896 68.87413754 130.7251942 173.3701678 177.2392091 186.2072258 189.9414824 191.5401216 187.7629969 187.7913145 186.6093949 180.4666573 137.0158946 131.5857767 134.690267 138.4507739 55.59906697 55.61325471 56.31187789 55.58992522 55.56628703 55.54747741 55.52996507 55.73347144 55.71429961 55.72127279 51.36335576 47.07023155 47.0820534 47.07101501 47.76418405 47.06144979 47.10494149 47.13028141 47.13122749 47.03902018 47.04086999 47.04070163 52.95937119 55.78297328 55.64805936 55.47933837 56.18394292 55.44844159 55.4349709 55.42236001 55.41163038 55.61687742 55.59527962 57.9236219 52.6299583 46.99833422 47.06374558 47.09447008 47.79581038 47.11871278 47.17425047 47.21585315 47.23977561 47.15769151 47.16681806 47.16492325 53.07309801 55.8647482 55.7126971 55.54374186 56.22828416 55.51756133 55.51787008 55.51101775 55.49741493 55.70135643 55.67771009 64.86808473 125.1860403 165.7734766 166.9949167 177.576396 185.3924546 190.5232249 194.5562668 205.7901157 212.8172685 205.0891771 150.5199969 144.7269389 143.9610194 140.7094505 55.78409971 55.63808955 56.35116137 55.62602032 55.62289522 55.6060067 55.59687493 56.64554177 56.44752272 64.69192709 123.4141973 165.7266337 172.1765011 185.2138362 193.9463021 202.9545842 206.3751895 217.0330012 226.4622058 218.9000922 165.6438498 160.3322241 156.6117811 149.8492338 55.67538566 55.69343885 56.40706895 55.68632455 55.67986039 55.67030909 55.65484162 55.8704769 55.82014205 64.21378433 123.2837724 169.4566199 179.8001334 193.0263428 202.5231043 208.4102582 208.5554817 211.7881188 217.7713284 204.2302144 150.2264086 147.207916 148.0851395 146.3689851 55.84430872 55.70174148 56.42525157 55.71520354 55.70817676 55.70299281 55.6985304 55.94228477 55.92972305 84.35472587 143.7688305 188.1694408 195.8586113 207.3586105 218.0505396 226.7777723 225.5930147 232.625034 235.4773768 224.4388066 166.4255591 160.3758188 158.7069922 158.3383989 55.92907871 55.7661501 56.46618453 55.75389734 55.75159661 55.74992166 55.74570273 57.03218615 56.84584846 96.91656207 157.4473049 208.6994289 215.6621009 226.2157883 247.3457803 262.6522119 258.3114452 262.0716023 262.0525279 249.2020639 187.0250529 178.4512654 175.9316897 174.100777 55.80591902 55.82116566 56.52213707 55.80687857 55.80086279 55.79904262 55.794541 56.06035574 56.03954764 56.03255648 50.22980869 47.37992571 47.42357318 47.44552655 48.13270831 47.47060261 57.88580421 57.36692817 54.17670394 62.93878989 64.96998742 60.72559505 63.88474289 56.21912639 56.03919478 55.81396489 56.47211957 55.77198786 55.76218895 55.76235614 55.75671064 56.01070969 55.99083839 55.99274395 50.20289295 47.35255793 47.38108351 47.39124253 48.09323483 47.43920452 61.04692131 73.60883386 71.80040048 72.93229316 71.07864975 65.52136333 57.44787384 61.43346836 56.05360881 55.82031939 56.46416816 55.76575644 55.75511145 55.74064721 55.72088161 55.94265645 55.8991595 72.49241146 131.7843814 178.1073085 186.9665536 202.6481778 217.517261 231.2337416 240.1670059 248.3449043 251.6039664 237.3747823 177.0384347 169.2100977 161.4743743 158.4456634 55.93493645 55.77952002 56.49865383 55.78395214 55.77679273 55.77113611 55.77148129 57.06238698 56.86861893 95.85446495 153.9905413 205.9215533 213.2714441 225.3552367 242.3492874 246.9385046 244.4762804 254.1263641 259.2768271 243.2331607 184.0434781 176.2069246 175.4599173 176.9095441 55.81583984 55.83561221 56.53521188 55.82206633 55.81118872 55.80727765 55.80606901 56.06854117 56.04322323 98.97460169 156.4531911 213.9055855 222.5442626 236.1967473 254.3080984 268.9769605 259.6343091 259.3306999 210.5694688 167.9095017 120.4596146 120.3488563 124.8491138 129.1160887 55.68102528 55.56429943 56.28631302 55.57955443 55.5759692 55.56645501 55.55809868 55.76707252 55.74558084 64.26609922 121.8867141 165.7509477 165.7920553 169.7925219 170.4978587 169.900102 166.2059057 166.4136772 164.4802329 163.6258141 120.3448795 120.3429617 124.8564118 129.1341629 55.71417464 55.5911376 56.32571964 55.62000564 55.61588432 55.61306228 55.61483293 56.78965868 56.63878691 82.14428551 143.5113319 188.0743452 192.906062 203.9855777 213.2134137 218.1130334 218.0415428 222.6079754 221.6066777 209.6239138 154.0678917 151.0804253 155.0435398 158.0088197 55.73523095 55.75786371 56.46461179 55.75144763 55.73928823 55.73015221 55.72365669 55.96886952 55.95405718 55.95053562 48.72852704 47.31219308 47.344538 47.36518233 48.05079099 47.38119466 47.4319686 47.44149245 47.44631974 47.39118476 47.3465457 47.33148109 51.87975432 56.14160526 55.98403704 55.78682783 56.46123298 55.76561511 55.75400109 55.7474743 55.74443714 55.99091891 55.97385716 55.98223721 48.76107903 47.33667409 47.36066926 47.37457343 48.0979427 47.43957703 57.55247592 59.32821222 67.89189438 65.95195045 63.56633042 64.38558328 55.46845148 56.16778814 55.98593352 55.77444948 56.43345065 55.73182631 55.71272003 55.68483375 55.65799555 55.85912426 55.82286495 64.17515494 121.8140641 166.5258073 172.3680112 182.9458189 193.4205806 204.6909208 210.4052961 223.4069459 230.1014959 222.4288798 166.2832432 157.5366071 148.2146405 142.2051245 55.80706144 55.6732681 56.39087463 55.65713044 55.65031446 55.63614973 55.62181468 56.72156959 56.55738586 64.90984415 123.1895529 170.9450138 181.7223274 195.6615452 210.1983323 222.6573346 229.6093447 241.5233608 247.7331612 236.5466651 180.0251271 172.3049812 169.1518783 164.4418678 55.75109385 55.76304508 56.47087118 55.75243165 55.74111545 55.72484128 55.71904742 55.94256878 55.91375041 76.44528584 135.9610994 187.9175104 204.8827919 222.7235659 238.6935886 251.8304091 260.08401 273.5101951 278.3941677 265.3046214 201.0692756 188.5997484 177.1011321 171.2702181 55.96952446 55.8048569 56.52629894 55.82046356 55.81670353 55.80692913 55.79889069 56.02656974 55.98204259 84.37928205 138.9863051 191.7100019 188.913772 183.796205 179.3208544 179.7847012 178.0005862 179.314183 179.4695402 171.6790844 123.9183717 122.2431332 126.1531652 129.2460563 55.68612609 55.55964312 56.28483228 55.56799711 55.55602095 55.54379244 55.53701581 56.58804327 56.41447248 65.07136299 120.7838956 165.7899216 165.8143931 170.8548099 176.3609848 180.0440475 180.2799767 186.3595969 192.3524853 185.5527424 136.0160982 133.4617125 134.3718265 131.8650376 55.53515168 55.57542309 56.32744911 55.5939523 55.57537663 55.56466717 55.56138964 55.77523537 55.75840129 55.76861654 47.1388267 47.15501217 47.18712906 47.21197545 47.9160843 47.2568623 47.31534865 47.33382596 47.33265331 47.23902452 47.23912492 47.23006477 51.75256441 56.01670109 55.87793866 55.69323088 56.37420672 55.68531351 55.68332234 55.67625925 55.67574003 55.93612154 55.9278517 55.92715942 47.27587375 47.2936077 47.34182953 47.35694784 48.04479598 47.37876845 47.4354476 47.44202159 47.43516199 47.34328624 47.33891519 47.3368815 50.45615145 56.13635801 55.98032037 55.78628961 56.46807159 55.78115107 55.77955616 55.78345681 55.78591769 56.04765789 56.03114786 104.482707 159.8516341 222.7576401 230.6769153 240.9651902 255.8335161 281.0025999 291.8925162 291.3610557 263.842817 230.1598708 165.5372181 153.4383504 147.2284051 147.4738433 55.85351861 55.71175932 56.4227237 55.71546762 55.69562073 55.67728912 55.65843585 56.75334295 56.56283991 64.54692854 120.408113 166.8197893 172.0879193 182.7141284 190.9862211 201.0124351 205.4944695 214.8876477 221.1892062 213.3602966 159.7069628 154.8757887 147.9697511 141.9062285 55.62508933 55.65731378 56.38496716 55.67193214 55.65781226 55.64239729 55.63484674 55.84674307 55.80350937 64.21118916 120.4126106 166.4542144 175.1502586 187.3428043 196.2331097 205.4485871 206.5382553 213.9051064 214.5366035 202.9884537 149.9314129 144.4492587 141.0978349 142.8006121 55.80854135 55.65972296 56.38095367 55.66704936 55.65896884 55.64872241 55.65626398 55.9097593 55.89386411 72.09384031 128.8376972 178.2522463 186.5072994 200.4097608 210.5294731 216.4228261 216.109632 218.8789148 217.4974798 205.3304733 152.1743069 150.0814575 150.2434541 154.5126109 55.90692897 55.74964167 56.46767722 55.76453361 55.7583893 55.74620781 55.74414672 56.99553498 56.80881277 89.89360511 145.7074037 185.5351057 179.7513579 185.2270808 188.4091927 194.9708324 208.9163437 226.5070395 237.4960554 231.8307027 178.1726847 170.7876887 159.8808204 152.9812891 55.69111282 55.71368702 56.41251284 55.69769931 55.67810545 55.65790676 55.641735 55.85488547 55.83387325 54.40583897 47.2172919 47.28539213 47.36318264 47.39453573 48.09480658 47.42557391 47.46082212 52.72050048 53.1067336 63.14301944 58.93311641 58.44361302 50.51245274 56.16765487 55.99256206 55.78408419 56.44325966 55.74673162 55.73525921 55.72571552 55.72080684 55.96404972 55.93810323 54.51401452 47.30058726 47.33620519 47.39978908 47.43264466 48.14031056 47.47605484 59.6077667 70.17861412 69.00443286 68.95725872 65.27190108 63.00878561 50.53888247 56.18767449 56.01493389 55.80885493 56.47588014 55.77722653 55.7727235 55.77126906 55.76703588 56.02180049 56.00873115 90.71909537 147.6276024 206.5557115 214.3210342 228.4653075 248.8134754 265.5878752 274.1008329 289.7989 299.7413806 288.4551164 224.7940713 218.0099182 213.0301793 204.1889967 56.04850371 55.85417485 56.55511833 55.84191222 55.81947267 55.79662687 55.77260421 56.97924942 56.78442336 78.38580504 133.2418285 183.1578346 185.8735584 192.52484 202.5329616 217.3791141 219.556675 235.8712681 240.265492 227.3575916 172.1729266 164.5517387 160.3515426 161.5887285 55.7481993 55.77373361 56.49234355 55.78808239 55.77585444 55.76357258 55.74414956 55.97674852 55.95638375 83.18988376 144.1110944 199.7759665 209.7788201 215.9421446 234.4838229 252.6972343 254.8524064 262.4855116 261.8125662 245.2799229 184.2092305 176.2207019 173.6416124 175.4089277 55.99934992 55.82406721 56.53389628 55.81926804 55.80901042 55.80424241 55.79995566 56.05712894 56.03798328 98.72453925 157.329787 225.8942389 236.6952193 249.4011542 267.9054362 282.4635601 283.2782548 293.1709241 300.8992777 274.0532634 211.0057673 203.9944378 193.9407813 187.698415 56.01683873 55.83967085 56.53812624 55.82452037 55.8166192 55.80594431 55.79702707 57.08215454 56.85615569 88.46925437 147.1923671 216.4107194 237.3034144 256.8917158 274.9500912 287.9282382 291.6995858 300.8347568 302.8538259 282.6220001 215.9643725 209.2093204 201.619165 192.4473026 55.82361613 55.84031447 56.54257566 55.83308357 55.82870255 55.82206685 55.81146716 56.05679017 56.02617016 54.59076963 47.37717013 47.41133557 47.444508 47.4725391 48.19084047 57.28554446 65.2129419 67.57903739 69.55057835 71.13800303 67.81560283 62.1476227 57.77350357 56.266859 56.0590706 55.85167292 56.52247983 55.82658624 55.81797981 55.80343722 55.7960687 56.05628139 56.03121219 54.60226896 47.39113472 47.41911295 47.44468397 47.4675893 48.17602788 47.49938086 59.02142168 68.35665968 71.21373254 68.31134866 71.85588117 63.42782147 60.43583862 56.22599297 56.04315961 55.83696831 56.50433331 55.8113907 55.80161091 55.79331741 55.79296394 56.05897932 56.04511343 100.7466595 158.8915892 228.038438 239.6337464 256.9404265 271.7043277 280.3823468 279.6975187 279.4839574 277.4986398 259.9178944 199.9110079 190.8326355 187.30753 188.8150781 56.02848059 55.85400942 56.56648234 55.85758107 55.8474168 55.839724 55.83579112 57.18830021 56.97472342 104.7188419 163.3482459 234.4066442 249.96892 266.1219519 273.8225905 281.6812609 279.7098669 285.4792619 288.4075311 269.8444722 210.7758112 200.6953471 192.5577642 194.7909471 55.86429977 55.86981118 56.57745552 55.8695839 55.86361496 55.8538258 55.84595886 56.11964535 56.09820113 105.5447003 162.9402391 235.9265155 250.8965929 266.809937 283.2986822 285.936481 279.7294174 240.9447679 212.2265108 196.9159 143.5780895 142.1461585 143.076713 148.5834507 55.86356966 55.72430737 56.43121368 55.72219132 55.71621639 55.7160813 55.72042456 55.97161487 55.95240392 83.90649133 145.3081159 202.0298405 215.4630182 232.835041 253.8646794 270.5479612 273.1006055 287.2850734 293.0234797 277.0748168 219.2548537 214.913663 205.6557347 200.5875446 56.00551374 55.8034549 56.49766225 55.77216675 55.73598372 55.70774553 55.68569518 56.79109043 56.6092669 63.27120299 125.2283302 179.1701276 192.0223609 206.7177236 222.7561613 240.255979 248.3344142 262.3471246 270.4708288 258.5537343 203.6804637 201.6269241 200.5040384 197.9320079 55.83982111 55.86643235 56.58562859 55.86751815 55.86026332 55.85015071 55.83677103 56.10036835 56.07267255 53.21408662 47.42483297 47.43990598 47.46558853 54.00809803 65.15272159 74.6567897 79.17929734 86.47500294 81.65375027 85.42929947 79.24823571 81.70552115 71.31993914 72.60112164 57.99126961 55.9465414 56.61826881 55.93346253 55.93315698 55.92862647 55.87029156 56.13430084 56.11066352 53.23907312 47.43999578 47.45776774 47.48210623 52.69959151 71.97925262 72.63411169 73.86101424 85.24247469 79.81930497 84.7769001 78.00252504 78.38894366 72.7665527 63.38064927 63.25042064 55.94295893 56.60922699 55.91462118 55.89575297 55.82654407 55.80791401 56.04730066 56.01804248 88.12744079 146.1015642 212.2408586 218.3985775 229.5788102 243.5773654 238.0245264 225.9389699 229.8229159 233.7989754 225.8468159 171.9726475 168.7081926 166.4374343 169.8316924 55.96339049 55.79130781 56.50555906 55.80019416 55.79424279 55.7846185 55.77685551 57.04844795 56.85756696 90.11087173 148.8927353 210.8998651 220.3059751 235.0956774 247.2472681 251.0339252 241.2110371 241.9122633 237.003082 221.0346329 164.6084621 160.1031671 156.4350293 160.5939169 55.75236849 55.77817711 56.48386545 55.77293452 55.75341921 55.73666751 55.72316119 55.95696973 55.93107575 70.50458714 131.3221879 184.307661 192.8786413 207.0922838 224.2765999 236.9174689 242.5636827 254.6666992 261.6531328 247.356326 190.1011052 187.4858421 177.8904916 171.4800961 55.97078009 55.78941699 56.4966312 55.77367114 55.74967595 55.73424831 55.72672585 55.94982982 55.91206381 68.03959537 129.8389696 185.4901367 198.9176419 219.2972615 245.8661613 262.3272075 268.8473843 284.4623076 288.6619413 272.5903579 211.6609841 202.5812678 189.7952126 182.6514023 56.00025664 55.82682501 56.5419345 55.8327395 55.82991584 55.83231705 55.83081757 57.1679865 56.95834292 99.33467643 160.4145958 236.4285904 253.803327 275.2494174 293.7422634 305.0630954 304.2811632 311.8967832 307.5818857 287.1000391 222.3423749 210.1539919 201.7512166 200.9193663 55.85144545 55.87224434 56.58338583 55.8701134 55.85443554 55.84440778 55.83938285 56.10691577 56.07921418 51.78646388 47.41721495 47.43202549 47.46686462 53.8980654 66.49083377 71.3282445 76.90252788 79.05275132 82.95450525 77.55360647 79.78301788 72.40557611 73.39239996 68.63600352 56.14248366 55.93410375 56.61094995 55.92616757 55.92588545 55.92988581 55.91599118 56.16453883 56.14391747 51.8538104 47.46624018 47.47773077 53.92034836 71.76687359 76.00072631 76.62382507 78.90181766 79.61169564 82.89486323 79.17689788 77.63460032 70.90656387 68.21547702 67.66007137 60.94589494 55.94290002 56.62493248 55.94235065 55.93705491 55.93322938 55.93812996 56.22723444 56.15772967 122.904931 184.3381831 273.5202337 288.2660585 303.642925 320.5704066 330.0247114 320.766724 319.4332926 319.2885007 304.6470592 238.2410001 232.7235133 227.6287836 221.0033269 56.15450943 55.91806291 56.61371092 55.89916129 55.88918814 55.88428805 55.87578242 57.24987407 57.04620298 120.5371369 176.2914854 253.2454649 269.8133667 295.035585 319.4624311 329.4334917 330.2983868 331.2282049 329.2749847 317.4709655 242.6148411 229.7186396 219.6771835 218.4162487 55.94134419 55.92363655 56.6115537 55.90075007 55.89012158 55.87662586 55.86808191 56.14129879 56.12649662 118.214994 180.4142742 272.8342886 285.1104634 293.9662361 296.4603276 269.9724116 239.3200665 235.3554161 238.6229857 226.6119717 170.1824723 168.1445448 169.0460573 170.5717657 55.95387753 55.77976441 56.4834558 55.76932954 55.75278055 55.75153851 55.75250381 55.98771558 55.95176125 73.49514264 137.2869595 195.1097034 209.0722525 231.2364913 260.0478037 278.4396512 286.7828646 301.3196461 312.5244881 300.4237135 246.7990285 247.2123097 238.5041979 229.2306904 56.08228493 55.89704144 56.59427802 55.87434553 55.85292476 55.84827182 55.84961212 57.19990461 56.99860795 106.1017406 166.9479842 253.6762158 276.2734165 298.7216607 316.0000983 324.7481073 327.3219525 333.2487711 333.9358441 327.1441825 260.5277786 265.2999701 256.7653609 243.7806787 60.71396996 55.94180903 56.62098575 55.89602954 55.87284204 55.85283788 55.83665145 56.08662684 56.03947127 51.73127774 47.37313065 47.42806284 47.47539583 54.38224579 61.97778088 76.83211333 77.10067519 82.64078809 82.73590233 85.76458306 83.41676782 82.61324679 77.05090636 78.73900417 63.44600178 59.37158706 56.60486411 55.91785981 55.8987176 55.88490512 55.87004056 56.12472848 56.11121748 51.76699647 47.41781373 47.44536677 47.48362537 49.64031427 66.7851149 69.39620843 76.86228523 73.78839868 74.72790292 80.55115917 81.2928095 75.52646947 71.36192901 69.51026843 59.73092781 55.95152833 56.63319743 55.94593319 55.93277612 55.87249622 55.84787262 56.10645382 56.09358732 109.3537956 174.7747896 259.7295539 259.1453754 263.751576 268.855898 279.1980314 285.1243263 300.892373 299.6044886 279.9473455 221.5518098 219.9856937 212.2680582 212.4451089 56.15416793 55.90793802 56.61310887 55.90106636 55.89188326 55.88784712 55.88435694 57.27466225 57.05940786 117.6742766 176.7993003 265.2070164 278.2760047 298.0507916 312.2939794 320.9014841 314.6622049 315.2723695 313.6411558 293.0928519 230.5543115 223.8776413 217.7103745 219.7676011 55.94216603 55.94183286 56.6277998 55.90128743 55.89593547 55.89683417 55.89736863 56.17589187 56.14277031 120.9688685 186.860673 282.2184757 292.9238236 310.2977196 336.2121008 343.713437 335.1090834 330.9098129 270.9674272 217.2955342 158.7476219 152.8094757 146.6412849 153.0066743 55.89362168 55.75184549 56.46537359 55.7599705 55.75427 55.74960336 55.74961633 55.9967828 55.97872099 81.38265768 141.5220218 193.8974728 196.4413011 205.0293207 221.6480118 232.6392264 234.8028074 241.2584659 240.0994962 225.5150035 167.3176884 162.349499 157.6169087 158.8912977 55.89964035 55.73727918 56.44792982 55.73265144 55.71684899 55.70020781 55.68493269 56.82088706 56.63314509 63.59882447 128.2696046 184.509868 198.7931495 213.6522579 230.1186262 244.5987949 246.0391091 251.763353 253.6357418 242.3148927 186.8818825 182.942659 173.2575341 164.459463 55.73124128 55.75012094 56.46696267 55.7458423 55.71902654 55.70198889 55.68434324 55.90596607 55.88267618 50.17437978 47.29603171 47.35487199 47.40772594 47.44722684 48.16639132 47.48165908 49.76430649 65.08945077 72.50144667 76.93288828 77.16827942 79.31880666 73.12950638 76.19167982 58.17424775 55.892258 56.57989907 55.87932156 55.7993804 55.76488566 55.74614005 55.97466606 55.941814 50.22541909 47.32997437 47.38597343 47.43986314 52.82887013 53.21984637 50.83445957 68.51229541 75.17056429 78.35122003 80.18732783 77.28607624 79.01220428 74.01461183 74.43429897 58.32196153 55.91388872 56.58177919 55.89392765 55.88845399 55.86617963 55.81619798 56.07793682 56.05634244 91.43135447 157.5437814 238.5957455 256.0092489 278.2115464 297.6689492 308.8522579 309.1446236 317.9486089 321.790484 301.252709 236.4807334 228.0130116 216.7256712 209.8408801 56.06636429 55.88187854 56.59741262 55.88389369 55.87219076 55.86592737 55.86039094 57.22240113 57.01936342 111.2931462 177.251852 271.8416862 292.7470563 309.4177586 325.3831955 340.8694096 342.6892177 346.7809256 348.17596 343.8994075 285.4854063 278.6822061 257.7358784 243.464342 55.96060325 55.95360525 56.65672806 55.95206983 55.92030403 55.91189157 55.90163978 56.17184222 56.14438111 126.3130854 196.2835592 290.1461858 302.1797276 319.3889807 337.3555079 347.1612339 348.7230529 349.7522104 347.7859284 347.2927719 289.4497598 277.7785882 260.8123062 250.7214791 56.18575055 55.9335518 56.60352267 55.89946297 55.9072246 55.87475626 55.83778987 56.08922147 56.06657071 93.4953248 153.11411 233.1996524 254.4403138 287.6774959 322.0665071 336.5421905 338.4566191 315.9020346 282.955877 259.6186626 202.0159906 197.1568133 190.7582324 193.754461 56.05458455 55.85219807 56.55998628 55.84782391 55.8331807 55.81969181 55.81098721 57.09549741 56.89246309 90.70756508 151.4794824 223.8888244 244.5941142 266.6868171 284.5941888 297.7179513 299.5744235 302.9843261 298.8947575 280.216914 218.3886316 212.7205345 207.5009806 206.0578782 55.86845427 55.86748747 56.56165983 55.85177831 55.84719207 55.83669002 55.8283691 56.09378102 56.07270715 50.35554959 47.41161629 47.41617369 47.42007481 47.4423064 48.1652502 47.46940109 53.15414584 62.61319235 65.7495001 64.22673996 67.19117393 68.6874943 64.82268879 57.7607672 56.04951682 55.84494513 56.52395364 55.83108688 55.81818477 55.80532082 55.79766368 56.05797452 56.02346298 50.30548326 47.39408868 47.41957845 51.37649187 54.14772542 57.29029574 64.2304359 74.37435756 72.88419687 79.66006628 80.93296131 80.22748548 78.76686387 74.84443851 73.59152015 58.98340532 55.91412246 56.58202347 55.889042 55.88497913 55.88034319 55.86888359 56.05658557 56.02741475 50.30148243 47.39280877 47.43444251 53.32087506 56.56765737 59.17150978 77.38727538 80.46187238 79.58171238 86.25386121 83.02389242 88.41764238 82.43709808 84.45196791 81.13058947 77.99793698 72.19843481 56.64274538 55.93527244 55.9136428 55.91025249 55.90991303 57.26452624 57.06775726 109.7616244 172.5578592 267.4428641 290.672885 314.8464466 332.5579268 339.4661515 332.1192389 335.9751287 323.100805 286.5275284 216.9365825 211.2054773 204.8793861 204.7373995 55.91391503 55.91692602 56.61839734 55.91277206 55.86453739 55.86318437 55.85917488 56.12736768 56.10225086 110.9406445 171.8648094 253.131617 265.8900371 294.7794064 321.2442191 328.4017771 326.5930573 323.2417465 319.5059725 299.1852295 237.7142545 233.3284125 224.1741289 219.3575515 56.15793104 55.94421391 56.63528282 55.89044006 55.86824023 55.85083735 55.83463997 56.0844111 56.06168886 103.1125898 178.7844815 283.2040265 299.6349567 315.1582301 333.5322697 346.0382075 347.3528895 350.9924326 346.8446359 341.967421 282.5629084 268.2193606 247.1312567 231.3107161 56.15787907 55.94014234 56.62595609 55.91843994 55.88661563 55.84751831 55.83506321 57.13886696 56.93194245 96.28585726 167.1365825 269.7133018 293.4897899 311.497975 327.430502 337.8397876 340.4253415 344.7889492 351.0320527 351.2590432 286.1743312 271.169479 256.7735498 252.7498288 55.97436906 55.97435716 56.6726832 55.96819077 55.96276903 55.94179417 55.9157463 56.18306493 56.150543 50.42015493 47.47978353 47.49814731 69.4335772 63.50276031 79.97094427 74.37339832 89.1176235 81.70988989 90.20782363 79.46036016 86.41194105 71.04790186 77.15531375 73.52463138 70.0363492 55.95851769 56.63350113 55.94616467 55.93713926 55.92386081 55.92199523 56.21143004 56.18222481 50.42476446 47.47193045 47.48662822 47.49944975 71.17056886 71.79174323 66.89160464 66.58227111 71.96302301 80.19834629 77.73288737 76.34065296 72.49646778 65.42777909 62.16494524 60.07839141 55.95848019 56.63441892 55.95076932 55.90146326 55.87172004 55.85695853 56.12504108 56.08644124 104.6013221 171.1209809 264.9331973 278.7118637 287.0663798 297.1832597 299.8592709 298.7715926 302.4078609 303.3650143 285.6478267 230.3836099 226.0112065 217.4229406 214.1285623 56.11852463 55.90343758 56.592207 55.84116449 55.82198164 55.80702173 55.79709276 57.08044801 56.88662038 93.5330691 156.5170407 231.5257422 247.3902595 263.6996687 281.6117697 294.6332737 300.8662278 308.7890844 315.3305397 303.9538025 239.6361618 232.0760499 217.5490058 202.6555222 55.82541049 55.83889256 56.54149372 55.82480593 55.80134057 55.77582436 55.7604607 55.99498139 55.96123544 72.78533865 138.0016703 200.8040861 218.3864725 244.2199527 260.9739039 267.6035531 273.5110919 289.9442053 304.1887958 298.3216333 239.5890717 234.559047 224.2396437 214.1851752 56.06838724 55.88701009 56.59769692 55.87610373 55.85103148 55.8365149 55.82527506 56.08010311 56.05055068 95.33265032 157.4658059 234.8581325 253.7274347 275.9529813 296.1523793 316.1973772 314.603594 307.4730776 300.2934625 276.7118765 221.1492135 221.9433169 219.4031829 223.0397309 56.13775695 55.91521731 56.61059289 55.8939501 55.88011055 55.87313243 55.87286611 57.26458523 57.05879937 124.366817 185.5225478 288.558753 310.3865716 319.4366865 304.170811 307.9949519 314.3562816 318.4601855 319.3228188 300.8256519 238.8772206 217.0959684 203.2533596 196.1024469 55.90500512 55.91074125 56.60861149 55.90703898 55.85383367 55.85236348 55.84869275 56.12966706 56.10342796 50.38055962 47.44792497 47.47169118 47.49948942 47.51690196 72.98990238 72.97198273 77.19794066 83.6893459 71.56295854 79.83964552 77.72834491 72.90872171 65.38167744 64.15610863 56.17246205 55.95844488 56.63438004 55.93288659 55.88245605 55.87957429 55.87965997 56.15525934 56.12917015 50.41122621 47.46861378 52.55801085 65.02215812 75.94048436 75.57142908 70.17825342 48.13733591 56.72877142 73.95204367 72.2746246 68.8416795 66.42266171 53.31596244 62.29659286 56.16687386 55.94577115 56.61764666 55.91263664 55.85535286 55.84427905 55.84011454 56.11132347 56.09587673 116.8939678 190.2085239 294.1643556 308.6296669 325.4754735 344.8398045 350.3186721 347.3694678 350.3894236 347.3883983 343.9708504 288.0596271 279.3893451 258.6543152 246.8937388 56.16312619 55.93658478 56.62418138 55.91438207 55.90146706 55.8931102 55.83859855 57.13061719 56.93669942 102.0389865 177.105663 284.505409 301.9282403 316.9448921 330.6403872 347.1119254 336.4580969 332.0209713 338.3810307 332.486588 269.8799219 263.4523103 254.1601003 247.7364117 55.96087715 55.95384432 56.65620627 55.94726474 55.93810797 55.91913602 55.88745426 56.1588559 56.13571022 123.5098054 194.9795163 293.1851888 306.8782525 321.7761156 335.7523419 344.7178208 340.9255442 342.8098845 342.177727 336.4756779 272.0838381 261.9309696 248.8870363 241.2114395 56.17420237 55.96157639 56.65783535 55.94207472 55.93146986 55.89083331 55.88105864 56.15553385 56.11960507 115.1849402 191.1573293 293.5251025 305.6584221 325.5561626 342.4765573 345.6657116 340.6918416 347.9022085 352.7449597 345.7805777 282.7571382 270.575297 259.0787624 247.2538581 62.20650933 56.70120156 56.65872401 55.95239431 55.9468792 55.93331978 55.892819 57.27946774 57.05226941 122.4678151 197.1022876 294.5641595 316.186877 336.4372709 343.7477025 351.6102512 350.5642362 354.3047163 351.1153827 348.9650722 291.9078478 279.3652728 267.9082187 256.856178 56.44734343 56.72436977 62.92787236 55.96325561 55.95920024 55.95883736 55.9555546 56.19223597 56.16005739 50.43083075 47.48894433 52.48837625 72.89111984 77.40074431 73.37905699 76.71487635 54.25923329 47.43036763 47.44919319 53.48792112 47.48931176 58.61780909 47.77646513 54.88676088 56.14758124 55.9367061 56.61553248 55.92331129 55.88162284 55.83895821 55.83498411 56.10648281 56.08574174 50.36821636 47.43909036 47.45142429 47.46675285 47.45936773 48.14893359 71.16277329 70.95675901 77.34539175 90.84966033 82.31079866 88.74766456 80.97410509 86.24450984 77.86717222 77.11435127 75.75166411 60.77915442 57.93301689 55.91185026 55.89981277 55.88664533 56.15560567 56.14181434 136.520666 214.4219228 313.1871024 331.3114459 346.5266451 354.0394867 352.3218279 332.2764838 332.8664353 340.552554 338.2703521 272.0927634 263.7688127 255.5456606 249.0507938 56.18379584 55.97003766 56.66761178 55.96276857 55.95455353 55.95122277 55.94519195 57.32088848 57.11155266 135.0790371 208.6407019 310.2847328 321.216747 332.2390849 351.1331529 359.3676772 358.226953 361.3351867 353.5165826 346.0447479 299.1920741 292.8850336 270.9528412 256.3499197 68.18642401 62.62112317 57.0193638 55.95549232 55.95202826 55.95166568 55.95132852 56.23604359 56.16483943 130.3277323 206.0498268 305.5261681 319.5837252 341.617939 355.3469394 357.3610702 355.4321132 358.3095001 356.8415227 353.4299486 299.9204776 293.2513524 277.1731671 258.6495037 71.69748515 61.52789795 56.65802834 55.94755606 55.94342438 55.94301247 55.93754623 56.20424663 56.1462049 123.6709624 197.0875252 295.9970643 310.9931342 324.3843096 341.3680388 350.192913 348.587061 356.2410067 351.8215558 351.8488537 306.0222032 303.4351836 290.8244608 271.0490895 72.33673053 65.99806139 61.62194365 55.95577591 55.95227573 55.9467974 55.94279724 57.33028399 57.08677296 126.4891411 194.3697833 293.8795149 314.6463067 334.5227174 349.2153304 356.7799932 355.3892402 356.5943934 353.6309648 354.8128426 302.8192379 289.6203068 270.3149725 243.2903305 61.85395743 68.7375241 56.65165519 55.94388609 55.93401871 55.92687253 55.89745023 56.1584255 56.12798159 50.40632274 47.46637632 54.20147804 59.86154698 77.70181079 79.5273298 81.99483936 84.44811942 87.09189283 90.75304885 91.96728091 93.2939742 91.81277735 87.98239792 88.06802068 84.76937234 77.57831773 67.24490232 55.94716074 55.94314306 55.93770277 55.93882699 56.2210596 56.19230929 50.40460173 47.46708956 56.30847583 78.07610646 77.22855706 80.30253285 85.4107491 87.73038752 89.06565928 87.78454722 89.93805856 91.88405441 90.68173802 86.56858796 88.49892126 83.03167473 77.87304556 68.88322667 59.48915611 55.93940581 55.94271408 55.94239005 56.22771521 56.20251195 127.1466631 203.7213886 304.3502522 317.2518809 332.7538235 350.0103421 355.0495299 352.7832827 359.8259331 343.7501095 322.8417446 263.446804 261.9865816 249.0845532 237.0161946 56.15856063 55.95075447 56.64867489 55.93392879 55.92678377 55.9212919 55.92238495 57.29324333 57.08530565 119.6163135 194.1212016 296.1842665 306.4872513 321.6382347 340.4455769 350.1289576 351.0867771 359.5489283 358.3353494 354.5379541 297.8206242 285.3535162 270.0606954 256.7133859 65.10194194 69.3740188 59.45939676 55.97168816 55.96319941 55.95498989 55.94144896 56.22337357 56.20297918 125.1634472 200.2577258 298.0173614 318.1579951 335.0092784 347.320141 351.5481808 349.5428392 356.3973578 353.8682372 350.089907 299.3456457 284.1713763 265.1555238 254.9204011 62.10854456 61.01768192 56.67234316 55.9634703 55.95009914 55.93795928 55.93903895 56.22123974 56.19801319 122.5042977 192.9838503 287.3038413 302.2732128 321.2508968 336.5872164 344.3640781 341.5569392 349.194513 351.1560783 349.9152885 301.0732521 293.933458 282.8878559 266.6513405 77.36511992 64.11765907 60.00169955 55.94781571 55.9488026 55.94696429 55.9378657 57.33891894 57.10019581 126.3654093 200.812523 300.6044735 312.9561014 333.1080989 344.7482984 347.6744875 345.014504 351.0351676 358.0752259 359.2777262 302.9707959 296.1560712 277.8303176 266.2895886 72.20951234 66.70417806 61.62233845 55.97090083 48.75030544 48.74180535 48.73356423 48.98931933 48.92469508 43.19424952 40.25464648 49.9529643 53.66555599 74.33920792 72.61774068 77.132392 79.79423604 81.66778661 86.54331181 87.42625183 88.24474506 85.17700494 79.571602 74.70100308 67.8971574 53.67262577 49.38840151 48.69900935 48.69866811 48.69834713 48.69804305 48.96605756 48.95019522 43.17868631 40.23487772 40.26868912 50.22141799 72.1470242 71.98687897 79.5211294 75.68595027 81.21370384 81.98083954 82.37960604 75.60976691 73.85679882 66.00138377 67.5889311 61.67641629 50.0107986 49.4069552 48.71788625 48.71453869 48.71427421 48.71400474 48.9997998 48.97996896 103.1898977 113.0914849 185.4800733 202.7744754 219.7818356 232.9293434 246.6844741 250.3007874 264.7042012 265.4770251 234.0459227 189.9792706 139.7563833 146.8004073 123.8507982 48.95931182 48.75281704 49.44883193 48.74289334 48.74363647 48.74206661 48.73365813 49.01535798 48.99016506 43.21372985 40.26524389 40.27302871 40.28404172 55.38251591 72.84887898 74.23932015 75.26325381 82.53085011 76.94426822 83.84126603 77.34611799 83.31558593 73.2574195 72.64245384 64.70843828 57.78026793 49.82667435 48.73092828 48.72552679 48.7173515 48.71402698 48.98737967 48.96452472 99.84366012 108.0686999 180.1134463 198.3935599 210.0567515 222.7336827 235.2666303 245.2611746 258.7932357 258.9372219 267.4615105 239.1761519 160.2711829 157.2008891 129.4744834 66.30552794 58.06417066 49.46625353 48.74988414 48.73976603 48.7343179 48.73032623 49.01563793 48.99041772 108.3001935 120.0019813 187.4539305 208.9978139 228.0527204 242.1744394 253.2830083 262.6804899 267.2576565 246.3360725 241.4244892 211.5361904 150.0046467 148.3267483 117.7791963 48.93903611 48.73849785 49.43196764 48.71232804 48.7028669 48.70469702 48.70230415 50.11795169 49.87689239 110.0372654 118.2222355 175.9823624 182.4133302 190.9020594 211.8953785 217.7420109 221.3479645 233.8855423 239.2354132 237.9023978 211.8942854 148.5411769 146.545234 120.7935096 48.72543864 48.73230169 49.42686924 48.71451073 48.70358433 48.69201476 48.68272961 48.97033413 48.95835944 44.6618535 40.25911132 40.26551254 40.28961941 62.11671866 71.77053569 71.65253062 77.59810243 74.8832989 84.01853451 79.17453901 78.79936054 65.28294592 63.02065298 61.09633647 59.9776144 48.75592876 49.43676509 48.74597642 48.74829774 48.7453869 48.7384967 49.03231612 49.01200789 44.65184913 40.27093904 40.29287768 50.29597309 70.46605333 77.47867976 78.18449807 78.92657832 83.18901999 83.62617562 84.26927198 83.75603816 82.46821969 79.31369022 81.30050322 71.27790395 66.62167345 55.74467037 48.75069695 48.74674994 48.73206141 48.72142383 49.00389278 48.97995758 105.0704353 117.7019545 192.1417588 206.3986081 222.3301021 234.7011584 237.7043164 243.7081173 259.6585739 267.2071717 275.7992542 249.5762926 164.3144861 162.9984392 133.6092572 67.03407823 59.58115182 51.09019226 48.77205695 48.76661371 48.75341554 48.75151802 50.19983762 49.98044879 114.1962296 128.5427649 202.1450864 214.6651943 231.2849645 239.3977545 253.2941698 251.7269092 238.6565683 250.720226 261.6246702 226.3061257 154.1646615 150.0688145 121.9468806 51.18471239 48.76463858 49.45786989 48.75090915 48.72022469 48.69453828 48.67389836 48.93442138 48.90519132 100.2780467 108.2967056 183.0341843 203.2244745 214.9358291 234.4078589 247.8213041 250.9720688 264.5862323 277.5487524 277.1737817 246.5578844 165.2343815 162.336109 131.3834634 71.42107866 51.09076061 49.44797912 48.7362367 48.71881958 48.69968324 48.68413179 48.95112992 48.91621571 99.99408413 111.2531841 184.4222172 202.1785738 212.2859595 226.8382671 238.1635413 244.6606069 253.0443387 254.0934753 264.9947599 244.8199837 164.029164 165.9873557 140.4624418 72.60695981 63.17205154 61.41669079 48.7507571 48.72014549 48.69902637 48.6871567 50.08246562 49.87231978 106.0522761 114.5751914 185.2529305 200.9232473 215.8764594 229.241169 241.1111964 251.8871991 261.3770505 266.0067001 276.6584012 245.5198415 162.4110158 166.1666161 140.9774522 73.54278726 71.90326151 61.98078013 48.74440436 48.71553441 48.69545419 48.68446029 48.94789159 48.91438232 44.62334834 40.25478883 50.03372266 54.6780591 70.04891789 72.33578748 76.80284426 76.97055303 84.57704622 85.12790584 89.07340284 87.92968635 88.34142861 84.23694467 84.90856094 74.71236256 73.16500173 71.05490304 56.9266378 48.76666264 48.75854683 48.74597716 49.01404182 48.99265794 44.65943368 40.27928733 40.29429096 62.56600272 73.43477885 74.38089922 81.42546743 72.12490684 73.10770992 69.46560732 74.25674156 67.38220302 71.00558712 62.26349324 59.8283897 49.35003249 48.72596834 49.39253842 48.70559538 48.7010347 48.69257021 48.68861535 48.96053923 48.94956056 96.0349714 96.90565808 162.1346735 182.45033 195.9632591 207.3375269 219.3671005 228.170462 229.2562381 238.7172167 252.7242661 218.8417934 147.5778767 147.8796226 115.7545705 68.84148751 50.72751197 49.44032073 48.70463346 48.68467135 48.66729273 48.6573492 50.00915146 49.7992171 98.76437395 107.3197119 177.9141322 193.2316193 209.91822 224.5776259 231.2621928 231.1146413 233.9667302 242.1669665 248.5322585 219.5757973 150.4808969 144.5937304 117.6823875 51.06886701 48.75591286 49.45461922 48.73787341 48.7174062 48.70380542 48.68742193 48.95085136 48.91623267 100.790605 111.5416886 177.5571683 196.8067287 216.2232422 229.2181364 239.025853 245.404702 250.9854828 256.9715997 258.3332949 226.0506832 156.1620908 156.3614087 130.405793 64.30914667 60.1679163 49.46454053 48.74315468 48.72866168 48.7224495 48.71169273 48.99352413 48.96457512 109.7017122 119.3005229 185.8661184 204.070212 229.5386639 246.077374 259.3310469 257.203292 258.7493693 250.6315837 248.5092228 226.8688881 154.2059193 151.859719 130.3472082 67.07852178 53.39266153 49.4648271 48.74850075 48.74272609 48.73566712 48.72689167 50.15459351 49.90598893 110.442406 118.9807615 191.0325986 210.6072378 214.7763991 215.6034673 240.5195246 253.0185084 230.1334904 219.4028279 233.5696616 202.4563105 145.5559085 138.6577825 111.2649109 48.70315197 48.70710499 49.38720787 48.67590813 48.65958071 48.64897728 48.64316371 48.91547116 48.89296552 44.61430888 40.2489537 40.25903241 40.28972012 40.31888776 68.78363539 68.11082283 66.29939405 69.61357266 81.47646579 72.45964707 81.96558443 64.11163957 62.13142054 49.68595398 49.57040771 48.7460355 49.42100876 48.73877544 48.73850127 48.72385958 48.67740159 48.91946705 48.89189912 44.60332977 40.24236404 40.28123128 40.31597983 66.04796171 69.06668859 71.58820765 65.94129723 66.13916066 69.02952143 64.30243897 69.32028513 63.97603116 62.6597865 57.99400074 54.03017647 48.73441567 49.41279151 48.7301692 48.72057658 48.70853652 48.70462996 48.93391506 48.89902724 102.9569953 107.6919144 164.5141233 184.8426992 208.820617 219.2612903 208.8526422 212.9914967 231.2364333 229.216499 215.6329379 189.3358031 150.5882558 153.1007311 126.2659456 48.94144515 48.73331786 49.4103351 48.7025016 48.69048787 48.68113444 48.67112268 50.04446105 49.82011972 102.6373313 107.7794157 170.2423232 188.4154467 207.0321517 213.8912094 224.5022379 234.0853207 242.2987559 241.9288252 235.9967847 212.6410991 149.1705962 145.0186226 123.1405083 48.73966107 48.7563213 49.44786133 48.72775463 48.71365933 48.69299693 48.67629649 48.95358381 48.93062606 107.7747302 112.238432 181.0751836 203.0871456 215.8572087 230.2354688 240.0086608 245.5268649 260.5424439 264.7243369 262.7231157 235.4395648 160.8468393 161.5072595 136.6947345 52.48222469 49.17336711 49.46071518 48.75182062 48.73528056 48.70751205 48.68531129 48.95238804 48.92993153 108.6736084 114.1558436 184.1001426 208.0197476 221.5637041 239.367875 252.7426681 217.5640353 216.9765408 218.2685904 201.304514 169.8194512 139.6548915 144.7106861 122.7685252 48.93871639 48.71810431 49.39768217 48.70108865 48.69727581 48.68888258 48.67371765 50.05449371 49.84809264 106.6766691 110.8624571 175.664143 194.0054028 213.7829686 230.4799547 244.8839023 253.5605307 263.2616784 266.6792814 273.3166314 245.1128117 163.6803057 158.9615212 132.6197796 52.49158832 56.5159883 49.45515984 48.73537764 48.71584456 48.7053017 48.70324322 48.97906974 48.94619071 46.07674799 40.2607985 40.28064159 50.48675096 46.04362129 72.9789306 77.30114038 74.81693591 77.66492294 78.83119477 72.7111271 64.94186592 65.57570611 57.6066744 59.13557315 50.66418451 48.73248467 49.40455276 48.71733615 48.70891071 48.70496939 48.70043523 48.96542779 48.93677992 46.01667966 40.22433545 40.25746697 40.30003627 54.39688211 76.41172608 79.1877118 82.35238676 88.21178483 88.0722799 91.23989578 87.4116894 84.06466836 77.45801365 76.83779377 72.86630837 67.83928358 56.78682494 48.74708864 48.73745729 48.73556493 48.7338146 49.00877577 48.9922196 109.8105065 122.1387342 196.3719399 217.9356368 238.0729638 261.912451 281.8915207 279.9042816 286.6481958 293.604334 292.1628271 262.9647129 163.0420781 153.97608 126.3648519 57.550829 65.39240279 51.70665775 48.75090576 48.73969667 48.72826894 48.71708975 50.02664841 49.79499472 107.6156155 119.6132287 180.5031487 195.9029085 208.4758439 224.0024411 236.5498228 242.6068043 258.4228919 281.1800993 298.4439997 265.818145 171.2001168 163.6759207 137.9220144 74.71851514 74.15145319 72.95547662 48.76356301 48.74296502 48.7194856 48.69517995 48.95777477 48.92231061 105.1233177 114.837788 186.4003922 207.5967509 220.247875 238.8049665 262.9573341 274.7570793 290.2867313 303.1278533 309.5572034 289.6399808 182.2290077 174.193132 153.2512281 83.85809469 81.5058937 68.80157618 67.29779345 48.76074176 48.75371407 48.74509652 49.01387309 48.97768564 114.2053487 125.6413649 198.3066699 213.4826429 234.8052975 258.9649919 275.947268 292.6378218 303.7412581 306.6625257 279.5690727 213.4061472 148.768964 156.2178263 136.7142523 52.64498297 52.84183756 52.05829168 48.76288054 48.73530399 48.7172165 48.70460701 50.13002162 49.91803892 114.2330738 125.1421206 199.7399353 219.6534223 239.9446258 262.4485284 271.9697747 276.2095337 294.7421717 300.3094216 303.0450601 282.7570066 181.5102254 174.2835366 145.8092522 76.62721125 72.92338238 57.53404916 60.21400197 48.76017624 48.73234035 48.71825287 48.98030118 48.93666633 46.05736144 40.24893941 46.78858321 55.46694323 74.13866307 82.81647038 82.12738106 83.62592945 86.38328141 91.92969426 90.88600653 79.64404195 68.21095873 66.46346514 71.70055354 60.59948545 60.16734513 49.42585194 48.72158537 48.71458167 48.71427436 48.70888309 48.97678607 48.94815795 46.0323087 40.24584967 40.28672747 52.22158776 74.168993 69.05225039 73.42024382 75.87068074 81.03454207 80.2246993 84.59071466 81.60349364 81.67906303 73.8588162 75.21692029 68.68649494 67.38689124 49.42903281 48.74709416 48.74261622 48.73934501 48.73910641 49.02736024 49.00208564 111.7371839 102.5878106 147.0981758 153.9768761 164.3779157 171.3628211 177.4414052 189.7205666 203.0499312 206.0544933 212.5985741 185.2521919 141.3384952 139.4968549 113.3835267 48.94766386 48.73908963 49.42461372 48.72160526 48.72121161 48.72599653 48.72430356 50.05330221 49.8087288 106.5737566 113.6908281 179.9170523 198.4904697 217.659649 239.6149732 245.1413007 245.4980428 263.7342804 273.7089591 283.271221 261.3987816 173.3259327 169.0755603 138.7826129 68.92607545 55.29484519 49.45360242 48.7438654 48.73173512 48.7169225 48.70707925 48.97302484 48.93547867 110.0377913 121.4852139 192.1309299 210.0407057 221.8551639 240.8574019 260.1684627 267.2594687 277.8935646 286.6226693 293.4622774 251.4500348 163.6451169 164.5137794 142.4132309 58.24057116 63.63241562 49.45767816 48.73674484 48.72674654 48.71416122 48.6858543 48.94883415 48.92470022 107.0828905 116.6483839 187.1534223 205.3173212 221.977378 240.2444274 258.0769584 268.9343817 284.651492 295.5329229 294.3687527 241.9277736 161.4419974 163.78651 136.8057382 52.27188518 51.42114787 49.46364201 48.74762161 48.71769221 48.69176001 48.68657652 50.07708224 49.83943087 107.9867015 119.075759 189.9669199 208.0594045 221.8292095 240.6892878 258.9595745 271.1616303 276.0273139 275.5172328 288.5256967 261.4027989 174.8892513 175.332261 145.5730211 73.93685719 63.39370782 61.33929639 48.75522443 48.7403365 48.72912119 48.69993437 48.9490137 48.93470276 47.49971798 40.26212522 40.30113931 56.15216451 74.65656342 75.25506929 83.22639561 83.79316855 88.89204115 89.6640363 94.34537507 92.89419344 91.62999789 80.4629313 82.08790925 71.67961846 66.01699113 66.47730188 62.72861029 56.05683019 48.76640005 48.75832827 49.05197856 49.03196891 47.53059165 40.29035668 50.74738634 67.44245637 69.86860831 83.8463553 81.29834723 90.80958781 83.71833849 84.29669557 73.34402426 71.61614711 65.3195488 60.01080815 64.95021633 48.9353068 48.71815805 49.39774105 48.70934736 48.70540338 48.70512284 48.70483572 48.98887469 48.97555343 107.9968619 109.5689989 170.0373633 184.9431298 200.3088995 213.1970636 185.8647813 166.5923735 168.4039806 171.5736106 179.5567833 157.3975571 137.3617436 137.3489325 114.3347322 48.92317979 48.71442615 49.40262091 48.70490158 48.7003367 48.67708049 48.64342021 50.00392814 49.8016593 106.4803911 103.278366 160.3720434 175.7802915 191.6988181 201.8518728 217.136968 226.3509384 241.3283234 251.1547237 254.8898653 227.3675042 158.4042202 161.4940549 135.3611587 50.76585588 60.45849478 49.43795052 48.72043667 48.69441681 48.67106085 48.6559358 48.9144299 48.89266979 101.2099974 105.5044732 177.1530814 199.8048885 215.470968 234.7987393 245.0993804 250.5148148 264.179995 263.1212233 263.0537252 231.4263524 158.8087969 158.6925914 130.5122586 52.05597293 50.77008854 49.44163886 48.71838771 48.69361962 48.67381948 48.66278184 48.93371423 48.90987301 104.9210028 114.1839488 188.0415337 207.0670724 223.3923911 248.4346426 262.5127518 204.731983 171.3158898 169.1493378 174.7123234 151.1786887 135.6506135 136.4249562 111.7025316 48.86662263 48.67274007 49.36095747 48.65982457 48.65507159 48.65162851 48.64872331 50.02774538 49.82417479 111.6034849 110.7353524 167.0745038 187.9292918 217.1076867 241.4572726 256.1404078 232.225887 210.318609 212.8471927 224.0102926 196.4025237 147.2694469 146.1278377 117.0766889 48.70292641 48.71161808 49.39735354 48.68414132 48.6729693 48.6610301 48.6512826 48.92322418 48.90018206 47.46742662 40.23212005 40.26407841 46.9509393 56.08400372 74.88553095 80.28239526 78.44862496 84.86437499 83.44236691 87.63014095 85.32799427 80.40999509 71.10651317 76.39162746 60.52161454 59.90318269 49.39990979 48.71918324 48.72185218 48.71726306 48.70878614 48.98234458 48.96429395 47.46965789 40.24493949 40.27544858 46.31624848 61.98927996 75.22165582 80.47019785 84.88965037 84.41180231 86.14529719 85.44133056 73.60222516 56.61348026 60.32393657 50.245408 48.91895016 48.71114513 49.39743045 48.71417651 48.70881904 48.70068309 48.70166502 48.98199811 48.96402894 104.9375771 102.6473326 156.70904 177.1942771 203.200478 219.3289421 225.8264006 225.1922132 221.24443 214.7054069 187.9130399 142.8559318 129.0695722 131.5376166 110.2382713 48.91973922 48.72124382 49.40657115 48.66422057 48.66019706 48.65751183 48.65507911 50.04630194 49.84126713 113.0193776 115.0326878 164.5500054 169.3268452 174.4594966 176.6432856 175.9381387 169.1031256 168.1041075 171.504657 180.8534624 161.0815252 145.758851 141.5095455 116.6046699 48.68356048 48.67753902 49.36131338 48.65923553 48.65129356 48.64785247 48.64480561 48.92222108 48.90190599 112.0658613 114.8132336 170.2877494 179.6474211 200.5715815 197.5934402 192.6170466 202.6927927 219.2911219 234.4213691 239.5618914 211.5064969 153.0977373 151.7583227 122.7185697 48.92631225 48.71472043 49.38497273 48.6762147 48.66083668 48.65146063 48.64365856 48.91076207 48.88884652 105.5506689 104.9070104 168.6549777 191.204688 214.1257218 229.3175028 229.6086604 231.810546 256.4493589 276.7059532 278.4684367 247.1429025 164.4688818 158.2989746 132.3629174 51.25244127 48.74950023 49.42671895 48.71587144 48.70305906 48.68314424 48.66969284 50.04425337 49.83926684 113.8301464 117.5673905 182.8215365 208.9586033 224.8408514 240.2309898 255.7062085 270.3071934 273.7892868 274.9767591 249.5982776 215.7518958 165.8691058 166.7540066 134.0197815 48.76508292 48.75421526 49.43266733 48.70148054 48.68201591 48.67086039 48.66172367 48.92988432 48.90217167 47.48134266 40.25031933 40.27648039 47.48781905 62.00330941 81.70971308 76.0064959 87.27382362 83.97729645 89.50871793 85.99518337 88.30308535 81.45365253 82.9974078 76.18812782 72.89422597 55.8309806 58.70346463 48.74795496 48.72130052 48.71423271 48.71389694 48.9996294 48.97309142 47.48130222 40.24162536 40.27281402 51.63334729 70.58710839 76.77851671 84.30448133 80.83776138 89.3054198 84.39564889 93.87956617 86.3774593 90.59802111 81.28745125 85.32538668 78.45855393 72.9871947 64.01535884 54.3574213 48.74946918 48.72930812 48.72167435 48.99170417 48.96473337 109.2280095 114.0924287 180.3948637 195.7028171 215.4523749 243.1364828 260.6190872 273.7195286 291.154211 293.5777247 293.8910139 273.8986557 171.5690131 166.9729377 135.9702874 70.34890744 54.96762609 51.20714553 48.77508595 48.76664075 48.75847305 48.75514035 50.19983762 49.95950824 114.0069669 119.0851918 181.9315348 202.5611555 230.7702616 262.0798921 279.0940014 289.4337067 301.4656777 304.6363759 301.605526 274.5753656 173.5654081 171.2551694 138.0589789 70.46728515 54.27848018 50.75243652 48.74038177 48.73483356 48.73078896 48.73043565 49.00336213 48.95703564 101.8856748 101.2959089 163.2221225 183.8034635 207.5219041 232.3083378 249.0342463 261.6982575 275.899497 278.6355052 281.7330317 249.9129908 147.2479304 132.985363 108.1154087 48.87952322 48.68220752 49.37608299 48.66881869 48.6623401 48.65706133 48.6520491 48.92520445 48.90339971 105.448035 98.21817276 150.2474544 156.5769515 169.4682189 181.6326173 201.661317 222.9447782 234.4548247 236.9573695 244.3946801 224.4836736 165.1607318 155.516325 109.4468228 48.86340209 48.67680246 49.37607671 48.66994716 48.66291184 48.65775697 48.65407925 50.03141518 49.82861978 112.0100324 108.3581845 161.7763245 178.5220732 201.6210381 218.6854937 240.1328986 245.9994054 243.4356228 235.9478142 229.0912226 197.0122109 146.0056366 148.8384159 122.7646951 48.71801145 48.72446478 49.41254308 48.70398845 55.90949214 55.89907225 55.88549505 56.16037217 56.13902306 56.13063627 47.44879923 47.45337518 47.46247941 47.47236459 48.16850431 47.49533311 72.55681227 75.35845653 78.9258738 74.39990936 68.46020211 51.56768958 52.6050601 56.31642066 56.13931766 55.88726514 56.55716137 55.8692396 55.86615246 55.86346646 55.8610404 56.13921393 56.11928049 56.11150482 47.43817127 47.44388686 47.45307318 47.46826147 71.93795683 67.75994583 69.86227103 76.59538028 76.01018448 73.65548137 67.97990836 65.46827398 61.11373228 56.29828444 56.12183081 55.88487329 56.54013058 55.85018354 55.84546221 55.83599385 55.83373185 56.10963887 56.08943864 56.09442106 47.43761564 47.44903541 47.47372785 55.0709876 81.34069755 83.54285476 83.9773123 86.9217915 86.69834533 86.61574215 85.66974659 82.44566199 78.7135385 75.26666876 59.42148067 55.90461571 56.56628862 55.8676088 55.85050975 55.83917731 55.79177483 56.9800242 56.77518606 78.70040548 137.6465623 204.9906282 224.4855427 253.6925365 279.3766395 291.7644077 299.5218133 313.3001439 320.2764421 317.2871079 252.5702783 234.6263312 216.0614195 201.1010861 55.85669404 55.86967543 56.56828251 55.83801968 55.81373334 55.78293576 55.75916278 55.98660719 55.97102688 79.51853062 137.6616712 204.5440979 235.7938702 265.6517392 280.3788833 291.6163275 298.85431 314.6445057 321.4202317 311.677744 243.2958604 230.04209 217.9661905 205.2418329 56.06124526 55.86624181 56.55484312 55.83191352 55.81422166 55.79768952 55.78169116 56.02414709 55.98914537 81.25383117 137.9458562 199.1814251 212.4337312 233.6620784 256.1646619 274.4930021 288.63787 306.2343321 312.6209269 307.170482 241.8169598 223.4903633 210.8501843 200.4392805 56.03574115 55.84643413 56.55730587 55.83940261 55.81787278 55.78806348 55.76049259 56.93129024 56.72128402 72.59468799 130.6733561 189.7224715 206.4440009 230.1208837 253.2393005 271.2745598 283.931162 303.2316972 314.0004088 311.6451044 248.283198 228.5225788 209.3800614 196.5862182 55.82135122 55.8237979 56.54438829 55.80835303 55.77691658 55.75391731 55.7340653 55.9757987 55.94979763 55.9432923 47.31468763 47.37197676 47.44552976 47.49828447 52.14854125 72.00925517 75.10283476 86.70594671 84.56594264 91.70232741 84.78781478 86.69093631 82.56073438 73.87302762 61.78307535 55.89950288 56.57003072 55.88091043 55.86720202 55.78922075 55.76817089 56.00328853 55.95582148 55.94795652 47.3098588 47.37312054 47.45968989 47.52018245 65.35062687 77.35376091 82.7308142 90.11611359 89.14134143 92.91116401 88.01199287 88.92184728 84.65387376 80.23551326 76.06863928 72.4333411 59.75470843 55.94130822 55.92948212 55.92104682 55.89125722 56.08524932 56.06384456 103.6132378 161.859505 249.5805542 275.3072374 302.8903203 331.2013447 346.546929 347.0628184 349.7851194 350.1497908 350.5813451 292.9364195 270.8406024 253.345745 239.3467197 56.17114104 55.9434606 56.62863749 55.90042807 55.881282 55.8742858 55.86798855 57.21760706 57.00810607 120.1802638 181.1802159 258.8371433 289.4862424 339.5928415 357.354224 355.3681716 353.8823857 339.0221791 316.4788448 311.9309283 273.131206 270.7420802 262.996198 252.9467928 55.97110754 55.96520725 56.65822179 55.94962751 55.94259919 55.93721552 55.88785991 56.15188689 56.12348634 126.9533197 184.7359481 276.6801704 295.8301866 326.9235296 350.7964866 357.2625834 356.7253641 363.4291859 360.08455 356.6517911 307.0611847 296.1505005 277.7272237 260.2150628 56.19762925 68.84356636 56.66572326 55.95017329 55.93797451 55.92460601 55.91329807 56.12743982 56.09823708 114.2967445 172.0194469 270.800117 302.9217308 332.3358466 346.1624693 355.062292 356.4528771 361.7110437 360.5537181 356.4133911 302.2874552 287.9104046 274.9783834 260.4995103 68.74999481 61.17770276 56.66253772 55.93798341 55.92400568 55.88940811 55.87305305 57.21413663 57.01268257 114.9437613 171.7380947 259.5379732 288.3531451 325.1902473 348.863325 351.8659722 345.063492 350.2155699 332.3940147 303.4927716 249.3412668 233.8499418 221.810396 218.9608582 55.92633911 55.92615825 56.63286932 55.9179295 55.89168199 55.89119212 55.88795638 56.17771603 56.15525275 56.14077375 47.46274872 47.47233504 47.47649363 47.4872867 71.83205868 69.16647006 77.89209496 81.00031031 82.26856878 81.77242715 77.9101471 77.49808589 72.61509967 62.19432982 62.18637224 55.9543098 56.63845994 55.94717954 55.90561543 55.90592344 55.90347034 56.19216432 56.17167696 56.17294981 48.92351552 47.50463025 71.21679122 72.26387222 77.76259125 89.22043865 86.4370006 92.91120178 86.75905277 91.05333112 83.30213987 83.52823335 81.10971971 78.02011084 74.21666806 66.54809254 56.64994917 55.96705463 55.96180598 55.9630572 55.96648108 56.20862762 56.18423545 154.6979778 214.4955898 310.6662477 320.782607 333.9328975 350.8293246 355.0438608 353.0505406 358.4065321 357.7446347 353.6156255 296.0084946 275.8357831 261.1974692 256.8713632 56.19795516 55.97785825 56.67070304 55.96279008 55.95881968 55.95853213 55.93570903 57.33065021 57.10214933 138.0645079 197.7319539 292.3351084 305.5927516 330.7521597 351.4055497 358.8675043 357.6554807 361.4662477 360.7507151 355.3170551 300.8161932 284.2278551 263.0917906 252.9539185 55.97673025 60.11732192 56.665472 55.95516369 55.95172774 55.92836714 55.8936569 56.17441529 56.15668872 132.0316266 190.9805779 289.5913185 308.8444929 335.0128019 349.0180857 357.4166596 359.2437196 362.2295263 360.3442818 362.0186582 307.7800953 285.600414 264.9959297 250.7734594 56.18239921 60.05789951 56.65779009 55.94700955 55.94294143 55.90820195 55.85746576 56.11389715 56.08667406 107.2992021 164.6861219 265.6202628 302.6996077 333.4596611 349.049467 355.9596691 354.1191913 357.7109931 356.6511108 352.6612607 299.00114 284.6107794 265.3565958 248.5653552 56.1875879 55.96968122 56.66418255 55.94060137 55.9268251 55.88648816 55.8646329 57.19681059 56.97762675 110.0218984 170.8314656 275.0811612 307.5709755 337.0601632 355.4875736 360.6347868 361.598794 365.4242414 364.6131686 360.2958069 306.2661743 294.7524017 276.6209514 260.327743 55.98203775 68.60785226 56.66447423 55.9552015 55.95172785 55.94627698 55.90062853 56.16573821 56.13012388 56.12807882 48.8818248 47.48193803 56.3201161 80.53811968 87.86568326 86.08913575 92.49033808 92.22040101 94.32969071 91.48643217 91.70804263 85.27211568 90.29639024 79.28318882 79.16519465 66.10118935 57.88261164 55.95461517 55.9512985 55.94086308 55.92907532 56.20618556 56.1813357 56.11639923 48.87394988 47.47628594 50.56716084 70.42008985 78.55696658 79.22519726 83.46626122 75.24683779 85.08034795 76.1505588 81.1622211 72.60527413 74.96067342 71.04951258 60.6333985 55.95433661 56.61437913 55.92094448 55.91278999 55.90012486 55.88803018 56.14528165 56.04276143 95.57554839 149.7676337 221.7287988 243.7815045 274.7539652 304.2914732 318.0268057 322.2483117 333.1060837 339.686375 329.5915814 263.5212278 245.4897887 218.112316 193.2106118 56.00865695 55.82184268 56.54995264 55.83590894 55.82711568 55.79923216 55.7725638 56.99836677 56.8108429 83.45452506 141.8712266 204.52387 230.0000211 269.0819 311.5115074 321.6086356 319.1617602 337.7283622 342.3450558 330.8995717 270.4105043 248.6915681 231.6958034 217.2685161 55.89407784 55.90450453 56.59684942 55.87277553 55.85278607 55.84203797 55.83005207 56.08106102 56.04720352 98.66866322 154.6755137 228.1436257 261.6091892 298.8533515 329.1626083 336.3616969 334.4256843 339.0747738 338.7654109 329.6675059 265.4291607 245.841654 234.7783099 219.740744 56.09245464 55.90317879 56.60542881 55.87686974 55.84787207 55.82360516 55.79961827 56.04160637 56.01857324 90.58458986 148.4285351 229.038261 269.5665754 301.7208893 319.1911279 324.7412782 325.290726 337.2523255 340.5280808 329.3047178 268.4412078 247.9064015 233.3825347 218.9525093 56.09680443 55.90563487 56.61886039 55.90398148 55.88328409 55.87015791 55.85508194 57.18349486 56.96242245 106.3826914 168.2969405 268.0684998 301.2391926 317.9782529 340.1846394 345.2309696 325.6199044 316.6360175 313.497413 299.2759308 232.8594691 219.5453249 219.6003362 216.6356689 55.93944356 55.90309165 56.56407406 55.85237396 55.83537493 55.81701301 55.81322202 56.07679099 56.05551381 56.05540161 48.82295847 47.40394628 47.41661897 47.42621294 48.12411056 47.44471898 47.45950365 63.19785708 61.47316454 65.45437515 68.60113373 56.46111133 57.83465626 56.22781145 56.04950876 55.85242573 56.53977758 55.85907031 55.86347713 55.86836371 55.87248597 56.1670138 56.13846224 56.12690879 48.89389278 47.49705734 54.27906398 75.02672956 78.92916755 80.89038358 84.51536802 91.73524518 86.24418332 91.55890952 81.25292042 83.94115882 81.45176777 71.16297072 62.1985995 55.96515479 56.63441782 55.94564751 55.92764944 55.87979669 55.87946394 56.14850655 56.11741517 120.5185497 176.7197335 282.2747265 307.0244645 339.728684 354.5388269 337.2708313 305.1644717 316.5286515 327.7914813 301.4645795 222.6945922 204.4999517 200.8022153 188.8382232 56.0871618 55.89228035 56.55598824 55.8399884 55.82380321 55.80061701 55.78312715 57.02359072 56.80384338 79.30301753 134.2500395 185.3462094 194.8824668 209.5359907 223.392778 235.7603714 239.3362748 247.214003 248.9481005 237.3368006 172.5936189 159.6095807 153.5621137 144.8110691 55.65490121 55.69299083 56.40954686 55.6922654 55.67281953 55.65408996 55.64223794 55.8540428 55.83347378 64.20094396 121.8513559 170.408348 182.1954441 199.2281635 214.8665877 229.970061 234.0807264 241.5820212 249.4409515 240.6918258 177.2459254 161.82693 154.8522791 143.8163032 55.81692326 55.67994814 56.40265998 55.68429186 55.6710488 55.65515752 55.6399132 55.86446619 55.85323505 65.63807519 126.7017229 177.7564739 191.9398836 213.9873351 242.8355114 263.5395107 267.1894033 277.7702482 283.2144371 270.9878786 206.9348629 192.407701 184.706476 174.8041697 55.98778698 55.81679445 56.53270373 55.80846347 55.78590629 55.76695065 55.7393651 56.93278832 56.75921934 79.48632179 139.3651753 189.8429507 196.4399829 209.961377 241.5456083 262.6202911 268.2845512 280.9654422 287.1145588 271.2616196 202.1002276 186.4955725 173.7672407 164.7024841 55.74975292 55.76954951 56.4882088 55.77205077 55.75995658 55.74722937 55.73255708 55.96886725 55.94762454 55.96797396 50.19927244 47.37988604 47.43581055 47.47565941 48.15972621 47.46257003 47.47931546 50.40320664 62.78723341 50.59223315 56.70591795 48.86086392 56.28576657 56.24807462 56.0733795 55.85838684 56.52814638 55.83946273 55.83631542 55.8289661 55.82290931 56.10107626 56.09209758 56.09569177 50.29625589 47.46546938 47.49857097 56.80639897 76.30446785 83.30584024 82.68368094 92.01781256 84.74790268 89.54951788 82.56791893 80.69128286 78.59033934 71.90101446 57.36840486 55.95114115 56.56822387 55.86363421 55.84169002 55.81438129 55.79269292 56.02921707 55.98576432 55.97326624 50.18045781 47.33752353 47.34805731 47.39095767 48.11606416 58.03698028 68.74509326 73.90600623 72.22788376 72.77255842 60.96991203 59.60958397 56.20414933 56.1065692 55.95554844 55.77038922 56.4212056 55.71396261 55.70878459 55.72096433 55.73177304 56.98093876 56.79085239 79.15858355 137.2550202 186.1723236 193.2204049 203.1466764 208.0026649 218.2800976 230.034636 243.1223506 237.2217935 219.6305165 162.2807981 157.3607557 159.6502648 157.368217 55.73181254 55.75974325 56.47646499 55.77555855 55.77411318 55.77072539 55.76771528 56.01783772 55.99460506 88.28319196 145.8097097 193.9863047 194.0816082 200.886765 210.6240004 206.5986615 201.0361188 210.3592067 220.8494322 209.9625697 151.9898568 146.0601585 145.7930546 139.465017 55.78442015 55.64720765 56.34905363 55.62649203 55.61505053 55.60052539 55.5876492 55.79303947 55.76291654 64.41377038 123.4504049 165.7428299 167.6509089 180.2567615 191.0992771 203.0743754 212.4663038 222.051392 223.4385497 212.0506177 150.7689052 137.8006007 132.5120021 129.1491794 55.65103987 55.53737324 56.2896427 55.54985493 55.5433729 55.52874201 55.51497352 56.56130929 56.39001062 65.24690877 123.9249926 166.047435 168.7582459 186.8805857 203.4130829 220.0135699 225.4112228 235.9724705 241.3627721 237.8395199 171.9925713 147.3393124 134.5369578 129.0425267 55.56058084 55.58605551 56.31466914 55.58717881 55.57858561 55.56030199 55.54413549 55.7484698 55.72766795 55.73222871 49.95427589 47.14556311 47.25694988 47.34558796 48.08022794 47.41328517 62.16765592 70.76404231 69.70530141 70.91166002 63.72974438 60.33075573 57.27606879 56.02198703 55.84134616 55.6587322 56.32812134 55.62230488 55.60666348 55.58920056 55.57741932 55.78172417 55.75936619 55.76859973 50.00506584 47.22393166 47.33634553 47.39622373 48.10431031 47.43172006 57.74046926 69.94580303 67.77313398 68.18912913 58.50161946 59.37296931 56.15368947 56.14170385 55.99888986 55.78482883 56.43880998 55.73657837 55.70876161 55.67497348 55.64892151 55.84799696 55.80694992 64.22369282 123.3244377 165.8275336 172.2091587 187.2035729 200.9959723 213.9894523 219.2202599 232.1361494 240.1181542 236.0063984 173.0458077 146.8267334 133.762101 129.2547618 55.68618878 55.57076039 56.30888907 55.57753312 55.5677793 55.55798157 55.54915234 56.59826264 56.42800334 65.12381973 123.6271526 165.739484 174.7233658 196.6941596 216.7116166 229.3014101 233.9548989 244.3255006 253.107159 243.958324 174.8719099 161.1895234 155.0901669 144.2702054 55.63378704 55.65547019 56.37869389 55.66763554 55.6527052 55.64281584 55.63023305 55.83658335 55.81135075 64.21211741 123.2807545 171.2674011 197.1239979 231.6433225 260.4344378 275.7267701 280.1183738 292.1683779 299.2217707 286.4218822 220.9371694 198.5917289 183.56443 167.9132015 55.93336896 55.75675797 56.44936809 55.73404027 55.71980582 55.69861352 55.68403814 55.89667417 55.85951261 64.21092224 123.9657867 178.2820829 205.0203991 243.6460317 277.6564955 291.4558381 289.8698211 300.896881 305.7339128 287.8891593 216.3831333 196.415056 181.2362141 168.3292416 55.95466974 55.7707319 56.45353237 55.73680804 55.72334807 55.70643782 55.69085094 56.8018145 56.6113538 66.11486495 129.4713395 180.4261308 204.8619546 237.8758993 266.9948481 283.0705824 283.0484304 293.2189599 292.7103682 272.9735506 198.5362132 182.5284032 178.9813337 175.7791201 55.80039544 55.82684835 56.53919645 55.82276747 55.81539232 55.80545514 55.78687608 56.03308459 56.01226439 56.0135148 51.65481639 47.37214623 47.41362182 47.45306907 48.16891706 62.29273725 76.12240249 73.54743094 73.12620937 67.36596501 62.71864443 53.7085566 56.22064284 56.18211318 56.02075246 55.816912 56.47333363 55.7773261 55.77257971 55.77874387 55.78285134 56.03737366 56.01284639 56.0083955 51.62945688 47.36568831 47.41400245 47.43921855 48.12404694 47.41503428 47.42364253 47.40926491 47.39712008 47.39154043 47.32602669 50.18286821 56.1573569 56.0980228 55.92856838 55.74391515 56.41874006 55.72171669 55.71471596 55.70588587 55.69819784 55.9371577 55.91843952 77.85178758 139.4313704 187.7043928 200.8350112 227.2343935 266.4006603 282.8930919 283.4648401 294.5228205 301.3886182 284.6485628 212.1885828 201.3012796 193.9763384 185.2273537 56.00404993 55.83107478 56.53244225 55.81297491 55.8022804 55.80255028 55.80212385 57.10183711 56.90739044 99.36228832 158.7798624 218.7953175 224.9155969 237.1179462 255.3994175 262.8693546 259.7621892 260.0375378 257.6331553 244.5353616 181.8704962 178.8348437 179.4491083 172.543772 55.79278045 55.8156204 56.5161316 55.79726431 55.76915007 55.75330718 55.74798002 55.99987972 55.98404986 86.8649097 147.3572535 197.3977893 203.8239765 216.4301669 240.0135453 261.0437591 268.065084 273.6739881 274.9881136 257.3078795 190.8094219 178.5863441 172.3505714 165.3056238 55.92991988 55.75351974 56.44379943 55.72872784 55.71523134 55.69897134 55.6840327 55.89990615 55.88644388 70.40405551 130.1627702 177.7108069 194.6756439 228.4628119 261.9705864 278.0834079 281.8780734 288.4649705 292.7059686 281.9367006 216.4136254 189.9681391 167.3468 153.4564443 55.8737911 55.73436743 56.44538958 55.72440307 55.70367539 55.69222282 55.67142398 56.78633658 56.61029704 65.00336724 126.4077805 177.9807207 198.6821269 229.2792712 256.2073587 268.965329 273.8884601 281.5231987 278.9194332 261.7210386 186.0037478 171.9695579 169.2737717 166.1643294 55.76860218 55.79415288 56.50099082 55.79195612 55.78851358 55.78305189 55.77871516 56.03341631 56.02016804 56.02662248 51.66158333 47.3895753 47.41491233 47.45613579 48.18188124 66.97048296 78.36476079 76.87373059 78.30418397 76.45252471 76.42797737 67.43993034 66.1046173 56.18367128 56.03023889 55.79068902 56.42833726 55.73009472 55.71852468 55.70867099 55.7024316 55.91748015 55.88272198 55.89358725 51.54056148 47.27772683 47.36921787 47.44783103 61.05378008 77.34072177 72.99534128 81.66890399 74.77700724 81.06796936 72.28150039 73.3284124 66.85570784 59.71864463 56.02690938 55.80565506 56.47360847 55.76871256 55.74819265 55.72994372 55.71329568 55.94536025 55.91845318 75.22075633 136.4850919 189.1020001 215.7594694 248.6265648 273.1273613 288.5748029 288.0821082 291.7055714 294.0971172 276.4596108 205.7913478 192.4317247 184.8939086 182.0352999 56.00986851 55.83529158 56.55236382 55.84202178 55.83649647 55.82252525 55.80172519 57.05465926 56.8470099 88.69941903 147.1158373 211.5036108 246.4949105 277.5959367 298.1336765 310.0669341 308.0656737 316.564808 319.461976 306.3916304 241.3459703 219.0196235 204.8726265 195.4243079 55.83139277 55.83557334 56.51795118 55.78366024 55.74763703 55.71127004 55.67391458 55.85490911 55.80048207 64.25798074 124.71866 166.3272203 179.7001041 217.6714048 248.7720988 255.4939544 259.0412946 269.0347637 274.0232461 268.5456074 202.7767305 182.1090258 170.986347 162.3730112 55.92536762 55.7585936 56.46221066 55.74294279 55.73048345 55.72361751 55.71327308 55.95000793 55.92236377 78.7289389 139.0198736 184.7316823 200.3219701 217.6035052 243.5724927 269.6919125 270.1171618 273.8730723 264.3007146 240.5674721 170.9873943 167.3608064 169.314942 167.575681 55.97602712 55.80440033 56.50717512 55.80447272 55.80276565 55.79886243 55.79565163 57.10990596 56.88004763 96.8915888 161.2227235 217.0316996 234.4957239 253.9266213 269.8957732 279.0378697 281.4810344 287.4452558 288.6932284 267.5500553 198.3034791 190.0526275 187.4667312 183.7698844 55.82179682 55.84113248 56.54562631 55.83623428 55.82948269 55.81909679 55.8012511 56.05091417 56.03140315 56.0417442 53.10637183 47.39207274 47.42557136 47.44926269 47.9865227 47.23543983 47.25377058 47.26409699 47.25472947 47.16873612 47.16854282 52.86159593 55.90793285 55.8671603 55.738029 55.57826595 56.26140112 55.5582718 55.54443457 55.53075482 55.52009796 55.72349388 55.69910527 55.69954961 52.76835291 47.07161633 47.1202277 47.14115972 47.85966512 47.18631438 47.24302204 47.27843259 53.30731356 52.38295529 50.57322835 52.87239523 55.8942673 55.84410854 55.7112507 55.54064208 56.22883169 55.50667649 55.4982312 55.48919544 55.48093955 55.4722137 55.67882043 55.66032657 62.11566769 120.6005961 165.7046295 170.3469701 182.9877844 190.8344497 199.5981308 203.7503917 208.3905836 205.6786169 189.6798313 141.3860053 139.722029 136.9438667 135.4997376 55.7522999 55.6093416 56.34583694 55.64156266 55.63815972 55.6342333 55.63096007 56.7760602 56.59907278 66.31703344 125.8117304 172.6316704 179.3899327 190.9487208 202.6898448 214.3544168 214.1352592 219.4969414 218.4299016 199.7765389 147.4163809 143.2207526 137.8120549 136.154027 55.59010117 55.62458842 56.35805801 55.64900306 55.64407725 55.63512049 55.62612751 55.84602975 55.8037733 61.34944453 120.4147133 165.7081208 165.7584739 170.031451 171.2341723 171.648821 168.8245628 168.7851977 165.4700108 163.6368655 126.065037 128.926549 129.1518298 129.1335983 55.68850904 55.55747312 56.27606576 55.57135484 55.57094475 55.56183786 55.5545433 55.76571566 55.74912509 61.37771226 120.4261111 165.6998525 165.7338896 169.8804325 172.6471032 175.1303644 172.1680291 174.6493808 174.376156 170.0640631 128.1359387 128.9052761 129.1301293 129.1412073 55.62468241 55.5068784 56.24576535 55.51539742 55.5174142 55.51618756 55.49537017 56.54164715 56.36223177 62.45699797 120.9025742 165.7302276 170.1249473 182.4776075 190.4237862 201.0927948 206.4136896 212.1817711 213.6411644 196.4809123 138.2265286 131.0435602 128.9077503 128.9280023 55.48485557 55.51961708 56.26474171 55.52924427 55.52176496 55.50774335 55.495932 55.70375453 55.68432061 52.83200428 47.07897091 47.13821558 47.23256594 47.27951678 47.98246866 47.30848885 58.16096587 63.75015885 59.58179152 55.64940752 52.97787333 55.80285406 56.01486399 55.95863685 55.78016714 55.58516476 56.25776996 55.54934738 55.53338815 55.51897828 55.51369823 55.72182292 55.69714101 52.84588851 47.09475579 47.16066929 47.25765092 47.30472849 48.00748414 48.68040445 61.21842285 63.51992771 64.03174485 56.58203036 52.96890972 55.76920472 55.97919775 55.93342514 55.7879172 55.59945746 56.26314799 55.56073602 55.54593004 55.5322743 55.52456988 55.73018301 55.71260308 61.50644034 120.4572377 168.1848092 183.4681673 202.7060332 217.7874542 225.6760473 226.7726856 232.7574643 232.8074594 215.6077409 154.4866039 145.2974501 141.7587392 135.8881643 55.72723694 55.58862091 56.30635253 55.58741994 55.57229815 55.55618569 55.54639195 56.59246203 56.41887659 61.85732257 120.4534894 167.812262 180.603179 200.0183268 221.5560107 235.5118468 237.7572468 242.0891963 240.7765776 218.7769582 160.6581949 151.5709188 143.0783564 142.1673813 55.61418734 55.62544517 56.33721619 55.62455856 55.60884002 55.59468822 55.58809404 55.79907439 55.79731604 62.79310657 120.7871684 175.3499822 193.8479705 219.0170578 235.3720993 236.6474132 238.1003448 248.7609206 244.8173184 224.4204153 164.3954016 158.3171048 154.4275521 154.2434919 55.8959265 55.73723591 56.44639981 55.73660439 55.73434425 55.73052405 55.72731873 55.97769438 55.95317902 84.43316348 142.3883211 194.8433258 203.0124946 224.1511612 240.5274482 255.8773956 262.3079678 269.0972891 263.0158441 240.8057945 175.6944974 165.5583939 156.1030394 150.0462498 55.85609848 55.69368932 56.39947884 55.69708571 55.68646513 55.67800499 55.67085489 56.84801853 56.66264543 72.94774357 131.5821915 182.1373892 188.0362655 206.4073228 226.9505346 239.3587482 243.9575738 248.4545784 244.3895754 219.2716774 158.064613 149.991394 149.82048 148.4978401 55.66411474 55.695277 56.41777125 55.70822667 55.69621516 55.68309949 55.67538088 55.90499533 55.87437978 54.44175328 47.22449769 47.24252579 47.31481447 47.361968 48.06321377 52.16873489 47.44001482 55.26555672 47.43061182 47.32773081 53.0162257 55.85162363 56.0909486 56.06505248 55.90720171 55.70889384 56.38712334 55.69692391 55.68911895 55.68700252 55.69705383 55.94938344 55.92036159 54.49175502 47.29240562 47.33154665 47.37906639 47.387612 48.08188705 47.41309033 50.27554717 53.7943517 56.27145984 47.37512771 53.06569828 55.89943207 56.15422234 56.12835752 55.97557971 55.77904862 56.46036532 55.76917533 55.76354393 55.75194673 55.74794534 56.00719444 55.99031819 93.3695493 151.6357696 215.2765314 235.4310478 247.0638246 256.4293989 265.4762535 260.6196562 256.0947748 246.7595559 223.808837 168.277863 164.770907 162.9369563 160.6601887 55.93202838 55.7614545 56.46094386 55.74763969 55.74092576 55.73575798 55.73144361 56.99135199 56.79723971 88.68277005 148.5712752 209.8081303 234.246336 256.4549109 271.2250154 274.4619372 268.7015936 269.2640467 258.3450936 238.3075066 183.4300187 179.6461283 174.4172403 169.6930389 55.79253184 55.80343392 56.50325477 55.79695261 55.78902691 55.78049389 55.77059596 56.02423554 56.00404578 97.20399833 158.2856847 224.4027655 240.9112604 255.2820288 270.1148573 274.3378306 272.1444384 255.8849707 245.6196595 216.6385718 155.6731673 152.4404288 151.7656748 152.3973347 55.88829364 55.73612855 56.44687553 55.74063851 55.73050089 55.72315652 55.71952347 55.96705785 55.94807492 54.5165384 47.2928057 47.30501276 47.33202419 47.335814 48.01749436 47.34356624 47.39722846 47.41365958 55.7278181 47.26443082 54.35207775 55.73773491 55.92991402 55.89078307 55.74760222 55.57473192 56.25621145 55.54940263 55.54040496 55.52536727 55.51445063 56.56979461 56.39446039 63.84453352 120.7322406 166.7353146 176.6650783 191.7116068 206.5842335 219.173841 222.3516534 230.321223 231.2740737 212.6933957 157.8405035 153.6786961 152.1838248 151.6286249 55.69495605 55.72272032 56.44971518 55.73220084 55.7212623 55.72304351 55.7309635 56.00412249 55.98864099 54.56937819 47.35886427 47.36780904 47.39758117 47.40938791 48.09951435 47.43381317 47.48322546 47.49456003 57.83026233 47.40478608 54.52270184 55.93726716 56.20763972 56.17537912 56.02045276 55.82222996 56.50374973 55.81942425 55.81273361 55.80748705 55.80582478 56.08176998 56.06258154 54.63314595 47.40472403 47.41610246 47.45013899 47.45717957 55.68435276 66.18266048 57.4703439 48.85277568 52.67222755 47.43881728 54.5283884 55.94532471 56.22114344 56.2003365 56.04108982 55.83655136 56.5118519 55.82609903 55.81972825 55.81424662 55.81778645 56.10064919 56.08155394 113.4886838 171.7718046 245.2571663 255.5852657 266.8145514 281.1905239 291.508698 280.9165036 280.7569765 276.8425722 261.6387835 206.7290849 202.5261823 199.2686981 193.9942387 56.11742319 55.85758561 56.52879087 55.80259049 55.78474074 55.76937835 55.74673446 56.94658126 56.72161242 75.92120499 128.0812304 171.799627 173.1426536 183.6571507 194.7778593 202.9600414 202.4559426 201.7787479 199.1078181 183.0361279 136.2951378 133.707619 131.0638324 129.181197 55.52145884 55.55973985 56.29191133 55.58492441 55.58721328 55.57000266 55.55569709 55.76255433 55.73736117 64.29677112 120.4384809 165.6794662 165.870929 172.3745901 178.9717169 185.5852062 186.3765674 185.9949858 182.0704044 172.5784442 129.5335745 128.8630768 129.1099516 129.1918782 55.58154216 55.4678286 56.2320066 55.47727192 55.47962484 55.46512774 55.45125906 55.65139834 55.62652093 65.00663734 121.0771045 166.2609666 165.76788 170.2039825 174.9143272 178.0773047 178.7913979 183.3944218 180.728527 171.1516771 130.1035376 129.1775967 129.1052622 129.0934096 55.65068091 55.54135712 56.28927803 55.58275978 55.58766405 55.58681033 55.58672921 56.70868331 56.53248227 68.33843126 130.7076395 184.6943638 192.3240544 205.4528598 222.7108206 230.5801322 230.2188286 233.8851095 230.1776003 212.5398707 163.9175207 161.7135197 160.3608575 159.2695747 55.74467443 55.75537319 56.45110853 55.72873725 55.72175844 55.71905271 55.69022534 55.90773762 55.89302863 55.90793917 47.27797067 47.2815567 47.26927969 47.22655833 47.91897784 47.25048366 47.30184712 54.51032297 47.28722152 47.15170548 54.25450325 55.64834539 55.84382331 55.82075949 55.70025867 55.54264681 56.23450679 55.53995043 55.53632473 55.53317527 55.53010744 55.74171611 55.72553681 55.73783915 47.10707665 47.13753891 47.17783046 47.17637995 47.85880785 47.18040294 47.24596764 47.28201763 47.27725316 47.15743068 54.2635448 55.66477733 55.89115127 55.86876426 55.72840432 55.55633404 56.24606523 55.56541347 55.57540176 55.57731539 55.58143495 55.81681615 55.80147544 68.46507793 125.0154286 172.0534414 175.0258904 183.1096114 187.1911055 189.5037258 189.2242629 193.9269551 195.1426825 188.6331778 150.370129 151.6681234 152.2382247 152.2159684 55.86543616 55.70543501 56.41636531 55.70852687 55.70421497 55.70135164 55.69879925 56.94834777 56.7565112 85.53425246 140.2252554 190.7147358 204.2775414 220.5682887 230.6436528 238.5384764 249.1747952 254.2484275 242.9439459 216.3179078 159.9641597 155.3333019 152.8910382 150.5128286 55.68070185 55.7022957 56.41419261 55.70180872 55.69522052 55.6946072 55.69356097 55.93789867 55.91884581 83.55932801 142.0345444 190.1584023 196.6226779 207.8188094 225.228841 234.1116767 240.9646042 246.418705 236.6740297 214.2942632 163.8284854 162.2980429 162.8265544 163.2560639 55.95707885 55.78143675 56.48435722 55.77405404 55.76327224 55.75521488 55.75142803 56.00947738 55.98955028 94.42209728 150.665719 205.18957 213.9353729 225.6638732 240.1490902 250.0147486 254.6077079 255.2121425 246.642029 225.59333 173.0781356 169.5048853 166.4959952 164.1601309 55.96142703 55.78952545 56.50089972 55.79441662 55.79293296 55.79735057 55.79814396 57.15338524 56.94837724 103.2007304 160.3544931 220.7151845 230.1308881 240.1469036 251.183995 253.7207721 248.8050101 251.8041419 248.858577 228.9555636 177.2693047 161.5175962 145.4176272 138.0670416 55.61506971 55.64276822 56.35075988 55.63723902 55.61079531 55.5880635 55.57359108 55.77559758 55.74980332 55.75560473 47.11568385 47.11269313 47.12417195 47.11840821 47.79927799 47.11267519 47.15394617 47.16671502 47.15463838 47.04988553 54.18511221 55.60502037 55.80936905 55.78556882 55.66315 55.50498402 56.20558477 55.49985422 55.49017548 55.48040872 55.47073487 55.67571032 55.65255673 55.66095996 48.45233723 47.0279254 47.05032809 47.05719627 47.75745702 47.09440387 47.15122449 47.16244861 47.13952208 47.0313973 54.1562964 55.56602975 55.76502648 55.73873189 55.60638825 55.43589533 56.15032285 55.41442657 55.40449565 55.39094165 60.14855257 62.45591981 60.8121525 65.39704356 122.5833271 166.3062766 165.8857221 169.8656017 171.5628961 174.1740283 175.4095048 181.2421809 180.1955655 170.7644801 128.1034718 128.8855997 129.2094506 129.5817701 55.55662808 55.4434336 56.2084753 55.45532367 55.44525728 55.43224066 55.41937095 56.4725008 56.29617006 65.45645206 122.5385268 166.1111066 166.0649049 175.2384549 182.4410384 187.4540898 185.9632483 187.8990688 187.0233133 176.7399219 130.9409415 128.8766959 128.8813079 128.8831156 55.50378989 55.51907561 56.25154163 55.5310512 55.52886048 55.52023332 55.50892535 55.71242722 55.69471224 64.42500578 121.9334516 165.7023699 166.7781236 174.4449665 182.6829125 193.2151326 196.0154275 201.2621221 199.1949043 188.2296825 145.6570936 144.3340995 143.8962872 143.1673205 55.80226454 55.65190319 56.34676563 55.62989347 55.61380687 55.59671753 55.58787174 55.8102505 55.78292693 64.23617247 121.8674667 165.9950819 167.7828143 177.6835812 184.4116667 185.7608359 183.584462 184.9211269 185.8464872 177.0103465 133.3443799 129.5171047 129.1294507 129.1141033 55.69007536 55.5706093 56.30409891 55.59568501 55.59740101 55.59710883 55.58843931 56.69105744 56.51765961 64.58114806 122.4787335 169.83488 174.3456776 183.0371198 189.3415562 189.3278632 180.7278129 175.3020113 171.5592511 169.1110811 132.952069 135.432625 136.1918392 137.4692854 55.60523098 55.63920779 56.35590538 55.63370923 55.60620852 55.58654238 55.56409659 55.7624655 55.73010154 55.73223197 48.53488469 47.15739235 47.24506659 47.30283028 48.01411083 51.28449185 61.65725082 63.9196015 65.7756064 55.02309133 56.82519585 55.77775056 55.99263912 55.9508115 55.77323356 55.5676455 56.23761215 55.5400029 55.52470078 55.50294919 55.49485472 55.70018961 55.6719012 55.68300105 48.48773847 47.10676738 47.18409527 47.21338914 47.91260799 47.24519229 55.1388575 57.15807735 58.10910355 53.76974097 54.34646843 55.72914578 55.93006936 55.8940648 55.76045735 55.5920337 56.27618468 55.57408934 55.56359905 55.54086968 55.51760974 55.72617096 55.70449061 64.34478266 121.8783872 170.0026332 186.1924276 205.6245013 224.9786632 236.9322484 240.1463976 250.3644503 249.6014237 226.4982075 165.8858735 159.7943918 157.1052005 154.3908893 55.89067129 55.7256366 56.43641518 55.70955241 55.67026142 55.64551895 55.62960118 56.77407838 56.61890552 71.96224841 130.4757701 170.5134338 166.2103885 170.6420998 173.2289296 172.5531725 168.9041254 167.3740364 164.6470226 163.5921451 126.0548058 128.9684188 129.0310854 129.0960986 55.42820367 55.46603973 56.22429324 55.49135472 55.48621605 55.47788571 55.46890549 55.67568909 55.65758355 64.99084591 122.4962493 166.2925546 166.3151781 170.322561 170.9333665 170.0479534 165.979636 165.8825542 163.9236548 163.9416134 126.640133 129.5078843 129.7316778 129.7235645 55.51980685 55.41608784 56.19179818 55.44132228 55.4411278 55.43523394 55.43060953 55.63710522 55.61651823 65.09186773 122.5189408 166.2803854 166.2939541 170.3027974 171.0528817 170.3151561 166.1096427 165.8713454 163.8219498 163.7503253 126.3050862 129.3238181 129.617565 129.6068745 55.529076 55.42103164 56.19725007 55.45695873 55.46355137 55.4610156 55.45708084 56.51585997 56.34203223 65.3925804 122.5002334 166.0956376 165.9665245 169.8281209 170.4592971 169.739818 165.7635575 165.7961116 163.837458 163.5766764 126.0187324 128.8892137 128.9097873 128.917836 55.4495987 55.49648043 56.24638068 55.53514354 55.54066867 55.54111397 55.54258071 55.76932813 55.76368216 55.78507635 48.59325469 47.21044063 47.28122614 47.30819161 47.9921015 47.32342159 47.37868654 47.40617805 47.41428498 47.31237721 53.00857668 55.84425125 56.07335372 56.01427747 55.84878406 55.65586908 56.33045914 55.63839767 55.63066085 55.61919965 55.61304269 55.83973027 55.81191748 55.82284689 48.59190376 47.15123183 47.17854863 47.18822695 47.87365332 47.19350947 47.24235294 47.25613598 47.23098266 47.11013042 52.79275509 55.61860475 55.8129362 55.78150663 55.6506514 55.48114699 56.18370282 55.45488586 55.43687677 55.4204279 55.40579659 55.60588138 55.5840693 60.32993253 51.47431816 50.63559514 47.01476143 47.02805368 47.73781699 47.03148315 47.08663834 47.11692021 47.11268987 47.01248336 52.70807312 55.54863042 55.75626013 55.73715707 55.61298623 55.4441795 56.1533008 55.41420448 55.39582013 57.66150786 60.71746407 61.61026334 62.52005146 65.63718243 122.5783727 166.3157842 166.2074199 169.7474219 173.7438764 180.2254651 183.0204857 189.454456 189.5008352 178.6415856 131.0732815 128.9015151 128.9404565 129.0551166 55.43952667 55.47142311 56.22336935 55.48209341 55.4641452 55.45889508 55.45775247 55.65966606 55.64210052 65.05091519 122.5373326 166.3213847 166.3370905 169.8460824 170.9755963 176.7445949 181.4578093 188.3227976 187.7729436 177.3996149 130.1746679 128.8870516 129.1455718 129.1413547 55.60692814 55.48547061 56.2259269 55.4869706 55.47606403 55.46381334 55.45704874 55.6583485 55.63363142 65.03935945 123.965244 166.1058421 165.7505757 169.9845382 174.7379422 179.4357801 183.2586966 190.9593488 192.2525129 177.9252139 130.3800673 128.8854644 129.1438938 129.1605313 55.61029631 55.48762005 56.2317009 55.49535372 55.48403974 55.46448558 55.44934774 56.49859552 56.32338097 65.38058609 123.9595596 166.0363628 165.9068033 179.0258922 186.9869287 190.9439983 190.187165 188.8739211 185.6410553 177.9277498 138.5286679 138.8175017 134.9760165 132.3427178 55.54313198 55.57333484 56.29552477 55.57229808 55.55121023 55.53313592 55.51496373 55.7111056 55.68220308 55.68802118 49.90429432 47.071079 47.12703407 47.15304131 47.85811397 47.19523788 47.25546293 47.28663011 53.34961841 53.08310173 52.83312325 55.62972432 55.80857477 55.77473486 55.64085703 55.47025783 56.17935472 55.44002639 55.42516099 55.41637473 55.40656928 55.61227365 55.59319196 57.77279022 50.39867544 47.04785625 47.12951185 47.18602969 47.90123207 47.23795031 47.30306329 51.28161409 55.72714679 52.41387655 52.89307788 55.67253075 55.85385811 55.81632973 55.67122134 55.49796223 56.19716448 ================================================ FILE: src/pymgrid/data/load/__init__.py ================================================ ================================================ FILE: src/pymgrid/data/pv/Houston_722430TYA.csv ================================================ GH illum (lx) 0 0 0 0 0 0 0 28 171 359 509 574 634 569 468 281 115 20 0 0 0 0 0 0 0 0 0 0 0 0 0 26 147 243 333 372 402 292 457 237 79 9 0 0 0 0 0 0 0 0 0 0 0 0 0 28 48 165 395 580 285 266 203 174 72 15 0 0 0 0 0 0 0 0 0 0 0 0 0 38 104 267 463 520 575 593 491 368 168 22 0 0 0 0 0 0 0 0 0 0 0 0 0 31 192 387 549 650 680 644 536 370 171 21 0 0 0 0 0 0 0 0 0 0 0 0 0 18 56 144 216 335 483 306 338 199 92 11 0 0 0 0 0 0 0 0 0 0 0 0 0 10 85 139 210 249 296 348 253 184 76 16 0 0 0 0 0 0 0 0 0 0 0 0 0 20 94 196 227 297 303 329 272 205 112 16 0 0 0 0 0 0 0 0 0 0 0 0 0 17 74 140 165 281 259 388 379 310 151 25 0 0 0 0 0 0 0 0 0 0 0 0 0 24 85 153 243 303 283 407 382 241 127 23 0 0 0 0 0 0 0 0 0 0 0 0 0 28 171 376 520 648 633 501 507 352 160 26 0 0 0 0 0 0 0 0 0 0 0 0 0 20 137 302 402 416 399 353 462 196 73 19 0 0 0 0 0 0 0 0 0 0 0 0 0 31 107 195 239 322 189 188 278 195 99 24 0 0 0 0 0 0 0 0 0 0 0 0 0 29 93 150 233 304 299 328 257 220 115 21 0 0 0 0 0 0 0 0 0 0 0 0 0 22 41 164 239 282 355 328 265 204 107 14 0 0 0 0 0 0 0 0 0 0 0 0 0 29 102 154 210 369 301 327 247 193 106 29 0 0 0 0 0 0 0 0 0 0 0 0 0 18 69 131 174 201 350 221 280 215 109 28 0 0 0 0 0 0 0 0 0 0 0 0 0 24 97 208 283 320 440 607 506 337 110 26 0 0 0 0 0 0 0 0 0 0 0 0 0 32 176 370 507 625 584 497 357 204 150 37 0 0 0 0 0 0 0 0 0 0 0 0 0 31 125 156 252 260 308 395 367 211 91 23 0 0 0 0 0 0 0 0 0 0 0 0 0 22 64 143 157 331 365 356 290 240 103 37 0 0 0 0 0 0 0 0 0 0 0 0 0 33 188 398 573 684 719 688 586 424 211 39 0 0 0 0 0 0 0 0 0 0 0 0 0 36 216 428 599 710 745 705 538 389 190 33 0 0 0 0 0 0 0 0 0 0 0 0 0 29 108 228 346 440 424 464 275 293 215 36 0 0 0 0 0 0 0 0 0 0 0 0 0 25 84 135 456 651 713 677 568 411 204 41 0 0 0 0 0 0 0 0 0 0 0 0 0 36 218 428 600 708 750 718 619 453 222 42 0 0 0 0 0 0 0 0 0 0 0 0 0 36 210 406 582 697 738 709 609 447 242 49 0 0 0 0 0 0 0 0 0 0 0 0 0 22 72 170 242 480 386 421 465 310 118 50 0 0 0 0 0 0 0 0 0 0 0 0 0 38 170 288 342 384 506 615 487 409 146 45 0 0 0 0 0 0 0 0 0 0 0 0 0 37 203 429 577 714 759 727 626 461 249 48 0 0 0 0 0 0 0 0 0 0 0 0 0 38 172 295 527 374 456 683 572 296 184 44 0 0 0 0 0 0 0 0 0 0 0 0 0 20 78 149 191 376 473 739 623 477 264 59 0 0 0 0 0 0 0 0 0 0 0 0 0 42 213 418 612 688 660 651 557 352 203 40 0 0 0 0 0 0 0 0 0 0 0 0 0 43 188 397 552 681 725 706 583 419 193 31 0 0 0 0 0 0 0 0 0 0 0 0 0 10 74 104 158 231 225 353 209 146 145 25 0 0 0 0 0 0 0 0 0 0 0 0 0 22 72 135 189 348 238 227 206 159 91 24 0 0 0 0 0 0 0 0 0 0 0 0 0 32 77 230 331 242 372 379 314 249 141 40 0 0 0 0 0 0 0 0 0 0 0 0 0 34 131 215 308 392 372 368 309 216 158 51 0 0 0 0 0 0 0 0 0 0 0 0 0 34 86 168 582 671 762 703 644 478 207 66 0 0 0 0 0 0 0 0 0 0 0 0 0 27 116 202 284 329 357 331 285 241 135 25 0 0 0 0 0 0 0 0 0 0 0 0 0 32 172 255 612 721 781 754 616 486 265 70 0 0 0 0 0 0 0 0 0 0 0 0 0 53 264 490 668 787 832 802 697 527 312 82 0 0 0 0 0 0 0 0 0 0 0 0 0 39 160 358 341 630 665 706 610 343 158 43 0 0 0 0 0 0 0 0 0 0 0 0 0 42 108 211 281 611 358 283 406 212 171 49 0 0 0 0 0 0 0 0 0 0 0 0 0 39 198 304 535 656 744 702 627 486 274 77 0 0 0 0 0 0 0 0 0 0 0 0 0 54 252 269 304 299 304 669 426 286 288 71 0 0 0 0 0 0 0 0 0 0 0 0 0 38 135 263 466 601 573 655 505 413 279 56 0 0 0 0 0 0 0 0 0 0 0 0 0 35 210 467 636 712 764 733 672 520 286 81 0 0 0 0 0 0 0 0 0 0 0 0 0 62 120 420 290 340 331 348 294 178 188 55 0 0 0 0 0 0 0 0 0 0 0 0 0 43 136 204 257 321 644 417 590 460 197 68 0 0 0 0 0 0 0 0 0 0 0 0 0 45 105 192 292 428 337 385 445 414 211 54 0 0 0 0 0 0 0 0 0 0 0 0 0 43 122 188 305 397 414 657 258 267 126 52 0 0 0 0 0 0 0 0 0 0 0 0 0 62 263 476 696 822 864 837 733 565 344 109 0 0 0 0 0 0 0 0 0 0 0 0 0 79 310 535 713 831 877 845 741 572 318 109 0 0 0 0 0 0 0 0 0 0 0 0 0 65 225 475 600 618 580 568 543 393 202 41 0 0 0 0 0 0 0 0 0 0 0 0 0 28 82 147 213 248 244 263 228 178 119 71 0 0 0 0 0 0 0 0 0 0 0 0 0 47 166 261 361 349 306 364 282 265 146 80 0 0 0 0 0 0 0 0 0 0 0 0 0 62 223 173 539 385 404 329 311 428 269 79 0 0 0 0 0 0 0 0 0 0 0 0 0 42 166 294 361 401 308 343 270 282 329 77 0 0 0 0 0 0 0 0 0 0 0 0 0 42 168 213 291 613 346 581 525 381 231 39 0 0 0 0 0 0 0 0 0 0 0 0 0 51 142 160 220 247 273 259 225 311 196 44 0 0 0 0 0 0 0 0 0 0 0 0 0 54 115 233 335 402 444 406 360 304 113 96 0 0 0 0 0 0 0 0 0 0 0 0 0 70 179 403 423 645 356 518 448 295 197 65 0 0 0 0 0 0 0 0 0 0 0 0 0 116 353 463 710 730 910 879 779 603 385 134 0 0 0 0 0 0 0 0 0 0 0 0 0 130 367 541 695 792 834 738 700 589 367 154 0 0 0 0 0 0 0 0 0 0 0 0 0 51 178 201 452 337 415 313 330 220 154 96 13 0 0 0 0 0 0 0 0 0 0 0 0 66 162 376 408 686 361 768 636 261 170 80 12 0 0 0 0 0 0 0 0 0 0 0 0 67 355 586 526 813 843 918 804 637 413 166 16 0 0 0 0 0 0 0 0 0 0 0 0 142 385 613 790 906 941 906 797 615 400 157 18 0 0 0 0 0 0 0 0 0 0 0 0 140 365 576 715 776 545 483 341 275 139 42 12 0 0 0 0 0 0 0 0 0 0 0 15 70 198 508 616 869 683 837 768 480 301 124 19 0 0 0 0 0 0 0 0 0 0 0 16 145 396 616 794 909 947 915 804 627 407 134 17 0 0 0 0 0 0 0 0 0 0 0 12 147 332 554 760 813 933 865 802 634 407 160 18 0 0 0 0 0 0 0 0 0 0 0 15 143 386 618 811 931 940 934 813 621 395 139 17 0 0 0 0 0 0 0 0 0 0 0 5 68 105 251 239 253 324 311 251 231 185 103 27 0 0 0 0 0 0 0 0 0 0 0 18 95 162 259 401 492 305 276 243 181 119 57 12 0 0 0 0 0 0 0 0 0 0 0 18 87 203 314 387 675 579 727 548 515 362 108 21 0 0 0 0 0 0 0 0 0 0 0 22 166 407 648 813 923 959 924 813 646 404 163 22 0 0 0 0 0 0 0 0 0 0 0 22 157 402 642 812 933 976 930 807 638 397 152 23 0 0 0 0 0 0 0 0 0 0 0 24 161 394 630 795 913 956 913 792 624 387 154 16 0 0 0 0 0 0 0 0 0 0 0 16 93 304 398 641 381 626 287 580 283 206 105 16 0 0 0 0 0 0 0 0 0 0 0 8 72 191 301 465 491 410 430 403 274 348 114 21 0 0 0 0 0 0 0 0 0 0 0 9 62 188 262 381 457 449 419 381 339 217 87 10 0 0 0 0 0 0 0 0 0 0 0 13 95 271 478 437 443 873 326 334 523 305 175 26 0 0 0 0 0 0 0 0 0 0 0 20 81 205 281 528 838 938 918 774 617 362 116 17 0 0 0 0 0 0 0 0 0 0 0 33 125 368 585 568 864 906 819 646 638 427 170 21 0 0 0 0 0 0 0 0 0 0 0 19 56 233 296 422 388 508 530 598 416 331 96 14 0 0 0 0 0 0 0 0 0 0 0 14 42 213 273 469 659 270 237 188 302 115 75 25 0 0 0 0 0 0 0 0 0 0 0 16 68 239 240 270 296 314 313 265 216 152 74 15 0 0 0 0 0 0 0 0 0 0 0 29 73 254 208 444 502 725 413 290 306 118 52 18 0 0 0 0 0 0 0 0 0 0 0 27 67 201 282 470 452 410 492 408 341 147 106 22 0 0 0 0 0 0 0 0 0 0 0 31 108 230 368 736 601 580 648 549 434 329 135 28 0 0 0 0 0 0 0 0 0 0 0 38 204 431 624 694 895 863 807 685 605 379 173 30 0 0 0 0 0 0 0 0 0 0 0 31 133 229 654 792 865 955 905 853 659 432 184 31 0 0 0 0 0 0 0 0 0 0 0 46 243 329 631 829 952 922 908 809 645 361 174 33 0 0 0 0 0 0 0 0 0 0 0 26 81 218 347 355 420 478 429 412 355 223 107 26 0 0 0 0 0 0 0 0 0 0 0 54 272 521 746 907 1009 1032 907 763 619 425 150 30 0 0 0 0 0 0 0 0 0 0 0 24 72 213 279 387 423 478 419 381 336 220 104 31 0 0 0 0 0 0 0 0 0 0 0 37 129 186 384 382 407 470 429 395 320 259 129 28 0 0 0 0 0 0 0 0 0 0 0 36 87 153 229 598 784 634 367 247 179 259 83 25 0 0 0 0 0 0 0 0 0 0 0 51 244 496 727 883 994 1021 975 845 678 437 196 34 0 0 0 0 0 0 0 0 0 0 0 50 232 475 660 716 908 697 912 782 623 427 176 34 0 0 0 0 0 0 0 0 0 0 0 47 116 251 460 383 357 400 446 351 308 189 98 20 0 0 0 0 0 0 0 0 0 0 0 41 83 174 393 682 716 849 905 788 627 360 167 35 0 0 0 0 0 0 0 0 0 0 0 64 277 516 653 798 775 773 692 353 527 299 179 39 0 0 0 0 0 0 0 0 0 0 0 48 235 396 655 822 921 947 764 772 347 281 154 28 0 0 0 0 0 0 0 0 0 0 0 31 157 223 326 637 903 1010 909 816 604 395 195 38 0 0 0 0 0 0 0 0 0 0 0 34 226 199 355 415 851 856 487 299 360 366 170 31 0 0 0 0 0 0 0 0 0 0 0 37 157 199 331 422 494 600 371 457 375 224 104 20 0 0 0 0 0 0 0 0 0 0 0 37 166 218 418 566 678 728 671 713 414 284 213 41 0 0 0 0 0 0 0 0 0 0 0 64 265 314 565 618 746 705 615 424 634 367 201 41 0 0 0 0 0 0 0 0 0 0 0 66 207 374 580 573 597 871 445 349 360 315 150 31 0 0 0 0 0 0 0 0 0 0 0 71 254 334 485 773 491 650 690 558 534 398 174 36 0 0 0 0 0 0 0 0 0 0 0 41 112 250 341 448 616 770 515 634 285 284 154 39 0 0 0 0 0 0 0 0 0 0 0 43 121 411 414 231 415 432 410 719 527 329 105 28 0 0 0 0 0 0 0 0 0 0 0 45 109 321 531 759 319 345 226 239 206 151 110 44 0 0 0 0 0 0 0 0 0 0 0 53 120 228 325 529 908 748 741 763 534 306 154 34 0 0 0 0 0 0 0 0 0 0 0 99 310 563 728 886 957 1015 979 821 608 439 200 45 0 0 0 0 0 0 0 0 0 0 0 54 232 564 769 919 1038 1059 1009 876 614 403 177 36 0 0 0 0 0 0 0 0 0 0 0 71 145 386 687 810 970 814 832 656 479 346 155 41 0 0 0 0 0 0 0 0 0 0 0 83 118 264 291 240 275 331 482 433 253 211 131 27 0 0 0 0 0 0 0 0 0 0 0 43 124 249 375 299 432 292 501 467 234 161 124 37 0 0 0 0 0 0 0 0 0 0 0 114 342 467 748 938 956 955 926 813 694 395 240 53 0 0 0 0 0 0 0 0 0 0 0 84 287 491 701 868 972 994 941 806 646 431 197 42 0 0 0 0 0 0 0 0 0 0 0 96 201 375 703 590 908 1005 1000 373 399 285 116 29 0 0 0 0 0 0 0 0 0 0 0 111 293 423 678 774 918 937 723 620 365 280 185 56 0 0 0 0 0 0 0 0 0 0 7 47 282 448 643 901 938 619 534 500 459 299 152 39 0 0 0 0 0 0 0 0 0 0 11 52 136 391 638 811 713 630 668 416 476 279 84 29 0 0 0 0 0 0 0 0 0 0 6 69 175 446 568 861 934 1003 946 750 577 302 119 25 0 0 0 0 0 0 0 0 0 0 11 53 214 331 332 227 282 360 340 380 486 297 122 39 0 0 0 0 0 0 0 0 0 0 11 60 202 284 520 837 660 994 913 847 697 503 249 54 0 0 0 0 0 0 0 0 0 0 10 125 287 612 563 870 854 980 958 791 688 484 253 60 0 0 0 0 0 0 0 0 0 0 16 112 347 485 645 829 983 952 859 696 664 408 218 51 0 0 0 0 0 0 0 0 0 0 17 92 281 401 528 727 890 747 452 409 658 461 171 51 0 0 0 0 0 0 0 0 0 0 8 64 77 190 522 201 493 453 535 368 389 163 157 34 0 0 0 0 0 0 0 0 0 0 12 80 175 213 416 404 462 460 474 459 367 223 98 32 0 0 0 0 0 0 0 0 0 0 16 134 302 549 625 650 726 634 416 202 305 124 83 24 0 0 0 0 0 0 0 0 0 0 13 95 218 331 414 628 855 817 944 719 659 460 259 64 0 0 0 0 0 0 0 0 0 0 19 155 395 618 654 755 841 861 976 855 738 528 294 77 0 0 0 0 0 0 0 0 0 0 22 158 398 621 816 962 985 1054 1016 903 738 529 297 80 0 0 0 0 0 0 0 0 0 0 19 147 381 612 772 912 991 976 968 843 738 509 281 74 0 0 0 0 0 0 0 0 0 0 20 146 368 348 578 755 897 718 813 831 610 491 255 80 0 0 0 0 0 0 0 0 0 0 19 110 281 444 483 752 933 984 820 737 616 438 219 66 0 0 0 0 0 0 0 0 0 0 23 77 142 352 526 560 478 914 1005 766 624 363 214 65 0 0 0 0 0 0 0 0 0 0 5 89 180 445 541 787 583 530 488 349 225 148 143 58 0 0 0 0 0 0 0 0 0 0 21 103 245 358 540 666 498 619 614 396 320 239 152 24 0 0 0 0 0 0 0 0 0 0 11 82 109 261 630 458 287 285 443 400 354 338 202 78 0 0 0 0 0 0 0 0 0 0 12 152 373 572 748 903 758 1006 770 623 713 343 159 74 0 0 0 0 0 0 0 0 0 0 23 144 361 602 785 804 916 710 916 738 719 485 177 58 0 0 0 0 0 0 0 0 0 0 12 103 248 344 507 453 604 980 802 401 389 122 74 27 0 0 0 0 0 0 0 0 0 0 17 81 179 288 390 480 549 582 315 442 244 256 157 27 0 0 0 0 0 0 0 0 0 0 6 149 344 576 661 893 966 948 872 762 491 465 276 51 0 0 0 0 0 0 0 0 0 0 7 149 362 543 714 913 1017 563 535 473 392 293 170 56 0 0 0 0 0 0 0 0 0 0 3 99 218 334 428 501 546 557 535 473 392 293 170 56 0 0 0 0 0 0 0 0 0 0 4 99 218 334 428 501 546 557 535 480 392 293 176 56 0 0 0 0 0 0 0 0 0 0 5 117 354 484 240 387 308 399 244 340 287 239 170 57 0 0 0 0 0 0 0 0 0 0 4 108 333 556 767 910 932 954 944 808 698 514 271 90 0 0 0 0 0 0 0 0 0 0 9 159 364 570 756 901 1021 1004 959 873 702 404 281 90 0 0 0 0 0 0 0 0 0 0 8 149 343 475 737 856 480 412 244 309 250 162 73 36 0 0 0 0 0 0 0 0 0 0 9 159 348 356 666 195 346 207 361 372 231 138 90 36 0 0 0 0 0 0 0 0 0 0 3 90 218 232 574 820 615 459 671 288 238 222 204 37 0 0 0 0 0 0 0 0 0 0 9 159 308 306 614 521 560 200 438 416 343 268 154 54 0 0 0 0 0 0 0 0 0 0 9 176 366 581 759 898 518 658 810 832 710 291 291 96 0 0 0 0 0 0 0 0 0 0 8 168 361 562 666 876 980 267 465 872 704 467 301 97 0 0 0 0 0 0 0 0 0 0 8 158 346 520 518 841 888 1045 752 467 387 496 289 102 0 0 0 0 0 0 0 0 0 0 8 167 352 551 707 916 1025 1005 984 848 666 346 129 79 0 0 0 0 0 0 0 0 0 0 8 158 241 520 604 392 972 963 643 804 549 495 254 74 0 0 0 0 0 0 0 0 0 0 5 143 299 404 720 812 927 432 189 169 135 162 124 59 0 0 0 0 0 0 0 0 0 0 1 43 186 331 344 447 679 1031 984 824 677 524 200 101 0 0 0 0 0 0 0 0 0 0 6 150 345 563 695 426 406 359 458 499 577 416 295 102 0 0 0 0 0 0 0 0 0 0 6 151 354 497 538 494 386 924 845 688 614 522 300 99 0 0 0 0 0 0 0 0 0 0 6 150 329 554 701 612 1000 862 975 867 706 401 281 103 0 0 0 0 0 0 0 0 0 0 6 151 348 543 756 887 991 1001 873 806 685 506 291 104 0 0 0 0 0 0 0 0 0 0 3 81 349 508 715 869 997 1010 953 839 662 447 215 101 0 0 0 0 0 0 0 0 0 0 6 151 339 545 757 902 1025 998 970 853 713 498 282 104 0 0 0 0 0 0 0 0 0 0 6 142 339 547 757 892 819 994 706 835 669 455 301 104 0 0 0 0 0 0 0 0 0 0 6 152 349 566 567 677 727 901 930 340 156 419 294 103 0 0 0 0 0 0 0 0 0 0 5 152 335 404 693 885 952 989 929 854 700 499 157 47 0 0 0 0 0 0 0 0 0 0 6 143 321 461 684 744 876 1002 886 874 655 258 134 80 0 0 0 0 0 0 0 0 0 0 4 143 332 518 683 831 977 997 880 831 699 507 290 108 0 0 0 0 0 0 0 0 0 0 2 130 314 439 728 800 1013 971 953 796 709 217 216 106 0 0 0 0 0 0 0 0 0 0 12 138 351 586 773 917 966 878 869 812 671 543 225 68 0 0 0 0 0 0 0 0 0 0 10 106 337 422 705 683 957 777 775 704 753 340 168 68 0 0 0 0 0 0 0 0 0 0 11 137 347 496 798 617 771 964 632 716 517 393 191 64 0 0 0 0 0 0 0 0 0 0 10 110 238 316 737 741 864 730 767 739 707 531 258 58 0 0 0 0 0 0 0 0 0 0 9 127 326 449 683 829 905 910 923 687 619 399 271 106 0 0 0 0 0 0 0 0 0 0 8 116 265 368 722 713 1059 698 732 550 507 371 244 65 0 0 0 0 0 0 0 0 0 0 10 102 212 473 508 519 761 950 860 838 543 415 147 95 0 0 0 0 0 0 0 0 0 0 11 129 217 299 643 834 936 992 862 850 655 298 169 71 0 0 0 0 0 0 0 0 0 0 8 89 161 476 670 873 955 918 974 846 688 529 289 95 0 0 0 0 0 0 0 0 0 0 7 110 281 427 780 825 901 924 984 799 720 469 285 91 0 0 0 0 0 0 0 0 0 0 7 114 290 410 691 722 998 483 844 689 705 479 285 90 0 0 0 0 0 0 0 0 0 0 8 126 338 563 660 804 852 972 748 828 589 507 310 107 0 0 0 0 0 0 0 0 0 0 7 113 326 460 555 882 995 975 855 657 661 535 243 97 0 0 0 0 0 0 0 0 0 0 8 126 349 530 771 839 970 992 746 891 728 445 297 105 0 0 0 0 0 0 0 0 0 0 8 130 348 540 735 720 927 923 1038 844 683 462 271 83 0 0 0 0 0 0 0 0 0 0 6 75 232 406 638 783 932 356 358 527 415 262 251 71 0 0 0 0 0 0 0 0 0 0 7 116 324 567 780 741 848 993 982 945 669 508 323 104 0 0 0 0 0 0 0 0 0 0 7 128 326 441 648 853 892 762 878 845 771 514 174 52 0 0 0 0 0 0 0 0 0 0 5 99 246 481 675 572 993 1044 900 694 649 515 210 82 0 0 0 0 0 0 0 0 0 0 6 103 255 396 631 778 880 663 848 731 740 466 302 83 0 0 0 0 0 0 0 0 0 0 0 74 201 405 340 407 596 504 707 430 433 376 232 75 0 0 0 0 0 0 0 0 0 0 0 74 230 457 500 645 910 690 895 511 454 391 226 70 0 0 0 0 0 0 0 0 0 0 0 85 245 437 557 569 582 546 343 713 393 395 252 74 0 0 0 0 0 0 0 0 0 0 0 49 137 400 620 683 861 438 422 532 518 399 301 88 0 0 0 0 0 0 0 0 0 0 0 68 185 384 499 447 359 831 794 618 458 338 192 66 0 0 0 0 0 0 0 0 0 0 0 88 249 514 691 909 920 870 803 772 602 418 131 85 0 0 0 0 0 0 0 0 0 0 0 87 261 451 616 725 872 548 534 516 426 204 118 57 0 0 0 0 0 0 0 0 0 0 0 99 275 227 555 782 859 949 826 886 610 471 121 54 0 0 0 0 0 0 0 0 0 0 0 62 268 497 249 442 625 698 586 458 279 217 142 54 0 0 0 0 0 0 0 0 0 0 0 86 263 472 717 897 954 1045 927 756 638 290 243 71 0 0 0 0 0 0 0 0 0 0 0 102 317 547 734 888 832 680 776 830 611 374 233 72 0 0 0 0 0 0 0 0 0 0 0 99 263 507 723 862 992 1006 942 859 691 499 275 81 0 0 0 0 0 0 0 0 0 0 0 100 288 505 711 868 961 1005 950 855 691 490 278 70 0 0 0 0 0 0 0 0 0 0 0 88 265 500 704 870 979 863 879 778 423 227 55 29 0 0 0 0 0 0 0 0 0 0 0 77 284 498 612 657 792 919 915 788 641 492 264 69 0 0 0 0 0 0 0 0 0 0 0 101 290 493 676 836 930 893 773 802 621 149 98 44 0 0 0 0 0 0 0 0 0 0 0 102 273 489 617 703 393 692 808 672 650 408 222 25 0 0 0 0 0 0 0 0 0 0 0 15 63 92 159 210 208 479 535 460 488 277 151 46 0 0 0 0 0 0 0 0 0 0 0 92 288 373 382 760 829 865 616 822 680 462 266 62 0 0 0 0 0 0 0 0 0 0 0 95 284 500 665 830 957 971 903 825 623 125 114 54 0 0 0 0 0 0 0 0 0 0 0 95 294 456 685 857 954 1000 959 801 347 408 250 54 0 0 0 0 0 0 0 0 0 0 0 96 284 459 663 849 947 993 921 592 487 448 249 56 0 0 0 0 0 0 0 0 0 0 0 97 285 452 675 829 916 947 906 833 618 423 244 52 0 0 0 0 0 0 0 0 0 0 0 86 278 255 606 781 809 896 857 694 173 87 54 26 0 0 0 0 0 0 0 0 0 0 0 73 145 153 160 684 194 206 181 228 197 182 160 32 0 0 0 0 0 0 0 0 0 0 0 31 106 466 663 762 841 729 864 777 644 375 253 49 0 0 0 0 0 0 0 0 0 0 0 89 279 489 660 755 771 795 765 700 568 283 159 39 0 0 0 0 0 0 0 0 0 0 0 90 247 487 655 817 780 242 181 160 159 92 53 30 0 0 0 0 0 0 0 0 0 0 0 92 271 489 668 691 777 452 310 459 542 442 234 45 0 0 0 0 0 0 0 0 0 0 0 79 281 491 704 840 859 907 830 790 668 454 168 41 0 0 0 0 0 0 0 0 0 0 0 34 260 443 679 832 911 781 803 705 593 87 46 28 0 0 0 0 0 0 0 0 0 0 0 83 64 297 657 735 434 316 263 207 126 86 109 6 0 0 0 0 0 0 0 0 0 0 0 19 73 153 136 158 180 184 186 260 302 175 93 21 0 0 0 0 0 0 0 0 0 0 0 68 130 197 551 434 433 644 560 420 453 390 214 20 0 0 0 0 0 0 0 0 0 0 0 71 265 473 593 681 320 821 938 795 502 358 206 31 0 0 0 0 0 0 0 0 0 0 0 72 265 486 557 585 626 573 852 751 407 432 209 28 0 0 0 0 0 0 0 0 0 0 0 74 267 475 581 742 888 970 923 808 648 422 199 23 0 0 0 0 0 0 0 0 0 0 0 75 258 466 689 845 863 920 850 642 611 415 179 17 0 0 0 0 0 0 0 0 0 0 0 57 258 476 679 816 955 824 715 730 558 418 188 22 0 0 0 0 0 0 0 0 0 0 0 59 193 443 675 818 915 947 764 726 554 394 191 22 0 0 0 0 0 0 0 0 0 0 0 42 256 442 648 715 567 590 566 482 412 328 127 5 0 0 0 0 0 0 0 0 0 0 0 22 156 226 330 307 399 860 764 672 438 301 146 4 0 0 0 0 0 0 0 0 0 0 0 37 163 438 591 552 854 617 462 356 449 275 103 20 0 0 0 0 0 0 0 0 0 0 0 27 123 134 200 225 258 477 436 377 214 136 60 16 0 0 0 0 0 0 0 0 0 0 0 27 139 273 352 469 484 502 607 432 257 187 118 25 0 0 0 0 0 0 0 0 0 0 0 50 192 365 603 841 939 970 924 844 651 430 181 27 0 0 0 0 0 0 0 0 0 0 0 57 263 523 710 867 968 988 946 803 626 414 176 30 0 0 0 0 0 0 0 0 0 0 0 38 219 452 667 748 900 914 796 707 572 337 136 18 0 0 0 0 0 0 0 0 0 0 0 54 256 506 710 861 959 983 935 817 659 420 178 26 0 0 0 0 0 0 0 0 0 0 0 49 230 462 690 866 971 996 940 807 610 372 146 23 0 0 0 0 0 0 0 0 0 0 0 43 223 469 691 866 938 969 908 813 616 381 151 23 0 0 0 0 0 0 0 0 0 0 0 43 211 454 662 835 942 896 833 771 544 264 93 17 0 0 0 0 0 0 0 0 0 0 0 50 243 476 698 814 884 921 886 682 512 360 149 21 0 0 0 0 0 0 0 0 0 0 0 19 140 319 488 631 386 518 397 386 467 247 79 16 0 0 0 0 0 0 0 0 0 0 0 32 81 236 523 714 702 877 811 632 508 291 129 14 0 0 0 0 0 0 0 0 0 0 0 46 225 469 655 775 835 889 764 762 526 348 129 17 0 0 0 0 0 0 0 0 0 0 0 48 200 423 566 428 355 390 476 235 168 204 57 7 0 0 0 0 0 0 0 0 0 0 0 29 115 150 340 411 512 481 447 421 257 172 60 7 0 0 0 0 0 0 0 0 0 0 0 26 100 263 409 500 586 808 780 628 419 268 109 0 0 0 0 0 0 0 0 0 0 0 0 34 139 283 341 496 601 728 646 632 379 212 74 0 0 0 0 0 0 0 0 0 0 0 0 42 202 372 483 746 821 804 696 705 463 313 101 0 0 0 0 0 0 0 0 0 0 0 0 30 161 230 527 689 733 756 763 612 502 296 73 0 0 0 0 0 0 0 0 0 0 0 0 32 204 424 594 666 739 845 830 401 352 268 96 0 0 0 0 0 0 0 0 0 0 0 0 44 229 427 557 792 602 698 825 671 321 282 108 0 0 0 0 0 0 0 0 0 0 0 0 40 217 416 496 702 664 912 776 499 470 260 80 0 0 0 0 0 0 0 0 0 0 0 0 40 196 322 413 442 622 513 386 406 171 141 64 0 0 0 0 0 0 0 0 0 0 0 0 38 215 447 666 832 893 908 856 752 554 322 93 0 0 0 0 0 0 0 0 0 0 0 0 39 89 384 668 776 839 785 857 730 532 307 84 0 0 0 0 0 0 0 0 0 0 0 0 18 179 419 604 704 834 811 817 627 426 265 74 0 0 0 0 0 0 0 0 0 0 0 0 38 214 424 596 622 841 802 806 655 485 299 84 0 0 0 0 0 0 0 0 0 0 0 0 31 182 363 389 462 395 677 501 511 381 135 60 0 0 0 0 0 0 0 0 0 0 0 0 14 59 223 301 396 227 353 356 268 337 225 45 0 0 0 0 0 0 0 0 0 0 0 0 30 187 374 462 574 444 525 481 425 426 238 59 0 0 0 0 0 0 0 0 0 0 0 0 31 191 149 409 665 293 375 535 349 229 127 24 0 0 0 0 0 0 0 0 0 0 0 0 37 182 408 644 713 843 830 745 435 433 259 66 0 0 0 0 0 0 0 0 0 0 0 0 21 183 401 621 789 856 870 831 688 487 262 58 0 0 0 0 0 0 0 0 0 0 0 0 35 138 253 489 669 797 715 782 657 468 265 60 0 0 0 0 0 0 0 0 0 0 0 0 19 99 148 253 723 749 770 748 617 454 217 48 0 0 0 0 0 0 0 0 0 0 0 0 26 144 183 422 280 179 365 340 421 203 123 35 0 0 0 0 0 0 0 0 0 0 0 0 28 144 262 528 698 776 787 672 346 320 204 31 0 0 0 0 0 0 0 0 0 0 0 0 33 154 354 563 481 543 890 745 541 344 123 57 0 0 0 0 0 0 0 0 0 0 0 0 23 90 105 196 324 366 478 393 302 220 109 46 0 0 0 0 0 0 0 0 0 0 0 0 11 84 159 251 330 379 397 394 555 443 132 24 0 0 0 0 0 0 0 0 0 0 0 0 29 194 430 632 788 867 881 815 683 492 259 54 0 0 0 0 0 0 0 0 0 0 0 0 28 187 425 624 780 863 869 805 671 489 246 49 0 0 0 0 0 0 0 0 0 0 0 0 28 182 410 624 759 843 851 789 655 466 233 48 0 0 0 0 0 0 0 0 0 0 0 0 23 166 352 602 706 578 589 670 448 308 159 39 0 0 0 0 0 0 0 0 0 0 0 0 22 133 373 586 763 853 855 791 645 456 220 42 0 0 0 0 0 0 0 0 0 0 0 0 25 152 366 578 738 830 838 770 618 415 199 34 0 0 0 0 0 0 0 0 0 0 0 0 31 179 403 600 746 820 777 685 631 408 213 39 0 0 0 0 0 0 0 0 0 0 0 0 21 135 344 533 690 779 790 716 576 342 151 28 0 0 0 0 0 0 0 0 0 0 0 0 19 147 347 490 608 771 671 674 595 406 186 33 0 0 0 0 0 0 0 0 0 0 0 0 11 109 195 408 426 691 582 661 371 330 128 37 0 0 0 0 0 0 0 0 0 0 0 0 17 138 328 174 285 412 342 185 192 213 89 34 0 0 0 0 0 0 0 0 0 0 0 0 13 65 190 336 669 541 717 682 546 356 113 20 0 0 0 0 0 0 0 0 0 0 0 0 6 48 167 266 330 188 223 202 169 193 98 15 0 0 0 0 0 0 0 0 0 0 0 0 16 83 213 291 463 561 618 419 393 312 131 24 0 0 0 0 0 0 0 0 0 0 0 0 23 53 225 561 705 740 755 715 531 384 158 29 0 0 0 0 0 0 0 0 0 0 0 0 17 95 296 486 618 622 627 585 426 313 101 19 0 0 0 0 0 0 0 0 0 0 0 0 12 76 171 348 297 647 752 708 527 326 164 28 0 0 0 0 0 0 0 0 0 0 0 0 12 126 323 532 661 724 731 653 507 350 155 22 0 0 0 0 0 0 0 0 0 0 0 0 14 102 292 405 532 751 596 426 393 268 111 25 0 0 0 0 0 0 0 0 0 0 0 0 14 135 352 494 635 733 757 704 537 371 159 24 0 0 0 0 0 0 0 0 0 0 0 0 0 102 333 541 559 673 720 618 530 362 167 23 0 0 0 0 0 0 0 0 0 0 0 0 0 64 290 318 437 687 479 438 228 164 71 12 0 0 0 0 0 0 0 0 0 0 0 0 0 76 266 292 501 618 517 367 435 195 103 23 0 0 0 0 0 0 0 0 0 0 0 0 0 57 170 225 177 209 211 337 261 222 89 15 0 0 0 0 0 0 0 0 0 0 0 0 0 113 326 516 674 760 764 694 550 364 145 20 0 0 0 0 0 0 0 0 0 0 0 0 0 107 310 513 649 734 739 665 541 342 115 16 0 0 0 0 0 0 0 0 0 0 0 0 0 63 163 307 445 667 751 679 542 340 135 20 0 0 0 0 0 0 0 0 0 0 0 0 0 31 91 149 202 400 399 346 164 111 51 11 0 0 0 0 0 0 0 0 0 0 0 0 0 59 154 255 346 392 379 316 274 186 114 17 0 0 0 0 0 0 0 0 0 0 0 0 0 106 320 511 659 741 744 682 548 363 143 18 0 0 0 0 0 0 0 0 0 0 0 0 0 94 296 485 636 722 730 661 519 338 128 16 0 0 0 0 0 0 0 0 0 0 0 0 0 101 263 416 576 678 678 619 483 327 129 17 0 0 0 0 0 0 0 0 0 0 0 0 0 96 298 498 629 708 718 657 536 342 134 17 0 0 0 0 0 0 0 0 0 0 0 0 0 95 298 499 628 704 713 649 495 288 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 210 454 529 515 378 348 418 222 121 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 132 189 610 413 676 600 372 236 122 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 214 286 556 632 627 538 293 233 97 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 226 409 528 558 568 346 350 120 106 0 0 0 0 0 0 0 0 0 0 0 0 0 0 58 201 217 290 678 427 303 291 214 79 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36 191 411 304 256 467 385 212 133 70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 234 370 501 517 399 315 270 144 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 194 214 318 395 251 268 142 165 37 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 171 348 416 424 286 486 286 243 92 0 0 0 0 0 0 0 0 0 0 0 0 0 0 68 230 443 593 667 680 624 499 313 104 0 0 0 0 0 0 0 0 0 0 0 0 0 0 33 90 207 286 370 325 257 282 231 69 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 105 178 354 506 552 295 203 176 77 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 97 244 203 279 344 217 214 161 81 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 123 225 441 550 607 533 327 232 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 55 185 309 440 603 599 528 314 211 93 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 192 358 504 589 606 546 433 267 95 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 134 165 265 390 332 342 260 195 71 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 61 150 207 599 636 579 449 274 95 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 209 176 229 308 244 539 459 283 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 92 195 232 281 307 255 232 150 68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 189 337 472 397 368 529 397 217 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 55 161 204 414 325 374 291 204 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 103 218 272 268 302 447 212 169 70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 112 168 224 292 320 279 243 166 45 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 121 216 266 347 345 308 251 172 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 117 173 318 421 608 336 335 186 72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 201 387 543 637 654 601 473 297 108 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43 182 253 440 573 553 452 396 262 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 91 183 248 333 476 469 319 214 37 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 141 229 398 349 293 305 211 264 74 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 66 139 217 240 308 180 161 144 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 210 398 545 634 654 605 493 324 129 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 194 390 536 626 648 597 482 314 117 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 187 376 531 611 634 585 479 305 117 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 82 216 244 274 337 288 220 160 76 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 97 202 285 231 222 342 279 182 103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 88 166 293 301 285 250 244 149 68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 112 196 287 313 355 318 267 170 87 0 0 0 0 0 0 0 0 0 0 0 0 0 0 34 106 163 243 268 261 265 293 202 72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 82 135 340 442 548 380 416 230 92 6 0 0 0 0 0 0 0 0 0 0 0 0 0 31 183 374 538 624 650 613 496 281 107 15 0 0 0 0 0 0 0 0 0 0 0 0 0 20 112 233 550 518 616 618 501 341 148 16 0 0 0 0 0 0 0 0 0 0 0 0 0 19 80 205 373 596 630 582 479 310 120 15 0 0 0 0 0 0 0 0 0 0 0 0 0 38 172 359 368 639 615 550 477 351 136 19 0 0 0 0 0 0 0 0 0 0 0 0 0 26 163 330 466 435 365 258 235 163 65 13 0 0 0 0 0 0 0 0 0 0 0 0 0 29 178 370 527 622 653 613 507 342 140 19 0 0 0 0 0 0 0 0 0 0 0 0 0 32 194 389 546 646 674 633 523 358 157 19 0 0 0 0 0 0 ================================================ FILE: src/pymgrid/data/pv/Minneapolis_726580TYA.csv ================================================ GH illum (lx) 0 0 0 0 0 0 0 0 0 77 126 102 105 82 108 61 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 181 250 198 284 82 123 37 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 207 310 376 396 353 258 128 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 205 247 264 235 256 80 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 207 307 365 395 360 265 134 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 206 311 229 383 247 169 118 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 206 310 389 402 367 271 141 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 115 113 250 297 213 132 99 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 185 207 284 317 266 257 124 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 82 189 293 356 380 346 258 135 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80 188 293 365 379 345 258 141 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80 188 300 360 170 132 128 99 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 57 220 325 406 424 388 294 164 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 60 120 406 429 342 302 166 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 57 191 113 277 86 171 296 169 37 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 56 203 270 206 315 348 256 112 37 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 55 44 70 130 145 349 310 177 41 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 228 338 419 443 408 314 183 41 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 121 180 222 209 235 298 185 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 201 271 400 382 234 165 102 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 235 249 83 442 421 327 189 37 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 240 349 420 464 427 329 165 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50 128 85 97 87 146 78 119 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 72 142 365 446 469 247 341 210 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 91 365 453 474 185 347 209 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 245 113 452 481 283 267 217 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 119 382 460 481 198 359 221 70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 252 135 465 484 455 366 228 71 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 114 127 135 274 395 362 323 226 66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 93 217 275 273 331 339 334 172 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 90 78 91 95 85 86 129 68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 67 228 373 496 489 446 381 218 84 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 56 192 166 238 203 229 171 109 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 92 150 267 338 338 369 237 165 51 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 74 214 329 496 511 481 385 255 95 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 122 292 432 524 551 513 419 279 109 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 139 310 452 536 565 530 435 292 121 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 54 89 306 362 382 214 187 112 77 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 128 286 435 530 562 496 400 277 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 124 294 453 537 566 527 437 299 131 17 0 0 0 0 0 0 0 0 0 0 0 0 0 22 132 287 398 504 533 513 419 286 122 17 0 0 0 0 0 0 0 0 0 0 0 0 0 24 131 285 417 498 496 448 274 168 115 16 0 0 0 0 0 0 0 0 0 0 0 0 0 11 46 154 196 257 262 277 246 176 91 21 0 0 0 0 0 0 0 0 0 0 0 0 0 26 79 138 359 421 334 503 401 268 113 24 0 0 0 0 0 0 0 0 0 0 0 0 0 23 122 266 328 410 550 515 462 309 138 22 0 0 0 0 0 0 0 0 0 0 0 0 0 27 155 324 469 563 595 558 458 309 141 22 0 0 0 0 0 0 0 0 0 0 0 0 0 31 127 201 221 259 343 458 335 136 83 13 0 0 0 0 0 0 0 0 0 0 0 0 0 20 71 232 347 365 369 325 258 268 126 18 0 0 0 0 0 0 0 0 0 0 0 0 0 23 88 240 221 256 256 310 210 118 148 27 0 0 0 0 0 0 0 0 0 0 0 0 0 34 161 141 271 402 377 328 269 154 73 15 0 0 0 0 0 0 0 0 0 0 0 0 0 33 154 283 489 551 533 570 508 364 169 31 0 0 0 0 0 0 0 0 0 0 0 0 0 26 143 322 337 345 445 494 497 351 176 32 0 0 0 0 0 0 0 0 0 0 0 0 0 39 178 321 446 507 491 471 269 200 111 18 0 0 0 0 0 0 0 0 0 0 0 0 0 15 105 212 176 266 302 168 146 122 69 26 0 0 0 0 0 0 0 0 0 0 0 0 0 22 70 133 262 315 336 324 265 198 109 27 0 0 0 0 0 0 0 0 0 0 0 0 0 36 136 298 288 244 527 228 373 141 105 14 0 0 0 0 0 0 0 0 0 0 0 0 0 43 198 338 490 547 529 574 431 170 138 31 0 0 0 0 0 0 0 0 0 0 0 0 0 30 106 317 385 381 606 461 511 357 169 34 0 0 0 0 0 0 0 0 0 0 0 0 0 64 248 437 581 668 698 662 560 338 193 49 0 0 0 0 0 0 0 0 0 0 0 0 0 62 236 419 556 647 670 633 509 325 185 40 0 0 0 0 0 0 0 0 0 0 0 0 0 61 145 400 515 652 681 608 548 403 217 48 0 0 0 0 0 0 0 0 0 0 0 0 0 55 142 298 505 596 629 594 521 385 174 37 0 0 0 0 0 0 0 0 0 0 0 0 0 81 229 446 578 670 695 665 569 422 239 59 0 0 0 0 0 0 0 0 0 0 0 0 0 46 114 413 521 606 644 539 532 386 216 50 0 0 0 0 0 0 0 0 0 0 0 0 0 76 262 440 582 664 693 655 557 412 187 53 0 0 0 0 0 0 0 0 0 0 0 0 0 40 88 187 288 343 177 176 157 140 133 23 0 0 0 0 0 0 0 0 0 0 0 0 0 39 101 250 333 376 347 368 312 140 86 27 0 0 0 0 0 0 0 0 0 0 0 0 0 58 152 243 207 238 233 360 305 232 151 46 0 0 0 0 0 0 0 0 0 0 0 0 0 48 149 271 397 630 466 282 268 207 111 32 0 0 0 0 0 0 0 0 0 0 0 0 0 48 102 272 310 370 360 349 308 159 93 31 0 0 0 0 0 0 0 0 0 0 0 0 0 37 203 293 419 657 453 591 528 378 219 73 0 0 0 0 0 0 0 0 0 0 0 0 15 68 229 431 435 404 423 356 158 133 71 25 0 0 0 0 0 0 0 0 0 0 0 0 9 65 161 232 329 353 408 342 191 144 87 56 0 0 0 0 0 0 0 0 0 0 0 0 11 58 120 180 347 250 242 351 327 265 150 60 0 0 0 0 0 0 0 0 0 0 0 0 17 86 183 259 339 399 402 371 346 228 137 41 0 0 0 0 0 0 0 0 0 0 0 0 12 72 157 179 290 349 371 317 315 205 129 67 0 0 0 0 0 0 0 0 0 0 0 0 17 68 243 260 483 738 447 357 281 181 157 53 0 0 0 0 0 0 0 0 0 0 0 0 25 160 284 520 703 785 790 763 660 506 317 116 0 0 0 0 0 0 0 0 0 0 0 0 26 144 298 474 647 628 697 654 487 235 158 63 0 0 0 0 0 0 0 0 0 0 0 0 19 109 192 500 664 693 730 621 573 441 256 75 0 0 0 0 0 0 0 0 0 0 0 0 23 59 148 339 574 626 768 655 627 481 229 61 0 0 0 0 0 0 0 0 0 0 0 0 33 198 402 586 720 720 766 732 626 484 330 125 0 0 0 0 0 0 0 0 0 0 0 0 35 187 370 547 676 814 838 796 691 534 343 137 15 0 0 0 0 0 0 0 0 0 0 0 38 209 414 595 733 819 761 684 639 500 313 136 16 0 0 0 0 0 0 0 0 0 0 0 39 206 417 600 732 809 833 690 686 530 338 132 17 0 0 0 0 0 0 0 0 0 0 0 38 141 229 364 640 732 714 624 520 403 236 113 18 0 0 0 0 0 0 0 0 0 0 0 23 104 213 427 576 642 651 603 623 359 168 87 13 0 0 0 0 0 0 0 0 0 0 0 34 157 315 375 715 787 489 328 290 237 156 73 18 0 0 0 0 0 0 0 0 0 0 0 46 217 415 601 721 798 822 778 639 487 329 135 19 0 0 0 0 0 0 0 0 0 0 0 55 246 210 293 318 474 327 352 268 401 209 62 15 0 0 0 0 0 0 0 0 0 0 0 85 112 136 126 139 159 157 146 128 121 127 33 6 0 0 0 0 0 0 0 0 0 0 0 66 112 91 147 217 330 403 239 167 157 230 103 13 0 0 0 0 0 0 0 0 0 0 0 90 184 312 430 509 504 267 764 691 541 362 165 14 0 0 0 0 0 0 0 0 0 0 0 100 180 245 308 419 592 603 634 590 508 331 165 17 0 0 0 0 0 0 0 0 0 0 0 80 239 392 529 632 745 786 753 720 567 368 172 18 0 0 0 0 0 0 0 0 0 0 0 99 282 463 630 631 857 885 722 711 470 371 109 3 0 0 0 0 0 0 0 0 0 0 0 89 126 120 169 162 229 397 331 325 201 139 34 5 0 0 0 0 0 0 0 0 0 0 0 110 155 185 261 327 574 538 608 577 452 384 184 23 0 0 0 0 0 0 0 0 0 0 0 112 293 484 651 792 882 867 841 730 570 389 185 26 0 0 0 0 0 0 0 0 0 0 0 126 140 171 126 273 364 885 828 723 575 141 34 26 0 0 0 0 0 0 0 0 0 0 0 123 132 98 177 176 195 179 168 226 148 129 65 29 0 0 0 0 0 0 0 0 0 0 0 125 313 504 671 795 864 880 862 745 593 402 198 31 0 0 0 0 0 0 0 0 0 0 0 132 319 512 672 812 900 898 456 201 136 136 40 28 0 0 0 0 0 0 0 0 0 0 0 140 139 256 690 820 876 892 847 752 594 367 134 35 0 0 0 0 0 0 0 0 0 0 0 143 147 321 676 829 802 900 846 760 602 408 210 38 0 0 0 0 0 0 0 0 0 0 0 145 333 380 526 661 730 544 533 393 259 405 116 39 0 0 0 0 0 0 0 0 0 0 6 152 338 531 700 841 888 904 859 766 604 422 216 43 0 0 0 0 0 0 0 0 0 0 6 150 346 538 703 744 839 906 872 774 602 422 217 43 0 0 0 0 0 0 0 0 0 0 1 72 239 156 219 714 749 922 736 745 351 424 217 46 0 0 0 0 0 0 0 0 0 0 9 165 352 534 693 837 893 916 864 779 566 312 157 25 0 0 0 0 0 0 0 0 0 0 3 70 100 157 177 162 210 201 169 176 180 131 47 12 0 0 0 0 0 0 0 0 0 0 9 150 123 275 586 363 444 235 906 801 642 443 245 56 0 0 0 0 0 0 0 0 0 0 15 187 387 571 752 854 919 928 877 763 615 440 231 57 0 0 0 0 0 0 0 0 0 0 7 104 160 325 177 220 410 909 364 438 617 442 243 59 0 0 0 0 0 0 0 0 0 0 0 183 378 569 735 877 910 914 900 794 630 449 243 62 0 0 0 0 0 0 0 0 0 0 0 191 386 568 743 863 928 798 513 456 588 445 140 58 0 0 0 0 0 0 0 0 0 0 0 68 115 113 156 198 218 228 176 151 117 86 47 17 0 0 0 0 0 0 0 0 0 0 0 118 130 220 297 343 280 323 309 255 200 174 47 14 0 0 0 0 0 0 0 0 0 0 0 204 399 591 754 897 936 960 409 275 486 405 255 74 0 0 0 0 0 0 0 0 0 0 0 203 398 579 672 599 376 429 297 576 470 382 228 66 0 0 0 0 0 0 0 0 0 0 34 182 393 591 771 908 945 954 906 823 656 466 250 71 0 0 0 0 0 0 0 0 0 0 41 207 412 608 773 894 958 967 918 810 660 452 221 78 0 0 0 0 0 0 0 0 0 0 36 194 393 598 726 879 958 965 917 796 470 312 114 28 0 0 0 0 0 0 0 0 0 0 32 144 274 430 596 544 763 759 471 699 460 286 70 24 0 0 0 0 0 0 0 0 0 0 33 147 247 466 608 691 740 776 834 703 587 408 232 69 0 0 0 0 0 0 0 0 0 0 42 173 299 558 707 840 922 884 767 678 591 347 222 62 0 0 0 0 0 0 0 0 0 0 44 144 213 394 450 670 741 491 316 343 290 258 123 45 0 0 0 0 0 0 0 0 0 0 23 111 226 199 394 418 285 443 581 321 205 115 65 43 0 0 0 0 0 0 0 0 0 0 30 117 208 295 384 455 492 486 464 370 296 332 157 92 0 0 0 0 0 0 0 0 0 0 53 221 418 580 721 740 816 872 874 677 600 436 276 83 0 0 0 0 0 0 0 0 0 0 44 192 330 557 642 886 940 966 887 765 600 441 198 74 0 0 0 0 0 0 0 0 0 0 45 177 265 466 350 396 469 248 233 278 176 142 87 33 0 0 0 0 0 0 0 0 0 0 30 95 364 527 735 817 831 666 845 828 685 490 285 105 0 0 0 0 0 0 0 0 0 0 66 216 332 571 744 866 925 987 764 641 630 466 266 115 15 0 0 0 0 0 0 0 0 0 43 118 289 356 726 707 528 881 785 434 522 413 247 91 15 0 0 0 0 0 0 0 0 0 59 215 418 618 769 895 900 961 784 632 556 411 280 93 14 0 0 0 0 0 0 0 0 0 63 246 456 631 774 849 914 788 708 701 650 482 310 118 16 0 0 0 0 0 0 0 0 0 63 219 422 623 771 901 945 971 905 792 679 484 278 105 12 0 0 0 0 0 0 0 0 0 46 121 393 566 734 867 868 904 830 789 693 502 307 111 15 0 0 0 0 0 0 0 0 0 37 76 203 297 359 415 746 854 886 817 707 528 329 136 20 0 0 0 0 0 0 0 0 0 83 269 469 659 817 925 987 996 947 848 702 527 302 121 20 0 0 0 0 0 0 0 0 0 70 229 449 646 796 742 907 911 920 832 645 405 273 112 14 0 0 0 0 0 0 0 0 0 81 168 285 524 726 830 779 427 394 357 337 325 299 128 20 0 0 0 0 0 0 0 0 0 60 155 327 499 569 667 815 875 864 772 630 359 211 101 17 0 0 0 0 0 0 0 0 0 55 218 375 462 606 817 885 836 827 548 451 254 266 111 21 0 0 0 0 0 0 0 0 0 77 171 437 563 784 851 855 861 814 250 366 417 177 49 6 0 0 0 0 0 0 0 0 0 51 233 316 402 700 827 712 316 260 208 200 144 88 75 12 0 0 0 0 0 0 0 0 0 49 118 109 239 405 397 652 595 508 754 326 192 92 60 12 0 0 0 0 0 0 0 0 0 45 149 155 340 468 599 721 771 658 405 302 147 105 72 13 0 0 0 0 0 0 0 0 0 56 124 198 296 414 418 476 510 494 438 393 403 281 120 25 0 0 0 0 0 0 0 0 0 36 129 275 272 391 476 369 409 220 219 402 193 92 54 23 0 0 0 0 0 0 0 0 0 77 230 441 579 626 808 695 915 794 784 570 474 286 115 26 0 0 0 0 0 0 0 0 0 73 197 405 572 530 603 648 647 813 786 649 467 267 107 22 0 0 0 0 0 0 0 0 0 88 265 374 348 338 708 783 945 832 729 681 488 335 155 29 0 0 0 0 0 0 0 0 0 94 273 469 668 806 922 986 1003 958 862 733 545 351 152 29 0 0 0 0 0 0 0 0 0 96 274 470 653 756 858 702 330 399 535 622 401 241 96 26 0 0 0 0 0 0 0 0 0 98 273 474 645 789 906 968 979 912 854 697 543 350 161 32 0 0 0 0 0 0 0 0 0 75 120 375 556 765 776 449 257 438 359 500 265 156 106 15 0 0 0 0 0 0 0 0 0 43 76 209 311 399 442 515 510 480 446 372 305 187 104 17 0 0 0 0 0 0 0 0 0 58 133 231 325 313 641 649 759 805 815 666 528 325 155 30 0 0 0 0 0 0 0 0 0 93 257 463 644 754 839 957 1033 983 816 687 538 334 155 25 0 0 0 0 0 0 0 0 0 91 252 339 425 784 870 903 624 859 335 248 238 167 66 22 0 0 0 0 0 0 0 0 0 33 80 229 319 406 280 480 787 596 592 370 346 227 71 21 0 0 0 0 0 0 0 0 0 102 274 352 336 528 585 438 529 464 441 323 316 312 116 9 0 0 0 0 0 0 0 0 0 33 64 120 298 394 485 463 547 491 442 377 487 285 157 30 0 0 0 0 0 0 0 0 0 93 262 415 664 788 918 944 1029 848 681 548 467 292 147 29 0 0 0 0 0 0 0 0 0 79 263 401 651 807 796 929 931 943 839 666 546 354 164 33 0 0 0 0 0 0 0 0 0 90 232 409 491 710 854 902 915 884 722 554 316 248 120 32 0 0 0 0 0 0 0 0 0 34 168 220 354 317 702 961 995 897 777 686 485 343 168 33 0 0 0 0 0 0 0 0 0 94 224 452 518 795 904 975 990 944 858 721 567 366 178 35 0 0 0 0 0 0 0 0 0 73 240 345 544 696 836 914 907 915 829 711 525 331 145 28 0 0 0 0 0 0 0 0 0 67 116 374 313 503 520 532 771 736 604 591 455 283 139 30 0 0 0 0 0 0 0 0 0 42 100 198 298 330 391 618 520 467 495 280 218 214 73 24 0 0 0 0 0 0 0 0 0 79 187 356 562 741 877 918 935 893 730 627 519 336 124 32 0 0 0 0 0 0 0 0 0 94 246 455 621 594 878 936 818 771 468 309 168 82 65 21 0 0 0 0 0 0 0 0 0 20 80 148 204 352 426 506 842 788 763 724 460 259 159 36 0 0 0 0 0 0 0 0 0 23 101 222 534 570 654 499 628 892 644 610 484 314 149 35 0 0 0 0 0 0 0 0 0 96 268 472 655 791 910 977 989 954 864 729 574 372 181 35 0 0 0 0 0 0 0 0 0 87 238 383 593 755 880 957 907 934 807 723 545 340 162 33 0 0 0 0 0 0 0 0 0 77 216 400 445 630 837 909 959 882 809 674 519 234 140 33 0 0 0 0 0 0 0 0 0 53 48 210 540 657 739 239 850 849 607 566 354 104 61 30 0 0 0 0 0 0 0 0 0 76 232 418 613 755 801 929 876 672 625 600 462 304 137 32 0 0 0 0 0 0 0 0 0 82 240 412 628 782 911 984 995 952 856 724 471 286 109 27 0 0 0 0 0 0 0 0 0 29 146 362 615 511 720 751 873 789 798 542 436 309 147 31 0 0 0 0 0 0 0 0 0 76 137 110 463 646 832 633 785 318 750 586 499 342 181 38 0 0 0 0 0 0 0 0 0 74 183 368 625 778 890 963 971 934 848 719 554 370 185 40 0 0 0 0 0 0 0 0 0 71 215 392 189 238 441 402 463 263 240 225 421 181 106 25 0 0 0 0 0 0 0 0 0 77 225 390 522 704 830 920 985 657 743 646 442 214 117 35 0 0 0 0 0 0 0 0 0 75 208 396 594 654 865 953 950 712 842 504 464 298 173 34 0 0 0 0 0 0 0 0 0 77 235 417 569 726 831 849 980 867 770 612 418 212 133 32 0 0 0 0 0 0 0 0 0 24 93 205 288 327 418 508 391 368 455 396 230 216 160 29 0 0 0 0 0 0 0 0 0 50 197 402 586 733 780 840 476 651 652 719 527 375 184 38 0 0 0 0 0 0 0 0 0 61 194 302 450 622 717 867 917 930 824 677 485 293 130 24 0 0 0 0 0 0 0 0 0 68 213 383 579 714 644 949 829 907 847 705 544 344 154 30 0 0 0 0 0 0 0 0 0 61 212 402 576 720 754 853 758 273 394 310 292 165 114 30 0 0 0 0 0 0 0 0 0 59 201 338 561 722 838 890 931 855 822 694 507 245 82 28 0 0 0 0 0 0 0 0 0 49 130 270 543 736 593 866 754 834 584 299 216 123 79 19 0 0 0 0 0 0 0 0 0 61 125 176 224 362 521 408 471 483 544 395 280 238 143 33 0 0 0 0 0 0 0 0 0 54 208 407 564 717 803 933 940 910 822 687 525 340 154 25 0 0 0 0 0 0 0 0 0 62 179 320 557 623 773 741 740 645 765 641 508 236 145 27 0 0 0 0 0 0 0 0 0 25 74 163 202 206 274 268 502 485 404 399 350 149 87 20 0 0 0 0 0 0 0 0 0 60 191 392 577 770 895 957 982 936 859 723 549 356 164 30 0 0 0 0 0 0 0 0 0 54 206 406 586 762 895 973 774 699 482 612 490 328 140 27 0 0 0 0 0 0 0 0 0 49 101 194 188 348 387 257 327 321 267 214 238 230 55 17 0 0 0 0 0 0 0 0 0 50 168 140 211 411 374 901 913 775 836 369 286 128 96 26 0 0 0 0 0 0 0 0 0 53 212 412 541 726 812 898 885 859 770 685 538 339 146 29 0 0 0 0 0 0 0 0 0 37 119 155 339 485 583 784 770 712 736 508 227 177 57 16 0 0 0 0 0 0 0 0 0 34 142 172 407 631 676 847 639 370 300 349 212 157 84 10 0 0 0 0 0 0 0 0 0 45 112 188 351 273 533 826 730 890 619 609 474 215 122 21 0 0 0 0 0 0 0 0 0 44 180 371 580 736 800 860 832 826 708 510 473 275 104 26 0 0 0 0 0 0 0 0 0 15 96 182 227 269 245 261 288 244 230 197 205 233 118 19 0 0 0 0 0 0 0 0 0 41 186 257 330 293 401 826 856 849 669 608 456 251 130 21 0 0 0 0 0 0 0 0 0 34 173 374 523 626 826 376 526 518 320 193 349 194 85 19 0 0 0 0 0 0 0 0 0 35 167 350 542 717 854 903 924 826 705 656 474 277 107 18 0 0 0 0 0 0 0 0 0 22 77 93 447 224 394 708 445 869 742 606 402 219 102 17 0 0 0 0 0 0 0 0 0 30 166 323 143 292 343 433 415 637 411 397 269 226 102 14 0 0 0 0 0 0 0 0 0 31 167 349 551 678 830 878 878 831 647 528 421 267 93 15 0 0 0 0 0 0 0 0 0 35 157 294 546 593 408 543 467 704 724 587 503 301 116 15 0 0 0 0 0 0 0 0 0 34 146 349 446 623 724 700 818 682 616 542 244 120 89 0 0 0 0 0 0 0 0 0 0 24 75 176 221 196 366 422 277 282 286 209 156 113 43 0 0 0 0 0 0 0 0 0 0 27 165 368 552 708 835 905 922 838 779 645 477 273 103 0 0 0 0 0 0 0 0 0 0 27 153 338 538 714 806 810 870 854 732 549 435 252 83 0 0 0 0 0 0 0 0 0 0 19 124 250 504 686 842 796 810 648 585 569 446 253 87 0 0 0 0 0 0 0 0 0 0 10 46 174 233 379 433 289 431 417 415 326 236 140 54 0 0 0 0 0 0 0 0 0 0 21 126 190 277 450 540 630 665 375 540 437 219 233 88 0 0 0 0 0 0 0 0 0 0 11 39 73 201 353 278 265 290 422 386 346 231 147 56 0 0 0 0 0 0 0 0 0 0 18 101 187 481 422 727 783 917 647 673 580 421 234 40 0 0 0 0 0 0 0 0 0 0 7 68 205 476 628 584 323 507 455 771 562 423 241 77 0 0 0 0 0 0 0 0 0 0 22 137 329 478 581 790 887 812 801 656 549 326 221 67 0 0 0 0 0 0 0 0 0 0 23 142 326 486 704 821 839 870 593 681 617 419 213 75 0 0 0 0 0 0 0 0 0 0 21 128 319 491 675 777 845 871 780 687 478 407 215 58 0 0 0 0 0 0 0 0 0 0 20 138 298 502 641 765 827 834 846 706 548 317 225 43 0 0 0 0 0 0 0 0 0 0 19 65 221 303 397 213 343 391 271 311 313 287 154 52 0 0 0 0 0 0 0 0 0 0 15 115 290 423 626 592 699 763 833 597 539 306 195 51 0 0 0 0 0 0 0 0 0 0 20 133 339 527 632 732 841 833 848 741 577 377 230 57 0 0 0 0 0 0 0 0 0 0 16 111 202 470 569 729 881 901 775 708 560 241 107 23 0 0 0 0 0 0 0 0 0 0 13 52 209 179 422 645 661 446 390 347 278 204 114 32 0 0 0 0 0 0 0 0 0 0 12 69 182 295 377 437 470 471 440 375 341 218 137 33 0 0 0 0 0 0 0 0 0 0 14 66 162 259 346 393 446 359 693 499 410 182 71 31 0 0 0 0 0 0 0 0 0 0 0 47 141 245 343 441 622 725 648 532 555 349 181 43 0 0 0 0 0 0 0 0 0 0 0 106 247 428 566 530 637 767 681 542 506 365 186 40 0 0 0 0 0 0 0 0 0 0 0 98 268 472 389 504 689 611 685 384 365 343 163 32 0 0 0 0 0 0 0 0 0 0 0 103 297 494 610 777 800 821 762 693 563 380 157 29 0 0 0 0 0 0 0 0 0 0 0 98 241 446 624 721 804 789 682 690 556 345 160 27 0 0 0 0 0 0 0 0 0 0 0 49 243 460 583 751 787 799 734 636 450 307 123 20 0 0 0 0 0 0 0 0 0 0 0 73 249 443 586 494 647 713 645 476 444 321 119 19 0 0 0 0 0 0 0 0 0 0 0 89 249 394 611 757 826 800 772 666 541 363 156 21 0 0 0 0 0 0 0 0 0 0 0 69 103 222 361 306 633 578 583 275 211 133 59 13 0 0 0 0 0 0 0 0 0 0 0 77 262 152 177 543 802 792 627 476 467 318 97 16 0 0 0 0 0 0 0 0 0 0 0 34 83 148 524 625 749 686 699 641 416 304 129 13 0 0 0 0 0 0 0 0 0 0 0 69 241 435 613 744 793 811 755 640 501 304 126 12 0 0 0 0 0 0 0 0 0 0 0 66 267 471 528 631 818 781 731 543 349 292 126 12 0 0 0 0 0 0 0 0 0 0 0 67 235 435 624 730 712 330 470 531 252 159 108 9 0 0 0 0 0 0 0 0 0 0 0 75 223 418 580 681 705 799 727 612 418 167 67 8 0 0 0 0 0 0 0 0 0 0 0 52 234 260 499 738 739 693 536 535 329 112 118 0 0 0 0 0 0 0 0 0 0 0 0 56 217 397 571 702 776 786 731 615 430 267 93 0 0 0 0 0 0 0 0 0 0 0 0 66 210 328 402 525 752 691 718 608 487 290 108 0 0 0 0 0 0 0 0 0 0 0 0 39 71 158 186 228 292 686 622 528 358 103 73 0 0 0 0 0 0 0 0 0 0 0 0 35 205 377 575 661 675 584 677 590 240 277 94 0 0 0 0 0 0 0 0 0 0 0 0 58 231 430 580 662 802 754 434 589 407 171 74 0 0 0 0 0 0 0 0 0 0 0 0 38 157 314 488 642 604 482 292 246 179 104 34 0 0 0 0 0 0 0 0 0 0 0 0 23 49 88 152 188 208 210 194 161 115 76 55 0 0 0 0 0 0 0 0 0 0 0 0 44 184 344 408 279 307 310 287 241 175 125 48 0 0 0 0 0 0 0 0 0 0 0 0 36 137 247 191 232 254 255 238 200 181 186 33 0 0 0 0 0 0 0 0 0 0 0 0 45 199 209 534 524 533 548 685 515 369 220 66 0 0 0 0 0 0 0 0 0 0 0 0 30 72 231 288 600 622 399 268 228 162 71 30 0 0 0 0 0 0 0 0 0 0 0 0 17 108 114 161 195 214 181 199 197 144 82 23 0 0 0 0 0 0 0 0 0 0 0 0 12 50 94 466 591 662 525 552 364 172 96 26 0 0 0 0 0 0 0 0 0 0 0 0 36 183 374 520 664 700 699 638 574 407 216 49 0 0 0 0 0 0 0 0 0 0 0 0 36 193 387 551 664 672 726 678 555 393 212 47 0 0 0 0 0 0 0 0 0 0 0 0 31 122 307 498 533 661 631 637 498 398 212 47 0 0 0 0 0 0 0 0 0 0 0 0 17 61 123 177 266 238 239 219 181 108 58 15 0 0 0 0 0 0 0 0 0 0 0 0 15 56 115 170 210 381 362 404 354 181 93 34 0 0 0 0 0 0 0 0 0 0 0 0 31 135 329 492 590 658 583 564 474 264 150 39 0 0 0 0 0 0 0 0 0 0 0 0 33 179 370 534 650 675 694 656 538 378 190 38 0 0 0 0 0 0 0 0 0 0 0 0 31 166 347 518 643 711 711 647 524 357 176 35 0 0 0 0 0 0 0 0 0 0 0 0 27 105 162 294 298 373 344 570 262 93 46 15 0 0 0 0 0 0 0 0 0 0 0 0 26 144 318 485 611 676 649 592 454 301 131 24 0 0 0 0 0 0 0 0 0 0 0 0 29 116 199 300 515 311 285 440 457 270 143 25 0 0 0 0 0 0 0 0 0 0 0 0 7 30 68 148 165 196 212 166 145 107 51 15 0 0 0 0 0 0 0 0 0 0 0 0 14 53 113 154 206 336 232 198 157 118 59 15 0 0 0 0 0 0 0 0 0 0 0 0 24 145 157 424 479 423 606 492 456 271 96 9 0 0 0 0 0 0 0 0 0 0 0 0 10 53 161 206 143 208 162 252 203 139 74 21 0 0 0 0 0 0 0 0 0 0 0 0 11 82 180 236 302 328 344 316 241 176 80 18 0 0 0 0 0 0 0 0 0 0 0 0 16 100 179 246 425 564 494 454 382 270 135 19 0 0 0 0 0 0 0 0 0 0 0 0 17 118 290 449 557 619 620 555 446 282 111 17 0 0 0 0 0 0 0 0 0 0 0 0 19 115 283 394 496 549 571 439 313 197 83 0 0 0 0 0 0 0 0 0 0 0 0 0 16 123 299 428 513 521 556 343 367 221 103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 118 294 449 560 622 620 558 442 285 109 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 295 451 562 588 502 286 240 117 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 42 138 154 238 283 266 324 288 212 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 105 272 431 551 598 597 541 418 256 92 0 0 0 0 0 0 0 0 0 0 0 0 0 0 84 226 294 434 474 391 399 329 214 78 0 0 0 0 0 0 0 0 0 0 0 0 0 0 82 177 281 498 483 499 347 326 209 71 0 0 0 0 0 0 0 0 0 0 0 0 0 0 75 190 269 259 502 399 417 354 200 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 160 259 253 316 249 235 164 104 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 79 139 161 286 285 160 132 84 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 129 198 253 283 297 275 195 125 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 75 234 382 494 551 551 486 365 216 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 204 380 495 543 558 498 384 231 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 83 220 350 461 462 383 371 274 155 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 52 186 284 426 452 489 415 300 172 42 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 76 197 263 278 228 232 168 120 38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 87 200 374 443 266 317 307 206 46 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 116 311 291 249 442 286 160 72 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 45 80 315 492 450 245 259 127 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 94 72 92 111 128 90 84 46 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 184 198 92 103 114 103 95 77 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 71 130 98 163 139 146 152 148 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 185 320 409 492 476 380 189 161 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 126 322 419 469 482 406 298 157 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 170 272 429 495 488 362 314 162 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 156 321 425 442 478 416 211 164 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 72 65 106 123 113 193 105 34 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 185 318 423 482 473 411 300 151 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 181 58 78 89 86 174 210 152 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 179 312 410 468 467 405 287 145 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 292 269 279 451 259 82 71 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 48 58 77 88 86 76 250 53 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 57 73 77 88 125 107 168 85 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 57 273 276 215 106 76 52 28 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 159 293 391 442 439 378 268 131 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 152 286 384 435 433 371 268 127 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 119 80 304 263 275 142 140 46 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 114 205 290 136 119 124 108 60 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 77 73 173 81 168 93 85 32 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 95 66 310 402 79 74 253 119 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 133 267 356 415 413 359 249 118 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 97 252 159 229 413 337 247 96 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 126 261 350 402 320 232 171 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 33 246 351 401 400 293 218 74 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 42 80 70 88 85 106 122 66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 138 223 154 98 74 50 67 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 241 341 347 394 323 236 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 81 193 334 391 392 338 234 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 163 153 274 306 276 84 108 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 82 209 308 367 370 123 71 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 60 101 204 214 175 112 78 92 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 94 228 336 396 400 347 244 110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 83 211 322 384 388 333 227 96 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 202 310 372 376 304 209 93 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 54 82 99 100 101 59 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 74 109 128 329 298 209 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 181 269 321 310 312 199 66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 76 288 247 132 115 178 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 67 68 219 121 183 108 65 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 47 88 107 109 94 205 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43 195 312 374 381 332 235 76 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 179 204 357 365 316 217 92 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30 142 261 324 341 244 199 96 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 48 163 151 269 186 241 184 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 58 283 206 115 100 60 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 73 108 128 222 236 187 92 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 144 272 320 326 300 200 97 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 66 153 345 125 236 137 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 44 71 87 90 78 64 37 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 45 70 100 103 91 145 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 71 107 211 132 118 87 45 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30 139 191 327 350 305 208 34 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 58 239 113 117 103 175 36 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 65 245 365 340 309 210 98 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 69 290 375 389 345 252 123 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 54 85 104 107 97 71 43 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 63 99 121 125 112 70 31 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 42 145 247 101 105 93 82 41 5 0 0 0 0 0 0 0 ================================================ FILE: src/pymgrid/data/pv/NewYork_744860TYA.csv ================================================ GH illum (lx) 0 0 0 0 0 0 0 9 133 274 358 286 407 88 217 78 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 151 209 331 399 349 240 97 84 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 31 58 77 83 93 76 52 61 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 112 290 391 407 332 373 270 123 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 144 273 386 459 424 378 257 129 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 132 274 358 263 176 119 63 57 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 103 298 410 436 439 402 300 135 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 59 182 113 96 93 76 58 33 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 86 154 160 241 170 225 87 38 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 160 260 182 463 446 392 283 157 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 156 273 211 203 339 418 308 153 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 59 174 270 247 337 283 183 147 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 76 153 174 196 209 102 140 74 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 95 125 78 90 100 83 59 54 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 40 58 78 90 228 188 140 164 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 166 224 211 429 313 426 313 176 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 162 284 424 462 495 422 320 178 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 50 58 92 171 153 84 65 35 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 173 318 437 431 464 419 319 179 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 145 282 385 313 273 280 317 189 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 135 181 230 377 205 84 142 57 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 30 95 85 111 101 128 78 52 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 66 176 132 114 84 108 68 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 57 88 93 138 108 91 67 41 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 66 111 169 139 108 91 72 57 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 182 346 462 516 249 437 127 160 53 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 186 329 449 225 237 331 322 203 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 48 66 85 245 180 313 211 85 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 115 117 463 532 503 477 365 209 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 196 351 475 547 516 471 223 116 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 196 372 473 547 544 505 389 241 69 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 148 249 426 277 431 289 277 178 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 33 159 316 452 535 534 487 408 250 77 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 189 359 494 559 568 462 364 107 46 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 44 81 131 152 131 118 92 66 67 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 176 317 471 535 510 464 308 123 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 195 371 484 406 552 287 273 155 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 182 332 448 497 472 393 316 218 71 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 184 353 476 547 536 534 427 260 87 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 227 403 534 609 559 477 330 228 77 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 165 321 307 545 559 472 412 194 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 188 322 470 582 594 434 327 155 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 47 195 370 494 573 585 527 406 253 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 190 369 437 501 497 494 414 266 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 69 219 291 383 545 529 555 487 321 129 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 170 241 214 245 202 184 147 94 28 3 0 0 0 0 0 0 0 0 0 0 0 0 0 57 99 259 433 422 252 339 171 108 57 6 0 0 0 0 0 0 0 0 0 0 0 0 0 75 202 396 458 583 596 528 470 272 121 10 0 0 0 0 0 0 0 0 0 0 0 0 0 73 228 301 301 381 361 519 434 263 110 10 0 0 0 0 0 0 0 0 0 0 0 0 0 75 244 405 504 540 612 515 402 291 114 10 0 0 0 0 0 0 0 0 0 0 0 0 0 69 238 253 368 367 668 579 412 307 75 15 0 0 0 0 0 0 0 0 0 0 0 0 0 35 82 111 147 169 203 184 145 93 55 7 0 0 0 0 0 0 0 0 0 0 0 0 0 76 276 458 599 680 658 595 469 333 144 14 0 0 0 0 0 0 0 0 0 0 0 0 0 36 86 144 187 213 215 197 158 104 47 9 0 0 0 0 0 0 0 0 0 0 0 0 0 40 101 284 391 479 497 454 423 355 78 18 0 0 0 0 0 0 0 0 0 0 0 0 0 114 307 496 586 656 656 609 438 348 150 17 0 0 0 0 0 0 0 0 0 0 0 0 0 42 88 161 204 229 231 262 214 148 59 10 0 0 0 0 0 0 0 0 0 0 0 0 0 39 98 132 143 160 163 149 122 81 38 7 0 0 0 0 0 0 0 0 0 0 0 0 3 32 66 107 138 185 160 145 116 77 38 13 0 0 0 0 0 0 0 0 0 0 0 0 0 143 333 504 635 720 707 665 548 302 116 21 0 0 0 0 0 0 0 0 0 0 0 0 0 43 114 168 380 396 610 606 547 239 59 21 0 0 0 0 0 0 0 0 0 0 0 0 5 158 346 517 648 734 720 679 562 266 192 25 0 0 0 0 0 0 0 0 0 0 0 0 2 99 68 96 123 136 147 129 129 153 90 25 0 0 0 0 0 0 0 0 0 0 0 0 1 52 68 169 131 143 140 208 129 142 108 29 0 0 0 0 0 0 0 0 0 0 0 0 1 41 68 104 124 143 161 130 105 383 55 29 0 0 0 0 0 0 0 0 0 0 0 0 11 184 364 543 684 739 748 684 577 405 203 28 0 0 0 0 0 0 0 0 0 0 0 0 3 60 137 204 249 232 261 214 186 159 136 20 0 0 0 0 0 0 0 0 0 0 0 0 14 200 307 562 672 376 288 143 111 161 92 38 0 0 0 0 0 0 0 0 0 0 0 0 15 197 173 217 324 779 727 518 594 357 145 39 0 0 0 0 0 0 0 0 0 0 0 0 0 204 396 569 712 764 776 704 604 425 225 42 0 0 0 0 0 0 0 0 0 0 0 0 0 93 179 564 483 737 148 137 181 127 173 43 0 0 0 0 0 0 0 0 0 0 0 0 0 218 410 586 723 777 790 717 610 438 232 46 0 0 0 0 0 0 0 0 0 0 0 0 0 224 417 541 600 598 794 417 218 298 158 42 0 0 0 0 0 0 0 0 0 0 0 0 0 231 423 599 737 792 804 730 623 445 244 50 0 0 0 0 0 0 0 0 0 0 0 0 0 74 90 111 154 172 162 138 118 92 64 16 0 0 0 0 0 0 0 0 0 0 0 0 0 108 230 464 167 370 155 740 637 447 58 56 0 0 0 0 0 0 0 0 0 0 0 0 0 244 445 461 755 592 813 744 287 454 251 60 0 0 0 0 0 0 0 0 0 0 0 0 0 114 150 184 305 517 355 145 622 464 256 56 0 0 0 0 0 0 0 0 0 0 0 0 0 258 443 487 714 819 830 757 651 464 247 56 0 0 0 0 0 0 0 0 0 0 0 0 58 247 456 148 711 469 716 211 288 436 263 66 0 0 0 0 0 0 0 0 0 0 0 0 85 272 470 650 761 840 844 773 638 477 269 70 0 0 0 0 0 0 0 0 0 0 0 0 83 279 477 658 769 849 852 781 645 482 270 71 0 0 0 0 0 0 0 0 0 0 0 0 80 286 484 665 775 854 857 778 659 460 277 76 0 0 0 0 0 0 0 0 0 0 0 0 47 219 106 127 147 215 264 172 133 117 211 79 0 0 0 0 0 0 0 0 0 0 0 0 85 297 487 149 176 725 851 528 492 387 285 77 0 0 0 0 0 0 0 0 0 0 0 0 30 111 99 141 189 413 858 682 183 495 290 82 0 0 0 0 0 0 0 0 0 0 0 0 54 179 157 495 787 800 864 469 338 258 195 79 0 0 0 0 0 0 0 0 0 0 0 0 109 318 509 694 800 883 885 806 671 511 296 88 0 0 0 0 0 0 0 0 0 0 0 0 52 126 158 148 294 385 403 417 327 237 188 95 0 0 0 0 0 0 0 0 0 0 0 0 62 78 193 219 314 378 267 192 159 118 55 36 0 0 0 0 0 0 0 0 0 0 0 0 82 87 151 211 255 236 277 254 178 305 136 65 0 0 0 0 0 0 0 0 0 0 0 0 104 207 246 539 695 507 604 609 555 282 276 94 0 0 0 0 0 0 0 0 0 0 0 0 109 315 534 724 827 807 890 823 717 525 305 101 0 0 0 0 0 0 0 0 0 0 0 0 86 252 457 678 788 863 861 783 648 479 261 88 0 0 0 0 0 0 0 0 0 0 0 0 71 261 421 680 780 361 293 271 230 172 105 38 0 0 0 0 0 0 0 0 0 0 0 8 128 338 543 661 789 806 795 754 665 435 272 98 0 0 0 0 0 0 0 0 0 0 0 7 127 302 526 708 840 897 886 694 696 525 270 98 0 0 0 0 0 0 0 0 0 0 0 8 107 303 445 420 774 882 813 774 537 449 239 80 0 0 0 0 0 0 0 0 0 0 0 8 113 199 546 287 500 544 582 736 460 490 324 107 0 0 0 0 0 0 0 0 0 0 0 10 76 222 454 625 618 686 717 815 699 533 316 122 6 0 0 0 0 0 0 0 0 0 0 10 131 333 552 740 846 912 908 834 721 528 309 111 6 0 0 0 0 0 0 0 0 0 0 16 159 378 585 756 876 935 930 862 723 570 339 122 8 0 0 0 0 0 0 0 0 0 0 13 81 136 213 286 493 364 294 270 225 165 104 56 5 0 0 0 0 0 0 0 0 0 0 9 50 120 363 697 790 778 875 816 623 445 238 102 9 0 0 0 0 0 0 0 0 0 0 11 50 115 183 203 201 216 214 198 166 124 75 32 4 0 0 0 0 0 0 0 0 0 0 21 166 385 589 771 865 887 899 688 535 551 301 124 11 0 0 0 0 0 0 0 0 0 0 12 82 234 194 250 376 308 306 283 241 184 98 41 5 0 0 0 0 0 0 0 0 0 0 11 50 108 165 250 289 309 307 284 241 184 115 49 7 0 0 0 0 0 0 0 0 0 0 24 130 293 504 648 823 776 897 796 550 521 223 66 11 0 0 0 0 0 0 0 0 0 0 15 57 124 192 248 288 308 305 282 238 180 111 47 9 0 0 0 0 0 0 0 0 0 0 15 55 100 158 244 242 305 256 235 199 147 90 58 10 0 0 0 0 0 0 0 0 0 0 16 65 110 188 247 288 308 805 483 285 175 253 66 10 0 0 0 0 0 0 0 0 0 0 34 203 418 634 803 818 926 883 872 719 566 370 160 18 0 0 0 0 0 0 0 0 0 0 22 80 165 481 518 295 313 312 287 246 188 119 53 11 0 0 0 0 0 0 0 0 0 0 33 191 399 563 795 893 954 946 863 529 528 332 148 17 0 0 0 0 0 0 0 0 0 0 36 170 336 551 688 855 840 753 768 686 507 320 125 16 0 0 0 0 0 0 0 0 0 0 29 70 138 328 523 526 633 581 463 721 558 350 159 23 0 0 0 0 0 0 0 0 0 0 42 211 429 632 762 857 933 895 803 707 430 242 54 13 0 0 0 0 0 0 0 0 0 0 25 68 166 397 259 297 316 313 289 246 187 119 54 14 0 0 0 0 0 0 0 0 0 0 20 49 96 144 184 212 226 224 207 175 156 301 110 22 0 0 0 0 0 0 0 0 0 0 55 231 435 602 750 887 929 699 645 554 433 295 144 18 0 0 0 0 0 0 0 0 0 0 70 244 439 607 786 871 908 902 772 723 548 366 156 11 0 0 0 0 0 0 0 0 0 0 35 121 173 243 193 262 288 263 316 247 191 197 117 14 0 0 0 0 0 0 0 0 0 0 18 46 114 129 171 242 241 256 197 190 276 158 110 23 0 0 0 0 0 0 0 0 0 0 47 120 144 236 264 415 961 435 324 521 270 379 191 28 0 0 0 0 0 0 0 0 0 0 75 55 166 194 277 401 438 539 432 471 179 170 85 18 0 0 0 0 0 0 0 0 0 0 87 97 224 136 172 179 184 181 176 157 110 90 91 6 0 0 0 0 0 0 0 0 0 0 85 47 106 244 236 298 324 244 355 235 179 204 71 6 0 0 0 0 0 0 0 0 0 0 43 219 343 486 803 910 939 885 590 559 306 287 140 34 0 0 0 0 0 0 0 0 0 0 92 262 448 626 777 880 952 976 889 753 582 397 202 37 0 0 0 0 0 0 0 0 0 0 79 261 461 632 771 886 977 982 905 784 590 402 210 37 0 0 0 0 0 0 0 0 0 0 88 264 450 646 778 879 935 945 887 748 584 409 194 38 0 0 0 0 0 0 0 0 0 0 51 135 216 251 244 728 930 940 869 759 590 397 208 41 0 0 0 0 0 0 0 0 0 0 97 270 466 639 783 931 944 943 872 783 591 396 172 42 0 0 0 0 0 0 0 0 0 0 95 259 455 652 802 889 904 906 841 724 519 388 167 43 0 0 0 0 0 0 0 0 0 0 106 278 407 684 677 765 864 886 785 715 530 416 215 47 0 0 0 0 0 0 0 0 0 0 105 276 479 635 784 885 942 960 902 754 570 402 210 39 0 0 0 0 0 0 0 0 0 0 82 210 421 603 307 354 269 312 205 268 254 173 94 30 0 0 0 0 0 0 0 0 0 0 93 154 173 285 208 292 515 346 350 152 118 79 128 49 0 0 0 0 0 0 0 0 0 0 101 201 356 690 844 909 991 974 892 783 628 424 213 53 0 0 0 0 0 0 0 0 0 0 107 282 479 644 806 922 968 978 906 730 584 307 195 42 0 0 0 0 0 0 0 0 0 0 79 209 331 445 529 596 626 624 582 506 406 289 160 54 0 0 0 0 0 0 0 0 0 0 24 213 341 271 335 313 331 326 305 171 441 323 177 45 0 0 0 0 0 0 0 0 0 0 24 177 230 165 186 179 192 189 219 158 125 92 42 58 0 0 0 0 0 0 0 0 0 0 118 281 487 666 798 414 562 941 916 750 389 104 207 60 0 0 0 0 0 0 0 0 0 0 98 286 508 690 803 809 958 298 550 406 341 283 127 54 0 0 0 0 0 0 0 0 0 0 56 267 493 597 725 804 608 976 948 804 602 436 232 66 0 0 0 0 0 0 0 0 0 0 112 297 478 680 780 897 962 927 767 771 482 313 157 65 0 0 0 0 0 0 0 0 0 0 121 296 493 681 836 934 1006 998 886 621 269 322 118 72 0 0 0 0 0 0 0 0 0 0 124 286 485 640 802 919 993 985 930 785 608 432 237 70 0 0 0 0 0 0 0 0 0 0 121 304 499 671 785 928 970 1007 929 783 601 401 226 71 0 0 0 0 0 0 0 0 0 7 95 293 294 224 759 761 935 962 892 763 605 372 178 62 0 0 0 0 0 0 0 0 0 7 87 293 486 671 855 960 1010 1003 905 739 501 454 232 80 0 0 0 0 0 0 0 0 0 8 105 286 501 705 848 966 1024 1017 944 815 662 453 241 73 0 0 0 0 0 0 0 0 0 7 92 264 465 668 811 939 997 990 910 782 581 427 198 65 0 0 0 0 0 0 0 0 0 8 103 281 493 692 773 899 964 936 756 637 260 178 180 55 0 0 0 0 0 0 0 0 0 10 87 275 165 230 282 319 337 334 312 453 480 186 84 34 0 0 0 0 0 0 0 0 0 4 55 201 158 223 590 845 953 865 875 766 562 391 210 62 0 0 0 0 0 0 0 0 0 7 56 175 160 277 342 846 581 820 810 483 624 363 125 50 0 0 0 0 0 0 0 0 0 7 95 270 446 633 827 897 934 950 926 763 620 425 219 75 0 0 0 0 0 0 0 0 0 10 98 234 437 625 776 856 910 949 908 746 507 345 212 71 0 0 0 0 0 0 0 0 0 9 101 201 302 497 575 645 413 354 385 273 267 187 85 36 0 0 0 0 0 0 0 0 0 6 42 95 164 228 281 318 577 357 313 524 446 273 85 50 0 0 0 0 0 0 0 0 0 7 37 215 193 189 236 268 284 995 898 783 640 434 244 78 0 0 0 0 0 0 0 0 0 6 70 218 158 385 785 953 899 827 878 775 593 362 180 72 0 0 0 0 0 0 0 0 0 8 100 220 424 642 806 873 937 844 700 612 516 414 164 61 0 0 0 0 0 0 0 0 0 4 29 71 120 196 240 271 338 823 916 796 644 443 76 29 0 0 0 0 0 0 0 0 0 4 39 86 113 189 236 775 999 994 926 793 646 442 235 80 0 0 0 0 0 0 0 0 0 8 28 70 119 164 655 922 967 939 782 781 662 455 252 76 0 0 0 0 0 0 0 0 0 10 111 228 397 649 757 916 985 989 940 701 432 406 257 67 0 0 0 0 0 0 0 0 0 8 89 267 460 642 794 845 922 884 856 733 627 435 242 89 0 0 0 0 0 0 0 0 0 10 31 66 135 190 236 388 335 334 313 273 218 471 180 84 0 0 0 0 0 0 0 0 0 8 109 278 441 659 861 981 969 834 843 696 637 421 260 80 0 0 0 0 0 0 0 0 0 7 75 248 449 616 734 570 618 737 787 759 625 416 243 86 0 0 0 0 0 0 0 0 0 4 48 117 244 230 649 816 940 674 597 281 226 125 82 37 0 0 0 0 0 0 0 0 0 4 28 220 336 698 772 318 883 868 869 687 447 423 92 82 0 0 0 0 0 0 0 0 0 8 110 298 499 698 804 917 929 986 867 850 645 456 265 97 0 0 0 0 0 0 0 0 0 3 76 200 338 497 621 875 921 964 882 235 486 196 78 45 0 0 0 0 0 0 0 0 0 7 96 217 197 438 798 916 913 997 802 542 471 380 209 89 0 0 0 0 0 0 0 0 0 3 29 65 114 274 199 227 240 334 314 338 271 416 272 69 0 0 0 0 0 0 0 0 0 5 58 152 339 269 336 384 670 548 774 554 609 314 84 45 0 0 0 0 0 0 0 0 0 5 98 273 482 684 773 822 820 931 889 772 678 475 266 91 0 0 0 0 0 0 0 0 0 0 101 280 491 676 844 965 978 977 963 793 671 449 203 53 0 0 0 0 0 0 0 0 0 0 101 243 374 299 541 412 406 720 381 332 410 150 103 100 0 0 0 0 0 0 0 0 0 0 64 225 403 579 764 841 977 899 916 792 648 441 235 80 0 0 0 0 0 0 0 0 0 0 35 92 136 190 603 691 598 696 520 767 644 449 268 89 0 0 0 0 0 0 0 0 0 0 62 125 429 639 777 911 933 985 898 783 655 454 259 71 0 0 0 0 0 0 0 0 0 0 62 148 182 263 707 910 955 929 874 775 528 327 226 84 0 0 0 0 0 0 0 0 0 0 61 218 399 581 774 853 948 833 385 273 216 190 126 60 0 0 0 0 0 0 0 0 0 0 76 232 430 635 781 904 951 924 905 771 588 352 178 64 0 0 0 0 0 0 0 0 0 0 55 114 309 596 724 849 976 911 893 664 545 375 226 74 0 0 0 0 0 0 0 0 0 0 77 244 458 609 684 877 957 965 827 739 640 432 240 79 0 0 0 0 0 0 0 0 0 0 75 167 454 509 798 923 939 935 883 819 687 485 280 94 0 0 0 0 0 0 0 0 0 0 75 216 376 617 760 889 985 949 926 803 633 451 236 79 0 0 0 0 0 0 0 0 0 0 80 273 476 638 811 383 408 392 317 338 274 135 77 27 0 0 0 0 0 0 0 0 0 0 29 57 103 178 226 259 278 609 523 678 480 338 247 83 0 0 0 0 0 0 0 0 0 0 71 105 355 305 632 665 696 405 310 515 219 224 198 64 0 0 0 0 0 0 0 0 0 0 59 244 470 649 642 831 689 986 813 737 477 370 158 64 0 0 0 0 0 0 0 0 0 0 47 77 143 177 190 219 276 326 306 266 211 245 79 57 0 0 0 0 0 0 0 0 0 0 36 139 280 517 695 876 860 937 881 756 568 391 203 66 0 0 0 0 0 0 0 0 0 0 62 173 370 395 717 763 840 948 827 772 602 396 203 62 0 0 0 0 0 0 0 0 0 0 55 87 317 183 640 839 838 888 754 772 569 387 195 58 0 0 0 0 0 0 0 0 0 0 39 165 242 205 261 303 777 767 870 789 619 371 215 62 0 0 0 0 0 0 0 0 0 0 49 82 150 215 269 307 403 963 309 271 218 154 85 37 0 0 0 0 0 0 0 0 0 0 24 53 124 274 734 754 762 893 867 785 600 404 236 66 0 0 0 0 0 0 0 0 0 0 52 188 365 566 742 763 902 825 743 564 469 221 129 52 0 0 0 0 0 0 0 0 0 0 36 124 366 428 632 830 926 915 831 639 261 147 79 31 0 0 0 0 0 0 0 0 0 0 37 63 404 574 659 863 645 801 374 604 258 178 95 32 0 0 0 0 0 0 0 0 0 0 40 213 167 203 533 297 890 862 300 625 436 284 73 43 0 0 0 0 0 0 0 0 0 0 50 179 304 432 270 369 394 755 761 712 567 338 138 48 0 0 0 0 0 0 0 0 0 0 39 122 135 392 581 733 928 826 810 736 519 249 216 51 0 0 0 0 0 0 0 0 0 0 36 86 136 249 318 367 702 506 524 629 253 339 87 39 0 0 0 0 0 0 0 0 0 0 48 208 407 614 791 888 954 955 891 797 622 416 217 52 0 0 0 0 0 0 0 0 0 0 54 204 407 619 747 766 910 880 862 812 625 331 220 51 0 0 0 0 0 0 0 0 0 0 39 177 374 573 722 297 577 832 854 668 557 342 197 48 0 0 0 0 0 0 0 0 0 0 43 191 353 571 737 811 869 847 816 765 503 272 176 36 0 0 0 0 0 0 0 0 0 0 35 131 351 196 718 295 317 354 737 446 244 113 48 20 0 0 0 0 0 0 0 0 0 0 30 47 95 143 216 251 269 317 296 257 201 133 57 22 0 0 0 0 0 0 0 0 0 0 23 67 135 475 630 722 494 654 668 684 581 333 205 40 0 0 0 0 0 0 0 0 0 0 37 187 263 589 732 850 913 908 828 736 543 307 180 38 0 0 0 0 0 0 0 0 0 0 37 169 246 562 590 738 839 856 825 667 562 366 169 36 0 0 0 0 0 0 0 0 0 0 36 181 410 625 723 650 940 790 814 678 588 419 211 42 0 0 0 0 0 0 0 0 0 0 32 168 373 458 712 681 910 829 810 711 542 345 149 32 0 0 0 0 0 0 0 0 0 0 30 115 308 449 456 763 699 778 350 541 429 282 147 28 0 0 0 0 0 0 0 0 0 0 29 150 348 545 728 861 896 896 859 725 541 343 149 29 0 0 0 0 0 0 0 0 0 0 29 158 355 562 716 809 834 891 781 681 437 341 151 27 0 0 0 0 0 0 0 0 0 0 16 126 320 460 544 565 854 858 858 744 599 392 188 31 0 0 0 0 0 0 0 0 0 0 24 53 89 418 701 715 895 934 724 692 491 341 139 24 0 0 0 0 0 0 0 0 0 0 23 131 243 287 363 649 527 671 782 529 356 220 107 16 0 0 0 0 0 0 0 0 0 0 26 173 381 582 654 856 942 941 824 713 534 343 121 23 0 0 0 0 0 0 0 0 0 0 22 148 344 556 712 841 907 906 837 706 548 334 140 19 0 0 0 0 0 0 0 0 0 0 22 141 334 545 701 829 897 894 824 693 466 321 131 18 0 0 0 0 0 0 0 0 0 0 25 154 302 576 753 880 904 903 770 743 564 365 157 20 0 0 0 0 0 0 0 0 0 0 25 170 382 580 756 794 853 874 783 703 529 368 157 19 0 0 0 0 0 0 0 0 0 0 21 121 268 505 673 750 865 823 796 657 453 303 126 14 0 0 0 0 0 0 0 0 0 0 17 133 322 479 690 817 883 727 791 666 458 273 109 15 0 0 0 0 0 0 0 0 0 0 17 138 341 533 712 840 906 903 830 696 515 320 124 12 0 0 0 0 0 0 0 0 0 0 17 136 315 526 624 546 867 612 649 537 370 258 124 11 0 0 0 0 0 0 0 0 0 0 14 65 176 480 683 762 846 810 543 230 414 282 82 9 0 0 0 0 0 0 0 0 0 0 13 113 333 521 615 812 854 834 763 716 535 334 129 11 0 0 0 0 0 0 0 0 0 0 14 134 312 460 656 764 833 858 832 697 512 303 113 8 0 0 0 0 0 0 0 0 0 0 14 136 331 539 719 847 882 876 832 695 510 300 109 6 0 0 0 0 0 0 0 0 0 0 15 118 295 181 679 820 830 870 837 673 519 318 113 7 0 0 0 0 0 0 0 0 0 0 15 133 310 497 586 738 823 853 764 646 295 249 72 0 0 0 0 0 0 0 0 0 0 0 13 124 224 372 521 350 175 560 511 461 459 242 105 0 0 0 0 0 0 0 0 0 0 0 10 121 322 516 695 791 847 812 702 657 427 269 91 0 0 0 0 0 0 0 0 0 0 0 10 127 323 532 711 812 837 806 768 647 369 256 89 0 0 0 0 0 0 0 0 0 0 0 9 114 300 523 701 800 862 854 780 576 381 179 82 0 0 0 0 0 0 0 0 0 0 0 10 133 333 540 716 804 791 677 660 676 469 286 93 0 0 0 0 0 0 0 0 0 0 0 5 135 167 483 648 514 860 852 777 625 469 241 75 0 0 0 0 0 0 0 0 0 0 0 7 92 253 434 513 630 718 469 254 208 148 85 41 0 0 0 0 0 0 0 0 0 0 0 5 41 103 171 532 550 286 546 258 462 154 87 68 0 0 0 0 0 0 0 0 0 0 0 7 126 331 541 694 806 861 803 731 654 488 273 79 0 0 0 0 0 0 0 0 0 0 0 5 101 290 483 659 784 845 835 755 615 428 231 60 0 0 0 0 0 0 0 0 0 0 0 0 94 242 379 592 746 693 772 678 541 325 150 48 0 0 0 0 0 0 0 0 0 0 0 0 51 108 175 228 426 351 347 518 425 216 176 34 0 0 0 0 0 0 0 0 0 0 0 0 47 126 207 608 609 730 804 652 526 356 223 43 0 0 0 0 0 0 0 0 0 0 0 0 89 271 480 637 742 500 581 668 566 391 197 44 0 0 0 0 0 0 0 0 0 0 0 0 56 165 325 598 518 674 654 558 242 168 86 26 0 0 0 0 0 0 0 0 0 0 0 0 39 74 129 177 211 227 380 236 191 177 100 34 0 0 0 0 0 0 0 0 0 0 0 0 66 227 193 612 543 780 747 567 504 249 161 36 0 0 0 0 0 0 0 0 0 0 0 0 83 272 464 338 594 538 588 436 574 370 179 33 0 0 0 0 0 0 0 0 0 0 0 0 98 183 338 650 735 777 515 612 437 329 90 22 0 0 0 0 0 0 0 0 0 0 0 0 35 90 156 211 249 267 263 237 191 371 172 30 0 0 0 0 0 0 0 0 0 0 0 0 40 83 147 203 206 221 217 229 155 121 52 16 0 0 0 0 0 0 0 0 0 0 0 0 41 121 200 266 312 333 327 296 241 168 85 18 0 0 0 0 0 0 0 0 0 0 0 0 81 279 399 583 639 662 333 704 249 126 61 19 0 0 0 0 0 0 0 0 0 0 0 0 43 93 158 212 687 536 405 430 190 130 64 13 0 0 0 0 0 0 0 0 0 0 0 0 33 82 124 201 239 316 252 224 178 117 55 13 0 0 0 0 0 0 0 0 0 0 0 0 26 71 125 328 740 794 777 692 547 369 165 22 0 0 0 0 0 0 0 0 0 0 0 0 65 240 427 584 656 783 767 682 537 360 158 20 0 0 0 0 0 0 0 0 0 0 0 0 64 249 453 610 728 677 733 599 465 331 152 17 0 0 0 0 0 0 0 0 0 0 0 0 72 248 427 585 684 771 754 675 540 363 158 16 0 0 0 0 0 0 0 0 0 0 0 0 49 55 112 154 131 143 180 199 176 171 87 3 0 0 0 0 0 0 0 0 0 0 0 0 51 252 443 565 658 680 700 626 466 318 143 3 0 0 0 0 0 0 0 0 0 0 0 0 82 227 436 604 674 721 703 591 485 316 131 0 0 0 0 0 0 0 0 0 0 0 0 0 71 229 423 567 710 758 688 629 515 331 125 0 0 0 0 0 0 0 0 0 0 0 0 0 39 240 419 569 638 723 682 579 458 302 129 0 0 0 0 0 0 0 0 0 0 0 0 0 21 47 83 111 130 136 626 618 477 274 91 0 0 0 0 0 0 0 0 0 0 0 0 0 22 223 416 587 683 649 638 596 463 274 73 0 0 0 0 0 0 0 0 0 0 0 0 0 24 184 416 538 615 715 643 568 452 294 113 0 0 0 0 0 0 0 0 0 0 0 0 0 25 145 418 565 566 629 612 584 464 261 106 0 0 0 0 0 0 0 0 0 0 0 0 0 26 202 386 524 619 664 680 532 446 283 93 0 0 0 0 0 0 0 0 0 0 0 0 0 28 189 385 548 644 670 624 582 427 276 103 0 0 0 0 0 0 0 0 0 0 0 0 0 31 202 404 563 661 600 652 535 400 267 98 0 0 0 0 0 0 0 0 0 0 0 0 0 34 180 404 564 453 690 666 503 447 214 92 0 0 0 0 0 0 0 0 0 0 0 0 0 37 56 207 304 458 492 567 477 452 260 84 0 0 0 0 0 0 0 0 0 0 0 0 0 42 174 397 545 616 615 618 500 424 264 79 0 0 0 0 0 0 0 0 0 0 0 0 0 48 218 340 491 327 487 382 538 440 257 72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 179 358 530 547 545 617 528 411 224 74 0 0 0 0 0 0 0 0 0 0 0 0 0 0 184 363 492 584 596 601 523 401 226 69 0 0 0 0 0 0 0 0 0 0 0 0 0 0 184 366 518 578 607 591 552 393 246 66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 93 355 523 520 593 620 483 411 239 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 177 346 486 511 608 581 515 402 222 48 0 0 0 0 0 0 0 0 0 0 0 0 0 16 191 315 473 560 545 607 264 202 155 19 0 0 0 0 0 0 0 0 0 0 0 0 0 5 85 120 152 271 253 322 253 197 111 52 0 0 0 0 0 0 0 0 0 0 0 0 0 14 174 339 478 512 607 586 462 394 206 46 0 0 0 0 0 0 0 0 0 0 0 0 0 12 167 334 495 594 193 162 422 392 214 44 0 0 0 0 0 0 0 0 0 0 0 0 0 8 143 286 490 593 610 611 508 309 117 17 0 0 0 0 0 0 0 0 0 0 0 0 0 6 140 337 486 582 565 246 449 373 203 39 0 0 0 0 0 0 0 0 0 0 0 0 0 9 162 328 442 517 526 581 462 338 187 33 0 0 0 0 0 0 0 0 0 0 0 0 0 6 139 338 446 496 515 532 468 334 197 30 0 0 0 0 0 0 0 0 0 0 0 0 0 6 154 300 415 472 598 587 502 355 168 26 0 0 0 0 0 0 0 0 0 0 0 0 0 2 80 264 221 121 179 230 129 66 55 12 0 0 0 0 0 0 0 0 0 0 0 0 0 5 140 296 449 507 508 528 443 305 157 26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 141 294 439 544 583 559 476 337 132 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 118 281 414 474 419 459 408 292 162 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 275 289 467 536 534 368 187 83 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 121 276 410 479 105 166 102 162 106 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 122 276 403 489 566 546 451 291 145 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 104 260 382 478 449 277 370 218 110 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 105 276 364 393 372 480 407 248 121 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 105 173 165 181 268 356 279 161 76 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 47 114 407 366 118 222 223 133 128 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80 229 297 336 378 367 309 217 102 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 60 144 130 188 183 253 248 203 99 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 99 150 153 137 93 162 76 98 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96 60 108 134 242 145 155 92 60 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 84 188 300 459 518 264 204 109 37 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65 192 341 248 463 336 328 145 50 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 208 315 423 474 415 331 221 46 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 68 232 375 467 511 483 191 97 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 179 333 352 371 283 113 97 86 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 68 225 363 446 495 449 235 161 72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 225 349 404 492 343 367 221 66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 73 226 346 397 392 428 180 214 106 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 48 218 280 394 482 466 367 236 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 203 334 346 419 405 303 232 109 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 62 189 276 312 283 222 96 58 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 45 191 132 155 150 118 79 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 126 334 429 227 193 243 101 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 126 169 77 181 92 87 101 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 134 316 404 464 425 362 203 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 37 183 173 329 99 179 231 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36 129 268 283 375 248 193 142 95 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 175 319 365 430 466 390 265 108 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 172 315 420 467 434 370 246 94 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 49 74 98 108 124 312 116 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 61 135 140 154 149 126 113 47 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 27 65 109 134 250 262 197 97 69 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 151 296 315 326 150 276 118 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 85 272 306 314 381 321 248 104 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 143 215 382 300 270 146 161 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 53 98 162 146 143 120 69 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 40 73 118 114 130 107 70 38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 55 59 81 92 124 87 111 54 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 155 286 341 373 315 201 49 54 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 146 283 370 413 390 274 233 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 140 274 400 453 442 370 246 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 116 248 340 391 381 324 207 81 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 148 293 386 417 419 357 252 103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 140 284 394 432 374 259 242 104 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 155 279 180 299 367 251 208 69 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 142 290 363 313 252 229 89 41 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 136 264 272 409 436 367 246 105 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 121 210 341 326 166 139 171 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 140 74 122 140 138 117 80 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 85 191 158 123 347 211 152 91 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 34 67 93 105 123 245 180 112 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 122 266 348 298 223 258 145 79 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 42 69 98 96 112 95 65 33 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 124 279 326 408 400 329 253 114 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 79 101 136 155 153 133 97 42 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 34 69 98 134 143 114 78 40 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 79 217 340 261 364 349 214 112 10 0 0 0 0 0 0 0 ================================================ FILE: src/pymgrid/data/pv/Raleigh_723060TYA.csv ================================================ GH illum (lx) 0 0 0 0 0 0 0 16 58 89 120 257 314 252 213 160 51 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 33 82 115 133 156 144 123 132 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 148 320 466 551 574 529 423 264 83 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 150 326 411 549 527 529 420 263 76 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 105 284 431 511 534 459 273 150 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 73 150 214 303 272 244 204 83 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 77 170 246 269 193 162 139 96 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 50 164 231 277 281 284 234 150 51 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 123 297 447 525 550 510 412 250 76 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 134 286 440 528 481 441 326 235 93 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 93 211 260 508 529 487 403 234 83 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 32 63 112 144 149 146 123 90 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 57 111 152 195 190 179 147 104 45 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 77 174 223 272 327 373 198 143 53 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 139 292 462 505 559 524 420 248 112 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 131 248 331 412 392 512 411 259 95 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 68 161 422 311 392 329 186 213 102 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 135 325 452 524 566 528 436 283 109 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 137 283 235 285 197 246 192 88 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 55 103 171 187 212 179 147 101 44 14 0 0 0 0 0 0 0 0 0 0 0 0 0 20 112 259 351 274 340 309 185 132 65 11 0 0 0 0 0 0 0 0 0 0 0 0 0 23 163 346 429 542 558 572 485 328 143 17 0 0 0 0 0 0 0 0 0 0 0 0 0 29 110 241 389 247 327 327 351 201 99 20 0 0 0 0 0 0 0 0 0 0 0 0 0 28 57 179 293 448 544 500 305 296 132 17 0 0 0 0 0 0 0 0 0 0 0 0 0 24 160 349 502 535 456 557 412 317 137 20 0 0 0 0 0 0 0 0 0 0 0 0 0 26 153 325 483 498 532 566 468 299 132 17 0 0 0 0 0 0 0 0 0 0 0 0 0 25 151 318 357 364 564 525 413 287 104 10 0 0 0 0 0 0 0 0 0 0 0 0 0 19 144 293 499 549 628 530 387 293 130 21 0 0 0 0 0 0 0 0 0 0 0 0 0 26 164 346 507 611 649 611 502 338 152 24 0 0 0 0 0 0 0 0 0 0 0 0 0 30 179 374 527 626 659 625 522 364 169 25 0 0 0 0 0 0 0 0 0 0 0 0 0 27 126 206 236 326 333 560 347 243 80 27 0 0 0 0 0 0 0 0 0 0 0 0 0 25 97 173 252 309 316 194 171 120 54 14 0 0 0 0 0 0 0 0 0 0 0 0 0 17 62 204 183 196 207 211 164 120 61 17 0 0 0 0 0 0 0 0 0 0 0 0 0 28 88 191 256 595 592 573 488 227 114 15 0 0 0 0 0 0 0 0 0 0 0 0 0 34 167 390 525 626 678 609 517 362 170 31 0 0 0 0 0 0 0 0 0 0 0 0 0 21 61 110 194 175 198 203 300 131 67 17 0 0 0 0 0 0 0 0 0 0 0 0 0 28 125 203 295 443 468 310 220 342 173 35 0 0 0 0 0 0 0 0 0 0 0 0 0 24 124 335 481 560 579 497 522 361 173 36 0 0 0 0 0 0 0 0 0 0 0 0 0 37 203 409 570 668 705 673 567 409 202 36 0 0 0 0 0 0 0 0 0 0 0 0 0 37 175 369 552 621 678 600 339 320 185 33 0 0 0 0 0 0 0 0 0 0 0 0 0 41 217 341 592 660 692 538 493 202 181 42 0 0 0 0 0 0 0 0 0 0 0 0 0 43 207 429 541 337 229 427 252 223 95 22 0 0 0 0 0 0 0 0 0 0 0 0 0 26 119 197 277 326 367 343 310 237 160 38 0 0 0 0 0 0 0 0 0 0 0 0 0 45 185 378 567 616 674 670 410 216 177 23 0 0 0 0 0 0 0 0 0 0 0 0 0 49 237 338 460 612 397 384 457 235 148 40 0 0 0 0 0 0 0 0 0 0 0 0 0 43 212 419 572 700 765 647 540 388 211 44 0 0 0 0 0 0 0 0 0 0 0 0 0 50 236 444 603 709 744 588 599 440 231 48 0 0 0 0 0 0 0 0 0 0 0 0 0 23 91 199 287 637 624 651 500 272 105 43 0 0 0 0 0 0 0 0 0 0 0 0 0 40 128 394 384 565 443 699 572 426 219 48 0 0 0 0 0 0 0 0 0 0 0 0 0 30 88 141 182 203 432 458 268 175 76 47 0 0 0 0 0 0 0 0 0 0 0 0 0 27 126 190 341 709 754 717 625 451 242 53 0 0 0 0 0 0 0 0 0 0 0 0 0 65 273 479 632 706 779 737 634 472 260 61 0 0 0 0 0 0 0 0 0 0 0 0 0 22 148 330 451 638 513 411 350 390 224 55 0 0 0 0 0 0 0 0 0 0 0 0 0 57 175 338 469 384 403 495 389 295 103 50 0 0 0 0 0 0 0 0 0 0 0 0 0 63 223 462 472 584 686 663 595 381 187 61 0 0 0 0 0 0 0 0 0 0 0 0 0 25 126 251 338 558 420 489 141 251 117 34 0 0 0 0 0 0 0 0 0 0 0 0 0 28 132 271 447 477 370 503 258 320 84 47 0 0 0 0 0 0 0 0 0 0 0 0 0 44 131 414 588 525 518 437 262 236 120 39 0 0 0 0 0 0 0 0 0 0 0 0 0 82 288 493 663 771 810 770 659 481 274 72 0 0 0 0 0 0 0 0 0 0 0 0 0 106 317 518 681 775 802 765 660 506 292 84 0 0 0 0 0 0 0 0 0 0 0 0 0 106 320 519 683 777 803 767 661 498 294 82 0 0 0 0 0 0 0 0 0 0 0 0 0 67 199 168 146 153 254 131 138 167 128 49 0 0 0 0 0 0 0 0 0 0 0 0 0 33 66 142 234 199 120 108 154 221 135 53 0 0 0 0 0 0 0 0 0 0 0 0 0 26 82 144 205 169 159 223 192 128 93 30 0 0 0 0 0 0 0 0 0 0 0 0 0 68 153 205 296 392 296 246 266 234 75 16 0 0 0 0 0 0 0 0 0 0 0 0 0 128 333 540 698 798 830 797 686 506 301 91 0 0 0 0 0 0 0 0 0 0 0 0 0 128 316 528 672 723 807 683 513 353 165 54 0 0 0 0 0 0 0 0 0 0 0 0 0 46 69 147 211 261 140 240 216 281 41 13 0 0 0 0 0 0 0 0 0 0 0 0 5 19 58 291 235 258 274 271 227 295 90 63 0 0 0 0 0 0 0 0 0 0 0 0 16 148 372 580 742 839 862 838 704 551 329 113 0 0 0 0 0 0 0 0 0 0 0 0 12 164 384 574 755 846 838 793 635 543 325 89 0 0 0 0 0 0 0 0 0 0 0 0 5 47 76 118 466 820 843 839 733 495 332 113 0 0 0 0 0 0 0 0 0 0 0 0 17 120 211 280 358 565 578 332 310 286 280 57 0 0 0 0 0 0 0 0 0 0 0 0 17 179 400 595 704 625 742 518 506 422 266 77 0 0 0 0 0 0 0 0 0 0 0 0 18 181 396 606 760 877 910 852 739 565 339 119 0 0 0 0 0 0 0 0 0 0 0 0 0 177 397 627 769 868 882 851 755 579 350 128 0 0 0 0 0 0 0 0 0 0 0 0 27 156 224 270 329 275 176 122 111 93 46 19 0 0 0 0 0 0 0 0 0 0 0 0 22 83 73 163 191 268 291 597 522 407 342 121 6 0 0 0 0 0 0 0 0 0 0 0 28 198 417 632 800 858 950 692 641 542 313 128 8 0 0 0 0 0 0 0 0 0 0 0 35 166 394 486 612 851 901 859 741 549 341 126 9 0 0 0 0 0 0 0 0 0 0 0 34 144 405 554 760 864 903 847 744 556 346 131 8 0 0 0 0 0 0 0 0 0 0 0 13 89 245 362 466 423 486 562 494 459 307 67 7 0 0 0 0 0 0 0 0 0 0 0 27 104 239 350 439 544 612 758 664 538 364 131 10 0 0 0 0 0 0 0 0 0 0 0 43 161 386 503 606 628 637 639 691 457 291 121 9 0 0 0 0 0 0 0 0 0 0 0 6 36 145 144 188 200 365 356 445 554 356 145 14 0 0 0 0 0 0 0 0 0 0 0 56 228 447 691 836 884 933 900 802 627 412 159 13 0 0 0 0 0 0 0 0 0 0 0 55 248 480 689 838 911 943 896 785 608 392 178 14 0 0 0 0 0 0 0 0 0 0 0 48 242 469 669 830 919 948 892 781 608 365 102 22 0 0 0 0 0 0 0 0 0 0 0 50 230 467 662 821 882 909 779 622 584 307 89 11 0 0 0 0 0 0 0 0 0 0 0 40 156 393 619 679 838 738 564 634 585 362 145 14 0 0 0 0 0 0 0 0 0 0 0 33 127 252 333 680 846 809 831 623 575 371 93 25 0 0 0 0 0 0 0 0 0 0 0 45 206 445 490 821 811 709 693 622 542 329 111 7 0 0 0 0 0 0 0 0 0 0 0 49 144 460 672 791 763 763 542 359 219 187 71 3 0 0 0 0 0 0 0 0 0 0 0 0 260 400 702 902 835 977 876 747 530 297 158 8 0 0 0 0 0 0 0 0 0 0 0 54 251 394 644 830 906 924 885 763 587 375 151 7 0 0 0 0 0 0 0 0 0 0 0 63 254 479 634 794 856 738 360 419 99 59 37 1 0 0 0 0 0 0 0 0 0 0 0 60 257 513 724 881 961 979 929 805 629 413 177 27 0 0 0 0 0 0 0 0 0 0 0 79 297 529 730 836 972 996 940 809 623 409 175 0 0 0 0 0 0 0 0 0 0 0 0 80 300 522 755 783 914 1000 905 790 646 404 174 12 0 0 0 0 0 0 0 0 0 0 0 49 224 177 343 473 268 342 250 217 132 235 69 10 0 0 0 0 0 0 0 0 0 0 0 44 211 297 287 169 235 244 370 430 496 359 177 17 0 0 0 0 0 0 0 0 0 0 0 93 310 538 715 893 864 804 857 774 605 402 183 15 0 0 0 0 0 0 0 0 0 0 0 94 304 524 713 895 932 973 927 759 600 394 161 14 0 0 0 0 0 0 0 0 0 0 0 64 118 159 205 379 562 812 663 379 368 189 105 21 0 0 0 0 0 0 0 0 0 0 0 0 72 132 173 410 572 785 621 443 488 329 172 8 0 0 0 0 0 0 0 0 0 0 0 31 152 319 464 855 746 683 418 494 432 298 182 33 0 0 0 0 0 0 0 0 0 0 0 47 239 537 716 887 971 977 862 725 535 142 48 3 0 0 0 0 0 0 0 0 0 0 0 117 353 579 779 907 1003 1020 956 835 653 422 188 20 0 0 0 0 0 0 0 0 0 0 0 121 356 575 781 926 1007 1001 890 730 620 367 179 16 0 0 0 0 0 0 0 0 0 0 0 83 177 300 643 637 945 941 818 679 209 109 48 10 0 0 0 0 0 0 0 0 0 0 0 113 307 527 663 464 463 436 525 182 106 146 48 1 0 0 0 0 0 0 0 0 0 0 0 78 262 302 459 915 726 852 742 742 547 418 194 26 0 0 0 0 0 0 0 0 0 0 6 129 347 565 773 891 966 967 947 810 630 411 189 24 0 0 0 0 0 0 0 0 0 0 7 126 343 571 740 873 971 993 913 744 599 361 145 33 0 0 0 0 0 0 0 0 0 0 10 124 264 424 724 840 949 966 751 566 429 382 170 25 0 0 0 0 0 0 0 0 0 0 10 123 308 472 509 840 941 948 898 785 596 363 161 23 0 0 0 0 0 0 0 0 0 0 11 121 321 528 695 835 913 626 682 695 576 387 171 27 0 0 0 0 0 0 0 0 0 0 15 152 325 583 703 709 951 715 765 372 219 151 55 15 0 0 0 0 0 0 0 0 0 0 14 121 325 434 798 786 574 397 720 398 621 398 138 37 0 0 0 0 0 0 0 0 0 0 0 64 87 150 191 435 782 907 710 651 418 338 140 17 0 0 0 0 0 0 0 0 0 0 9 85 302 332 645 378 582 417 795 778 274 151 94 44 0 0 0 0 0 0 0 0 0 0 6 35 84 139 185 260 333 338 821 681 602 404 75 26 0 0 0 0 0 0 0 0 0 0 10 50 218 279 295 721 789 784 695 464 318 149 75 43 0 0 0 0 0 0 0 0 0 0 12 156 369 583 810 862 935 1064 812 815 521 339 181 22 0 0 0 0 0 0 0 0 0 0 15 116 192 420 770 471 818 327 856 817 595 386 218 48 0 0 0 0 0 0 0 0 0 0 19 167 389 621 796 932 1009 967 929 837 530 377 140 38 0 0 0 0 0 0 0 0 0 0 20 145 306 367 661 929 1006 1027 975 861 695 493 256 61 0 0 0 0 0 0 0 0 0 0 18 150 366 555 783 897 983 1033 977 845 636 439 210 58 0 0 0 0 0 0 0 0 0 0 21 60 294 429 631 633 566 949 707 792 535 201 108 31 0 0 0 0 0 0 0 0 0 0 13 70 199 379 505 314 419 359 467 353 318 435 203 52 0 0 0 0 0 0 0 0 0 0 21 165 301 230 742 867 757 994 869 788 474 232 118 40 0 0 0 0 0 0 0 0 0 0 19 159 348 533 409 851 975 814 678 360 507 376 208 60 0 0 0 0 0 0 0 0 0 0 24 107 356 567 752 900 847 344 400 349 275 186 113 39 0 0 0 0 0 0 0 0 0 0 12 53 115 150 230 317 422 694 645 794 509 170 180 59 0 0 0 0 0 0 0 0 0 0 20 86 258 414 593 693 985 945 846 812 654 451 235 67 0 0 0 0 0 0 0 0 0 0 28 105 209 482 745 853 923 695 956 814 549 445 254 47 0 0 0 0 0 0 0 0 0 0 31 57 119 180 233 320 346 350 847 571 274 386 257 58 0 0 0 0 0 0 0 0 0 0 21 173 361 591 537 788 752 1026 951 560 413 331 249 55 0 0 0 0 0 0 0 0 0 0 19 70 144 215 276 395 347 713 781 295 241 405 85 37 0 0 0 0 0 0 0 0 0 0 32 194 424 638 836 940 1014 1026 976 901 720 516 277 82 0 0 0 0 0 0 0 0 0 0 30 164 383 589 760 866 781 1012 839 740 560 413 242 73 0 0 0 0 0 0 0 0 0 0 30 164 355 615 822 938 1021 983 932 678 449 359 183 54 0 0 0 0 0 0 0 0 0 0 34 126 304 625 773 939 1022 974 927 712 688 491 264 79 0 0 0 0 0 0 0 0 0 0 38 206 433 544 813 931 1016 958 931 866 710 527 296 94 0 0 0 0 0 0 0 0 0 0 32 178 336 561 770 949 1032 1045 964 703 665 461 247 77 0 0 0 0 0 0 0 0 0 0 35 189 394 581 721 846 1007 974 834 532 471 206 115 46 0 0 0 0 0 0 0 0 0 0 20 60 120 148 195 230 251 299 284 249 168 139 108 49 0 0 0 0 0 0 0 0 0 0 23 51 93 147 192 227 246 250 237 208 167 116 64 33 0 0 0 0 0 0 0 0 0 0 30 50 144 254 707 544 633 976 925 781 627 380 146 62 0 0 0 0 0 0 0 0 0 0 28 108 329 514 736 801 769 820 610 627 694 383 257 74 0 0 0 0 0 0 0 0 0 0 38 159 384 636 746 926 1023 916 930 761 649 458 272 98 0 0 0 0 0 0 0 0 0 0 39 194 362 608 747 962 1024 944 824 851 557 329 143 38 0 0 0 0 0 0 0 0 0 0 37 200 364 568 357 625 796 781 953 864 595 389 153 37 0 0 0 0 0 0 0 0 0 0 38 183 415 619 788 639 757 890 864 843 656 429 265 91 0 0 0 0 0 0 0 0 0 0 37 154 372 632 827 899 978 776 783 893 666 480 261 76 0 0 0 0 0 0 0 0 0 0 42 206 430 629 707 920 930 955 869 697 415 470 256 107 0 0 0 0 0 0 0 0 0 0 38 203 415 639 789 629 764 815 856 704 466 479 278 80 0 0 0 0 0 0 0 0 0 0 39 200 411 633 825 950 354 727 851 635 337 487 227 95 5 0 0 0 0 0 0 0 0 0 35 182 394 622 792 916 951 968 971 534 652 455 222 85 5 0 0 0 0 0 0 0 0 0 39 195 403 625 821 746 992 1054 857 763 687 499 208 100 6 0 0 0 0 0 0 0 0 0 45 226 436 614 773 960 1009 948 979 866 697 399 297 116 8 0 0 0 0 0 0 0 0 0 43 169 262 546 549 823 890 831 931 838 519 285 303 52 5 0 0 0 0 0 0 0 0 0 27 92 195 267 278 329 358 363 683 539 455 425 241 88 7 0 0 0 0 0 0 0 0 0 44 177 302 595 758 903 947 981 999 867 447 393 244 93 7 0 0 0 0 0 0 0 0 0 15 53 105 184 557 707 869 880 519 816 667 391 207 68 7 0 0 0 0 0 0 0 0 0 19 63 218 555 689 873 971 949 925 869 661 453 227 81 7 0 0 0 0 0 0 0 0 0 35 105 401 624 800 920 887 814 875 743 699 440 179 44 5 0 0 0 0 0 0 0 0 0 39 195 313 588 767 883 900 873 861 722 676 310 156 57 7 0 0 0 0 0 0 0 0 0 42 159 222 452 727 320 347 434 736 697 727 472 252 84 7 0 0 0 0 0 0 0 0 0 19 55 95 147 228 269 565 783 779 297 429 145 102 55 7 0 0 0 0 0 0 0 0 0 18 48 112 175 269 317 736 351 335 298 243 239 265 102 8 0 0 0 0 0 0 0 0 0 23 113 392 497 591 713 985 920 660 638 247 382 219 90 6 0 0 0 0 0 0 0 0 0 17 48 353 417 761 772 961 907 832 934 658 496 154 96 9 0 0 0 0 0 0 0 0 0 17 46 97 175 269 482 545 351 335 299 244 176 103 48 6 0 0 0 0 0 0 0 0 0 27 198 366 499 665 884 983 1005 952 867 585 495 281 122 11 0 0 0 0 0 0 0 0 0 42 186 395 545 723 701 823 964 885 844 670 520 303 107 11 0 0 0 0 0 0 0 0 0 39 189 374 403 537 637 948 861 926 764 580 302 241 87 8 0 0 0 0 0 0 0 0 0 31 173 360 586 696 841 906 959 947 828 632 458 302 107 10 0 0 0 0 0 0 0 0 0 39 203 399 627 711 833 899 1070 918 816 706 527 322 121 10 0 0 0 0 0 0 0 0 0 32 129 360 584 780 887 968 990 964 752 702 484 253 105 10 0 0 0 0 0 0 0 0 0 33 153 377 312 266 786 943 745 955 819 576 506 309 117 10 0 0 0 0 0 0 0 0 0 0 187 372 569 771 874 927 839 852 692 631 182 261 68 1 0 0 0 0 0 0 0 0 0 0 187 356 571 766 868 982 954 888 785 683 471 276 113 1 0 0 0 0 0 0 0 0 0 0 165 347 422 738 877 946 962 882 774 606 425 264 112 1 0 0 0 0 0 0 0 0 0 0 171 355 386 690 752 848 909 730 712 393 370 234 68 0 0 0 0 0 0 0 0 0 0 0 200 394 588 767 880 938 972 922 831 690 517 314 126 0 0 0 0 0 0 0 0 0 0 0 198 399 579 769 895 975 999 922 786 684 490 292 115 0 0 0 0 0 0 0 0 0 0 0 181 359 555 736 835 984 982 962 837 675 490 288 111 0 0 0 0 0 0 0 0 0 0 0 144 206 480 665 542 386 300 903 719 443 144 57 54 0 0 0 0 0 0 0 0 0 0 0 144 350 480 690 827 883 922 733 316 258 377 272 70 0 0 0 0 0 0 0 0 0 0 0 94 213 360 607 731 905 830 903 814 652 466 276 104 0 0 0 0 0 0 0 0 0 0 0 173 334 332 619 636 898 874 962 808 640 452 281 108 0 0 0 0 0 0 0 0 0 0 0 154 294 473 697 542 385 637 614 711 557 347 180 97 0 0 0 0 0 0 0 0 0 0 0 144 328 496 569 655 712 742 784 810 660 473 275 107 0 0 0 0 0 0 0 0 0 0 0 175 354 539 696 865 954 971 931 830 679 466 280 98 0 0 0 0 0 0 0 0 0 0 0 167 372 560 720 857 899 894 855 785 530 217 197 40 0 0 0 0 0 0 0 0 0 0 0 159 262 466 507 452 465 626 898 587 534 101 62 26 0 0 0 0 0 0 0 0 0 0 0 59 266 415 412 295 362 248 508 845 656 294 118 34 0 0 0 0 0 0 0 0 0 0 0 155 337 524 728 864 967 991 954 826 649 430 249 103 0 0 0 0 0 0 0 0 0 0 0 160 332 522 717 863 877 802 912 808 656 448 207 77 0 0 0 0 0 0 0 0 0 0 12 152 339 532 735 861 739 954 950 852 636 456 238 61 0 0 0 0 0 0 0 0 0 0 9 141 305 535 724 868 969 1010 937 839 699 481 268 100 0 0 0 0 0 0 0 0 0 0 11 154 340 548 735 864 975 946 751 750 412 114 102 77 0 0 0 0 0 0 0 0 0 0 11 155 340 493 641 757 828 850 811 568 478 449 266 97 0 0 0 0 0 0 0 0 0 0 10 155 325 467 714 857 945 881 595 690 566 393 118 37 0 0 0 0 0 0 0 0 0 0 5 98 207 298 593 637 656 700 629 202 312 114 123 66 0 0 0 0 0 0 0 0 0 0 3 61 185 452 584 569 796 811 555 523 466 339 248 89 0 0 0 0 0 0 0 0 0 0 6 133 169 267 258 321 376 212 316 228 167 107 79 20 0 0 0 0 0 0 0 0 0 0 3 71 207 309 412 432 653 868 856 744 642 446 259 87 0 0 0 0 0 0 0 0 0 0 7 140 234 505 667 852 862 855 919 840 680 467 266 84 0 0 0 0 0 0 0 0 0 0 2 100 218 334 316 760 179 184 354 766 629 436 255 84 0 0 0 0 0 0 0 0 0 0 3 82 178 466 516 743 453 643 711 390 224 196 153 40 0 0 0 0 0 0 0 0 0 0 14 112 290 500 687 810 885 913 823 736 587 413 188 57 0 0 0 0 0 0 0 0 0 0 14 102 298 502 694 826 858 888 856 754 623 438 247 84 0 0 0 0 0 0 0 0 0 0 11 96 277 294 485 656 789 860 731 763 563 329 229 68 0 0 0 0 0 0 0 0 0 0 12 96 287 498 698 771 750 727 492 744 589 417 227 68 0 0 0 0 0 0 0 0 0 0 11 107 273 485 656 792 856 850 855 534 586 479 197 65 0 0 0 0 0 0 0 0 0 0 14 102 283 505 679 802 891 920 868 711 627 444 221 65 0 0 0 0 0 0 0 0 0 0 16 100 283 495 693 847 788 883 852 743 581 441 218 62 0 0 0 0 0 0 0 0 0 0 10 87 279 503 689 823 939 985 936 817 638 420 215 61 0 0 0 0 0 0 0 0 0 0 13 96 222 451 562 748 846 419 442 687 506 391 206 59 0 0 0 0 0 0 0 0 0 0 11 100 281 485 658 791 902 928 747 776 520 374 215 50 0 0 0 0 0 0 0 0 0 0 10 81 273 484 655 798 893 897 834 673 579 400 127 47 0 0 0 0 0 0 0 0 0 0 13 71 171 180 352 242 324 276 269 393 358 242 72 39 0 0 0 0 0 0 0 0 0 0 14 121 339 559 765 871 663 906 949 843 702 474 194 55 0 0 0 0 0 0 0 0 0 0 9 118 331 540 729 888 917 766 697 783 620 445 202 55 0 0 0 0 0 0 0 0 0 0 0 72 259 251 458 493 670 809 833 733 592 450 222 58 0 0 0 0 0 0 0 0 0 0 0 105 308 538 748 878 973 997 948 831 646 465 219 56 0 0 0 0 0 0 0 0 0 0 0 108 313 547 734 891 973 942 893 733 650 432 207 50 0 0 0 0 0 0 0 0 0 0 0 72 239 457 580 798 902 970 915 792 609 405 186 35 0 0 0 0 0 0 0 0 0 0 0 51 149 411 686 825 748 848 733 636 514 329 120 35 0 0 0 0 0 0 0 0 0 0 0 89 256 520 658 779 824 869 733 665 471 364 174 41 0 0 0 0 0 0 0 0 0 0 0 71 239 504 615 711 781 492 488 711 489 227 117 18 0 0 0 0 0 0 0 0 0 0 0 48 153 271 334 408 535 493 534 433 546 286 103 37 0 0 0 0 0 0 0 0 0 0 0 44 104 253 343 605 455 542 645 438 239 229 65 43 0 0 0 0 0 0 0 0 0 0 0 61 134 210 312 420 649 501 533 548 448 270 155 28 0 0 0 0 0 0 0 0 0 0 0 88 121 252 354 482 595 547 541 646 478 323 193 38 0 0 0 0 0 0 0 0 0 0 0 68 288 515 516 799 963 583 829 579 553 300 159 22 0 0 0 0 0 0 0 0 0 0 0 37 109 457 588 562 578 468 693 596 327 340 128 18 0 0 0 0 0 0 0 0 0 0 0 56 189 373 444 560 589 615 474 600 468 137 48 36 0 0 0 0 0 0 0 0 0 0 0 59 135 227 270 473 477 585 640 495 357 131 120 22 0 0 0 0 0 0 0 0 0 0 0 72 264 491 671 799 727 609 883 709 447 371 121 14 0 0 0 0 0 0 0 0 0 0 0 80 280 490 703 853 938 788 805 747 564 369 61 13 0 0 0 0 0 0 0 0 0 0 0 48 211 198 230 538 611 510 760 598 455 222 140 20 0 0 0 0 0 0 0 0 0 0 0 33 145 145 633 467 600 887 766 473 362 307 138 23 0 0 0 0 0 0 0 0 0 0 0 44 130 345 316 636 555 332 381 476 334 226 129 17 0 0 0 0 0 0 0 0 0 0 0 64 237 438 513 477 451 340 415 418 297 176 79 14 0 0 0 0 0 0 0 0 0 0 0 48 72 154 241 311 269 292 428 250 192 199 96 15 0 0 0 0 0 0 0 0 0 0 0 41 128 221 378 394 448 516 444 336 528 305 123 24 0 0 0 0 0 0 0 0 0 0 0 61 235 442 641 779 857 678 701 696 567 311 131 20 0 0 0 0 0 0 0 0 0 0 0 42 118 221 166 388 402 498 472 335 317 128 110 14 0 0 0 0 0 0 0 0 0 0 0 52 79 219 337 406 409 463 419 394 330 218 95 25 0 0 0 0 0 0 0 0 0 0 0 50 146 192 336 380 726 497 547 617 518 344 127 17 0 0 0 0 0 0 0 0 0 0 0 42 255 289 440 507 814 535 757 689 351 257 132 16 0 0 0 0 0 0 0 0 0 0 0 47 100 214 213 415 441 475 570 615 371 190 93 12 0 0 0 0 0 0 0 0 0 0 0 48 207 417 621 765 851 849 782 566 496 288 97 0 0 0 0 0 0 0 0 0 0 0 0 50 222 449 637 789 879 894 832 700 510 303 100 0 0 0 0 0 0 0 0 0 0 0 0 55 248 443 555 542 842 875 713 706 474 175 97 0 0 0 0 0 0 0 0 0 0 0 0 41 90 373 367 637 698 840 801 687 505 292 98 0 0 0 0 0 0 0 0 0 0 0 0 49 224 435 632 775 672 892 806 727 537 313 104 0 0 0 0 0 0 0 0 0 0 0 0 50 228 444 644 654 392 589 790 672 444 226 70 0 0 0 0 0 0 0 0 0 0 0 0 35 104 305 342 729 739 878 853 515 297 162 62 0 0 0 0 0 0 0 0 0 0 0 0 40 223 449 611 768 852 833 669 547 454 271 89 0 0 0 0 0 0 0 0 0 0 0 0 42 192 408 609 770 868 811 753 619 441 234 70 0 0 0 0 0 0 0 0 0 0 0 0 36 142 200 310 384 397 471 500 459 466 240 86 0 0 0 0 0 0 0 0 0 0 0 0 34 111 199 255 703 817 824 762 596 428 235 68 0 0 0 0 0 0 0 0 0 0 0 0 40 185 368 577 460 687 795 720 336 195 200 61 0 0 0 0 0 0 0 0 0 0 0 0 41 208 415 609 759 814 818 705 604 437 246 64 0 0 0 0 0 0 0 0 0 0 0 0 42 213 434 616 760 841 799 752 651 462 248 60 0 0 0 0 0 0 0 0 0 0 0 0 46 227 451 588 709 692 769 735 504 453 161 56 0 0 0 0 0 0 0 0 0 0 0 0 35 86 144 187 311 435 374 522 551 381 139 49 0 0 0 0 0 0 0 0 0 0 0 0 37 197 403 594 594 751 792 671 524 383 234 46 0 0 0 0 0 0 0 0 0 0 0 0 25 69 183 587 694 710 766 424 571 435 223 48 0 0 0 0 0 0 0 0 0 0 0 0 0 218 415 605 741 806 816 748 615 445 235 43 0 0 0 0 0 0 0 0 0 0 0 0 0 223 404 611 732 809 816 779 634 435 236 43 0 0 0 0 0 0 0 0 0 0 0 0 0 213 210 355 460 382 369 468 391 354 199 43 0 0 0 0 0 0 0 0 0 0 0 0 0 210 284 275 490 382 554 294 262 126 67 16 0 0 0 0 0 0 0 0 0 0 0 0 0 67 76 530 447 696 600 300 162 347 72 34 0 0 0 0 0 0 0 0 0 0 0 0 17 193 405 590 702 783 802 727 598 428 205 33 0 0 0 0 0 0 0 0 0 0 0 0 19 210 411 574 703 784 737 662 280 376 153 26 0 0 0 0 0 0 0 0 0 0 0 0 18 198 393 593 704 768 756 711 587 407 198 26 0 0 0 0 0 0 0 0 0 0 0 0 6 104 292 527 484 688 565 248 271 232 127 10 0 0 0 0 0 0 0 0 0 0 0 0 3 51 159 356 519 275 302 176 111 84 89 17 0 0 0 0 0 0 0 0 0 0 0 0 4 78 159 104 132 145 148 292 551 244 166 14 0 0 0 0 0 0 0 0 0 0 0 0 6 114 221 422 469 476 646 616 531 250 121 15 0 0 0 0 0 0 0 0 0 0 0 0 4 97 137 111 168 172 155 129 104 355 39 7 0 0 0 0 0 0 0 0 0 0 0 0 10 178 375 564 678 746 745 675 546 389 178 13 0 0 0 0 0 0 0 0 0 0 0 0 9 179 375 546 681 748 735 681 541 369 104 9 0 0 0 0 0 0 0 0 0 0 0 0 3 108 238 521 664 383 439 657 347 178 76 4 0 0 0 0 0 0 0 0 0 0 0 0 1 43 68 104 124 137 140 123 103 65 51 3 0 0 0 0 0 0 0 0 0 0 0 0 6 165 362 535 655 712 680 648 511 358 149 6 0 0 0 0 0 0 0 0 0 0 0 0 5 170 355 425 503 395 305 263 177 323 137 1 0 0 0 0 0 0 0 0 0 0 0 0 0 53 92 96 138 137 133 154 177 70 46 1 0 0 0 0 0 0 0 0 0 0 0 0 0 64 182 509 610 699 718 653 513 336 136 0 0 0 0 0 0 0 0 0 0 0 0 0 0 161 348 511 642 728 721 644 520 330 135 0 0 0 0 0 0 0 0 0 0 0 0 0 0 152 349 492 634 713 721 554 288 322 130 0 0 0 0 0 0 0 0 0 0 0 0 0 0 158 342 500 508 252 610 381 337 323 129 0 0 0 0 0 0 0 0 0 0 0 0 0 0 137 335 506 641 693 668 621 483 304 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 139 336 491 624 684 667 589 487 319 120 0 0 0 0 0 0 0 0 0 0 0 0 0 0 141 323 483 614 669 663 626 477 291 111 0 0 0 0 0 0 0 0 0 0 0 0 0 0 130 313 473 586 668 666 608 449 300 111 0 0 0 0 0 0 0 0 0 0 0 0 0 0 126 309 455 600 682 657 592 464 280 97 0 0 0 0 0 0 0 0 0 0 0 0 0 0 107 302 469 590 665 650 583 431 283 106 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 302 456 597 636 640 578 458 283 102 0 0 0 0 0 0 0 0 0 0 0 0 0 0 90 276 446 563 641 613 367 264 177 43 0 0 0 0 0 0 0 0 0 0 0 0 0 0 34 171 162 244 59 72 148 119 76 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 62 237 493 607 613 440 432 205 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 71 182 293 398 495 541 407 203 68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80 246 418 545 607 600 545 425 250 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 42 152 233 349 278 335 309 214 111 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 74 114 172 368 584 441 280 248 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 67 138 121 203 216 202 131 60 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 122 149 275 201 563 525 355 220 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 74 264 438 563 626 611 547 391 130 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 75 258 421 539 603 566 519 402 224 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 69 236 411 545 616 614 541 408 232 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 57 222 383 505 567 564 462 372 210 51 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30 102 159 431 568 555 457 244 121 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43 166 297 353 224 210 196 100 77 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 47 267 431 620 613 552 375 246 56 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 244 417 539 604 610 531 385 175 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 206 159 380 527 571 516 399 143 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 167 228 296 285 417 521 385 219 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49 235 335 462 519 561 434 323 163 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 51 228 400 527 589 587 518 392 220 47 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 58 103 230 167 140 79 36 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 184 207 344 275 229 188 237 149 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49 218 390 517 589 587 508 308 99 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 173 266 492 542 551 399 162 102 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 71 160 270 319 248 253 209 130 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 75 141 138 260 240 121 87 124 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 36 84 87 90 74 134 100 70 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 83 160 341 508 451 333 363 210 38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 195 340 497 556 557 504 385 209 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 115 182 256 320 319 264 207 84 26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 74 130 167 286 174 160 122 134 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 113 338 421 500 520 375 263 163 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36 180 279 479 512 561 507 370 220 53 0 0 0 0 0 0 0 0 0 0 0 0 0 0 27 113 312 477 565 451 448 340 208 53 0 0 0 0 0 0 0 0 0 0 0 0 0 0 34 174 348 482 549 556 498 380 211 51 0 0 0 0 0 0 0 0 0 0 0 0 0 0 33 177 308 443 224 209 446 252 173 46 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 71 115 142 275 168 146 129 67 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 108 210 295 308 292 292 321 133 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 73 192 331 375 469 358 346 90 38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 55 98 138 186 161 165 114 76 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 54 154 148 162 165 146 203 105 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 176 348 484 560 567 512 397 234 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 164 339 471 547 558 503 364 199 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 107 267 407 500 511 469 359 204 53 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 118 269 422 514 380 432 230 165 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 77 158 324 203 258 215 275 82 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 86 122 343 163 225 174 117 66 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 151 321 456 533 546 493 383 206 56 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 140 305 435 517 532 441 330 196 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 139 302 440 519 503 481 363 198 51 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 146 316 428 515 547 460 358 229 58 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 60 144 115 300 228 205 172 126 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 54 98 146 173 190 171 213 81 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 80 158 231 279 285 262 190 187 42 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 137 292 327 242 270 235 249 124 46 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 77 188 290 277 361 316 275 177 54 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 139 312 448 530 549 503 396 237 66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 147 319 459 542 561 512 403 247 72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 150 323 461 547 532 485 221 184 56 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 150 321 463 548 570 525 414 231 71 0 0 0 0 0 0 0 ================================================ FILE: src/pymgrid/data/pv/SanFrancisco_724940TYA.csv ================================================ GH illum (lx) 0 0 0 0 0 0 0 5 126 287 403 442 442 418 358 208 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 117 278 367 468 487 393 328 205 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 113 257 369 402 441 408 298 176 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 99 172 265 427 382 423 246 171 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 105 215 387 448 500 478 364 223 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 116 266 314 268 467 421 348 234 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 55 118 230 105 226 353 253 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 125 292 422 506 529 438 379 211 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 121 266 392 469 519 412 348 154 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 121 264 363 430 460 418 376 224 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 109 205 403 508 412 491 374 253 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 118 278 426 512 541 456 365 110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 56 94 120 304 464 416 331 261 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 69 163 276 398 405 445 196 266 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 60 289 78 267 232 312 168 108 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 56 211 284 237 167 96 89 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 77 120 155 317 186 155 167 146 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 26 58 85 131 340 141 167 239 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 33 140 178 237 199 96 190 56 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 30 58 85 99 105 97 97 124 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 128 261 212 440 344 476 299 171 92 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 91 199 213 200 259 191 255 133 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 35 74 133 169 112 507 307 300 135 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 153 313 448 502 571 521 411 301 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 95 152 393 220 234 513 87 296 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 44 70 191 201 267 496 421 306 121 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 155 339 472 563 591 496 405 306 134 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 157 312 437 499 545 561 466 313 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 165 338 448 516 525 560 464 320 146 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 118 277 354 367 306 316 211 181 140 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 135 164 128 215 497 502 408 324 168 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 122 339 473 586 620 576 466 305 127 17 0 0 0 0 0 0 0 0 0 0 0 0 0 32 130 320 488 548 582 509 437 278 112 18 0 0 0 0 0 0 0 0 0 0 0 0 0 28 129 326 469 560 370 547 410 303 118 18 0 0 0 0 0 0 0 0 0 0 0 0 0 30 162 304 394 410 406 347 249 162 70 15 0 0 0 0 0 0 0 0 0 0 0 0 0 33 165 316 434 452 436 309 258 162 104 19 0 0 0 0 0 0 0 0 0 0 0 0 0 24 95 143 289 523 578 559 436 317 137 25 0 0 0 0 0 0 0 0 0 0 0 0 0 12 81 158 208 303 266 259 249 168 91 21 0 0 0 0 0 0 0 0 0 0 0 0 0 30 117 137 331 184 133 303 285 249 97 25 0 0 0 0 0 0 0 0 0 0 0 0 0 35 157 310 438 413 284 372 339 250 111 25 0 0 0 0 0 0 0 0 0 0 0 0 0 22 75 126 433 541 613 467 486 315 144 25 0 0 0 0 0 0 0 0 0 0 0 0 0 25 119 178 345 522 593 577 470 323 149 27 0 0 0 0 0 0 0 0 0 0 0 0 0 18 91 228 335 537 595 562 465 340 154 27 0 0 0 0 0 0 0 0 0 0 0 0 0 30 121 168 317 482 575 392 431 273 112 25 0 0 0 0 0 0 0 0 0 0 0 0 0 44 207 406 559 664 689 645 536 368 180 31 0 0 0 0 0 0 0 0 0 0 0 0 0 49 201 392 529 610 642 616 512 363 181 37 0 0 0 0 0 0 0 0 0 0 0 0 0 35 180 373 484 602 589 502 477 231 112 25 0 0 0 0 0 0 0 0 0 0 0 0 0 34 121 252 394 467 567 576 445 302 142 29 0 0 0 0 0 0 0 0 0 0 0 0 0 61 234 430 556 691 705 675 573 413 216 41 0 0 0 0 0 0 0 0 0 0 0 0 0 21 102 171 398 477 523 600 512 399 190 40 0 0 0 0 0 0 0 0 0 0 0 0 0 23 123 192 270 244 200 324 249 104 94 26 0 0 0 0 0 0 0 0 0 0 0 0 0 44 124 137 299 377 227 441 399 245 130 24 0 0 0 0 0 0 0 0 0 0 0 0 0 67 233 427 581 496 751 537 508 283 107 37 0 0 0 0 0 0 0 0 0 0 0 0 0 61 162 286 392 516 544 625 544 386 189 45 0 0 0 0 0 0 0 0 0 0 0 0 0 74 254 383 567 533 396 473 353 279 160 49 0 0 0 0 0 0 0 0 0 0 0 0 0 74 259 456 609 719 747 684 558 395 183 41 0 0 0 0 0 0 0 0 0 0 0 0 0 89 294 488 608 589 659 561 514 403 196 48 0 0 0 0 0 0 0 0 0 0 0 0 0 85 273 447 621 745 743 674 540 355 215 48 0 0 0 0 0 0 0 0 0 0 0 0 0 67 193 183 453 458 684 600 547 426 225 58 0 0 0 0 0 0 0 0 0 0 0 0 0 28 63 108 251 733 728 708 597 400 192 65 0 0 0 0 0 0 0 0 0 0 0 0 0 93 262 440 525 711 735 688 578 393 196 58 0 0 0 0 0 0 0 0 0 0 0 0 0 103 179 313 553 635 739 661 442 430 193 48 0 0 0 0 0 0 0 0 0 0 0 0 0 38 79 314 425 671 674 629 270 329 118 43 0 0 0 0 0 0 0 0 0 0 0 0 0 61 218 164 214 420 252 502 424 358 202 43 0 0 0 0 0 0 0 0 0 0 0 0 0 114 260 498 652 694 755 735 636 471 261 74 0 0 0 0 0 0 0 0 0 0 0 0 7 131 343 537 698 794 786 728 604 461 253 74 0 0 0 0 0 0 0 0 0 0 0 0 6 100 206 488 657 732 758 709 583 388 206 60 0 0 0 0 0 0 0 0 0 0 0 0 5 64 107 172 399 685 574 576 542 273 244 72 0 0 0 0 0 0 0 0 0 0 0 0 5 39 96 150 226 256 265 249 213 157 77 50 0 0 0 0 0 0 0 0 0 0 0 0 9 111 300 501 667 739 766 687 589 412 223 67 0 0 0 0 0 0 0 0 0 0 0 0 13 154 369 579 743 821 841 773 645 512 291 83 0 0 0 0 0 0 0 0 0 0 0 0 14 155 372 577 694 751 656 707 682 495 290 81 0 0 0 0 0 0 0 0 0 0 0 0 13 135 330 516 657 753 594 717 617 468 221 74 0 0 0 0 0 0 0 0 0 0 0 0 21 118 352 534 679 773 541 579 390 291 267 58 0 0 0 0 0 0 0 0 0 0 0 0 15 95 223 160 481 500 396 555 578 307 237 87 0 0 0 0 0 0 0 0 0 0 0 0 18 160 354 557 680 815 783 725 626 266 117 59 0 0 0 0 0 0 0 0 0 0 0 0 19 147 227 432 359 532 430 598 532 484 322 99 0 0 0 0 0 0 0 0 0 0 0 0 22 177 401 598 730 683 828 754 699 518 311 100 0 0 0 0 0 0 0 0 0 0 0 0 28 200 421 630 762 848 868 813 695 545 324 111 0 0 0 0 0 0 0 0 0 0 0 0 16 65 122 423 414 753 778 745 657 452 200 65 0 0 0 0 0 0 0 0 0 0 0 0 31 155 294 498 563 448 689 764 454 536 300 104 0 0 0 0 0 0 0 0 0 0 0 0 27 76 157 238 299 335 711 509 274 248 116 59 0 0 0 0 0 0 0 0 0 0 0 0 27 93 303 295 298 335 279 261 273 163 95 50 0 0 0 0 0 0 0 0 0 0 0 0 37 183 285 555 632 703 848 418 374 425 311 102 0 0 0 0 0 0 0 0 0 0 0 0 31 176 346 525 733 826 845 789 688 499 282 97 5 0 0 0 0 0 0 0 0 0 0 0 21 66 112 636 763 857 876 819 692 508 304 104 5 0 0 0 0 0 0 0 0 0 0 0 48 220 386 438 623 786 866 816 656 502 343 131 8 0 0 0 0 0 0 0 0 0 0 0 41 187 316 552 632 445 614 559 292 180 111 43 6 0 0 0 0 0 0 0 0 0 0 0 53 249 478 664 807 745 799 840 692 576 354 131 9 0 0 0 0 0 0 0 0 0 0 0 53 243 473 662 818 903 867 791 729 499 312 126 8 0 0 0 0 0 0 0 0 0 0 0 55 243 460 641 803 872 904 849 730 486 397 186 0 0 0 0 0 0 0 0 0 0 0 0 64 271 478 664 827 924 856 880 738 565 393 182 5 0 0 0 0 0 0 0 0 0 0 0 47 264 461 640 745 845 818 809 730 346 273 199 4 0 0 0 0 0 0 0 0 0 0 0 30 89 147 211 332 766 860 789 672 443 247 162 3 0 0 0 0 0 0 0 0 0 0 0 33 98 228 373 406 534 447 422 388 376 237 208 6 0 0 0 0 0 0 0 0 0 0 0 32 139 322 420 590 900 844 801 683 458 409 193 8 0 0 0 0 0 0 0 0 0 0 0 43 262 495 656 693 899 939 821 586 305 264 169 7 0 0 0 0 0 0 0 0 0 0 0 30 100 148 290 272 365 296 313 272 473 253 166 7 0 0 0 0 0 0 0 0 0 0 0 28 133 262 529 815 898 955 911 773 622 406 198 11 0 0 0 0 0 0 0 0 0 0 0 84 259 528 721 831 697 548 684 615 618 378 213 12 0 0 0 0 0 0 0 0 0 0 0 83 275 304 489 399 489 687 651 718 398 284 182 11 0 0 0 0 0 0 0 0 0 0 0 73 310 184 453 617 897 573 404 271 260 218 143 7 0 0 0 0 0 0 0 0 0 0 0 44 288 541 682 488 871 977 840 743 502 309 224 15 0 0 0 0 0 0 0 0 0 0 0 115 335 540 701 691 904 931 917 795 635 415 211 18 0 0 0 0 0 0 0 0 0 0 0 49 156 374 563 568 610 414 710 442 389 146 121 7 0 0 0 0 0 0 0 0 0 0 0 60 95 130 568 250 186 185 191 189 132 145 163 12 0 0 0 0 0 0 0 0 0 0 0 44 172 548 742 868 942 993 940 814 636 441 216 21 0 0 0 0 0 0 0 0 0 0 0 136 355 566 749 902 966 1001 900 764 600 427 227 23 0 0 0 0 0 0 0 0 0 0 0 111 323 526 771 888 992 959 946 810 641 431 224 24 0 0 0 0 0 0 0 0 0 0 0 142 362 559 767 896 972 981 948 809 642 447 165 16 0 0 0 0 0 0 0 0 0 0 1 61 126 264 344 503 542 548 520 278 220 153 139 13 0 0 0 0 0 0 0 0 0 0 3 47 113 154 520 810 932 980 954 830 656 423 229 28 0 0 0 0 0 0 0 0 0 0 7 154 351 576 734 873 911 921 925 757 613 411 253 30 0 0 0 0 0 0 0 0 0 0 8 160 383 603 780 860 930 929 955 725 530 399 251 31 0 0 0 0 0 0 0 0 0 0 8 95 348 283 451 516 747 527 469 330 351 186 168 21 0 0 0 0 0 0 0 0 0 0 11 163 364 567 717 854 937 937 943 832 659 456 254 37 0 0 0 0 0 0 0 0 0 0 5 119 164 246 370 492 270 464 470 402 408 333 262 36 0 0 0 0 0 0 0 0 0 0 12 173 397 608 781 915 1020 920 875 779 587 445 261 40 0 0 0 0 0 0 0 0 0 0 15 179 402 587 786 912 1021 924 929 794 635 433 258 41 0 0 0 0 0 0 0 0 0 0 15 179 404 609 795 934 1023 938 972 823 647 455 250 39 0 0 0 0 0 0 0 0 0 0 20 143 340 555 717 877 940 946 906 776 619 395 185 37 0 0 0 0 0 0 0 0 0 0 21 141 389 594 754 881 939 988 929 803 645 422 212 41 0 0 0 0 0 0 0 0 0 0 27 185 408 636 782 885 810 995 954 803 672 441 205 49 0 0 0 0 0 0 0 0 0 0 25 183 410 612 813 949 968 1018 972 842 622 431 221 44 0 0 0 0 0 0 0 0 0 0 28 112 303 570 679 726 829 939 870 762 508 374 149 39 0 0 0 0 0 0 0 0 0 0 25 128 332 578 729 890 936 849 853 674 520 325 171 39 0 0 0 0 0 0 0 0 0 0 27 199 393 624 747 898 960 947 913 838 565 393 220 53 0 0 0 0 0 0 0 0 0 0 28 71 209 512 652 497 932 840 893 779 692 412 229 52 0 0 0 0 0 0 0 0 0 0 34 123 424 649 825 941 1021 1027 970 856 689 494 259 63 0 0 0 0 0 0 0 0 0 0 28 142 350 567 735 901 986 992 871 798 636 413 200 47 0 0 0 0 0 0 0 0 0 0 30 156 193 539 748 656 862 952 871 798 631 396 221 54 0 0 0 0 0 0 0 0 0 0 34 188 398 620 812 921 996 1003 900 824 628 436 234 51 0 0 0 0 0 0 0 0 0 0 43 195 320 491 692 811 930 813 919 676 570 355 158 69 0 0 0 0 0 0 0 0 0 0 23 67 130 201 262 575 594 332 262 328 214 144 75 34 0 0 0 0 0 0 0 0 0 0 25 87 148 204 266 313 338 340 320 278 218 160 100 39 0 0 0 0 0 0 0 0 0 0 26 85 141 202 264 687 535 338 317 276 255 152 96 39 0 0 0 0 0 0 0 0 0 0 23 69 139 209 268 310 333 336 316 278 221 153 82 31 0 0 0 0 0 0 0 0 0 0 25 66 136 206 453 589 725 644 751 593 509 369 190 51 0 0 0 0 0 0 0 0 0 0 36 191 415 599 775 912 972 974 836 814 612 424 246 67 0 0 0 0 0 0 0 0 0 0 43 180 382 548 766 877 945 930 891 800 634 369 171 55 0 0 0 0 0 0 0 0 0 0 25 69 138 208 267 779 774 336 894 559 375 153 82 61 0 0 0 0 0 0 0 0 0 0 35 160 398 589 790 872 972 978 934 596 634 457 266 80 0 0 0 0 0 0 0 0 0 0 53 239 460 683 834 959 1025 1033 979 867 705 511 282 87 0 0 0 0 0 0 0 0 0 0 43 188 395 619 789 896 1000 1007 943 793 660 442 231 68 0 0 0 0 0 0 0 0 0 0 48 217 388 603 806 942 1004 1027 965 872 691 417 247 73 0 0 0 0 0 0 0 0 0 0 48 111 224 536 666 655 570 541 321 283 228 161 90 33 0 0 0 0 0 0 0 0 0 0 48 203 420 607 787 919 940 1011 988 862 683 470 260 78 0 0 0 0 0 0 0 0 0 0 45 197 426 494 576 719 662 861 758 690 672 488 240 86 0 0 0 0 0 0 0 0 0 0 34 79 150 218 789 906 970 914 931 821 707 495 279 74 0 0 0 0 0 0 0 0 0 0 44 163 414 649 838 944 1020 1028 968 877 665 418 225 71 0 0 0 0 0 0 0 0 0 0 46 213 443 663 827 964 1040 1047 987 865 713 475 273 87 0 0 0 0 0 0 0 0 0 0 61 217 436 657 780 816 962 941 885 783 561 322 268 92 0 0 0 0 0 0 0 0 0 0 64 246 470 665 833 954 1021 1029 977 870 712 528 302 104 0 0 0 0 0 0 0 0 0 0 55 226 434 652 840 932 1009 1017 960 871 699 486 272 90 0 0 0 0 0 0 0 0 0 0 52 208 427 625 812 950 1028 1038 977 854 679 488 263 85 0 0 0 0 0 0 0 0 0 0 57 223 441 658 820 955 1032 1041 983 862 713 501 281 96 0 0 0 0 0 0 0 0 0 0 52 203 415 612 800 941 1018 1029 970 847 672 483 261 85 0 0 0 0 0 0 0 0 0 0 51 199 399 611 764 900 774 811 957 816 668 458 250 84 0 0 0 0 0 0 0 0 0 0 55 206 398 645 834 938 1015 1025 967 881 705 494 285 94 0 0 0 0 0 0 0 0 0 0 56 226 434 652 841 948 1025 1035 978 889 712 501 291 96 5 0 0 0 0 0 0 0 0 0 54 218 424 641 829 935 1049 1059 1001 878 676 468 283 94 5 0 0 0 0 0 0 0 0 0 59 230 451 670 834 972 1050 1060 1003 883 711 521 296 106 7 0 0 0 0 0 0 0 0 0 50 186 367 615 809 906 996 978 952 785 522 397 156 72 5 0 0 0 0 0 0 0 0 0 31 81 129 418 692 776 878 701 918 826 619 451 250 86 6 0 0 0 0 0 0 0 0 0 56 230 419 640 809 893 1006 1016 941 854 680 449 267 100 7 0 0 0 0 0 0 0 0 0 30 74 116 176 228 778 972 1007 908 815 650 423 177 80 6 0 0 0 0 0 0 0 0 0 25 63 122 349 230 267 287 290 276 245 234 169 191 52 5 0 0 0 0 0 0 0 0 0 43 212 386 616 732 941 1048 952 857 833 683 498 290 101 7 0 0 0 0 0 0 0 0 0 62 245 460 677 827 951 1021 1031 983 877 748 539 324 120 8 0 0 0 0 0 0 0 0 0 64 205 421 627 730 839 984 959 935 794 631 494 289 95 7 0 0 0 0 0 0 0 0 0 23 64 123 181 230 314 464 937 883 850 549 459 195 59 6 0 0 0 0 0 0 0 0 0 39 104 315 388 550 851 962 885 910 773 699 306 249 107 9 0 0 0 0 0 0 0 0 0 50 228 423 661 831 955 1024 1036 989 885 733 555 330 127 10 0 0 0 0 0 0 0 0 0 57 225 446 644 823 968 958 963 969 875 557 493 306 94 8 0 0 0 0 0 0 0 0 0 42 74 212 501 714 866 866 891 892 447 429 395 213 83 7 0 0 0 0 0 0 0 0 0 30 71 139 208 267 311 336 788 990 840 604 308 187 72 5 0 0 0 0 0 0 0 0 0 31 62 114 204 265 309 335 339 322 285 231 165 94 50 6 0 0 0 0 0 0 0 0 0 24 117 371 461 683 711 832 886 965 872 673 545 291 117 9 0 0 0 0 0 0 0 0 0 66 218 466 660 830 954 1025 1038 992 889 738 546 336 131 11 0 0 0 0 0 0 0 0 0 44 179 377 594 788 902 984 995 877 856 684 473 265 94 8 0 0 0 0 0 0 0 0 0 53 223 443 644 833 929 1000 1013 967 902 732 528 307 114 9 0 0 0 0 0 0 0 0 0 47 204 410 628 822 966 1050 1028 1014 895 720 511 300 106 15 0 0 0 0 0 0 0 0 0 49 210 428 646 814 953 1034 1051 996 880 736 516 289 102 9 0 0 0 0 0 0 0 0 0 28 118 197 281 550 763 695 399 825 599 502 326 197 66 16 0 0 0 0 0 0 0 0 0 38 179 292 528 806 879 962 1030 965 864 695 510 272 90 11 0 0 0 0 0 0 0 0 0 49 229 390 646 793 892 1000 1017 974 875 686 548 314 122 18 0 0 0 0 0 0 0 0 0 41 197 427 639 826 964 1047 1069 1014 896 725 484 280 96 10 0 0 0 0 0 0 0 0 0 25 87 195 385 342 657 783 935 887 781 613 382 223 33 17 0 0 0 0 0 0 0 0 0 17 65 238 378 631 838 960 993 959 823 689 521 314 114 16 0 0 0 0 0 0 0 0 0 38 102 250 436 528 779 744 873 970 870 723 546 324 123 16 0 0 0 0 0 0 0 0 0 45 224 442 664 818 948 1023 1037 993 888 736 554 327 123 16 0 0 0 0 0 0 0 0 0 28 122 226 286 517 782 847 926 875 784 615 452 198 66 11 0 0 0 0 0 0 0 0 0 24 119 330 541 756 882 1049 1055 1006 890 723 535 310 113 16 0 0 0 0 0 0 0 0 0 41 204 424 631 822 923 998 1013 968 905 734 525 314 112 15 0 0 0 0 0 0 0 0 0 33 172 393 608 800 914 1003 1023 967 886 717 508 297 100 13 0 0 0 0 0 0 0 0 0 29 78 266 467 652 824 959 945 931 846 608 427 223 55 11 0 0 0 0 0 0 0 0 0 30 151 278 307 305 716 997 876 942 818 649 484 264 62 7 0 0 0 0 0 0 0 0 0 30 120 167 323 297 548 894 735 905 827 647 489 280 98 0 0 0 0 0 0 0 0 0 0 20 56 161 305 271 383 637 555 631 560 498 353 209 74 0 0 0 0 0 0 0 0 0 0 21 56 215 230 446 870 955 1037 985 873 705 494 283 93 0 0 0 0 0 0 0 0 0 0 20 63 273 535 745 860 929 1007 972 853 714 531 309 110 0 0 0 0 0 0 0 0 0 0 39 202 420 644 802 932 1008 1023 979 875 720 538 311 109 0 0 0 0 0 0 0 0 0 0 38 199 416 641 801 934 1010 1026 984 881 725 533 293 100 0 0 0 0 0 0 0 0 0 0 27 153 322 474 772 882 926 951 903 857 726 511 303 101 0 0 0 0 0 0 0 0 0 0 25 76 336 573 792 922 996 1011 972 867 716 528 285 97 0 0 0 0 0 0 0 0 0 0 35 195 416 623 796 933 1010 1026 981 879 725 531 313 107 0 0 0 0 0 0 0 0 0 0 24 100 241 542 776 935 932 984 933 857 686 505 263 87 0 0 0 0 0 0 0 0 0 0 24 144 351 541 762 906 946 953 907 823 641 461 253 80 0 0 0 0 0 0 0 0 0 0 26 113 167 456 308 352 777 929 881 838 672 478 201 91 0 0 0 0 0 0 0 0 0 0 20 59 249 515 742 850 856 953 935 792 593 440 228 65 0 0 0 0 0 0 0 0 0 0 27 152 328 576 641 844 882 1003 947 794 660 478 258 78 0 0 0 0 0 0 0 0 0 0 21 66 171 253 341 377 470 473 430 608 391 276 95 25 0 0 0 0 0 0 0 0 0 0 21 59 156 376 648 703 828 910 837 721 564 419 260 75 0 0 0 0 0 0 0 0 0 0 26 141 346 551 746 898 988 1009 954 837 664 470 243 71 0 0 0 0 0 0 0 0 0 0 28 173 391 618 782 916 993 1011 964 860 703 514 282 84 0 0 0 0 0 0 0 0 0 0 27 133 334 594 777 909 979 998 952 855 698 513 283 84 0 0 0 0 0 0 0 0 0 0 28 169 350 573 755 908 983 990 951 796 635 385 198 51 0 0 0 0 0 0 0 0 0 0 22 147 370 592 757 891 973 984 938 836 700 371 198 67 0 0 0 0 0 0 0 0 0 0 17 133 342 547 711 815 942 974 940 831 653 409 222 58 0 0 0 0 0 0 0 0 0 0 16 102 290 529 732 854 943 965 909 775 610 393 210 46 0 0 0 0 0 0 0 0 0 0 23 144 315 511 585 804 790 709 630 816 634 470 250 66 0 0 0 0 0 0 0 0 0 0 16 117 329 556 729 885 975 974 930 821 668 452 240 57 0 0 0 0 0 0 0 0 0 0 24 140 306 580 765 898 977 996 946 836 682 482 262 66 0 0 0 0 0 0 0 0 0 0 19 128 327 544 750 895 947 970 919 826 653 438 227 51 0 0 0 0 0 0 0 0 0 0 11 74 156 378 707 893 949 961 908 823 649 433 222 49 0 0 0 0 0 0 0 0 0 0 11 65 156 261 494 483 879 908 850 776 647 433 195 40 0 0 0 0 0 0 0 0 0 0 10 86 144 155 252 370 529 684 682 757 486 208 131 41 0 0 0 0 0 0 0 0 0 0 12 42 106 223 356 408 652 761 606 634 510 283 192 34 0 0 0 0 0 0 0 0 0 0 13 49 121 223 348 358 434 679 824 766 610 446 216 49 0 0 0 0 0 0 0 0 0 0 16 121 324 548 747 871 960 975 871 739 598 422 204 42 0 0 0 0 0 0 0 0 0 0 13 98 242 486 560 458 680 628 854 781 623 236 123 25 0 0 0 0 0 0 0 0 0 0 14 92 300 552 691 881 954 976 925 812 648 452 222 46 0 0 0 0 0 0 0 0 0 0 10 96 295 485 673 757 898 859 865 732 622 407 199 39 0 0 0 0 0 0 0 0 0 0 11 24 133 488 750 864 946 958 905 740 435 374 160 39 0 0 0 0 0 0 0 0 0 0 13 55 116 536 689 778 912 821 800 725 479 299 142 17 0 0 0 0 0 0 0 0 0 0 0 81 256 457 630 804 860 867 845 733 558 350 151 25 0 0 0 0 0 0 0 0 0 0 0 58 131 229 317 519 709 881 756 655 568 368 166 32 0 0 0 0 0 0 0 0 0 0 0 45 140 375 508 760 881 903 912 781 603 403 180 34 0 0 0 0 0 0 0 0 0 0 0 70 220 453 682 805 875 903 856 726 566 347 146 29 0 0 0 0 0 0 0 0 0 0 0 101 258 462 727 882 928 939 887 795 609 402 175 31 0 0 0 0 0 0 0 0 0 0 0 83 247 404 602 701 390 602 252 333 164 180 68 21 0 0 0 0 0 0 0 0 0 0 0 82 263 367 599 737 816 684 686 547 492 275 126 19 0 0 0 0 0 0 0 0 0 0 0 91 275 482 704 821 819 885 838 754 553 326 137 27 0 0 0 0 0 0 0 0 0 0 0 70 234 456 646 786 879 860 836 734 549 345 134 13 0 0 0 0 0 0 0 0 0 0 0 83 233 441 667 728 861 879 766 746 582 360 142 14 0 0 0 0 0 0 0 0 0 0 0 81 283 494 694 844 928 904 874 742 556 336 132 11 0 0 0 0 0 0 0 0 0 0 0 88 286 511 690 836 918 929 866 737 571 350 139 11 0 0 0 0 0 0 0 0 0 0 0 73 204 282 512 742 844 861 804 696 510 330 118 8 0 0 0 0 0 0 0 0 0 0 0 71 233 448 659 807 892 901 837 704 536 311 111 7 0 0 0 0 0 0 0 0 0 0 0 28 80 416 598 767 661 817 781 693 501 300 131 8 0 0 0 0 0 0 0 0 0 0 0 43 169 280 660 828 904 912 854 734 575 333 91 5 0 0 0 0 0 0 0 0 0 0 0 81 276 472 663 777 830 849 793 645 546 333 126 0 0 0 0 0 0 0 0 0 0 0 0 76 281 501 639 806 890 897 839 717 553 331 119 0 0 0 0 0 0 0 0 0 0 0 0 78 280 449 598 829 878 877 818 682 439 325 110 0 0 0 0 0 0 0 0 0 0 0 0 51 195 310 663 821 901 909 842 707 535 311 105 0 0 0 0 0 0 0 0 0 0 0 0 57 165 168 227 783 881 887 820 683 494 287 88 0 0 0 0 0 0 0 0 0 0 0 0 42 261 440 665 809 888 895 827 692 520 296 94 0 0 0 0 0 0 0 0 0 0 0 0 60 246 454 651 797 878 884 814 677 486 280 82 0 0 0 0 0 0 0 0 0 0 0 0 69 270 487 644 711 766 771 784 504 463 244 65 0 0 0 0 0 0 0 0 0 0 0 0 51 238 439 514 731 869 873 805 670 498 277 80 0 0 0 0 0 0 0 0 0 0 0 0 26 203 299 594 543 711 798 722 444 357 120 64 0 0 0 0 0 0 0 0 0 0 0 0 54 169 446 661 792 861 864 755 643 484 235 80 0 0 0 0 0 0 0 0 0 0 0 0 21 72 133 592 760 850 853 790 684 493 273 74 0 0 0 0 0 0 0 0 0 0 0 0 20 66 315 524 734 837 812 752 648 475 255 49 0 0 0 0 0 0 0 0 0 0 0 0 41 145 342 634 752 817 736 672 603 411 213 50 0 0 0 0 0 0 0 0 0 0 0 0 32 86 184 211 522 710 559 609 462 251 106 37 0 0 0 0 0 0 0 0 0 0 0 0 52 234 441 637 778 842 808 736 557 424 142 59 0 0 0 0 0 0 0 0 0 0 0 0 24 71 115 168 208 827 799 726 589 415 203 44 0 0 0 0 0 0 0 0 0 0 0 0 17 53 104 248 763 837 838 765 626 450 231 45 0 0 0 0 0 0 0 0 0 0 0 0 18 67 149 451 619 757 688 656 560 274 194 47 0 0 0 0 0 0 0 0 0 0 0 0 29 161 248 343 399 766 613 610 572 376 210 38 0 0 0 0 0 0 0 0 0 0 0 0 38 146 330 610 727 799 799 727 608 417 204 37 0 0 0 0 0 0 0 0 0 0 0 0 42 222 413 578 745 775 802 760 619 428 219 40 0 0 0 0 0 0 0 0 0 0 0 0 11 39 77 112 154 169 211 219 199 183 121 14 0 0 0 0 0 0 0 0 0 0 0 0 13 141 239 311 686 795 824 729 583 392 240 27 0 0 0 0 0 0 0 0 0 0 0 0 33 214 422 599 687 731 782 733 628 443 241 28 0 0 0 0 0 0 0 0 0 0 0 0 32 213 407 571 665 710 704 651 573 414 233 24 0 0 0 0 0 0 0 0 0 0 0 0 29 208 408 572 659 760 762 689 555 385 217 19 0 0 0 0 0 0 0 0 0 0 0 0 27 172 367 340 615 634 762 706 565 378 218 20 0 0 0 0 0 0 0 0 0 0 0 0 14 95 217 217 386 587 473 433 312 374 122 7 0 0 0 0 0 0 0 0 0 0 0 0 10 125 217 200 469 471 724 643 557 400 213 15 0 0 0 0 0 0 0 0 0 0 0 0 23 193 394 572 708 772 732 656 507 397 212 12 0 0 0 0 0 0 0 0 0 0 0 0 22 178 382 531 642 690 687 632 512 358 202 9 0 0 0 0 0 0 0 0 0 0 0 0 17 155 384 539 637 685 765 688 532 357 191 8 0 0 0 0 0 0 0 0 0 0 0 0 6 65 308 227 398 335 695 633 512 155 107 3 0 0 0 0 0 0 0 0 0 0 0 0 8 84 163 204 221 306 679 627 374 326 204 5 0 0 0 0 0 0 0 0 0 0 0 0 15 171 353 528 622 662 726 667 515 369 180 5 0 0 0 0 0 0 0 0 0 0 0 0 15 165 349 527 607 671 734 652 537 363 169 0 0 0 0 0 0 0 0 0 0 0 0 0 12 169 352 548 651 696 720 652 472 355 156 0 0 0 0 0 0 0 0 0 0 0 0 0 11 163 364 535 658 728 725 637 532 359 162 0 0 0 0 0 0 0 0 0 0 0 0 0 6 84 206 285 392 406 568 632 473 195 154 0 0 0 0 0 0 0 0 0 0 0 0 0 9 157 354 525 645 712 685 611 457 325 121 0 0 0 0 0 0 0 0 0 0 0 0 0 6 148 336 484 582 608 591 564 452 316 148 0 0 0 0 0 0 0 0 0 0 0 0 0 6 142 299 448 549 579 585 478 412 274 150 0 0 0 0 0 0 0 0 0 0 0 0 0 1 52 109 155 256 460 400 435 486 286 112 0 0 0 0 0 0 0 0 0 0 0 0 0 1 58 139 404 599 600 608 374 414 278 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 128 138 311 315 654 562 468 239 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 135 313 443 569 638 589 577 455 309 102 0 0 0 0 0 0 0 0 0 0 0 0 0 0 126 314 453 546 620 558 569 433 276 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 274 165 137 232 588 346 211 109 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 42 127 136 506 334 269 233 354 189 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 119 308 451 525 565 557 576 421 281 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 117 308 475 573 640 634 580 450 289 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 99 218 465 359 453 339 145 180 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 112 294 458 577 623 635 556 427 262 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 106 274 472 582 645 634 561 432 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 102 269 89 481 347 117 282 356 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 109 319 371 360 387 424 241 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 79 278 320 493 611 565 551 426 264 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 56 140 227 467 509 361 366 165 126 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 75 107 433 513 549 490 247 321 206 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 83 82 103 117 108 99 74 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 57 134 82 171 116 418 409 182 151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 49 154 153 311 305 396 336 212 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 128 132 122 215 267 253 158 142 26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 237 376 474 558 492 511 158 109 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 62 95 360 468 491 489 511 391 217 37 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 221 315 367 444 461 434 307 169 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43 152 202 330 372 360 411 230 175 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 34 102 200 380 428 460 376 192 148 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 213 371 471 476 493 483 343 211 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 180 362 461 513 473 362 197 159 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 52 221 380 488 543 465 486 360 202 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50 215 351 454 485 501 487 354 222 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 42 198 365 472 542 501 434 337 210 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 188 295 473 540 529 470 273 222 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 189 337 419 458 480 408 320 217 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 207 355 410 456 450 443 308 202 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 101 164 347 420 252 174 119 149 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 33 180 328 413 443 381 324 225 118 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36 108 337 429 509 441 408 318 183 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 33 170 324 397 513 445 465 351 207 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30 184 319 398 425 425 326 310 156 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 177 336 404 497 430 422 333 155 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 182 328 459 524 527 463 342 179 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 143 265 364 436 478 309 132 116 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 136 144 252 170 170 148 108 57 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 125 292 202 229 269 258 102 122 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 98 173 183 171 213 201 259 78 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 74 165 140 263 231 242 175 105 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 59 111 150 231 338 331 194 120 37 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 75 181 263 274 386 323 256 119 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 153 296 434 475 470 437 316 165 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 158 278 448 514 517 441 338 175 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 148 305 430 499 502 440 318 167 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 122 227 387 428 472 362 274 143 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 126 253 360 420 413 388 118 101 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 49 98 138 294 292 328 158 123 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 149 278 342 474 451 403 304 133 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 51 278 319 343 338 396 308 156 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 52 182 198 306 170 151 96 63 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 62 209 386 420 443 350 300 152 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 137 289 422 495 481 444 326 176 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 81 164 191 165 282 285 164 103 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 111 239 355 349 424 378 279 127 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 141 307 433 496 435 435 338 167 37 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 141 308 435 508 518 463 337 191 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 120 275 381 450 488 439 322 169 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 138 305 435 509 520 466 353 194 41 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 115 262 392 470 481 425 312 169 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 115 271 327 422 491 444 317 184 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 102 238 374 431 448 400 302 156 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 127 269 393 441 486 413 317 183 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 101 165 290 437 216 196 152 185 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 115 119 254 397 329 291 250 125 26 0 0 0 0 0 0 0 ================================================ FILE: src/pymgrid/data/pv/__init__.py ================================================ ================================================ FILE: src/pymgrid/data/scenario/__init__.py ================================================ ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_0/microgrid_0.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 1452 max_charge: 363 max_discharge: 363 min_capacity: 290.40000000000003 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 290.40000000000003 soc: 0.2 - - grid - !GridModule cls_params: cost_per_unit_co2: 0.1 final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 max_export: 1920 max_import: 1920 raise_errors: false time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz' name: - grid - 0 state: _current_step: 0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_1/microgrid_1.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 60363.0 running_min_production: 3353.5 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 91274 max_charge: 22819 max_discharge: 22819 min_capacity: 18254.8 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 18254.8 soc: 0.19999999999999998 - - grid - !GridModule cls_params: cost_per_unit_co2: 0.1 final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 max_export: 120726 max_import: 120726 raise_errors: false time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz' name: - grid - 0 state: _current_step: 0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_10/microgrid_10.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 60144.3 running_min_production: 3341.3500000000004 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 219201 max_charge: 54801 max_discharge: 54801 min_capacity: 43840.200000000004 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 43840.200000000004 soc: 0.2 - - grid - !GridModule cls_params: cost_per_unit_co2: 0.1 final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 max_export: 120288 max_import: 120288 raise_errors: false time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz' name: - grid - 0 state: _current_step: 0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_11/microgrid_11.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 1 initial_step: 0 max_capacity: 69594 max_charge: 17399 max_discharge: 17399 min_capacity: 13918.800000000001 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 69594 soc: 1.0 - - grid - !GridModule cls_params: cost_per_unit_co2: 0.1 final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 max_export: 55230 max_import: 55230 raise_errors: false time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz' name: - grid - 0 state: _current_step: 0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_12/microgrid_12.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 143726 max_charge: 35932 max_discharge: 35932 min_capacity: 28745.2 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 28745.2 soc: 0.2 - - grid - !GridModule cls_params: cost_per_unit_co2: 0.1 final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 max_export: 96428 max_import: 96428 raise_errors: false time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz' name: - grid - 0 state: _current_step: 0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_13/microgrid_13.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 19941.3 running_min_production: 1107.8500000000001 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 47556 max_charge: 11889 max_discharge: 11889 min_capacity: 9511.2 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 9511.2 soc: 0.2 - - grid - !GridModule cls_params: cost_per_unit_co2: 0.1 final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 max_export: 39882 max_import: 39882 raise_errors: false time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz' name: - grid - 0 state: _current_step: 0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_14/microgrid_14.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 162570 max_charge: 40643 max_discharge: 40643 min_capacity: 32514.0 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 32514.0 soc: 0.2 - - grid - !GridModule cls_params: cost_per_unit_co2: 0.1 final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 max_export: 197286 max_import: 197286 raise_errors: false time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz' name: - grid - 0 state: _current_step: 0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_15/microgrid_15.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 17296.2 running_min_production: 960.9000000000001 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 1 initial_step: 0 max_capacity: 26153 max_charge: 6539 max_discharge: 6539 min_capacity: 5230.6 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 26153 soc: 1.0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_16/microgrid_16.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.534118811938557 initial_step: 0 max_capacity: 60099 max_charge: 15025 max_discharge: 15025 min_capacity: 12019.800000000001 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 32100.00647869534 soc: 0.534118811938557 - - grid - !GridModule cls_params: cost_per_unit_co2: 0.1 final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 max_export: 97244 max_import: 97244 raise_errors: false time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz' name: - grid - 0 state: _current_step: 0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_17/microgrid_17.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 31257.0 running_min_production: 1736.5 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 38636 max_charge: 9659 max_discharge: 9659 min_capacity: 7727.200000000001 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 7727.200000000001 soc: 0.2 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_18/microgrid_18.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 34418.700000000004 running_min_production: 1912.15 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 1 initial_step: 0 max_capacity: 82080 max_charge: 20520 max_discharge: 20520 min_capacity: 16416.0 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 82080 soc: 1.0 - - grid - !GridModule cls_params: cost_per_unit_co2: 0.1 final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 max_export: 68836 max_import: 68836 raise_errors: false time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz' name: - grid - 0 state: _current_step: 0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_19/microgrid_19.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 1529.1000000000001 running_min_production: 84.95 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 2506 max_charge: 627 max_discharge: 627 min_capacity: 501.20000000000005 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 501.20000000000005 soc: 0.2 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_2/microgrid_2.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 43725.6 running_min_production: 2429.2000000000003 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 66116 max_charge: 16529 max_discharge: 16529 min_capacity: 13223.2 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 13223.2 soc: 0.2 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_20/microgrid_20.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 79186.5 running_min_production: 4399.25 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 129765 max_charge: 32442 max_discharge: 32442 min_capacity: 25953.0 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 25953.0 soc: 0.2 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_21/microgrid_21.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 95435.1 running_min_production: 5301.950000000001 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 170694 max_charge: 42674 max_discharge: 42674 min_capacity: 34138.8 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 34138.8 soc: 0.2 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_22/microgrid_22.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 80372.7 running_min_production: 4465.150000000001 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 292924 max_charge: 73231 max_discharge: 73231 min_capacity: 58584.8 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 58584.8 soc: 0.2 - - grid - !GridModule cls_params: cost_per_unit_co2: 0.1 final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 max_export: 160744 max_import: 160744 raise_errors: false time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz' name: - grid - 0 state: _current_step: 0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_23/microgrid_23.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 9453.6 running_min_production: 525.2 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 14294 max_charge: 3574 max_discharge: 3574 min_capacity: 2858.8 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 2858.8 soc: 0.2 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_24/microgrid_24.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 50157.0 running_min_production: 2786.5 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 103328 max_charge: 25832 max_discharge: 25832 min_capacity: 20665.600000000002 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 20665.600000000002 soc: 0.2 - - grid - !GridModule cls_params: cost_per_unit_co2: 0.1 final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 max_export: 100314 max_import: 100314 raise_errors: false time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz' name: - grid - 0 state: _current_step: 0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_3/microgrid_3.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 78147.0 running_min_production: 4341.5 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 102450 max_charge: 25613 max_discharge: 25613 min_capacity: 20490.0 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 20490.0 soc: 0.2 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_4/microgrid_4.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 65305 max_charge: 16327 max_discharge: 16327 min_capacity: 13061.0 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 13061.0 soc: 0.2 - - grid - !GridModule cls_params: cost_per_unit_co2: 0.1 final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 max_export: 99625 max_import: 99625 raise_errors: false time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz' name: - grid - 0 state: _current_step: 0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_5/microgrid_5.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 28560.600000000002 running_min_production: 1586.7 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 1 initial_step: 0 max_capacity: 57581 max_charge: 14396 max_discharge: 14396 min_capacity: 11516.2 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 57581 soc: 1.0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_6/microgrid_6.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.960305168086668 initial_step: 0 max_capacity: 179373 max_charge: 44844 max_discharge: 44844 min_capacity: 35874.6 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 172252.8189152099 soc: 0.960305168086668 - - grid - !GridModule cls_params: cost_per_unit_co2: 0.1 final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 max_export: 98432 max_import: 98432 raise_errors: false time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz' name: - grid - 0 state: _current_step: 0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_7/microgrid_7.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 11798.1 running_min_production: 655.45 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 1 initial_step: 0 max_capacity: 19334 max_charge: 4834 max_discharge: 4834 min_capacity: 3866.8 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 19334 soc: 1.0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_8/microgrid_8.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 64065.6 running_min_production: 3559.2000000000003 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.2 initial_step: 0 max_capacity: 105583 max_charge: 26396 max_discharge: 26396 min_capacity: 21116.600000000002 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 21116.600000000002 soc: 0.2 - - grid - !GridModule cls_params: cost_per_unit_co2: 0.1 final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 max_export: 128130 max_import: 128130 raise_errors: false time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz' name: - grid - 0 state: _current_step: 0 trajectory_func: null ================================================ FILE: src/pymgrid/data/scenario/pymgrid25/microgrid_9/microgrid_9.yaml ================================================ !Microgrid final_step: 8759 initial_step: 0 modules: - - load - !LoadModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 raise_errors: false time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz' name: - load - 0 state: _current_step: 0 - - pv - !RenewableModule cls_params: final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 provided_energy_name: renewable_used raise_errors: false time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz' name: - pv - 0 state: _current_step: 0 - - unbalanced_energy - !UnbalancedEnergyModule cls_params: initial_step: 0 loss_load_cost: 10 overgeneration_cost: 1 raise_errors: false name: - unbalanced_energy - 0 state: _current_step: 0 - - genset - !Genset cls_params: allow_abortion: true co2_per_unit: 2 cost_per_unit_co2: 0.1 genset_cost: 0.4 init_start_up: true initial_step: 0 provided_energy_name: genset_production raise_errors: false running_max_production: 98996.40000000001 running_min_production: 5499.8 start_up_time: 0 wind_down_time: 0 name: - genset - 0 state: _current_status: true _current_step: 0 _goal_status: true _steps_until_down: 0 _steps_until_up: 0 - - battery - !BatteryModule cls_params: battery_cost_cycle: 0.02 battery_transition_model: null efficiency: 0.9 init_charge: null init_soc: 0.5374787046064285 initial_step: 0 max_capacity: 199587 max_charge: 49897 max_discharge: 49897 min_capacity: 39917.4 raise_errors: false name: - battery - 0 state: _current_step: 0 current_charge: 107273.76221628326 soc: 0.5374787046064285 - - grid - !GridModule cls_params: cost_per_unit_co2: 0.1 final_step: 8759 forecast_horizon: 23 forecaster: oracle forecaster_increase_uncertainty: false forecaster_relative_noise: false initial_step: 0 max_export: 197992 max_import: 197992 raise_errors: false time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz' name: - grid - 0 state: _current_step: 0 trajectory_func: null ================================================ FILE: src/pymgrid/envs/__init__.py ================================================ from .discrete.discrete import DiscreteMicrogridEnv from .continuous.continuous import ContinuousMicrogridEnv ================================================ FILE: src/pymgrid/envs/base/__init__.py ================================================ from .base import BaseMicrogridEnv ================================================ FILE: src/pymgrid/envs/base/base.py ================================================ import pandas as pd from gym import Env from gym.spaces import Box, Dict, Tuple, flatten_space, flatten from abc import abstractmethod from pymgrid import NonModularMicrogrid, Microgrid from pymgrid.envs.base.skip_init import skip_init class BaseMicrogridEnv(Microgrid, Env): """ Base class for all microgrid environments. Implements the `OpenAI Gym API `_ for a microgrid; inherits from both :class:`.Microgrid` and :class:`gym.Env`. Parameters ---------- modules : list, Microgrid, NonModularMicrogrid, or int. The constructor can be called in three ways: 1. Passing a list of microgrid modules. This is identical to the :class:`.Microgrid` constructor. 2. Passing a :class:`.Microgrid` or :class:`.NonModularMicrogrid` instance. This will effectively wrap the microgrid instance with the Gym API. 3. Passing an integer in [0, 25). This will be result in loading the corresponding `pymgrid25` benchmark microgrids. add_unbalanced_module : bool, default True. Whether to add an unbalanced energy module to your microgrid. Such a module computes and attributes costs to any excess supply or demand. Set to True unless ``modules`` contains an :class:`.UnbalancedEnergyModule`. loss_load_cost : float, default 10.0 Cost per unit of unmet demand. Ignored if ``add_unbalanced_module=False``. overgeneration_cost : float, default 2.0 Cost per unit of excess generation. Ignored if ``add_unbalanced_module=False``. flat_spaces : bool, default True Whether the environment's spaces should be flat. If True, all continuous spaces are :class:`gym:gym.spaces.Box`. Otherwise, they are nested :class:`gym:gym.spaces.Dict` of :class:`gym:gym.spaces.Tuple` of :class:`gym:gym.spaces.Box`, corresponding to the structure of the ``control`` arg of :meth:`.Microgrid.run`. trajectory_func : callable or None, default None Callable that sets an initial and final step for an episode. ``trajectory_func`` must take two inputs: :attr:`.initial_step` and :attr:`.final_step`, and return two integers: the initial and final step for that particular episode, respectively. This function will be called every time :meth:`.reset` is called. If None, :attr:`.initial_step` and :attr:`.final_step` are used to define every episode. """ action_space = None 'Space object corresponding to valid actions.' observation_space = None 'Space object corresponding to valid observations.' def __new__(cls, modules, *args, **kwargs): if isinstance(modules, (NonModularMicrogrid, Microgrid)): import warnings warnings.warn('Initializing an environment with a microgrid will be deprecated in a future version.' 'Use from_microgrid() instead.', category=FutureWarning) instance = cls.from_microgrid(modules, **kwargs) elif isinstance(modules, int): import warnings warnings.warn('Initializing an environment with a scenario integer will be deprecated in a future version.' 'Use from_scenario() instead.', category=FutureWarning) instance = cls.from_scenario(modules, **kwargs) else: return super().__new__(cls) cls.__init__ = skip_init(cls, cls.__init__) return instance def __init__(self, modules, add_unbalanced_module=True, loss_load_cost=10, overgeneration_cost=2, reward_shaping_func=None, trajectory_func=None, flat_spaces=True, observation_keys=() ): super().__init__(modules, add_unbalanced_module=add_unbalanced_module, loss_load_cost=loss_load_cost, overgeneration_cost=overgeneration_cost, reward_shaping_func=reward_shaping_func, trajectory_func=trajectory_func) self._flat_spaces = flat_spaces self.observation_keys = self._validate_observation_keys(observation_keys) self.action_space = self._get_action_space() self.observation_space, self._nested_observation_space = self._get_observation_space() def _validate_observation_keys(self, keys): if not keys: return keys if isinstance(keys, str): keys = [keys] possible_keys = self.state_series().index.get_level_values(-1).unique() bad_keys = [key for key in keys if key not in possible_keys] if bad_keys: raise NameError(f'Keys {bad_keys} not found in state.') return keys @abstractmethod def _get_action_space(self, remove_redundant_actions=False): pass def _get_observation_space(self): obs_space = {} state_series = self.state_series() for name, module_list in self.modules.iterdict(): tup = [] for module_num, module in enumerate(module_list): normalized_space = module.observation_space['normalized'] if not self.observation_keys: tup.append(normalized_space) else: try: relevant_state_idx = state_series.loc[pd.IndexSlice[name, module_num]].index except KeyError: continue locs = [ relevant_state_idx.get_loc(key) for key in self.observation_keys if key in relevant_state_idx ] if locs: box_slice = Box( normalized_space.low[locs], normalized_space.high[locs], shape=(len(locs), ), dtype=normalized_space.dtype ) tup.append(box_slice) if tup: obs_space[name] = Tuple(tup) obs_space = Dict(obs_space) return (flatten_space(obs_space) if self._flat_spaces else obs_space), obs_space def reset(self): obs = super().reset() return self._get_obs(obs) def step(self, action, normalized=True): """ Run one timestep of the environment's dynamics. When the end of the episode is reached, you are responsible for calling `reset()` to reset the environment's state. Accepts an action and returns a tuple (observation, reward, done, info). Parameters ---------- action : dict[str, list[float]] An action provided by the agent. normalized : bool, default True Whether the passed action is normalized or not. Returns ------- observation : dict[str, list[float]] or np.ndarray, shape self.observation_space.shape Observations of each module after using the passed ``action``. ``observation`` is a nested dict if :attr:`~.flat_spaces` is True and a one-dimensional numpy array otherwise. reward : float Reward/cost of running the microgrid. A positive value implies revenue while a negative value is a cost. done : bool Whether the microgrid terminates. info : dict Additional information from this step. """ obs, reward, done, info = self.run(action, normalized=normalized) obs = self._get_obs(obs) return obs, reward, done, info def _get_obs(self, obs): if self.observation_keys: obs = self.state_series(normalized=True).loc[pd.IndexSlice[:, :, self.observation_keys]] if self._flat_spaces: obs = obs.values else: obs = obs.to_frame().unstack(level=1).T.droplevel(level=1, axis=1).to_dict(orient='list') elif self._flat_spaces: obs = flatten(self._nested_observation_space, obs) return obs def render(self, mode="human"): """:meta private:""" raise NotImplementedError @property def unwrapped(self): """:meta private:""" return super().unwrapped @property def flat_spaces(self): """ Whether the environment's spaces are flat. If True, all continuous spaces are :class:`gym:gym.spaces.Box`. Otherwise, they are nested :class:`gym:gym.spaces.Dict` of :class:`gym:gym.spaces.Tuple` of :class:`gym:gym.spaces.Box`, corresponding to the structure of the ``control`` arg of :meth:`Microgrid.run`. Returns ------- flat_spaces : bool Whether the environment's spaces are flat. """ return self._flat_spaces @classmethod def from_microgrid(cls, microgrid, **kwargs): """ Construct an RL environment from a microgrid. Effectively wraps the microgrid with the environment API. .. warning:: Any logs contained in the microgrid will not be ported over to the environment. Parameters ---------- microgrid : :class:`pymgrid.Microgrid` Microgrid to wrap. Returns ------- env The environment, suitable for reinforcement learning. """ try: modules = microgrid.modules except AttributeError: assert isinstance(microgrid, NonModularMicrogrid) return cls.from_nonmodular(microgrid, **kwargs) kwargs = kwargs.copy() kwargs['add_unbalanced_module'] = kwargs.pop('add_unbalanced_module', False) kwargs['reward_shaping_func'] = kwargs.pop('reward_shaping_func', microgrid.reward_shaping_func) kwargs['trajectory_func'] = kwargs.pop('trajectory_func', microgrid.trajectory_func) return cls(modules.to_tuples(), **kwargs) @classmethod def from_nonmodular(cls, nonmodular, **kwargs): microgrid = super().from_nonmodular(nonmodular) return cls.from_microgrid(microgrid, **kwargs) @classmethod def from_scenario(cls, microgrid_number=0, **kwargs): env = super().from_scenario(microgrid_number=microgrid_number) if kwargs: return cls.from_microgrid(env, **kwargs) return env @classmethod def load(cls, stream): return cls(super().load(stream)) ================================================ FILE: src/pymgrid/envs/base/skip_init.py ================================================ def skip_init(cls, init): """ Skip init once on cls, and then revert to original init. Parameters ---------- cls : Type Class to skip init on. init : callable Original init. Returns ------- skip_init : callable Callable that skips init once. """ def reset_init(*args, **kwargs): cls.__init__ = init return reset_init ================================================ FILE: src/pymgrid/envs/continuous/__init__.py ================================================ ================================================ FILE: src/pymgrid/envs/continuous/continuous.py ================================================ from gym.spaces import Dict, Tuple, flatten_space from warnings import warn from pymgrid.envs.base import BaseMicrogridEnv class ContinuousMicrogridEnv(BaseMicrogridEnv): """ Microgrid environment with a continuous action space. Implements the `OpenAI Gym API `_ for a microgrid; inherits from both :class:`.Microgrid` and :class:`gym.Env`. Parameters ---------- modules : list, Microgrid, NonModularMicrogrid, or int. The constructor can be called in three ways: 1. Passing a list of microgrid modules. This is identical to the :class:`.Microgrid` constructor. 2. Passing a :class:`.Microgrid` or :class:`.NonModularMicrogrid` instance. This will effectively wrap the microgrid instance with the Gym API. 3. Passing an integer in [0, 25). This will be result in loading the corresponding `pymgrid25` benchmark microgrids. add_unbalanced_module : bool, default True. Whether to add an unbalanced energy module to your microgrid. Such a module computes and attributes costs to any excess supply or demand. Set to True unless ``modules`` contains an :class:`.UnbalancedEnergyModule`. loss_load_cost : float, default 10.0 Cost per unit of unmet demand. Ignored if ``add_unbalanced_module=False``. overgeneration_cost : float, default 2.0 Cost per unit of excess generation. Ignored if ``add_unbalanced_module=False``. flat_spaces : bool, default True Whether the environment's spaces should be flat. If True, all continuous spaces are :class:`gym:gym.spaces.Box`. Otherwise, they are nested :class:`gym:gym.spaces.Dict` of :class:`gym:gym.spaces.Tuple` of :class:`gym:gym.spaces.Box`, corresponding to the structure of the ``control`` arg of :meth:`.Microgrid.run`. trajectory_func : callable or None, default None Callable that sets an initial and final step for an episode. ``trajectory_func`` must take two inputs: :attr:`.initial_step` and :attr:`.final_step`, and return two integers: the initial and final step for that particular episode, respectively. This function will be called every time :meth:`.reset` is called. If None, :attr:`.initial_step` and :attr:`.final_step` are used to define every episode. """ _nested_action_space = None def _get_nested_action_space(self): return Dict({name: Tuple([module.action_space['normalized'] for module in modules_list]) for name, modules_list in self.fixed.iterdict() if modules_list[0].is_source}) def _get_action_space(self): self._nested_action_space = self._get_nested_action_space() return flatten_space(self._nested_action_space) if self._flat_spaces else self._nested_action_space def _get_action(self, action): # Action does not have fixed sinks (loads); add those values. assert action in self._nested_action_space, 'Action is not in action space.' action = action.copy() for name, module_list in self.fixed.sinks.iterdict(): action[name] = [module.to_normalized(-1 * module.max_consumption, act=True) for module in module_list] return action def step(self, action): action = self._get_action(action) return super().run(action) def run(self, action, normalized=True): warn('run() should not be called directly in environments.') return super().run(action, normalized=normalized) ================================================ FILE: src/pymgrid/envs/discrete/__init__.py ================================================ ================================================ FILE: src/pymgrid/envs/discrete/discrete.py ================================================ import yaml from gym.spaces import Discrete from warnings import warn from pymgrid.algos.priority_list import PriorityListAlgo from pymgrid.envs.base import BaseMicrogridEnv class DiscreteMicrogridEnv(BaseMicrogridEnv, PriorityListAlgo): """ A discrete env that implements priority lists as actions on a microgrid. The environment deploys fixed controllable modules to the extent necessary to zero out the net load (load minus renewable generation). """ actions_list: list """ List of priority lists. Each element in this list corresponds to an action in the environment's action space, and defines an order in which to deploy fixed controllable modules. Specifically, each action corresponds to a unique priority list, itself containing :class:`PriorityListElements<.PriorityListElement>` that represents a particular module's position in the deployment order. Returns ------- actions_list : list of list of :class:`.PriorityListElement` List of all priority lists. """ yaml_tag = u"!DiscreteMicrogridEnv" yaml_loader = yaml.SafeLoader yaml_dumper = yaml.SafeDumper def __init__(self, modules, add_unbalanced_module=True, loss_load_cost=10, overgeneration_cost=2, reward_shaping_func=None, trajectory_func=None, flat_spaces=True, observation_keys=None, remove_redundant_gensets=True ): super().__init__(modules, add_unbalanced_module=add_unbalanced_module, loss_load_cost=loss_load_cost, overgeneration_cost=overgeneration_cost, reward_shaping_func=reward_shaping_func, trajectory_func=trajectory_func, flat_spaces=flat_spaces, observation_keys=observation_keys) self.action_space, self.actions_list = self._get_action_space(remove_redundant_gensets) def _get_action_space(self, remove_redundant_gensets=False): """ An action here is a priority list - in what order to deploy controllable source modules. Compute the total expected load It exhausts the entire production of the 0th source module before moving on to the second and the third, etc. If there are n fixed source modules, then there are 2^{n-1} actions. :return: """ priority_lists = self.get_priority_lists(remove_redundant_gensets) n_actions = len(priority_lists) if n_actions > 1000: warn(f'Microgrid with {len(priority_lists[0])} fixed source modules defines large action space with ' f'{n_actions} elements.') space = Discrete(n_actions) return space, priority_lists def _get_action(self, action_num): if action_num not in self.action_space: raise ValueError(f" Action {action_num} not in action space {self.action_space}") priority_list = list(self.actions_list[action_num]) return self._populate_action(priority_list) def remove_action(self, action_number): """ Remove an action from the action space. Useful if two actions happen to be redundant in a particular use case. Parameters ---------- action_number : int Index of the action to remove. """ if action_number not in self.action_space: raise ValueError('Cannot remove action that is not in the action space!') self.actions_list.pop(action_number) self.action_space = Discrete(self.action_space.n - 1) def step(self, action): """ Run one timestep of the environment's dynamics. When the end of the episode is reached, you are responsible for calling `reset()` to reset the environment's state. Accepts an action and returns a tuple (observation, reward, done, info). Parameters ---------- action : int An action provided by the agent. Returns ------- observation : dict[str, list[float]] or np.ndarray, shape self.observation_space.shape Observations of each module after using the passed ``action``. ``observation`` is a nested dict if :attr:`~.flat_spaces` is True and a one-dimensional numpy array otherwise. reward : float Reward/cost of running the microgrid. A positive value implies revenue while a negative value is a cost. done : bool Whether the microgrid terminates. info : dict Additional information from this step. """ self._microgrid_logger.log(action=action) microgrid_action = self._get_action(action) return super().step(microgrid_action, normalized=False) def sample_action(self, strict_bound=False, sample_flex_modules=False): return self.action_space.sample() def __repr__(self): return f"DiscreteMicrogridEnv({super().__repr__()}" def __str__(self): return self.__repr__() ================================================ FILE: src/pymgrid/forecast/__init__.py ================================================ from .forecaster import get_forecaster, OracleForecaster, GaussianNoiseForecaster, UserDefinedForecaster, NoForecaster ================================================ FILE: src/pymgrid/forecast/forecaster.py ================================================ import numpy as np from abc import abstractmethod from pandas.api.types import is_number, is_numeric_dtype from pymgrid.utils.ray import ray_decorator from pymgrid.utils.space import ModuleSpace def get_forecaster(forecaster, observation_space, forecast_shape, time_series=None, increase_uncertainty=False, relative_noise=False): """ Get the forecasting function for the time series module. Parameters ---------- forecaster : callable, float, "oracle", or None, default None. Function that gives a forecast n-steps ahead. * If ``callable``, must take as arguments ``(val_c: float, val_{c+n}: float, n: int)``, where * ``val_c`` is the current value in the time series: ``self.time_series[self.current_step]`` * ``val_{c+n}`` is the value in the time series n steps in the future * n is the number of steps in the future at which we are forecasting. The output ``forecast = forecaster(val_c, val_{c+n}, n)`` must have the same sign as the inputs ``val_c`` and ``val_{c+n}``. * If ``float``, serves as a standard deviation for a mean-zero gaussian noise function that is added to the true value. * If ``"oracle"``, gives a perfect forecast. * If ``None``, no forecast. forecast_shape : int or tuple of int Expected shape of forecasts. If an integer, will return forecasts of shape (shape, 1). observation_space : :class:`ModuleSpace ` Observation space; used to determine values to pad missing forecasts when we are forecasting past the end of the time series. time_series: ndarray[float] or None, default None. The underlying time series. * If ``callable(forecaster)``, used to validate :class:`.UserDefinedForecaster`. * If ``forecaster`` is numeric and ``relative_noise`` is true, the noise standard deviation will be defined relative to the mean of the time series. increase_uncertainty : bool, default False Whether to increase uncertainty for farther-out dates if using :class:`.GaussianNoiseForecaster`. Ignored otherwise. relative_noise : bool, default False Whether to define noise standard deviation relative to mean of time series if using :class:`.GaussianNoiseForecaster`. Ignored otherwise. Returns ------- forecaster : :class:`.Forecaster` The forecasting function. """ if forecaster is None: return NoForecaster(observation_space, forecast_shape) elif isinstance(forecaster, (UserDefinedForecaster, OracleForecaster, GaussianNoiseForecaster)): return forecaster elif callable(forecaster): return UserDefinedForecaster(forecaster, observation_space, forecast_shape, time_series) elif forecaster == "oracle": return OracleForecaster(observation_space, forecast_shape) elif is_number(forecaster): return GaussianNoiseForecaster(forecaster, observation_space, forecast_shape, time_series=time_series, increase_uncertainty=increase_uncertainty, relative_noise=relative_noise) else: raise ValueError(f"Unable to parse forecaster of type {type(forecaster)}") class Forecaster: def __init__(self, observation_space, forecast_shape): self._observation_space = observation_space self._forecast_shaped_space = self._get_forecast_shaped_space(forecast_shape) self._fill_arr = (self._observation_space.unnormalized.high + self._observation_space.unnormalized.low) / 2 def _get_forecast_shaped_space(self, shape): if len(shape) == 1: shape = (*shape, 1) elif len(shape) > 2: raise ValueError(f'shape must be one- or two-dimensional.') n_in_forecast = shape[0]*shape[1] if n_in_forecast: unnormalized_low = self._observation_space.unnormalized.low[-n_in_forecast:] unnormalized_high = self._observation_space.unnormalized.high[-n_in_forecast:] else: unnormalized_low = np.array([]) unnormalized_high = np.array([]) return ModuleSpace(unnormalized_low=unnormalized_low.reshape(shape), unnormalized_high=unnormalized_high.reshape(shape), shape=shape) @abstractmethod def _forecast(self, val_c, val_c_n, n): pass def _pad(self, forecast, n): if forecast.shape[0] == n: return forecast else: pad_amount = n - forecast.shape[0] pad = self._fill_arr.reshape((-1, forecast.shape[1]))[-pad_amount:] if pad.shape[0] < pad_amount: raise RuntimeError("Attempting to pad a forecast to a value larger than the module's observation space " "implies.") return np.concatenate((forecast, pad)) def full_pad(self, shape, forecast_horizon): if forecast_horizon is None: return None empty_forecast = np.array([]).reshape((0, shape[1])) return self._pad(empty_forecast, forecast_horizon) @ray_decorator def _clip(self, forecast): lb = self._forecast_shaped_space.unnormalized.low[-forecast.shape[0]:] ub = self._forecast_shaped_space.unnormalized.high[-forecast.shape[0]:] lt_lb = forecast < lb gt_ub = forecast > ub forecast[lt_lb] = lb[lt_lb] forecast[gt_ub] = ub[gt_ub] return forecast @property def observation_space(self): return self._observation_space @observation_space.setter def observation_space(self, value): self._observation_space = value self._fill_arr = (self._observation_space.unnormalized.high + self._observation_space.unnormalized.low) / 2 new_shape = ( int((value.shape[0] - self._forecast_shaped_space.shape[1]) / self._forecast_shaped_space.shape[1]), self._forecast_shaped_space.shape[1] ) self._forecast_shaped_space = self._get_forecast_shaped_space(new_shape) def __eq__(self, other): if type(self) != type(other): return NotImplemented return (self._fill_arr == other._fill_arr).all() and \ all(v == other.__dict__[k] for k, v in self.__dict__.items() if k != '_fill_arr') def __call__(self, val_c, val_c_n, n): if len(val_c_n.shape) == 1: val_c_n = val_c_n.reshape((-1, 1)) if val_c_n.shape[0] > self._forecast_shaped_space.shape[0]: raise RuntimeError(f'val_c_n shape {val_c_n.shape} is too large for space {self._forecast_shaped_space.shape}') forecast = self._forecast(val_c, val_c_n, n) if forecast is None: return None else: forecast = self._pad(forecast, n) forecast = self._clip(forecast) assert forecast.shape == (n, val_c_n.shape[1]) return forecast def __repr__(self): return self.__class__.__name__ class UserDefinedForecaster(Forecaster): def __init__(self, forecaster_function, observation_space, forecast_shape, time_series): self.is_vectorized_forecaster, self.cast_to_arr = \ _validate_callable_forecaster(forecaster_function, time_series) if not self.is_vectorized_forecaster: forecaster_function = vectorize_scalar_forecaster(forecaster_function) self._forecaster = forecaster_function super().__init__(observation_space, forecast_shape) def _cast_to_arr(self, forecast, val_c_n): if self.cast_to_arr: return np.array(forecast.reshape(val_c_n.shape)) return forecast def _forecast(self, val_c, val_c_n, n): forecast = self._forecaster(val_c, val_c_n, n) return self._cast_to_arr(forecast, val_c_n) class OracleForecaster(Forecaster): def _forecast(self, val_c, val_c_n, n): return val_c_n class GaussianNoiseForecaster(Forecaster): def __init__(self, noise_std, observation_space, forecast_shape, time_series=None, increase_uncertainty=False, relative_noise=False): super().__init__(observation_space, forecast_shape) self.input_noise_std = noise_std self.increase_uncertainty = increase_uncertainty self.relative_noise = relative_noise self._noise_size = self._forecast_shaped_space.shape self._noise_std = self._get_noise_std(time_series) def _get_noise_std(self, time_series): scalar_val = self.input_noise_std if self.relative_noise: if time_series is None: raise ValueError('Must pass time_series if relative_noise is True.') scalar_val *= np.abs(time_series.mean()) if self.increase_uncertainty: return scalar_val * np.outer( 1 + np.log(1 + np.arange(self._noise_size[0])), np.ones(self._noise_size[-1]) ) else: return scalar_val def _get_noise(self, size): try: return np.random.normal(scale=self._noise_std, size=size) except ValueError: noise_std = self._noise_std[:size[0], :] if noise_std.shape != size: raise RuntimeError(f'Cannot broadcast shapes {self._noise_std.shape} and {size}.') return np.random.normal(scale=noise_std, size=size) def _forecast(self, val_c, val_c_n, n): return val_c_n + self._get_noise(val_c_n.shape).reshape(val_c_n.shape) @property def noise_std(self): return self._noise_std @noise_std.setter def noise_std(self, value): pass def __repr__(self): return f'GaussianNoiseForecaster(noise_std={self.input_noise_std}, ' \ f'increase_uncertainty={self.increase_uncertainty})' class NoForecaster(Forecaster): def _forecast(self, val_c, val_c_n, n): return None def _validate_callable_forecaster(forecaster, time_series): val_c = time_series[0] n = np.random.randint(2, len(time_series)) vector_true_forecast = time_series[:n] try: cast_to_arr = _validate_vectorized_forecaster(forecaster, val_c, vector_true_forecast, n) is_vectorized_forecaster = True except NotImplementedError: scalar_true_forecast = vector_true_forecast[-1] _validate_scalar_forecaster(forecaster, val_c, scalar_true_forecast, n) is_vectorized_forecaster = False cast_to_arr = False return is_vectorized_forecaster, cast_to_arr def _validate_vectorized_forecaster(forecaster, val_c, vector_true_forecast, n): try: vectorized_forecast = forecaster(val_c, vector_true_forecast, n) except Exception as e: raise NotImplementedError("Unable to call forecaster with vector inputs. " f"\nFunc call forecaster(val_c={val_c}, val_c_n={vector_true_forecast}, n={n})" f"\nraised {type(e).__name__}: {e}") from e else: # vectorized function call succeeded if not hasattr(vectorized_forecast, 'size'): vectorized_forecast = np.array(vectorized_forecast) cast_to_arr = True else: cast_to_arr = False try: vectorized_forecast = vectorized_forecast.reshape(vector_true_forecast.shape) except ValueError: raise ValueError(f"Forecaster output of shape {vectorized_forecast.shape} cannot be casted to " f"necessary forecast shape {vector_true_forecast.shape}") for i, (forecast, true_forecast) in enumerate(zip(vectorized_forecast, vector_true_forecast)): try: _validate_forecasted_value(forecast, true_forecast, val_c, n) except Exception as e: raise type(e)(f"Failed validating forecast at position {i} due to exception {e}") from e return cast_to_arr def _validate_scalar_forecaster(forecaster, val_c, scalar_true_forecast, n): try: scalar_forecast = forecaster(val_c, scalar_true_forecast, n) except Exception as e_scalar: raise ValueError("Unable to call forecaster with scalar inputs. " f"\nFunc call forecaster(val_c={val_c}, val_c_plus_n={scalar_true_forecast}, n={n})" f"\nraised {type(e_scalar).__name__}: {e_scalar}") from e_scalar else: # scalar function call succeeded # check shape try: assert is_number(scalar_forecast) scalar_forecast_item = scalar_forecast except AssertionError: try: scalar_forecast_item = scalar_forecast.item() except (ValueError, AttributeError): raise ValueError("Unable to validate forecaster. Forecaster must return scalar output with scalar " f"input but returned {scalar_forecast}") _validate_forecasted_value(scalar_forecast_item, scalar_true_forecast, val_c, n) def _validate_forecasted_value(forecaster_output, true_forecast, val_c, n): if not is_numeric_dtype(np.array(forecaster_output)): raise TypeError( "Unable to validate forecaster. Forecaster must return numeric np.ndarray or number but returned " f"output of type {np.array(forecaster_output).dtype}: {forecaster_output}") elif not (forecaster_output * true_forecast >= 0): raise ValueError( "Unable to validate forecaster. Forecaster must return output of same sign (or zero) as " f"input but returned output {forecaster_output} with inputs " f"val_c={val_c}, val_c_plus_n={true_forecast}, n={n}") def vectorize_scalar_forecaster(forecaster): def vectorized(val_c, val_c_n, n): if n != len(val_c_n): raise ValueError(f"Incompatible true values length ({val_c_n}) to forecast {n}-steps ahead.") vectorized_output = np.array([forecaster(val_c, val_c_n_i, n_i) for n_i, val_c_n_i in enumerate(val_c_n)]) try: shape = (-1, vectorized_output.shape[1]) except IndexError: shape = (-1, 1) return vectorized_output.reshape(shape) return vectorized ================================================ FILE: src/pymgrid/microgrid/__init__.py ================================================ DEFAULT_HORIZON = 23 from .microgrid import Microgrid ================================================ FILE: src/pymgrid/microgrid/microgrid.py ================================================ import numpy as np import pandas as pd import yaml from copy import deepcopy from warnings import warn from pymgrid.microgrid import DEFAULT_HORIZON from pymgrid.modules import ModuleContainer, UnbalancedEnergyModule from pymgrid.utils.logger import ModularLogger from pymgrid.microgrid.utils.step import MicrogridStep from pymgrid.utils.serialize import add_numpy_pandas_representers, add_numpy_pandas_constructors, dump_data from pymgrid.utils.space import MicrogridSpace class Microgrid(yaml.YAMLObject): """ Microgrid class, used to define and simulate an environment with a variety of modules. Parameters ---------- modules : List[Union[Tuple[str, BaseMicrogridModule], BaseMicrogridModule]] List of modules that define the microgrid. The list can contain either/both microgrid modules -- subclasses of ``BaseMicrogridModule`` -- and tuples of length two, which must contain a string defining the name of the module followed by the module. ``Microgrid`` groups modules into lists based on their names. If no name is given (e.g. an element in ``modules`` is a subclass of ``BaseMicrogridModule`` and not a tuple, then the name is defined to be ``module.__class__.name[0]``. Modules are then exposed (within lists) by name as attributes to the microgrid. See below for an example. .. note:: The constructor copies modules passed to it. add_unbalanced_module : bool, default True. Whether to add an unbalanced energy module to your microgrid. Such a module computes and attributes costs to any excess supply or demand. Set to True unless ``modules`` contains an ``UnbalancedEnergyModule``. loss_load_cost : float, default 10.0 Cost per unit of unmet demand. Ignored if ``add_unbalanced_module=False``. overgeneration_cost : float, default 2.0 Cost per unit of excess generation. Ignored if ``add_unbalanced_module=False``. reward_shaping_func : callable or None, default None Function that allows for custom definition of the microgrid's reward/cost. If None, the cost of each step is simply the total cost of all modules. For example, you may define a function that defines the cost as only being the loss load, or only the pv curtailment. trajectory_func : callable or None, default None Callable that sets an initial and final step for an episode. ``trajectory_func`` must take two inputs: :attr:`.initial_step` and :attr:`.final_step`, and return two integers: the initial and final step for that particular episode, respectively. This function will be called every time :meth:`.reset` is called. If None, :attr:`.initial_step` and :attr:`.final_step` are used to define every episode. Examples -------- >>> from pymgrid import Microgrid >>> from pymgrid.modules import LoadModule, RenewableModule, GridModule, BatteryModule >>> timesteps = 10 >>> load = LoadModule(10*np.random.rand(timesteps), loss_load_cost=10.) >>> pv = RenewableModule(10*np.random.rand(timesteps)) >>> grid = GridModule(max_import=100, max_export=10, time_series=np.random.rand(timesteps, 3)) >>> battery_0 = BatteryModule(min_capacity=0, \ max_capacity=100, \ max_charge=1,\ max_discharge=10, \ efficiency=0.9, \ init_soc=0.5) >>> battery_1 = BatteryModule(min_capacity=1, \ max_capacity=20, \ max_charge=5, \ max_discharge=10, \ efficiency=0.9, \ init_soc=0.5) >>> microgrid = Microgrid(modules=[load, ('pv', pv), grid, battery_0, battery_1]) >>> # The modules are now available as attributes. The exception to this is `load`, which is an exposed method. >>> print(microgrid.pv) [RenewableModule(time_series=, raise_errors=False, forecaster=NoForecaster, forecast_horizon=0, forecaster_increase_uncertainty=False, provided_energy_name=renewable_used)] >>> print(microgrid.grid) [GridModule(max_import=100, max_export=10)] >>> print(microgrid.grid.item()) # Return the module instead of a list containing the module, if list has one item. GridModule(max_import=100, max_export=10) >>> for j, battery in enumerate(microgrid.battery): >>> print(f"Battery {j}: {battery}") Battery 0: BatteryModule(min_capacity=0, max_capacity=100, max_charge=1, max_discharge=10, efficiency=0.9, battery_cost_cycle=0.0, battery_transition_model=None, init_charge=None, init_soc=0.5, raise_errors=False) Battery 1: BatteryModule(min_capacity=1, max_capacity=20, max_charge=5, max_discharge=10, efficiency=0.9, battery_cost_cycle=0.0, battery_transition_model=None, init_charge=None, init_soc=0.5, raise_errors=False) """ yaml_tag = u"!Microgrid" """Tag used for yaml serialization.""" yaml_dumper = yaml.SafeDumper yaml_loader = yaml.SafeLoader def __init__(self, modules, add_unbalanced_module=True, loss_load_cost=10., overgeneration_cost=2., reward_shaping_func=None, trajectory_func=None): self._modules = self._get_module_container(modules, add_unbalanced_module, loss_load_cost, overgeneration_cost) # TODO (ahalev) transform envs to wrappers, and remove microgrid from attr names) self.microgrid_action_space = MicrogridSpace( self._modules.get_attrs('action_space', 'module_type', as_pandas=False), 'act' ) self.microgrid_observation_space = MicrogridSpace( self._modules.get_attrs('observation_space', as_pandas=False), 'obs' ) self._initial_step = self._get_module_initial_step() self._final_step = self._get_module_final_step() self.reward_shaping_func = reward_shaping_func self.trajectory_func = self._check_trajectory_func(trajectory_func) self._balance_logger = ModularLogger() self._microgrid_logger = ModularLogger() # log additional information. def _get_unbalanced_energy_module(self, loss_load_cost, overgeneration_cost): return UnbalancedEnergyModule(raise_errors=False, loss_load_cost=loss_load_cost, overgeneration_cost=overgeneration_cost ) def _get_module_container(self, modules, add_unbalanced_module, loss_load_cost, overgeneration_cost): """ Types of _modules: Fixed source: provides energy to the microgrid. When queried, the microgrid must absorb said energy. Example: battery (when discharging), grid (when importing from) Flex source: provides energy to the microgrid. Can retain excess energy and not send to microgrid. Queried last, in the hopes of balancing other _modules. Example: pv with ability to curtail pv Fixed sink: absorbs energy from the microgrid. When queried, the microgrid must send it said energy. Example: load, grid (when exporting to) Flexible sink: absorbs energy from the microgrid. Can absorb excess energy from the microgrid. Queried last, in the hopes of balancing other _modules. Example: dispatchable load Note that _modules can act as both sources and sinks (batteries, grid), but cannot be both fixed and flexible. :return: """ modules = deepcopy(modules) if not pd.api.types.is_list_like(modules): raise TypeError("modules must be list-like of modules.") if add_unbalanced_module: modules.append(self._get_unbalanced_energy_module(loss_load_cost, overgeneration_cost)) return ModuleContainer(modules) def _check_trajectory_func(self, trajectory_func): if trajectory_func is None: return trajectory_func if not callable(trajectory_func): raise TypeError('trajectory_func must be callable.') output = trajectory_func(self._initial_step, self._final_step) try: initial_step, final_step = output if not (isinstance(initial_step, int) and isinstance(final_step, int)): raise ValueError except (TypeError, ValueError): raise TypeError(f'trajectory func must return two integer values, not {output}') if initial_step < self._initial_step: raise ValueError(f'trajectory_func returned initial_step value ({initial_step}) less than env\'s initial ' f'step: ({self._initial_step})') if final_step > self._final_step: raise ValueError(f'trajectory_func returned final_step value ({final_step}) greater than env\'s final step:' f' ({self._final_step})') if initial_step >= final_step: raise ValueError(f'trajectory_func returned values ({initial_step}, {final_step}) such that initial_step' f'was greater than or equal to final_step.') return trajectory_func def reset(self): """ Reset the microgrid and flush the log. Returns ------- dict[str, list[float]] Observations from resetting the modules as well as the flushed balance log. """ self._set_trajectory() return { **{name: [module.reset() for module in module_list] for name, module_list in self.modules.iterdict()}, **{"balance": self._balance_logger.flush(), "other": self._microgrid_logger.flush()} } def _set_trajectory(self): if self.trajectory_func is not None: initial_step, final_step = self.trajectory_func(self._initial_step, self._final_step) self._set_initial_step(initial_step, modules_only=True) self._set_final_step(final_step, modules_only=True) def run(self, control, normalized=True): """ Run the microgrid for a single step. Parameters ---------- control : dict[str, list[float]] Actions to pass to each fixed module. normalized : bool, default True Whether ``control`` is a normalized value or not. If not, each module de-normalizes its respective action. Returns ------- observation : dict[str, list[float]] Observations of each module after using the passed ``control``. reward : float Reward/cost of running the microgrid. A positive value implies revenue while a negative value is a cost. done : bool Whether the microgrid terminates. info : dict Additional information from this step. """ control_copy = control.copy() microgrid_step = MicrogridStep(reward_shaping_func=self.reward_shaping_func, cost_info=self.get_cost_info()) for name, modules in self.fixed.iterdict(): for module in modules: microgrid_step.append(name, *module.step(0.0, normalized=False)) fixed_provided, fixed_consumed, _, _ = microgrid_step.balance() log_dict = self._get_log_dict(fixed_provided, fixed_consumed, prefix='fixed') for name, modules in self.controllable.iterdict(): try: module_controls = control_copy.pop(name) except KeyError: raise ValueError(f'Control for module "{name}" not found. Available controls:\n\t{control.keys()}') else: try: _zip = zip(modules, module_controls) except TypeError: _zip = zip(modules, [module_controls]) for module, _control in _zip: module_step = module.step(_control, normalized=normalized) # obs, reward, done, info. microgrid_step.append(name, *module_step) provided, consumed, _, _ = microgrid_step.balance() difference = provided - consumed # if difference > 0, have an excess. Try to use flex sinks to dissapate # otherwise, insufficient. Use flex sources to make up log_dict = self._get_log_dict(provided-fixed_provided, consumed-fixed_consumed, log_dict=log_dict, prefix='controllable') if len(control_copy) > 0: warn(f'\nIgnoring the following keys in passed control:\n {list(control_copy.keys())}') if difference > 0: energy_excess = difference for name, modules in self.flex.iterdict(): for module in modules: if not module.is_sink: sink_amt = 0.0 elif module.max_consumption < energy_excess: # module cannot dissapate all excess energy sink_amt = -1.0*module.max_consumption else: sink_amt = -1.0 * energy_excess module_step = module.step(sink_amt, normalized=False) microgrid_step.append(name, *module_step) energy_excess += sink_amt else: energy_needed = - difference for name, modules in self.flex.iterdict(): for module in modules: if not module.is_source: source_amt = 0.0 elif module.max_production < energy_needed: # module cannot provide sufficient energy source_amt = module.max_production else: source_amt = energy_needed module_step = module.step(source_amt, normalized=False) microgrid_step.append(name, *module_step) energy_needed -= source_amt provided, consumed, reward, shaped_reward = microgrid_step.balance() log_dict = self._get_log_dict(provided, consumed, log_dict=log_dict, prefix='overall') self._balance_logger.log(reward=reward, shaped_reward=shaped_reward, **log_dict) if not np.isclose(provided, consumed): raise RuntimeError('Microgrid modules unable to balance energy production with consumption.\n' '') return microgrid_step.output() def _get_log_dict(self, provided_energy, absorbed_energy, log_dict=None, prefix=None): _log_dict = dict(provided_to_microgrid=provided_energy, absorbed_from_microgrid=absorbed_energy) _log_dict = {(prefix + '_' + k if prefix is not None else k): v for k, v in _log_dict.items()} if log_dict: _log_dict.update(log_dict) return _log_dict def get_cost_info(self): return self._modules.get_attrs('production_marginal_cost', 'absorption_marginal_cost', as_pandas=False) def sample_action(self, strict_bound=False, sample_flex_modules=False): """ Get a random action within the microgrid's action space. Parameters ---------- strict_bound : bool, default False If True, choose actions that is guaranteed to satisfy self.max_consumption and self.max_production bounds. Otherwise selects action from min_act and min_act, which may not satisfy instantaneous bounds. sample_flex_modules : bool, default false Whether to sample the flex modules in the microgrid. ``run`` does not expect actions for flex modules. Returns ------- dict[str, list[float]] Random action in the action space. """ module_iterator = self._modules.to_dict() if sample_flex_modules else self._modules.controllable.to_dict() return {module_name: [module.sample_action(strict_bound=strict_bound) for module in module_list] for module_name, module_list in module_iterator.items() if module_list[0].action_space.shape[0]} def get_empty_action(self, sample_flex_modules=False): """ Get an action for the microgrid with no values set. Values are all ``None``; every ``None`` value should be replaced before passing an action to ``run``. Parameters ---------- sample_flex_modules : bool, default false Whether to sample the flex modules in the microgrid. ``run`` does not expect actions for flex modules. Returns ------- dict[str, list[None]] Empty action. """ module_iterator = self._modules.to_dict() if sample_flex_modules else self._modules.controllable.to_dict() return {module_name: [None]*len(module_list) for module_name, module_list in module_iterator.items() if module_list[0].action_space.shape[0]} def to_normalized(self, data_dict, act=False, obs=False): """ Normalize an action or observation. Parameters ---------- data_dict : dict[str, list[int]] Action or observation to normalize. Dictionary keys are names of the modules while dictionary values are lists containing an action corresponding to all modules with that name. act : bool, default False Set to True if you are normalizing an action. obs : bool, default False Set to True if you are normalizing an observation. Returns ------- dict[str, list[float]] Normalized action. """ assert act + obs == 1, 'One of act or obs must be True but not both.' return {module_name: [module.to_normalized(value, act=act, obs=obs) for module, value in zip(module_list, data_dict[module_name])] for module_name, module_list in self._modules.iterdict() if module_name in data_dict} def from_normalized(self, data_dict, act=False, obs=False): """ De-normalize an action or observation. Parameters ---------- data_dict : dict[str, list[int]] Action or observation to de-normalize. Dictionary keys are names of the modules while dictionary values are lists containing an action corresponding to all modules with that name. act : bool, default False Set to True if you are de-normalizing an action. obs : bool, default False Set to True if you are de-normalizing an observation. Returns ------- dict[str, list[float]] De-normalized action. """ assert act + obs == 1, 'One of act or obs must be True but not both.' return {module_name: [module.from_normalized(value, act=act, obs=obs) for module, value in zip(module_list, data_dict[module_name])] for module_name, module_list in self._modules.iterdict() if module_name in data_dict} def get_log(self, as_frame=True, drop_singleton_key=False): """ Collect a log of controls and responses of the microgrid. Parameters ---------- as_frame : bool, default True Whether to return the log as a pd.DataFrame. If False, returns a nested dict. drop_singleton_key : bool, default False Whether to drop index level enumerating the modules by name if each module name has only one module. Ignored otherwise. Returns ------- pd.DataFrame or dict """ _log_dict = dict() for name, modules in self._modules.iterdict(): for j, module in enumerate(modules): for key, value in module.log_dict().items(): _log_dict[(name, j, key)] = value for key, value in self._balance_logger.to_dict().items(): _log_dict[('balance', 0, key)] = value for key, value in self._microgrid_logger.items(): _log_dict[(key, 0, '')] = value col_names = ['module_name', 'module_number', 'field'] df = pd.DataFrame(_log_dict, index=pd.RangeIndex(start=self.initial_step, stop=self.current_step)) df.columns = pd.MultiIndex.from_tuples(df.columns.to_list(), names=col_names) if drop_singleton_key: df.columns = df.columns.remove_unused_levels() if as_frame: return df return df.to_dict() def set_forecaster(self, forecaster, forecast_horizon=DEFAULT_HORIZON, forecaster_increase_uncertainty=False, forecaster_relative_noise=False): """ Set the forecaster for timeseries modules in the microgrid. You may either pass in a single value for ``forecaster`` to apply the same forecasting logic to all timeseries modules, or pass key-value pairs in a ``dict`` to set the forecaster for specific modules. In the latter case, you may also set different forecasters for each named module. See :meth:`.get_forecaster` for additional details on setting forecasters. forecaster : callable, float, "oracle", None, or dict. Function that gives a forecast n-steps ahead. * If ``callable``, must take as arguments ``(val_c: float, val_{c+n}: float, n: int)``, where * ``val_c`` is the current value in the time series: ``self.time_series[self.current_step]`` * ``val_{c+n}`` is the value in the time series n steps in the future * n is the number of steps in the future at which we are forecasting. The output ``forecast = forecaster(val_c, val_{c+n}, n)`` must have the same sign as the inputs ``val_c`` and ``val_{c+n}``. * If ``float``, serves as a standard deviation for a mean-zero gaussian noise function that is added to the true value. * If ``"oracle"``, gives a perfect forecast. * If ``None``, no forecast. * If ``dict``, must contain key-value pairs of the form ``module_name: forecaster``. Will set the forecaster of the module corresponding to ``module_name`` using the logic above. forecast_horizon : int Number of steps in the future to forecast. If forecaster is None, this parameter is ignored and the resultant horizon will be zero. forecaster_increase_uncertainty : bool, default False Whether to increase uncertainty for farther-out dates if using a GaussianNoiseForecaster. Ignored otherwise. forecaster_relative_noise : bool, default False Whether to define noise standard deviation relative to mean of time series if using :class:`.GaussianNoiseForecaster`. Ignored otherwise. """ if isinstance(forecaster, dict): for module_name, _forecaster in forecaster.items(): if module_name not in self._modules.names(): raise NameError(f'Unrecognized module {module_name}.') try: self._modules[module_name].set_forecaster( _forecaster, forcast_horizon=forecast_horizon, forecaster_increase_uncertainty=forecaster_increase_uncertainty, forecaster_relative_noise=forecaster_relative_noise ) except AttributeError: pass else: for module in self._modules.iterlist(): try: module.set_forecaster( forecaster, forecast_horizon=forecast_horizon, forecaster_increase_uncertainty=forecaster_increase_uncertainty, forecaster_relative_noise=forecaster_relative_noise ) except AttributeError: pass def get_forecast_horizon(self): """ Get the forecast horizon of timeseries modules contained in the microgrid. Returns ------- int The forecast horizon. Raises ------ ValueError If horizons between modules are inconsistent. """ horizons = [] for module in self._modules.iterlist(): try: horizons.append(module.forecast_horizon) except AttributeError: pass if len(horizons) == 0: warn(f"No forecast horizon found in microgrid.modules. Using default horizon {DEFAULT_HORIZON}") return DEFAULT_HORIZON elif not np.min(horizons) == np.max(horizons): raise ValueError(f"Mismatched forecast_horizons found: {horizons}") return horizons[0] def set_module_attr(self, attr_name, value): """ Set the value of an attribute in all modules containing that attribute. Does nothing in modules not already containing the attribute. Parameters ---------- attr_name : str Name of the module attribute. value : any Value to set the attribute to. Raises ------ AttributeError If no module has the attribute. """ set_at_least_one = False for module in self._modules.iterlist(): if not hasattr(module, attr_name): continue setattr(module, attr_name, value) set_at_least_one = True if not set_at_least_one: raise AttributeError(f"No module has attribute '{attr_name}'.") @property def current_step(self): """ Current step of underlying modules. Returns ------- current_step : int Current step. """ return self._modules.get_attrs('current_step', unique=True).item() @property def initial_step(self): """ Initial step at which to start underlying timeseries data. The step to which :attr:`.current_step` is reset to when calling :meth:`.reset`. Returns ------- initial_step : int Initial step. """ return self._initial_step def _get_module_initial_step(self): initial_step = self.modules.get_attrs('initial_step', unique=True) try: return initial_step.item() except ValueError: if initial_step.empty: return 0 @initial_step.setter def initial_step(self, value): self._set_initial_step(value) def _set_initial_step(self, value, modules_only=False): self.set_module_attr('initial_step', value) if not modules_only: self._initial_step = self._get_module_initial_step() @property def final_step(self): """ Final step of underlying timeseries data. Returns ------- final_step : int Final step. """ return self._final_step def _get_module_final_step(self): final_step = self.modules.get_attrs('final_step', unique=True) try: return final_step.item() except ValueError: if final_step.empty: return np.inf @final_step.setter def final_step(self, value): self._set_final_step(value) def _set_final_step(self, value, modules_only=False): self.set_module_attr('final_step', value) if not modules_only: self._final_step = self._get_module_final_step() @property def modules(self): """ View of the module container. Returns ------- modules : :class:`pymgrid.modules.module_container.ModuleContainer` View of the container. """ return self._modules def state_dict(self, normalized=False): """ State of the microgrid as a dict. Keys are module names and values are lists of state dicts for all modules with said name. Parameters ---------- normalized : bool, default False Whether to return a dict of normalized values. Returns ------- state_dict : dict[str, list[dict]] State of the microgrid as a nested dict. """ return {name: [ module.state_dict(normalized=normalized) for module in modules ] for name, modules in self._modules.iterdict()} @property def log(self): """ Microgrid's log as a DataFrame. This is equivalent to `:meth:`get_log`. Returns ------- log : pd.DataFrame The log of the microgrid. """ return self.get_log() def state_series(self, normalized=False): """ State of the microgrid as a pandas Series. Three are three levels in the MultiIndex: ``microgrid_name``, ``microgrid_number`` (relative to each ``microgrid_name``) and state key name. Parameters ---------- normalized : bool, default False Whether to return a Series of normalized values. Returns ------- state : pd.Series State of the microgrid as a pandas Series.. """ return pd.Series( { (name, num, key): value for name, sd_list in self.state_dict(normalized=normalized).items() for num, sd in enumerate(sd_list) for key, value in sd.items() } ) @property def fixed(self): """ List of all fixed modules in the microgrid. Returns ------- list of modules """ return self._modules.fixed @property def flex(self): """ List of all flex modules in the microgrid. Returns ------- list The list of modules """ return self._modules.flex @property def controllable(self): """ List of all controllable modules in the microgrid. Returns ------- list of modules """ return self._modules.controllable @property def module_list(self): """ List of all modules in the microgrid. Returns ------- list The list of modules """ return self._modules.to_list() @property def n_modules(self): """ Number of modules in the microgrid. Returns ------- int """ return len(self._modules) def dump(self, stream=None): """ Save a microgrid to a YAML buffer. Supports both strings of YAML or storing YAML in a path-like object. Parameters ---------- stream : file-like object or None, default None Stream to save the YAML document. If None, returns the document instead. Returns ------- str or None : Returns the YAMl document as a string if ``stream=None``. Returns None otherwise .. note:: ``dump`` handles the serialization of array-like objects (e.g. time series and logs) differently depending on the value of ``stream``. If ``stream is None``, array-like objects are serialized inline. If ``stream`` is a stream to a file-like object, however, array-like objects will be serialized as `.csv.gz` files in a directory relative to ``stream``, and the relative locations stored inline in the YAML file. For an example of this behavior, see `data/scenario/pymgrid25/microgrid_0`. """ return yaml.safe_dump(self, stream=stream) @classmethod def load(cls, stream): """ Load a microgrid from a yaml buffer. Supports both strings of YAML or YAML stored in a path-like object. Parameters ---------- stream : str or file-like object YAML document. Can be either a string of loaded YAML or a stream to a local file containing a YAML document. Returns ------- Microgrid : the loaded microgrid. """ return yaml.safe_load(stream) @classmethod def to_yaml(cls, dumper, data): """ :meta private: """ add_numpy_pandas_representers() return dumper.represent_mapping(cls.yaml_tag, data.serialize(dumper.stream), flow_style=cls.yaml_flow_style) @classmethod def from_yaml(cls, loader, node): """ :meta private: """ add_numpy_pandas_constructors() mapping = loader.construct_mapping(node, deep=True) if 'scenario' in mapping: microgrid_number = mapping.pop('scenario') if len(mapping): warn(f'Ignoring keys {mapping.keys()} when loading from scenario.') return cls.from_scenario(microgrid_number) instance = cls(mapping["modules"], add_unbalanced_module=False) instance._balance_logger = instance._balance_logger.from_raw(mapping.get("balance_log")) instance.trajectory_func = mapping.get('trajectory_func', None) instance._initial_step = mapping.get('initial_step', instance.initial_step) instance._final_step = mapping.get('final_step', instance.final_step) return instance def serialize(self, dumper_stream): """ :meta private: """ return dump_data(self._serialization_data(), dumper_stream, self.yaml_tag) def _serialization_data(self): return { "modules": self._modules.to_tuples(), 'trajectory_func': self.trajectory_func, 'initial_step': self.initial_step, 'final_step': self.final_step, **self._balance_logger.serialize("balance_log") } @classmethod def from_nonmodular(cls, nonmodular): """ Convert to Microgrid from old-style NonModularMicrogrid. Parameters ---------- nonmodular : pymgrid.NonModularMicrogrid Non-modular (old-style) microgrid to be converted. Returns ------- converted : pymgrid.Microgrid New-style modular microgrid. See Also -------- pymgrid.Microgrid.to_nonmodular : Converter from new-style to old-style. .. warning:: Any logs that have accumulated will be lost in conversion. """ from pymgrid.convert.convert import to_modular return to_modular(nonmodular) def to_nonmodular(self): """ Convert Microgrid to old-style NonModularMicrogrid. Returns ------- converted : pymgrid.NonModularMicrogrid Old-style microgrid. See Also -------- :meth:`Microgrid.to_modular` : Converter from old-style to new-style. .. warning:: Any logs that have accumulated will be lost in conversion. """ from pymgrid.convert.convert import to_nonmodular return to_nonmodular(self) @classmethod def from_scenario(cls, microgrid_number=0): """ Load one of the *pymgrid25* benchmark microgrids. Parameters ---------- microgrid_number : int, default 0 Number of the microgrid to return. ``0<=microgrid_number<25``. Returns ------- scenario : pymgrid.Microgrid The loaded microgrid. """ from pymgrid import PROJECT_PATH n = microgrid_number if n not in np.arange(25): raise TypeError(f'Invalid microgrid_number {n}, must be an integer in the range [0, 25).') with open(PROJECT_PATH / f"data/scenario/pymgrid25/microgrid_{n}/microgrid_{n}.yaml", "r") as f: return cls.load(f) def _dir_additions(self): return { x for x in dir(self._modules) if not x.startswith('_') and not callable(getattr(self._modules, x)) and x in self._modules } def __dir__(self): rv = set(super().__dir__()) rv = rv | self._dir_additions() return sorted(rv) def __getnewargs__(self): return (self.modules.to_tuples(), ) def __len__(self): """ Length of available underlying data. """ l = [] for module in self.modules.iterlist(): try: l.append(len(module)) except TypeError: pass return min(l) def __eq__(self, other): if type(self) != type(other): return NotImplemented return all([ self.modules == other.modules, self._balance_logger == other._balance_logger, self.trajectory_func == other.trajectory_func]) def __repr__(self): module_str = [name + ' x ' + str(len(modules)) for name, modules in self._modules.iterdict()] module_str = ', '.join(module_str) return f'Microgrid([{module_str}])' def __getattr__(self, item): if item.startswith("__") or item == "_modules": raise AttributeError if item in self._modules: return self._modules[item] return object.__getattribute__(self, item) ================================================ FILE: src/pymgrid/microgrid/reward_shaping/__init__.py ================================================ from .pv_curtailment_shaper import PVCurtailmentShaper from .battery_discharge_shaper import BatteryDischargeShaper ================================================ FILE: src/pymgrid/microgrid/reward_shaping/base.py ================================================ import yaml from abc import abstractmethod class BaseRewardShaper(yaml.YAMLObject): yaml_dumper = yaml.SafeDumper yaml_loader = yaml.SafeLoader @staticmethod def sum_module_val(info, module_name, module_attr): try: module_info = info[module_name] return sum([d[module_attr] for d in module_info]) except KeyError: return 0.0 @abstractmethod def __call__(self, step_info, cost_info): pass def __repr__(self): return f'{self.__class__.__name__}()' ================================================ FILE: src/pymgrid/microgrid/reward_shaping/battery_discharge_shaper.py ================================================ import numpy as np from pymgrid.microgrid.reward_shaping.base import BaseRewardShaper class BatteryDischargeShaper(BaseRewardShaper): """ Reward is the percentage of load that is met by battery discharging. Return a value in [-1, 1]. Value of -1 implies that all load was loss load. Value of 1 implies all load was met by battery. Use in a config with microgrid: attributes: reward_shaping_func: !BatteryDischargeShaper {} """ yaml_tag = u"!BatteryDischargeShaper" def __call__(self, step_info, cost_info): battery_discharge = self.sum_module_val(step_info, 'battery', 'provided_energy') load = self.sum_module_val(step_info, 'load', 'absorbed_energy') loss_load = self.sum_module_val(step_info, 'unbalanced_energy', 'provided_energy') # battery_discharge is in [0, load-loss_load]; loss_load is in [0, load]. try: percent_battery = (battery_discharge - loss_load) / load except ZeroDivisionError: return 0.0 assert -1 <= percent_battery <= 1 or np.isclose(percent_battery, 1) or np.isclose(percent_battery, 0) return percent_battery ================================================ FILE: src/pymgrid/microgrid/reward_shaping/pv_curtailment_shaper.py ================================================ from pymgrid.microgrid.reward_shaping.base import BaseRewardShaper class PVCurtailmentShaper(BaseRewardShaper): """ Use in a config with microgrid: attributes: reward_shaping_func: !PVCurtailmentShaper {} """ yaml_tag = u"!PVCurtailmentShaper" def __call__(self, step_info, cost_info): pv_curtailment = self.sum_module_val(step_info, 'pv', 'curtailment') return -1.0 * pv_curtailment ================================================ FILE: src/pymgrid/microgrid/trajectory/__init__.py ================================================ from .deterministic import DeterministicTrajectory from .stochastic import StochasticTrajectory, FixedLengthStochasticTrajectory ================================================ FILE: src/pymgrid/microgrid/trajectory/base.py ================================================ import inspect import yaml from abc import abstractmethod class BaseTrajectory(yaml.YAMLObject): yaml_dumper = yaml.SafeDumper yaml_loader = yaml.SafeLoader @abstractmethod def __call__(self, initial_step, final_step): pass def __repr__(self): params = inspect.signature(self.__init__).parameters formatted_params = ', '.join([f'{p}={getattr(self, p)}' for p in params]) return f'{self.__class__.__name__}({formatted_params})' def __eq__(self, other): if type(self) != type(other): return NotImplemented return repr(self) == repr(other) ================================================ FILE: src/pymgrid/microgrid/trajectory/deterministic.py ================================================ from pymgrid.microgrid.trajectory.base import BaseTrajectory class DeterministicTrajectory(BaseTrajectory): yaml_tag = u"!DeterministicTrajectory" def __init__(self, initial_step, final_step): self.initial_step = initial_step self.final_step = final_step def __call__(self, initial_step, final_step): return self.initial_step, self.final_step ================================================ FILE: src/pymgrid/microgrid/trajectory/stochastic.py ================================================ import numpy as np from pymgrid.microgrid.trajectory.base import BaseTrajectory class StochasticTrajectory(BaseTrajectory): yaml_tag = u"!StochasticTrajectory" def __call__(self, initial_step, final_step): initial = np.random.randint(initial_step, final_step-2) final = np.random.randint(initial, final_step) return initial, final class FixedLengthStochasticTrajectory(BaseTrajectory): yaml_tag = u"!FixedLengthStochasticTrajectory" def __init__(self, trajectory_length): self.trajectory_length = trajectory_length def __call__(self, initial_step, final_step): if final_step - initial_step < self.trajectory_length: raise ValueError(f'Cannot create a trajectory of length {self.trajectory_length}' f'between initial_step ({initial_step}) and final_step ({final_step})') initial = np.random.randint(initial_step, final_step-self.trajectory_length) return initial, initial + self.trajectory_length ================================================ FILE: src/pymgrid/microgrid/utils/__init__.py ================================================ ================================================ FILE: src/pymgrid/microgrid/utils/step.py ================================================ import numpy as np class MicrogridStep: def __init__(self, reward_shaping_func=None, cost_info=None): self._reward_shaping_func = reward_shaping_func self.cost_info = cost_info self._obs = dict() self._reward = 0.0 self._done = False self._info = dict(absorbed_energy=[], provided_energy=[]) def append(self, module_name, obs, reward, done, info): try: self._obs[module_name].append(obs) except KeyError: self._obs[module_name] = [obs] self._reward += reward if done: self._done = True try: self._info[module_name].append(info) except KeyError: self._info[module_name] = [info] for key, value in info.items(): try: self._info[key].append(value) except KeyError: pass def balance(self): provided_energy = np.sum(self._info['provided_energy']) absorbed_energy = np.sum(self._info['absorbed_energy']) return provided_energy, absorbed_energy, self._reward, self.shaped_reward() def output(self): return self._obs, self.shaped_reward(), self._done, self._output_info() def shaped_reward(self): if self._reward_shaping_func is not None: assert isinstance(self.cost_info, dict) return self._reward_shaping_func(self._output_info(), self.cost_info) return self._reward def _output_info(self): return {k: v for k, v in self._info.items() if k not in ('absorbed_energy', 'provided_energy')} @property def obs(self): return self._obs @property def reward(self): return self._reward @property def done(self): return self._done @property def info(self): return self._info ================================================ FILE: src/pymgrid/modules/__init__.py ================================================ from .battery_module import BatteryModule from .genset_module import GensetModule from .grid_module import GridModule from .load_module import LoadModule from .renewable_module import RenewableModule from .unbalanced_energy_module import UnbalancedEnergyModule from .module_container import ModuleContainer ================================================ FILE: src/pymgrid/modules/base/__init__.py ================================================ from .base_module import BaseMicrogridModule from .timeseries.base_timeseries_module import BaseTimeSeriesMicrogridModule ================================================ FILE: src/pymgrid/modules/base/base_module.py ================================================ from abc import abstractmethod import inspect import logging import yaml import numpy as np from warnings import warn from pymgrid.utils.logger import ModularLogger from pymgrid.utils.space import ModuleSpace from pymgrid.utils.serialize import add_numpy_pandas_representers, add_numpy_pandas_constructors, dump_data script_logger = logging.getLogger(__name__) class BaseMicrogridModule(yaml.YAMLObject): """ Base class for all microgrid _modules. All values passed to step(self) that result in non-negative """ module_type = None """ Type of the module. Returns : tuple[str, {'fixed', 'flex', 'controllable'}] length-two tuple denoting the name of the module class and whether it is a fixed, flex, or controllable module. """ yaml_tag = None """ Tag used for yaml serialization. """ _energy_pos = 0 def __init__(self, raise_errors, initial_step=0, provided_energy_name='provided_energy', absorbed_energy_name='absorbed_energy' ): self.raise_errors = raise_errors self.initial_step = initial_step self._current_step = initial_step self._action_space = self._get_action_spaces() self._observation_space = self._get_observation_spaces() self.provided_energy_name, self.absorbed_energy_name = provided_energy_name, absorbed_energy_name self._logger = ModularLogger() self.name = (None, None) # set by ModularMicrogrid def _get_action_spaces(self): unnormalized_low = self.min_act if isinstance(self.min_act, np.ndarray) else np.array([self.min_act]) unnormalized_high = self.max_act if isinstance(self.max_act, np.ndarray) else np.array([self.max_act]) return ModuleSpace(unnormalized_low=unnormalized_low, unnormalized_high=unnormalized_high) def _get_observation_spaces(self): unnormalized_low = self.min_obs if isinstance(self.min_obs, np.ndarray) else np.array([self.min_obs]) unnormalized_high = self.max_obs if isinstance(self.max_obs, np.ndarray) else np.array([self.max_obs]) return ModuleSpace(unnormalized_low=unnormalized_low, unnormalized_high=unnormalized_high) def reset(self): """ Reset the module to step zero and flush the log. Returns ------- np.ndarray Normalized observation after resetting. """ self._update_step(reset=True) self._logger.flush() return self.to_normalized(self.state, obs=True) def _raise_error(self, ask_value, available_value, as_source=False, as_sink=False, lower_bound=False): assert as_source + as_sink == 1, 'Must act as either source or sink but not both or neither.' name = self.__class__.__name__ ask_v = round(ask_value, 2) available_v = round(available_value, 2) if as_source: if lower_bound: raise ValueError(f'Module {name} unable to supply requested value {ask_v} as a source. ' f'Must supply at least: {available_v}.') raise ValueError(f'Module {name} unable to supply requested value {ask_v} as a source. ' f'Max currently available: {available_v}.') else: raise ValueError(f'Module {name} unable to absorb requested value {ask_v} as a sink. ' f'Max currently capable of absorbing: {available_v}.') def step(self, action, normalized=True): """ Take one step in the module, attempting to draw or send ``action`` amount of energy. Parameters ---------- action : float or np.ndarray, shape (1,) The amount of energy to draw or send. If ``normalized``, the action is assumed to be normalized and is un-normalized into the range [:attr:`.BaseModule.min_act`, :attr:`.BaseModule.max_act`]. If the **unnormalized** action is positive, the module acts as a source and provides energy to the microgrid. Otherwise, the module acts as a sink and absorbs energy. If the unnormalized action implies acting as a sink and ``is_sink`` is False -- or the converse -- an ``AssertionError`` is raised. normalized : bool, default True Whether ``action`` is normalized. If True, action is assumed to be normalized and is un-normalized into the range [:attr:`.BaseModule.min_act`, :attr:`.BaseModule.max_act`]. Raises ------ AssertionError If action implies acting as a source and module is not a source. Likewise if action implies acting as a sink and module is not a sink. Returns ------- observation : np.ndarray State of the module after taking action ``action``. reward : float Reward/cost after taking the action. done : bool Whether the module terminates. info : dict Additional information from this step. Will include either``provided_energy`` or ``absorbed_energy`` as a key, denoting the amount of energy this module provided to or absorbed from the microgrid. """ denormalized_action = self._action_space.denormalize(action) if normalized else action try: denormalized_action = denormalized_action[self._energy_pos] except (IndexError, TypeError): if not isinstance(denormalized_action, (float, int)): try: flat_dim = np.product(denormalized_action.shape) assert flat_dim == 0 except (AttributeError, AssertionError): raise ValueError(f'Bad action {denormalized_action}') else: denormalized_action = 0.0 state_dict = self.state_dict() reward, done, info = self._unnormalized_step(denormalized_action) self._log(state_dict, reward=reward, **info) self._update_step() obs = self.to_normalized(self.state, obs=True) return obs, reward, done, info def _unnormalized_step(self, unnormalized_action): if unnormalized_action > 0: return self.as_source(unnormalized_action) elif unnormalized_action < 0: return self.as_sink(-1.0*unnormalized_action) else: if self.is_source: return self.as_source(unnormalized_action) else: assert self.is_sink return self.as_sink(-1.0 * unnormalized_action) def as_source(self, energy_demand): """ Act as an energy source to the microgrid. Microgrid will attempt to provide ``energy_demand`` amount of energy. Examples of this include discharging a battery, importing from a grid, or using renewables. It is assumed that ``energy_demand>=0``. Parameters ---------- energy_demand : float Amount of energy that the microgrid is requesting. Must be non-negative. Returns ------- reward : float Reward/cost after attempting the satisfy the energy demand. done : bool Whether the module terminates. info : dict Additional information from this step. Will include``provided_energy`` as a key, denoting the amount of energy this module provided to the microgrid. Raises ------ AssertionError If ``energy_demand<0`` or the module is not a source. """ assert energy_demand >= 0 assert self.is_source, f'step() was called with positive energy (source) for module {self} but ' \ f'module is not a source and ' \ f'can only be called with negative energy.' if self.module_type[-1] == 'fixed': return self.update(None, as_source=True) if energy_demand > self.max_production: if self.raise_errors: self._raise_error(energy_demand, self.max_production, as_source=True) provided_energy = self.max_production elif energy_demand < self.min_production: if self.raise_errors: self._raise_error(energy_demand, self.min_production, as_source=True, lower_bound=True) provided_energy = self.min_production else: provided_energy = energy_demand return self.update(provided_energy, as_source=True) def as_sink(self, energy_excess): """ Act as an energy sink to the microgrid. Microgrid will attempt to provide ``energy_excess`` amount of energy. Examples of this include charging a battery, exporting from a grid, or meeting a load. It is assumed that ``energy_excess>=0``. Parameters ---------- energy_excess : float Amount of energy that the microgrid is attempting to dissipate. Must be non-negative. Returns ------- reward : float Reward/cost after attempting the absorb the energy excess. done : bool Whether the module terminates. info : dict Additional information from this step. Will include``absorbed_energy`` as a key, denoting the amount of energy this module provided to the microgrid. Raises ------ AssertionError If ``energy_excess<0`` or the module is not a sink. """ assert energy_excess >= 0 if self.module_type[-1] == 'fixed': return self.update(None, as_sink=True) if energy_excess > self.max_consumption: if self.raise_errors: self._raise_error(energy_excess, self.max_consumption, as_sink=True) absorbed_energy = self.max_consumption else: absorbed_energy = energy_excess assert absorbed_energy >= 0 return self.update(absorbed_energy, as_sink=True) def _log(self, state_dict_pre_step, provided_energy=None, absorbed_energy=None, **info): _info = info.copy() if self.provided_energy_name is not None: _info[self.provided_energy_name] = provided_energy if provided_energy is not None else 0.0 else: assert provided_energy is None, 'Cannot log provided_energy with NoneType provided_energy_name.' if self.absorbed_energy_name is not None: _info[self.absorbed_energy_name] = absorbed_energy if absorbed_energy is not None else 0.0 else: assert absorbed_energy is None, 'Cannot log absorbed_energy with NoneType absorbed_energy_name.' _info.update(state_dict_pre_step) self._logger.log(**_info) def _update_step(self, reset=False): if reset: self._current_step = self.initial_step else: self._current_step += 1 @abstractmethod def update(self, external_energy_change, as_source=False, as_sink=False): """ Update the state of the module given an energy request. Parameters ---------- external_energy_change : float or None Amount of energy to provide or absorb. as_source : bool Whether the module is acting as a source. as_sink Whether the module is acting as a sink. Returns ------- reward : float Reward/cost after attempting the absorb the energy excess. done : bool Whether the module terminates. info : dict Additional information from this step. Will include``absorbed_energy`` as a key, denoting the amount of energy this module provided to the microgrid. """ pass def sample_action(self, strict_bound=False): """ Sample an action from the module's action space. Parameters ---------- strict_bound : bool, default False If True, choose action that is guaranteed to satisfy self.max_consumption and self.max_production bounds. Otherwise select action from min_act and min_act, which may not satisfy instantaneous bounds. Returns ------- float An action within the action space for this module. """ min_bound, max_bound = 0, 1 if strict_bound: if self.is_sink: min_bound = self._action_space.normalize(-1 * self.max_consumption) if np.isnan(min_bound): min_bound = 0 if self.is_source: max_bound = self._action_space.normalize(self.max_production) if np.isnan(max_bound): max_bound = 0 return np.random.rand()*(max_bound-min_bound) + min_bound def to_normalized(self, value, act=False, obs=False): """ Normalize an action or observation. Parameters ---------- value : scalar or array-like Action or observation to normalize. act : bool, default False Set to True if you are normalizing an action. obs : bool, default False Set to True if you are normalizing an observation. Returns ------- np.ndarray Normalized action. """ assert act + obs == 1, 'One of act or obs must be True but not both.' if act: return self._action_space.normalize(value) else: return self._observation_space.normalize(value) def from_normalized(self, value, act=False, obs=False): """ Un-normalize an action or observation. Parameters ---------- value : scalar or array-like Action or observation to un-normalize. act : bool, default False Set to True if you are un-normalizing an action. obs : bool, default False Set to True if you are un-normalizing an observation. Returns ------- np.ndarray Un-normalized action. """ assert act + obs == 1, 'One of act or obs must be True but not both.' if act: return self._action_space.denormalize(value) if obs: return self._observation_space.denormalize(value) def log_dict(self): """ Module's log as a dict. Returns ------- dict """ return self._logger.to_dict() def log_frame(self): """ Module's log as a DataFrame. Returns ------- log : pd.DataFrame """ return self._logger.to_frame() @property def log(self): """ Module's log as a DataFrame. Equivalent to :meth:`log_frame`. Returns ------- log : pd.DataFrame """ return self.log_frame() @property def logger(self): """ The module's logger. Returns ------- logger : ModularLogger """ return self._logger @property def logger_last(self): """ The most recent entry in the log. Returns ------- entry : dict """ return {k: v[-1] for k, v in self._logger} @logger.setter def logger(self, logger): assert isinstance(logger, ModularLogger) self._logger = logger def state_dict(self, normalized=False): """ Current state of the module as a dictionary. Parameters ---------- normalized : bool, default False Whether to return a dict of normalized values. Returns ------- state_dict : dict """ if normalized: return dict(zip(self.state_dict().keys(), self._observation_space.normalize(self.state))) return self._state_dict() @abstractmethod def _state_dict(self): """ Unnormalized state_dict. Returns ------- state_dict : dict The return value of :meth:`.state_dict` if ``normalized=False``. """ pass @property def state(self): """ Current state of the module as a vector. Equivalent to the values of ``state_dict``. Returns ------- np.ndarray """ return np.array([*self.state_dict().values()]) @property def current_step(self): """ Current step of the module. Returns ------- int """ return self._current_step @current_step.setter def current_step(self, value): self._current_step = value @property @abstractmethod def min_obs(self): """ Minimum observation that the module gives. Used in normalization and to define observation spaces. Returns ------- float or np.ndarray Scalar or vector minimum observation. """ raise NotImplementedError('Must define min_obs (along with the other three bounds) ' 'before calling super().__init__().') @property @abstractmethod def max_obs(self): """ Maximum observation that the module gives. Used in normalization and to define observation spaces. Returns ------- float or np.ndarray Scalar or vector maximum observation. """ raise NotImplementedError('Must define max_obs (along with the other three bounds) ' 'before calling super().__init__().') @property @abstractmethod def min_act(self): """ Minimum action that the module allows. Used in normalization and to define action spaces. Returns ------- float or np.ndarray Scalar or vector minimum action. """ raise NotImplementedError('Must define min_act (along with the other three bounds) ' 'before calling super().__init__().') @property @abstractmethod def max_act(self): """ Maximum action that the module allows. Used in normalization and to define action spaces. Returns ------- float or np.ndarray Scalar or vector maximum action. """ raise NotImplementedError('Must define max_act (along with the other three bounds) ' 'before calling super().__init__().') @property def min_production(self): """ Minimum amount of production at the current time step. In general, this value is zero. Some modules, such as ``GensetModule``, must produce a minimum amount of energy in some cases, and this value will be positive. Must be defined in any child class that is a source. If the module is not a source, this value is irrelevant. Returns ------- float """ return 0 @property def max_production(self): """ Maximum amount of production at the current time step. Must be defined in any child class that is a source. If the module is not a source, this value is irrelevant. Returns ------- float """ return NotImplemented @property def max_consumption(self): """ Maximum amount of consumption at the current time step. Must be defined in any child class that is a sink. If the module is not a sink, this value is irrelevant. Returns ------- float """ return NotImplemented @property def marginal_cost(self): """ Average marginal cost of producing with the module. Returns ------- marginal_cost : float Average marginal cost. """ return self.production_marginal_cost @property def production_marginal_cost(self): return 0.0 @property def absorption_marginal_cost(self): return 0.0 @property def action_space(self): """ Action spaces of the module. Contains both normalized and un-normalized action space. Returns ------- action_space : :class:`ModuleSpace ` The action space. """ return self._action_space @property def observation_space(self): """ Observation space of the module. Contains both normalized and un-normalized observation spaces. Returns ------- observation_space : :class:`ModuleSpace ` The observation space. """ return self._observation_space @property def is_source(self): """ Whether the module is a source. Returns ------- bool """ return False @property def is_sink(self): """ Whether the module is a sink. Returns ------- bool """ return False def dump(self, stream=None): """ Save a module to a YAML buffer. Supports both strings of YAML or storing YAML in a path-like object. Parameters ---------- stream : file-like object or None, default None Stream to save the YAML document. If None, returns the document instead. Returns ------- str or None : Returns the YAMl document as a string if ``stream=None``. Otherwise, returns None. .. note:: ``dump`` handles the serialization of array-like objects (e.g. time series and logs) differently depending on the value of ``stream``. If ``stream is None``, array-like objects are serialized inline. If ``stream`` is a stream to a file-like object, however, array-like objects will be serialized as `.csv.gz` files in a directory relative to ``stream``, and the relative locations stored inline in the YAML file. For an example of this behavior, see `data/scenario/pymgrid25/microgrid_0`. """ return yaml.safe_dump(self, stream=stream) @classmethod def load(cls, stream): """ Load a module from yaml representation. Equivalent to ``yaml.safe_load(stream)``. Parameters ---------- stream : str or file-like object Stream from which to read yaml representation of a module. Returns ------- BaseMicrogridModule or child class of BaseMicrogridModule Deserialized module, populated with the state it possessed upon serialization. """ return yaml.safe_load(stream) @classmethod def from_yaml(cls, loader, node): """ Convert a yaml representation of a module to a module. Part of the ``load`` and equivalently the ``yaml.safe_load`` procedures. Should not be called directly. :meta private: Parameters ---------- loader : yaml.SafeLoader The yaml loader. node : yaml.node.MappingNode yaml node representation of the module. Returns ------- BaseMicrogridModule or child class of BaseMicrogridModule Deserialized module, populated with the state it possessed upon serialization. """ add_numpy_pandas_constructors() mapping = loader.construct_mapping(node, deep=True) instance = cls.deserialize_instance(mapping["cls_params"]) instance.logger = instance.logger.from_raw(mapping.get("log")) instance.name = tuple(mapping["name"]) return instance.deserialize(mapping["state"]) @classmethod def to_yaml(cls, dumper, data): """ Convert a module to a yaml representation node. Part of the ``dump`` and equivalently the ``yaml.safe_dump`` procedures. Should not be called directly. :meta private: Parameters ---------- dumper : yaml.SafeDumper The yaml dumper. data : BaseMicrogridModule or child class of BaseMicrogridModule Module to be serialized Returns ------- yaml.node.MappingNode """ add_numpy_pandas_representers() return dumper.represent_mapping(cls.yaml_tag, data.serialize(dumper.stream), flow_style=cls.yaml_flow_style) def serialize(self, dumper_stream): """ Serialize module. The result is passed to a YAML dumper. :meta private: Parameters ---------- dumper_stream : file-like object or None. The stream that the object will be dumped to. Returns ------- dict The serialized module. """ data = { "name": self.name, "cls_params": self._serialize_cls_params(), "state": self._serialize_state_attributes(), **self._logger.serialize("log") } return dump_data(data, dumper_stream, self.yaml_tag) def serializable_state_attributes(self): """ Return the attributes of the module that represent the module's current state for serialization. :meta private: Returns ------- list[str] List of attribute names. """ return ["_current_step", *self.state_dict().keys()] def _serialize_state_attributes(self): return {attr_name: getattr(self, attr_name) for attr_name in self.serializable_state_attributes()} def _serialize_cls_params(self): serialized_args = {} cls_params = inspect.signature(self.__init__).parameters for p_name in cls_params.keys(): try: serialized_args[p_name] = (getattr(self, p_name)) except AttributeError: raise AttributeError(f"Module {self.__class__.__name__} must have attribute/property '{p_name}' corresponding to " f"class parameter of the same name.") return serialized_args @classmethod def deserialize_instance(cls, param_dict): """ Generate an instance of this module with the arguments in param_dict. Part of the ``load`` and ``yaml.safe_load`` methods. Should not be called directly. :meta private: Parameters ---------- param_dict : dict Class arguments. Returns ------- BaseMicrogridModule or child class of BaseMicrogridModule The module instance. """ param_dict = param_dict.copy() cls_params = inspect.signature(cls).parameters cls_kwargs = {} missing_params, default_params = [], [] for p_name, p_value in cls_params.items(): try: cls_kwargs[p_name] = param_dict.pop(p_name) except KeyError: if p_value.default is p_value.empty: missing_params.append(p_name) else: cls_kwargs[p_name] = p_value.default default_params.append(p_name) if len(default_params): warn(f'Missing parameter values {default_params} for {cls}. Using available default values.') if len(missing_params): raise KeyError(f"Missing parameter values {missing_params} for {cls} with no default values available.") return cls(**cls_kwargs) def deserialize(self, serialized_dict): """ Populate the attributes in ``self.serializable_state_attributes``. Part of the ``load`` and ``yaml.safe_load`` methods. Should not be called directly. :meta private: Parameters ---------- serialized_dict : dict Serialized state attributes Returns ------- BaseMicrogridModule or child of BaseMicrogridModule The module instance. """ serialized_dict = serialized_dict.copy() for attr_name in self.serializable_state_attributes(): if not hasattr(self, attr_name): raise ValueError(f"Key {attr_name} is not an attribute of module {self} and cannot be set.") try: setattr(self, attr_name, serialized_dict.pop(attr_name)) except KeyError: raise KeyError(f"Missing key {attr_name} in deserialized dict.") if len(serialized_dict): warn(f"Unused keys in serialized_dict: {list(serialized_dict.keys())}") return self def __eq__(self, other): if type(self) != type(other): return NotImplemented diff = [(k1, v1, v2) for (k1, v1), (k2, v2) in zip(self.__dict__.items(), other.__dict__.items()) if ((hasattr(v1, "any") and not np.allclose(v1, v2)) or (not hasattr(v1, "any") and v1 != v2))] return len(diff) == 0 def __repr__(self): param_repr = {p: getattr(self, p) for p in inspect.signature(self.__init__).parameters} param_repr = [f'{p}={type(v) if hasattr(v, "__len__") and not isinstance(v, str) else v}' for p, v in param_repr.items()] param_repr = ', '.join(param_repr) return f'{self.__class__.__name__}(' \ f'{param_repr})' ================================================ FILE: src/pymgrid/modules/base/timeseries/__init__.py ================================================ ================================================ FILE: src/pymgrid/modules/base/timeseries/base_timeseries_module.py ================================================ import numpy as np from pymgrid.microgrid import DEFAULT_HORIZON from pymgrid.modules.base import BaseMicrogridModule from pymgrid.forecast.forecaster import get_forecaster, OracleForecaster, NoForecaster class BaseTimeSeriesMicrogridModule(BaseMicrogridModule): state_components = None """ Labels of the components of each entry in the module's time series. Column labels of self.time_series. Returns ------- state_components : np.ndarray[str], shape (self.time_series.shape[1], ) The state components. """ def __init__(self, time_series, raise_errors, forecaster=None, forecast_horizon=DEFAULT_HORIZON, forecaster_increase_uncertainty=False, forecaster_relative_noise=False, initial_step=0, final_step=-1, provided_energy_name='provided_energy', absorbed_energy_name='absorbed_energy', normalize_pos=...): self._time_series = self._set_time_series(time_series) self._min_obs, self._max_obs, self._min_act, self._max_act = self._get_bounds() self.final_step = final_step self._forecast_param = forecaster self._forecast_horizon = forecast_horizon * (forecaster is not None) self._forecaster = get_forecaster(forecaster, self._get_observation_spaces(), forecast_shape=(self.forecast_horizon, len(self.state_components)), time_series=self.time_series[initial_step:self.final_step, :], increase_uncertainty=forecaster_increase_uncertainty, relative_noise=forecaster_relative_noise) self._state_dict_keys = self._set_state_dict_keys() super().__init__(raise_errors, initial_step=initial_step, provided_energy_name=provided_energy_name, absorbed_energy_name=absorbed_energy_name) self._current_forecast = self.forecast() def _set_time_series(self, time_series): _time_series = np.array(time_series) try: shape = (-1, _time_series.shape[1]) except IndexError: shape = (-1, 1) _time_series = _time_series.reshape(shape) assert len(_time_series) == len(time_series) return self._sign_check(_time_series) def _sign_check(self, time_series): if self.is_source and self.is_sink: return time_series if not ((np.sign(time_series) <= 0).all() or (np.sign(time_series) >= 0).all()): raise ValueError('time_series cannot contain both positive and negative values unless it is both ' 'a source and a sink.') if self.is_source: return np.abs(time_series) else: return -np.abs(time_series) def _get_bounds(self): _min, _max = np.min(self._time_series), np.max(self._time_series) if _min > 0: _min = 0 elif _max < 0: _max = 0 return _min, _max, _min, _max def _set_state_dict_keys(self): return { "current": [f"{component}_current" for component in self.state_components], "forecast": [ f"{component}_forecast_{j}" for j in range(self._forecast_horizon) for component in self.state_components ] } def _update_step(self, reset=False): super()._update_step(reset=reset) self._current_forecast = self.forecast() def forecast(self): """ Forecast the module's time series from the current state. Returns ------- forecast : None or np.ndarray, shape (n, len(self.state_components)) The forecasted time series. """ val_c_n = self.time_series[1+self.current_step:1+self.current_step+self.forecast_horizon, :] try: val_c = self.time_series[self.current_step, :] except IndexError: forecast = self._forecaster.full_pad(self.time_series.shape, self._forecast_horizon) else: forecast = self._forecaster(val_c=val_c, val_c_n=val_c_n, n=self.forecast_horizon) return None if forecast is None else forecast def _done(self): return self._current_step >= self._final_step - 1 @property def current_obs(self): """ Current observation. Returns ------- obs : np.ndarray, shape (len(self.state_components), ) The observation. """ try: return self.time_series[self.current_step, :] except IndexError: return self._forecaster.full_pad(self.time_series.shape, 1).reshape(-1) @property def time_series(self): """ View of the module's time series. Returns ------- time_series : np.ndarray, shape (len(self), len(self.state_components)) The underlying time series. """ return self._time_series @time_series.setter def time_series(self, value): self._time_series = self._set_time_series(value) self._min_obs, self._max_obs, self._min_act, self._max_act = self._get_bounds() self._action_space = self._get_action_spaces() self._observation_space = self._get_observation_spaces() @property def min_obs(self): # TODO find a better solution return np.repeat(np.array(self._min_obs).reshape((-1, 1)), 1+self._forecast_horizon, axis=1).T.reshape(-1) @property def max_obs(self): # TODO find a better solution return np.repeat(np.array(self._max_obs).reshape((-1, 1)), 1+self._forecast_horizon, axis=1).T.reshape(-1) @property def min_act(self): return self._min_act @property def max_act(self): return self._max_act @property def forecaster(self): """ View of the forecaster. Returns ------- forecaster : :class:`.Forecaster` The module's forecaster. """ return self._forecaster def set_forecaster(self, forecaster, forecast_horizon=DEFAULT_HORIZON, forecaster_increase_uncertainty=False, forecaster_relative_noise=False): """ Set the forecaster for this module. Sets the forecaster with the same logic as upon initialization. forecaster : callable, float, "oracle", or None, default None. Function that gives a forecast n-steps ahead. * If ``callable``, must take as arguments ``(val_c: float, val_{c+n}: float, n: int)``, where * ``val_c`` is the current value in the time series: ``self.time_series[self.current_step]`` * ``val_{c+n}`` is the value in the time series n steps in the future * n is the number of steps in the future at which we are forecasting. The output ``forecast = forecaster(val_c, val_{c+n}, n)`` must have the same sign as the inputs ``val_c`` and ``val_{c+n}``. * If ``float``, serves as a standard deviation for a mean-zero gaussian noise function that is added to the true value. * If ``"oracle"``, gives a perfect forecast. * If ``None``, no forecast. forecast_horizon : int Number of steps in the future to forecast. If forecaster is None, this parameter is ignored and the resultant horizon will be zero. forecaster_increase_uncertainty : bool, default False Whether to increase uncertainty for farther-out dates if using a GaussianNoiseForecaster. Ignored otherwise. forecaster_relative_noise : bool, default False Whether to define noise standard deviation relative to mean of time series if using :class:`.GaussianNoiseForecaster`. Ignored otherwise. """ self.forecast_horizon = forecast_horizon * (forecaster is not None) self._forecaster = get_forecaster(forecaster, self._observation_space, (self.forecast_horizon, len(self.state_components)), self.time_series[self.initial_step:self._final_step, :], increase_uncertainty=forecaster_increase_uncertainty, relative_noise=forecaster_relative_noise) @property def forecast_horizon(self): """ The number of steps until which the module forecasts. Returns ------- forecast_horizon : int The forecast horizon. """ return self._forecast_horizon @forecast_horizon.setter def forecast_horizon(self, value): self._forecast_horizon = value self._state_dict_keys = self._set_state_dict_keys() self._observation_space = self._get_observation_spaces() if value > 0 and isinstance(self._forecaster, NoForecaster): from warnings import warn warn("Setting forecast_horizon requires a non-null forecaster. Implementing OracleForecaster.") self._forecaster = OracleForecaster(self._observation_space, forecast_shape=(value, len(self.state_components)) ) self._forecaster.observation_space = self._observation_space @property def forecaster_increase_uncertainty(self): """ View of :class:`pymgrid.forecast.GaussianNoiseForecaster``.increase_uncertainty`. Required for serialization as a mirror to the class parameter. Will only ever be True if ``self.forecaster`` is a ``GaussianNoiseForecaster``. Returns ------- forecaster_increase_uncertainty : bool Associated attribute of ``self.forecaster``. """ try: return self._forecaster.increase_uncertainty except AttributeError: return False @property def forecaster_relative_noise(self): """ View of :class:`pymgrid.forecast.GaussianNoiseForecaster``.forecaster_relative_noise`. Required for serialization as a mirror to the class parameter. Will only ever be True if ``self.forecaster`` is a ``GaussianNoiseForecaster``. Returns ------- forecaster_relative_noise : bool Associated attribute of ``self.forecaster``. """ try: return self._forecaster.relative_noise except AttributeError: return False @property def final_step(self): return self._final_step @final_step.setter def final_step(self, value): if not value // 1 == value: raise ValueError('final_step value must be an integer.') if value <= 0: self._final_step = len(self) else: self._final_step = value try: if self._final_step <= self.initial_step: raise ValueError('final_step value must be greater than initial_step') except AttributeError: pass def _state_dict(self): state_dict = dict(zip(self._state_dict_keys['current'], self.current_obs)) if self._current_forecast is not None: state_dict.update(zip(self._state_dict_keys['forecast'], self._current_forecast.reshape(-1))) return state_dict def serialize(self, dumper_stream): data = super().serialize(dumper_stream) data["cls_params"]["forecaster"] = self._forecast_param return data def serializable_state_attributes(self): return ["_current_step"] def __len__(self): return self._time_series.shape[0] ================================================ FILE: src/pymgrid/modules/battery_module.py ================================================ from pymgrid.modules.base import BaseMicrogridModule import numpy as np import yaml from warnings import warn class BatteryModule(BaseMicrogridModule): """ A battery module. Battery modules are fixed: when calling ``Microgrid.run``, you must pass a control for batteries. Parameters ---------- min_capacity : float Minimum energy that must be contained in the battery. max_capacity : float Maximum energy that can be contained in the battery. If ``soc=1``, capacity is at this maximum. max_charge : float Maximum amount the battery can be charged in one step. max_discharge : float Maximum amount the battery can be discharged in one step. efficiency : float Efficiency of the battery. See :meth:`BatteryModule.model_transition` for details. battery_cost_cycle : float, default 0.0 Marginal cost of charging and discharging. battery_transition_model : callable or None, default None Function to model the battery's transition. If None, :meth:`BatteryModule.default_transition_model` is used. .. note:: If you define a battery_transition_model, it must be YAML-serializable if you plan to serialize your battery module or any microgrid containing your battery. For example, you can define it as a class with a ``__call__`` method and ``yaml.YAMLObject`` as its metaclass. See the `PyYAML documentation `_ for details. init_charge : float or None, default None Initial charge of the battery. One of ``init_charge`` or ``init_soc`` must be passed, else an exception is raised. If both are passed, ``init_soc`` is ignored and ``init_charge`` is used. init_soc : float or None, default None Initial state of charge of the battery. One of ``init_charge`` or ``init_soc`` must be passed, else an exception is raised. If both are passed, ``init_soc`` is ignored and ``init_charge`` is used. raise_errors : bool, default False Whether to raise errors if bounds are exceeded in an action. If False, actions are clipped to the limit possible. """ module_type = ('battery', 'controllable') yaml_tag = f"!BatteryModule" yaml_dumper = yaml.SafeDumper yaml_loader = yaml.SafeLoader def __init__(self, min_capacity, max_capacity, max_charge, max_discharge, efficiency, battery_cost_cycle=0.0, battery_transition_model=None, init_charge=None, init_soc=None, initial_step=0, raise_errors=False): assert 0 < efficiency <= 1 self.min_capacity = min_capacity self.max_capacity = max_capacity self.max_charge = max_charge self.max_discharge = max_discharge self.efficiency = efficiency self.battery_transition_model = battery_transition_model self.battery_cost_cycle = battery_cost_cycle self.min_soc, self.max_soc = min_capacity/max_capacity, 1 self.init_charge, self.init_soc = init_charge, init_soc self._current_charge, self._soc = self._init_battery(init_charge, init_soc) self.name = ('battery', None) super().__init__(raise_errors, initial_step=initial_step, provided_energy_name='discharge_amount', absorbed_energy_name='charge_amount') def _init_battery(self, init_charge, init_soc): if init_charge is not None: if init_soc is not None: warn('Passed both init_capacity and init_soc. Using init_charge and ignoring init_soc') init_soc = init_charge / self.max_capacity elif init_soc is not None: init_charge = init_soc * self.max_capacity else: raise ValueError("Must set one of init_charge and init_soc.") return init_charge, init_soc def update(self, external_energy_change, as_source=False, as_sink=False): assert as_source + as_sink == 1, 'Must act as either source or sink but not both or neither.' if as_source: info_key = 'provided_energy' internal_energy_change = self.model_transition(-1.0 * external_energy_change) assert internal_energy_change <= 0 else: info_key = 'absorbed_energy' internal_energy_change = self.model_transition(external_energy_change) assert internal_energy_change >= 0 self._update_state(internal_energy_change) reward = -1.0 * self.get_cost(internal_energy_change) info = {info_key: external_energy_change} return reward, False, info def _update_state(self, energy_change): self._current_charge += energy_change if self._current_charge < self.min_capacity: assert np.isclose(self._current_charge, self.min_capacity) self._current_charge = self.min_capacity self._soc = self._current_charge/self.max_capacity def get_cost(self, energy_change): """ Get the cost of charging or discharging. Parameters ---------- energy_change : float Internal energy change. Returns ------- cost : float Cost of charging or discharging. """ return np.abs(energy_change)*self.battery_cost_cycle def model_transition(self, energy): """ Convert an external energy request to a change in internal energy. This function uses the class argument ``battery_transition_model`` if one was passed. ``battery_transition_model`` must use the following api: .. code-block:: bash internal_energy_change = battery_transition_model( external_energy_change, min_capacity, max_capacity, max_charge, max_discharge, efficiency, battery_cost_cycle, max_production, max_consumption, state_dict ) The return value ``internal_energy_change`` must be a float. See :meth:`transition_kwargs` and :meth:`battery_transition_model` for details on these parameters; all parameters are passed as keyword arguments. Parameters ---------- energy : float External energy change. Returns ------- internal_energy : float Amount of energy that the battery must use or will retain given the external amount of energy. """ if self.battery_transition_model is None: return self.default_transition_model(external_energy_change=energy, **self.transition_kwargs()) return self.battery_transition_model(external_energy_change=energy, **self.transition_kwargs()) def transition_kwargs(self): """ Values passed to transition models. Keys ---- min_capacity : float Minimum energy that must be contained in the battery. max_capacity : float Maximum energy that can be contained in the battery. If ``soc=1``, capacity is at this maximum. max_charge : float Maximum amount the battery can be charged in one step. max_discharge : float Maximum amount the battery can be discharged in one step. efficiency : float Efficiency of the battery. battery_cost_cycle : float Marginal cost of charging and discharging. max_production : float Maximum amount of production, which is the lower of the maximum discharge and the discharge that would send the battery to ``min_capacity``. max_consumption : float Maximum amount of consumption, which is the lower of the maximum charge and the charge that would send the battery to ``max_capacity``. state_dict : dict State dictionary, with state of charge and current capacity information. Returns ------- kwargs : dict Transition keyword arguments. """ return dict(min_capacity=self.min_capacity, max_capacity=self.max_capacity, max_charge=self.max_charge, max_discharge=self.max_discharge, efficiency=self.efficiency, battery_cost_cycle=self.battery_cost_cycle, max_production=self.max_production, max_consumption=self.max_consumption, state_dict=self.state_dict() ) @staticmethod def default_transition_model(external_energy_change, efficiency, **transition_kwargs): """ A simple battery transition model. In this model, the amount of energy retained is given by ``efficiency``. For example, if a microgrid requests 100 kWh of energy and ``efficiency=0.5``, the battery must use 200 kWh of energy. Alternatively, if a microgrid sends a battery 100 kWh of energy and ``efficiency=0.5``, the battery's charge will increase by 50 kWh. Parameters ---------- external_energy_change : float Amount of energy that is being requested externally. If ``energy > 0``, it is energy that is absorbed by the battery -- a charge. If ``energy < 0``, it is energy provided by the battery: a discharge. efficiency : float Battery efficiency. transition_kwargs : dict State transition values given by :meth:`BatteryModule.transition_kwargs`. Returns ------- internal_energy : float Amount of energy that the battery must use or will retain given the external amount of energy. """ if external_energy_change < 0: return external_energy_change / efficiency else: return external_energy_change * efficiency def _state_dict(self): return dict(zip(('soc', 'current_charge'), [self._soc, self._current_charge])) @property def max_production(self): # Max discharge return min(self.max_discharge, self._current_charge-self.min_capacity) * self.efficiency @property def max_consumption(self): # Max charge return min(self.max_charge, self.max_capacity - self._current_charge) / self.efficiency @property def current_charge(self): """ Battery charge. Level of charge of the battery. Returns ------- current_charge : float Charge. """ return self._current_charge @property def soc(self): """ Battery state of charge. Level of charge of the battery relative to its capacity. Returns ------- soc : float State of charge. In the range [0, 1]. """ return self._soc @property def min_obs(self): # Min charge amount, min soc return np.array([self.min_soc, self.min_capacity]) @property def max_obs(self): return np.array([self.max_soc, self.max_capacity]) @property def min_act(self): return -self.max_discharge / self.efficiency @property def max_act(self): return self.max_charge * self.efficiency @property def production_marginal_cost(self): return self.battery_cost_cycle @property def absorption_marginal_cost(self): return self.battery_cost_cycle @property def is_source(self): return True @property def is_sink(self): return True @soc.setter def soc(self, value): self._current_charge, self._soc = self._init_battery(None, value) @current_charge.setter def current_charge(self, value): self._current_charge, self._soc = self._init_battery(value, None) ================================================ FILE: src/pymgrid/modules/genset_module.py ================================================ import yaml import numpy as np from warnings import warn from pymgrid.modules.base import BaseMicrogridModule class GensetModule(BaseMicrogridModule): """ A genset/generator module. This module is a controllable source module; when used as a module in a microgrid, you must pass it an energy production request. Parameters ---------- running_min_production : float Minimum production of the genset when it is running. running_max_production : float Maximum production of the genset when it is running. genset_cost : float or callable * If float, the marginal cost of running the genset: ``total_cost = genset_cost * production``. * If callable, a function that takes the genset production as an argument and returns the genset cost. co2_per_unit : float, default 0.0 Carbon dioxide production per unit energy production. cost_per_unit_co2 : float, default 0.0 Carbon dioxide cost per unit carbon dioxide production. start_up_time : int, default 0 Number of steps it takes to turn on the genset. wind_down_time : int, default 0 Number of steps it takes to turn off the genset. allow_abortion : bool, default True Whether the genset is able to remain shut down while in the process of starting up and vice versa. init_start_up : bool, default True Whether the genset is running upon reset. raise_errors : bool, default False Whether to raise errors if bounds are exceeded in an action. If False, actions are clipped to the limit possible. provided_energy_name : str, default "genset_production" Name of the energy provided by this module, to be used in logging. """ module_type = 'genset', 'controllable' yaml_tag = f"!Genset" yaml_dumper = yaml.SafeDumper yaml_loader = yaml.SafeLoader _energy_pos = 1 def __init__(self, running_min_production, running_max_production, genset_cost, co2_per_unit=0.0, cost_per_unit_co2=0.0, start_up_time=0, wind_down_time=0, allow_abortion=True, init_start_up=True, initial_step=0, raise_errors=False, provided_energy_name='genset_production'): if running_min_production > running_max_production: raise ValueError('parameter min_production must not be greater than parameter max_production.') if not allow_abortion: warn('Gensets that do not allow abortions are not fully tested, setting allow_abortion=False ' 'may lead to unexpected behavior.') self.running_min_production, self.running_max_production = running_min_production, running_max_production self.co2_per_unit, self.cost_per_unit_co2 = co2_per_unit, cost_per_unit_co2 self.genset_cost = genset_cost self.start_up_time = start_up_time self.wind_down_time = wind_down_time self.allow_abortion = allow_abortion self.init_start_up = init_start_up self._current_status, self._goal_status = int(init_start_up), int(init_start_up) self._steps_until_up, self._steps_until_down = self._reset_up_down_times() self.name = ('genset', None) super().__init__(raise_errors, initial_step=initial_step, provided_energy_name=provided_energy_name, absorbed_energy_name=None) def step(self, action, normalized=True): """ Take one step in the module, attempting to draw a certain amount of energy from the genset. Parameters ---------- action : float or np.ndarray, shape (2,) Two-dimensional vector containing two values. The first value is used to passed to :meth:`.GensetModule.update_status` while the second is the amount of energy to draw from the genset. If ``normalized``, the amount of energy is assumed to be normalized and is un-normalized into the range [:attr:`.GensetModule.min_act`, :attr:`.GensetModule.max_act`]. If the **unnormalized** action is positive, the module acts as a source and provides energy to the microgrid. Otherwise, the module acts as a sink and absorbs energy. If the unnormalized action implies acting as a sink and ``is_sink`` is False -- or the converse -- an ``AssertionError`` is raised. .. warning:: The first element in ``action`` is not denormalized before being passed to :meth:`.GensetModule.update_status`, regardless of the value of ``normalized``. normalized : bool, default True Whether ``action`` is normalized. If True, action is assumed to be normalized and is un-normalized into the range [:attr:`.GensetModule.min_act`, :attr:`.GensetModule.max_act`]. Raises ------ AssertionError If action implies acting as a sink, or ``action[0]`` in outside of ``[0, 1]``. Returns ------- observation : np.ndarray State of the module after taking action ``action``. reward : float Reward/cost after taking the action. done : bool Whether the module terminates. info : dict Additional information from this step. Will include either `provided_energy` or `absorbed_energy` as a key, denoting the amount of energy this module provided to or absorbed from the microgrid. """ goal_status = action[0] assert 0 <= goal_status <= 1 self.update_status(goal_status) return super().step(action, normalized=normalized) def get_co2(self, production): """ Carbon dioxide emissions of energy production. Parameters ---------- production : float Energy production. Returns ------- co2 : float Carbon dioxide production. """ return self.co2_per_unit*production def get_co2_cost(self, production): """ Carbon dioxide production cost. Parameters ---------- production : float Energy production. Returns ------- co2_cost : float Carbon dioxide cost. """ return self.cost_per_unit_co2 * self.get_co2(production) def _get_fuel_cost(self, production): if callable(self.genset_cost): return self.genset_cost(production) return self.genset_cost*production def get_cost(self, production): """ Total cost of energy production. Includes both fuel and carbon dioxide costs. Parameters ---------- production : float Energy production. Returns ------- cost : float Total cost. """ return self._get_fuel_cost(production) + self.get_co2_cost(production) def update(self, external_energy_change, as_source=False, as_sink=False): assert as_source, 'This module may only act as a source.' reward = -1.0 * self.get_cost(external_energy_change) info = {'provided_energy': external_energy_change, 'co2_production': self.get_co2(external_energy_change)} return reward, False, info def _reset_up_down_times(self): if self._goal_status != self._current_status: raise RuntimeError('Attempting to reset up and down times with status change in progress.') if self._current_status: self._steps_until_up = 0 self._steps_until_down = self.wind_down_time else: self._steps_until_down = 0 self._steps_until_up = self.start_up_time return self._steps_until_up, self._steps_until_down def _update_up_down_times(self): if self._goal_status == 0: # Turning it off self._steps_until_down -= 1 else: self._steps_until_up -= 1 def update_status(self, goal_status): """ Update the status of the microgrid. The status and goal status are updated, taking into account any in-progress status change as well as ``goal_status``. This method updates the internal properties ``self.current_status``, ``self.goal_status``, ``self.steps_until_up``, and ``self.steps_until_down`` as follows: 1. If ``steps_until_up == 0`` or ``steps_until_down == 0``, the status is changed to on and off, respectively. The following steps are then executed. 2. If ``goal_status == self.current_status == self.goal_status``, the genset is in equilibrium and its status does not change. In this case, one of ``self.steps_until_up``/``self.steps_until_down`` should be zero -- the former if ``self.current_status`` and the latter if not -- and the other should be ``self.start_up_time``/``self.wind_down_time``, respectively. 3. If ``goal_status == self.current_status != self.goal_status``, we are trying to abort a status change. * If ``self.allow_abortion``, the abortion can succeed. ``self.goal_status`` changes to ``goal_status`` and ``steps_until_up``/``steps_until_down`` are reset (one to zero, one to the corresponding ``self.start_up_time``/``self.wind_down_time``). * Otherwise, we proceed with an in-progress status change, and the corresponding ``steps_until_up``/``steps_until_down`` is incremented. This is identical to the case below. 4. If ``goal_status == self.goal_status != self.current_status``, a previously requested status change is being continued, and the corresponding ``steps_until_up``/``steps_until_down`` is incremented. .. note:: Steps 2, 3, and 4 are mutually exclusive, while step 1 is not and will be executed before the relevant step 2, 3 or 4. Parameters ---------- goal_status : float in [0, 1]. Goal status as defined by an external action. Will be rounded to 0 or 1 to define the goal status. """ assert self._steps_until_down >= 0 and self._steps_until_up >= 0 if not 0 <= goal_status <= 1: raise ValueError(f"Invalid goal_status value {goal_status}, must be in [0, 1].") goal_status = round(goal_status) next_prediction = self.next_status(goal_status) if goal_status == self._current_status == self._goal_status: # Everything is hunky-dory assert self._steps_until_down == 0 or self._steps_until_up == 0 return instant_up = self.start_up_time == 0 and goal_status == 1 instant_down = self.wind_down_time == 0 and goal_status == 0 if goal_status != self._goal_status and (self.allow_abortion or instant_up or instant_down): self._goal_status = goal_status finished_change = self._finish_in_progress_change() if not finished_change: self._non_instantaneous_update(goal_status) if not self._current_status == next_prediction: raise ValueError('self.next_status working incorrectly.') def _finish_in_progress_change(self): if self._steps_until_up == 0 and self._goal_status == 1: self._current_status = 1 self._reset_up_down_times() return True elif self._steps_until_down == 0 and self._goal_status == 0: self._current_status = 0 self._reset_up_down_times() return True return False def _instant_up(self): self._goal_status = 1 if not self._current_status: self._current_status = 1 self._reset_up_down_times() def _instant_down(self): self._goal_status = 0 if self._current_status: self._current_status = 0 self._reset_up_down_times() def _non_instantaneous_update(self, goal_status): if (goal_status == self._current_status != self._goal_status) and self.allow_abortion: # First case: aborting an in-progress status change self._goal_status = goal_status self._reset_up_down_times() elif self._current_status == self._goal_status != goal_status: # Second case: new status change request self._reset_up_down_times() self._goal_status = goal_status if self._goal_status != self._current_status: """ Current status is not equal to status goal; thus a status change is in progress and the relevant incrementer should be positive. """ if self._goal_status: assert self._steps_until_up > 0 else: assert self._steps_until_down > 0 self._update_up_down_times() def sample_action(self, strict_bound=False, **kwargs): return np.array([np.random.rand(), super().sample_action(strict_bound=strict_bound)]) def _raise_error(self, ask_value, available_value, as_source=False, as_sink=False, lower_bound=False): try: super()._raise_error(ask_value, available_value, as_source=as_source, as_sink=as_sink, lower_bound=lower_bound) except ValueError as e: if not self._current_status: raise ValueError(f'{e}\n This may be because this genset module is not currently running.') from e else: raise ValueError(f'{e}\n This is despite the fact this genset module is currently running.') from e def next_status(self, goal_status): """ Predict the next status of the genset given a goal status. Does not modify the genset in any way. Parameters ---------- goal_status : {0, 1} Goal status. Returns ------- next_status : {0, 1} The next status given the current status and the goal status. """ if goal_status: if self._current_status: return 1 elif self._steps_until_up == 0: return 1 else: return 0 else: if not self._current_status: return 0 elif self._steps_until_down == 0: return 0 else: return 1 def next_max_production(self, goal_status): """ Maximum production given a goal status. Parameters ---------- goal_status : {0, 1} A goal status. Returns ------- next_max_production : float Maximum production given a goal status. """ return self.next_status(goal_status) * self.running_max_production def next_min_production(self, goal_status): """ Minimum production given a goal status. Parameters ---------- goal_status : {0, 1} A goal status. Returns ------- next_min_production : float Minimum production given a goal status. """ return self.next_status(goal_status) * self.running_min_production def serializable_state_attributes(self): return ["_current_step"] + [f"_{key}" for key in self.state_dict().keys()] def _state_dict(self): return {'current_status': self._current_status, 'goal_status': self._goal_status, 'steps_until_up': self._steps_until_up, 'steps_until_down': self._steps_until_down} @property def current_status(self): """ Status of the genset. On or off. Returns ------- status : {0, 1} Integer value denoting the genset's current status. """ return self._current_status @property def goal_status(self): """ Goal of the genset. Whether the genset is trying to turn -- or keep -- itself on or off. Returns ------- status : {0, 1} Integer value denoting the genset's goal status. """ return self._goal_status @property def max_production(self): """ Maximum amount of production at the current time step. .. warning:: This value is aware of the genset's current status, but does not know if you're planning on turning it off at this step. This consideration is only relevant if ``start_up_time==0`` or ``wind_down_time==0``. Returns ------- max_production : float Current maximum production. """ return self._current_status * self.running_max_production @property def min_production(self): """ Minimum amount of production at the current time step. .. warning:: This value is aware of the genset's current status, but does not know if you're planning on turning it off at this step. This consideration is only relevant if ``start_up_time==0`` or ``wind_down_time==0``. Returns ------- min_production : float Current minimum production. """ return self._current_status * self.running_min_production @property def min_obs(self): return np.array([0, 0, 0, 0]) @property def max_obs(self): return np.array([1, 1, self.start_up_time, self.wind_down_time]) @property def min_act(self): return np.array([0, 0]) @property def max_act(self): return np.array([1, self.running_max_production]) @property def production_marginal_cost(self): return self.get_cost(1.0) @property def is_source(self): return True ================================================ FILE: src/pymgrid/modules/grid_module.py ================================================ import numpy as np import yaml from pymgrid.microgrid import DEFAULT_HORIZON from pymgrid.modules.base import BaseTimeSeriesMicrogridModule class GridModule(BaseTimeSeriesMicrogridModule): """ An electrical grid module. By default, ``GridModule`` is a *fixed* module; it can be transformed to a flex module with ``GridModule.as_flex``. ``GridModule`` is the only built-in module that can be both a fixed and flex module. Parameters ---------- max_import : float Maximum import at any time step. max_export : float Maximum export at any time step. time_series : array-like, shape (n_features, n_steps), n_features = {3, 4} If n_features=3, time series of ``(import_price, export_price, co2_per_kwH)`` in each column, respectively. Grid is assumed to have no outages. If n_features=4, time series of ``(import_price, export_price, co2_per_kwH, grid_status)`` in each column, respectively. ``time_series[:, -1]`` -- the grid status -- must be binary. forecaster : callable, float, "oracle", or None, default None. Function that gives a forecast n-steps ahead. * If ``callable``, must take as arguments ``(val_c: float, val_{c+n}: float, n: int)``, where * ``val_c`` is the current value in the time series: ``self.time_series[self.current_step]`` * ``val_{c+n}`` is the value in the time series n steps in the future * n is the number of steps in the future at which we are forecasting. The output ``forecast = forecaster(val_c, val_{c+n}, n)`` must have the same sign as the inputs ``val_c`` and ``val_{c+n}``. * If ``float``, serves as a standard deviation for a mean-zero gaussian noise function that is added to the true value. * If ``"oracle"``, gives a perfect forecast. * If ``None``, no forecast. forecast_horizon : int. Number of steps in the future to forecast. If forecaster is None, ignored and 0 is returned. forecaster_increase_uncertainty : bool, default False Whether to increase uncertainty for farther-out dates if using a GaussianNoiseForecaster. Ignored otherwise. cost_per_unit_co2 : float, default 0.0 Marginal cost of grid co2 production. raise_errors : bool, default False Whether to raise errors if bounds are exceeded in an action. If False, actions are clipped to the limit possible. """ module_type = ('grid', 'controllable') yaml_tag = u"!GridModule" yaml_loader = yaml.SafeLoader yaml_dumper = yaml.SafeDumper state_components = np.array(['import_price', 'export_price', 'co2_per_kwh', 'grid_status'], dtype=object) def __init__(self, max_import, max_export, time_series, forecaster=None, forecast_horizon=DEFAULT_HORIZON, forecaster_increase_uncertainty=False, forecaster_relative_noise=False, initial_step=0, final_step=-1, cost_per_unit_co2=0.0, raise_errors=False): time_series = self._check_params(max_import, max_export, time_series) self.max_import, self.max_export = max_import, max_export self.cost_per_unit_co2 = cost_per_unit_co2 self.name = ('grid', None) super().__init__( time_series, raise_errors, forecaster=forecaster, forecast_horizon=forecast_horizon, forecaster_increase_uncertainty=forecaster_increase_uncertainty, forecaster_relative_noise=forecaster_relative_noise, initial_step=initial_step, final_step=final_step, provided_energy_name='grid_import', absorbed_energy_name='grid_export' ) def _check_params(self, max_import, max_export, time_series): if max_import < 0: raise ValueError('parameter max_import must be non-negative.') if max_export < 0: raise ValueError('parameter max_export must be non-negative.') if time_series.shape[1] not in [3, 4]: raise ValueError('Time series must be two dimensional with three or four columns.' 'See docstring for details.') if time_series.shape[1] == 4: if not ((np.array(time_series)[:, -1] == 0) | (np.array(time_series)[:, -1] == 1)).all(): raise ValueError("Last column (grid status) must contain binary values.") else: new_ts = np.ones((time_series.shape[0], 4)) new_ts[:, :3] = time_series time_series = new_ts if (time_series < 0).any().any(): raise ValueError('Time series must be non-negative.') return time_series def _get_bounds(self): min_obs = self._time_series.min(axis=0) max_obs = self._time_series.max(axis=0) assert len(min_obs) in (3, 4) min_act, max_act = -1 * self.max_export, self.max_import return min_obs, max_obs, min_act, max_act def update(self, external_energy_change, as_source=False, as_sink=False): assert as_source + as_sink == 1, 'Must act as either source or sink but not both or neither.' reward = self.get_cost(external_energy_change, as_source, as_sink) info_key = 'provided_energy' if as_source else 'absorbed_energy' info = {info_key: external_energy_change, 'co2_production': self.get_co2_production(external_energy_change, as_source, as_sink)} return reward, self._done(), info def get_cost(self, import_export, as_source, as_sink): """ Current cost of the grid's usage. Includes both the cost of importing/exporting as well as the cost of carbon dioxide production. Note that the "cost" of exporting may be negative as the module may receive revenue in exchange for energy export. If the module is exporting to the grid, co2 production cost will be zero. Parameters ---------- import_export : float Amount of energy that is imported or exported. as_source : bool Whether the grid is acting as a source. as_sink : bool Whether the grid is acting as a sink. Returns ------- cost : float Cost of using the grid. """ if as_source: # Import import_cost = self._time_series[self.current_step, 0] return -1 * import_cost*import_export + self.get_co2_cost(import_export, as_source, as_sink) elif as_sink: # Export export_cost = self._time_series[self.current_step, 1] return export_cost * import_export + self.get_co2_cost(import_export, as_source, as_sink) else: raise RuntimeError def get_co2_cost(self, import_export, as_source, as_sink): """ Current cost of the carbon dioxide production of the grid's usage. If the module is exporting to the grid, co2 production cost will be zero. Parameters ---------- import_export : float Amount of energy that is imported or exported. as_source : bool Whether the grid is acting as a source. as_sink : bool Whether the grid is acting as a sink. Returns ------- co2_cost : float Cost of carbon dioxide production. """ return -1.0 * self.cost_per_unit_co2*self.get_co2_production(import_export, as_source, as_sink) def get_co2_production(self, import_export, as_source, as_sink): """ Current carbon dioxide production of the grid's usage. If the module is exporting to the grid, co2 production will be zero. Parameters ---------- import_export : float Amount of energy that is imported or exported. as_source : bool Whether the grid is acting as a source. as_sink : bool Whether the grid is acting as a sink. Returns ------- co2_production : float Carbon dioxide production. """ if as_source: # Import co2_prod_per_kWh = self._time_series[self.current_step, 2] co2 = import_export*co2_prod_per_kWh return co2 elif as_sink: # Export return 0.0 else: raise RuntimeError def as_flex(self): """ Convert the module to a flex module. Flex modules do not require a control to be passed, and are deployed as necessary to balance load and demand. """ self.__class__.module_type = (self.__class__.module_type[0], 'flex') def as_fixed(self): """ Convert the module to a fixed module. Flex modules require a control to be passed. """ self.__class__.module_type = (self.__class__.module_type[0], 'fixed') @property def import_price(self): """ Current and forecasted import prices. Returns ------- prices : np.ndarray, shape (forecast_horizon, ) prices[0] gives the current import price while prices[1:] gives forecasted import prices. """ return self.state[::4] @property def export_price(self): """ Current and forecasted export prices. Returns ------- prices : np.ndarray, shape (forecast_horizon, ) prices[0] gives the current export price while prices[1:] gives forecasted export prices. """ return self.state[1::4] @property def co2_per_kwh(self): """ Current and forecasted carbon dioxide production per kWh. Returns ------- marginal_production : np.ndarray, shape (forecast_horizon, ) marginal_production[0] gives the current production per kWh while marginal_production[1:] gives forecasted production per kWh. """ return self.state[2::4] @property def grid_status(self): """ Current and forecasted grid status. Returns ------- status : np.ndarray, shape (forecast_horizon, ) status[0] gives the current status of the grid while status[1:] gives forecasted status. """ return self.state[3::4] @property def current_status(self): """ Current status of the grid. Returns ------- status : {0, 1} Current status. """ return self.grid_status[0] @property def max_production(self): return self.max_import * self.current_status @property def max_consumption(self): return self.max_export * self.current_status @property def production_marginal_cost(self): return self.import_price[0] @property def absorption_marginal_cost(self): return self.export_price[0] @property def is_source(self): return True @property def is_sink(self): return True @property def weak_grid(self): """ Whether the grid has outages or not. Returns ------- weak_grid : bool True if the grid has outages. """ return self._time_series[:, -1].min() < 1 def __repr__(self): return f'GridModule(max_import={self.max_import}, max_export={self.max_export})' ================================================ FILE: src/pymgrid/modules/load_module.py ================================================ import numpy as np import yaml from pymgrid.microgrid import DEFAULT_HORIZON from pymgrid.modules.base import BaseTimeSeriesMicrogridModule class LoadModule(BaseTimeSeriesMicrogridModule): """ A renewable energy module. The classic examples of renewables are photovoltaics (PV) and wind turbines. Parameters ---------- time_series : array-like, shape (n_steps, ) Time series of load demand. forecaster : callable, float, "oracle", or None, default None. Function that gives a forecast n-steps ahead. * If ``callable``, must take as arguments ``(val_c: float, val_{c+n}: float, n: int)``, where * ``val_c`` is the current value in the time series: ``self.time_series[self.current_step]`` * ``val_{c+n}`` is the value in the time series n steps in the future * n is the number of steps in the future at which we are forecasting. The output ``forecast = forecaster(val_c, val_{c+n}, n)`` must have the same sign as the inputs ``val_c`` and ``val_{c+n}``. * If ``float``, serves as a standard deviation for a mean-zero gaussian noise function that is added to the true value. * If ``"oracle"``, gives a perfect forecast. * If ``None``, no forecast. forecast_horizon : int. Number of steps in the future to forecast. If forecaster is None, ignored and 0 is returned. forecaster_increase_uncertainty : bool, default False Whether to increase uncertainty for farther-out dates if using a GaussianNoiseForecaster. Ignored otherwise.. raise_errors : bool, default False Whether to raise errors if bounds are exceeded in an action. If False, actions are clipped to the limit possible. """ module_type = ('load', 'fixed') yaml_tag = u"!LoadModule" yaml_dumper = yaml.SafeDumper yaml_loader = yaml.SafeLoader state_components = np.array(["load"], dtype=object) def __init__(self, time_series, forecaster=None, forecast_horizon=DEFAULT_HORIZON, forecaster_increase_uncertainty=False, forecaster_relative_noise=False, initial_step=0, final_step=-1, raise_errors=False): super().__init__( time_series, raise_errors=raise_errors, forecaster=forecaster, forecast_horizon=forecast_horizon, forecaster_increase_uncertainty=forecaster_increase_uncertainty, forecaster_relative_noise=forecaster_relative_noise, initial_step=initial_step, final_step=final_step, provided_energy_name=None, absorbed_energy_name='load_met' ) self.name = ('load', None) def _get_bounds(self): _min_obs, _max_obs, _, _ = super()._get_bounds() return _min_obs, _max_obs, np.array([]), np.array([]) def update(self, external_energy_change, as_source=False, as_sink=False): assert as_sink, f'Class {self.__class__.__name__} is a sink.' info = {'absorbed_energy': self.current_load} return 0.0, self._done(), info def sample_action(self, strict_bound=False): return np.array([]) @property def max_consumption(self): return self.current_load @property def current_load(self): """ Current load. Returns ------- load : float Current load demand. """ return -1 * self._time_series[self._current_step].item() @property def is_sink(self): return True ================================================ FILE: src/pymgrid/modules/module_container.py ================================================ import json import pandas as pd from collections import UserDict, UserList from pymgrid.modules.base import BaseMicrogridModule class Container(UserDict): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.dir_additions = self.dir_additions() @property def containers(self): """ View of this container's containers. Returns ------- containers : dict-like View of containers. """ return self def to_list(self): """ Get the modules as a list. Returns ------- l : list of modules List of modules """ l = [] for _, raw_container in self.containers.items(): l.extend(raw_container.to_list()) return l def to_dict(self): """ Get the modules as a dictionary. Returns ------- d : dict[str, list[module]] Dictionary with module names as keys, modules as values. """ d = dict() for k, raw_container in self.containers.items(): d.update(raw_container) return d def to_tuples(self): """ Get the modules in (name, module) pairs. Returns ------- tups : list of tuples: (name, module) Module names and modules. """ l = [] for name, modules in self.iterdict(): tups = list(zip([name] * len(modules), modules)) l.extend(tups) return l def iterlist(self): """ Iterable of the container's modules as a list. Returns ------- iter : generator Iterator of modules. """ for module in self.to_list(): yield module def iterdict(self): """ Iterable of the container's modules as a dict. Returns ------- iter : generator Iterator of (name, module) pairs. """ for name, modules in self.to_dict().items(): yield name, modules def get_attrs(self, *attrs, unique=False, as_pandas=True): """ Get module attributes as a dictionary or pandas object. If ``unique``, checks that the value is unique for all modules and returns only the unique value. Otherwise, returns the values for all modules. If ``as_pandas``, returns either a pd.Series (if ``unique``) or pd.DataFrame of attributes. Parameters ---------- attrs : str Names of module attributes to return. unique : bool, default False Whether to check for and return a single, unique value for an attribute. If different modules have different values, a ``ValueError`` will be raised. as_pandas : bool, default True Whether to return either a pd.Series or pd.DataFrame. If True, the return value will be a pd.Series if ``unique`` and a pd.DataFrame otherwise. If False, returns a dict. .. note:: If only some modules have a particular attribute, ``get_attrs`` will not raise an error. If ``unique``, the unique value of the modules containing the value will be returned. Otherwise, ``NotImplemented`` will fill in missing values. Returns ------- d : dict or pd.DataFrame or pd.Series * Returns dict if ``as_pandas`` is False. * Otherwise, returns a pd.Series if ``unique`` and a pd.DataFrame otherwise. Raises ------ ValueError * If ``attrs`` is empty, or * ``unique`` is True and non-unique values are found. AttributeError If no module has the particular attribute. .. warning:: This check is not performed if both ``unique`` and ``as_pandas`` are False. """ if not attrs: raise ValueError('Missing attrs to get.') d = dict() for k, raw_container in self.containers.items(): d.update({ name: [{attr: getattr(module, attr, NotImplemented) for attr in attrs} for module in module_list] for name, module_list in raw_container.items() }) if not (unique or as_pandas): return d d_df = pd.DataFrame({(name, num): subdict for name, module_list in d.items() for num, subdict in enumerate(module_list)}).T bad_keys = [] uniques, nonuniques = {}, [] for k, v in d_df.items(): not_notimplemented = v[v != NotImplemented] unique_items = not_notimplemented.drop_duplicates().values try: unique_item = unique_items.item() except ValueError: if len(unique_items) == 0: # Only values were NotImplemented bad_keys.append(k) else: nonuniques.append(k) else: uniques[k] = unique_item if len(bad_keys): raise AttributeError(f'No values found for key(s) {bad_keys}') if unique: if len(nonuniques): raise ValueError(f"Attribute(s) {nonuniques} have non-unique values, cannot return single unique value.") if not as_pandas: return uniques return pd.Series(uniques, dtype=None if len(uniques) else float) if as_pandas: return d_df return d def dir_additions(self): """ :meta private: """ additions = set(self.keys()) for x in self.values(): try: additions.update(x.dir_additions) except AttributeError: pass return additions def __getitem__(self, item): if item == 'data' or item == 'module_dict': raise KeyError(item) try: return self.data[item] except KeyError: try: return self.to_dict()[item] except KeyError: raise KeyError(item) def __getattr__(self, item): if item == 'data' or item.startswith('__') or item not in dir(self): raise AttributeError(item) try: return self[item] except KeyError: raise AttributeError(item) def __len__(self): return sum(len(v) for k, v in self.containers.items()) def __repr__(self): try: return json.dumps(self.to_dict(), indent=2, default=str) except TypeError: return super().__repr__() def __dir__(self): rv = set(super().__dir__()) rv = rv | self.dir_additions return sorted(rv) def __contains__(self, item): return item in self.data.keys() or item in self.dir_additions class ModuleContainer(Container): """ Container of modules. Allows for indexing and viewing of a microgrids module's in various ways. """ """ Container of modules. Allows for indexing/getting of the modules in various ways. Modules are stored at the lowest level: self._containers[('fixed', 'source')] = [Genset, Grid], for example. These modules, however, can be accessed in many different ways: container.fixed All fixed modules container.flex All flex modules container.sources ll source modules container.sinks All sink modules container.fixed.sources All fixed source modules container.sources.fixed Same as above container.fixed.sinks All fixed sink modules container.sinks.fixed Same as above Modules can also be accessed directly: container.genset All modules named genset container.big_battery Modules passed with custom name big_battery Each level can be iterated on, both by calling .items() or by iterating through the modules directly with .iterlist() For example, container.sinks.iterlist() returns an iterator of all the sinks, without their names. """ def __init__(self, modules): """ :param modules: list-like. List of _modules or tuples. Latter case: tup(str, Module); str to define name of module and second element is the module. """ self._containers = get_subcontainers(modules) midlevels = self._set_midlevel() self._types_by_name = self._get_types_by_name() super().__init__(**midlevels) def _get_types_by_name(self): return {name: container_type for container_type, container in self._containers.items() for name in container} def _set_midlevel(self): midlevels = dict() for key, subcontainer in self._containers.items(): fixed_or_flex, source_sink_both = key if fixed_or_flex in midlevels: midlevels[fixed_or_flex][source_sink_both] = subcontainer else: midlevels[fixed_or_flex] = {source_sink_both: subcontainer} if source_sink_both in midlevels: midlevels[source_sink_both][fixed_or_flex] = subcontainer else: midlevels[source_sink_both] = {fixed_or_flex: subcontainer} midlevels = {k: Container(**v) for k, v in midlevels.items()} return midlevels def names(self): return list(self._types_by_name.keys()) @property def containers(self): return self._containers class ModuleList(UserList): def item(self): """ Get the value of a singleton list. Returns ------- module : BaseMicrogridModule Item in a singleton list. Raises ------ ValueError : If there is more than one item in the list. """ if len(self) != 1: raise ValueError("Can only convert a ModuleList of length one to a scalar") return self[0] def to_list(self): """ :meta private: Function to be compatible with Container API. """ return self def get_subcontainers(modules): """ :meta private: """ source_sink_keys = ('sources', 'sinks', 'source_and_sinks') fixed = {k: dict() for k in source_sink_keys} flex = {k: dict() for k in source_sink_keys} controllable = {k: dict() for k in source_sink_keys} module_names = dict() for module in modules: try: # module is a tuple module_name, module = module fixed_flex_controllable = module.__class__.module_type[1] except TypeError: # module is a module try: module_name, fixed_flex_controllable = module.__class__.module_type except TypeError: raise NotImplementedError( f'Must define the class attribute module_type for class {module.__class__.__name__}') assert isinstance(module, BaseMicrogridModule), 'Module must inherit from BaseMicrogridModule.' assert module.is_sink or module.is_source, 'Module must be sink or source (or both).' source_sink_both = 'source_and_sinks' if module.is_sink and module.is_source else \ 'sources' if module.is_source else 'sinks' if fixed_flex_controllable == 'fixed': d = fixed elif fixed_flex_controllable == 'flex': d = flex elif fixed_flex_controllable == 'controllable': d = controllable else: raise TypeError(f'Cannot parse fixed_flex_controllable from module type {module.__class__.module_type}') try: module_names[module_name] = (fixed_flex_controllable, source_sink_both) except KeyError: raise NameError( f'Attempted to add module {module_name} of type {(fixed_flex_controllable, source_sink_both)}, ' f'but there is an identically named module of type {module_names[module_name]}.') try: d[source_sink_both][module_name].append(module) except KeyError: d[source_sink_both][module_name] = ModuleList([module]) module.name = (module_name, len(d[source_sink_both][module_name]) - 1) modules_dict = dict(fixed=fixed, flex=flex, controllable=controllable) containers = {(ffs, source_sink_both): Container(modules_dict[ffs][source_sink_both]) for ffs in ('fixed', 'flex', 'controllable') for source_sink_both in source_sink_keys} return containers ================================================ FILE: src/pymgrid/modules/renewable_module.py ================================================ import numpy as np import yaml from pymgrid.microgrid import DEFAULT_HORIZON from pymgrid.modules.base import BaseTimeSeriesMicrogridModule class RenewableModule(BaseTimeSeriesMicrogridModule): """ A renewable energy module. The classic examples of renewables are photovoltaics (PV) and wind turbines. Parameters ---------- time_series : array-like, shape (n_steps, ) Time series of renewable production. forecaster : callable, float, "oracle", or None, default None. Function that gives a forecast n-steps ahead. * If ``callable``, must take as arguments ``(val_c: float, val_{c+n}: float, n: int)``, where * ``val_c`` is the current value in the time series: ``self.time_series[self.current_step]`` * ``val_{c+n}`` is the value in the time series n steps in the future * n is the number of steps in the future at which we are forecasting. The output ``forecast = forecaster(val_c, val_{c+n}, n)`` must have the same sign as the inputs ``val_c`` and ``val_{c+n}``. * If ``float``, serves as a standard deviation for a mean-zero gaussian noise function that is added to the true value. * If ``"oracle"``, gives a perfect forecast. * If ``None``, no forecast. forecast_horizon : int. Number of steps in the future to forecast. If forecaster is None, ignored and 0 is returned. forecaster_increase_uncertainty : bool, default False Whether to increase uncertainty for farther-out dates if using a GaussianNoiseForecaster. Ignored otherwise. provided_energy_name: str, default "renewable_used" Name of the energy provided by this module, to be used in logging. raise_errors : bool, default False Whether to raise errors if bounds are exceeded in an action. If False, actions are clipped to the limit possible. """ module_type = ('renewable', 'flex') yaml_tag = u"!RenewableModule" yaml_loader = yaml.SafeLoader yaml_dumper = yaml.SafeDumper state_components = np.array(["renewable"], dtype=object) def __init__(self, time_series, raise_errors=False, forecaster=None, forecast_horizon=DEFAULT_HORIZON, forecaster_increase_uncertainty=False, forecaster_relative_noise=False, initial_step=0, final_step=-1, provided_energy_name='renewable_used'): super().__init__( time_series, raise_errors, forecaster=forecaster, forecast_horizon=forecast_horizon, forecaster_increase_uncertainty=forecaster_increase_uncertainty, forecaster_relative_noise=forecaster_relative_noise, initial_step=initial_step, final_step=final_step, provided_energy_name=provided_energy_name, absorbed_energy_name=None ) self.name = ('renewable', None) def update(self, external_energy_change, as_source=False, as_sink=False): assert as_source, f'Class {self.__class__.__name__} can only be used as a source.' assert external_energy_change <= self.current_renewable, f'Cannot provide more than {self.current_renewable}' info = {'provided_energy': external_energy_change, 'curtailment': self.current_renewable-external_energy_change} return 0.0, self._done(), info @property def max_production(self): return self.current_renewable @property def current_renewable(self): """ Current renewable production. Returns ------- renewable : float Renewable production. """ return self._time_series[self._current_step].item() @property def is_source(self): return True ================================================ FILE: src/pymgrid/modules/unbalanced_energy_module.py ================================================ import numpy as np import yaml from pymgrid.modules.base import BaseMicrogridModule class UnbalancedEnergyModule(BaseMicrogridModule): module_type = ('balancing', 'flex') yaml_tag = u"!UnbalancedEnergyModule" yaml_dumper = yaml.SafeDumper yaml_loader = yaml.SafeLoader def __init__(self, raise_errors, initial_step=0, loss_load_cost=10, overgeneration_cost=2.0 ): super().__init__(raise_errors, initial_step=initial_step, provided_energy_name='loss_load', absorbed_energy_name='overgeneration') self.loss_load_cost, self.overgeneration_cost = loss_load_cost, overgeneration_cost self.name = ('unbalanced_energy', None) def update(self, external_energy_change, as_source=False, as_sink=False): assert as_source + as_sink == 1, 'Must act as either source or sink but not both or neither.' info_key = 'provided_energy' if as_source else 'absorbed_energy' reward = -1.0 * self.get_cost(external_energy_change, as_source, as_sink) assert reward <= 0 info = {info_key: external_energy_change} return reward, False, info def get_cost(self, energy_amount, as_source, as_sink): """ Get the cost of unmet load or excess production. Parameters ---------- energy_amount : float>=0 Amount of unmet load or excess production. as_source : bool Whether the energy is unmet load. as_sink : bool Whether the energy is excess production. Returns ------- cost : float Raises ------ TypeError If both as_source and as_sink are True or neither are. """ if as_source and as_sink: raise TypeError("as_source and as_sink cannot both be True.") if as_source: # loss load return self.loss_load_cost*energy_amount elif as_sink: return self.overgeneration_cost*energy_amount else: raise TypeError("One of as_source or as_sink must be True.") def _state_dict(self): return dict() @property def state(self): return np.array([]) @property def min_obs(self): return np.array([]) @property def max_obs(self): return np.array([]) @property def min_act(self): return -np.inf @property def max_act(self): return np.inf @property def max_production(self): return np.inf @property def max_consumption(self): return np.inf @property def is_source(self): return True @property def is_sink(self): return True @property def production_marginal_cost(self): return self.loss_load_cost @property def absorption_marginal_cost(self): return self.overgeneration_cost ================================================ FILE: src/pymgrid/utils/DataGenerator.py ================================================ """ Copyright 2020 Total S.A. Authors:Gonzague Henri , Avishai Halev <> Permission to use, modify, and distribute this software is given under the terms of the pymgrid License. NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Date: 2020/08/27 08:04 $ Gonzague Henri """ """ Copyright (C) <2020> This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . """ import sys import unittest import pandas as pd import numpy as np from matplotlib import pyplot as plt from scipy.interpolate import interp1d import statsmodels.regression.quantile_regression as quantile_regression from IPython.display import display def return_underlying_data(microgrid): """ Returns the pv, load, and grid data from the microgrid in the same format as samples. :param microgrid, pymgrid.Microgrid.Microgrid microgrid to reformat underlying data for :return: data: pd.DataFrame, shape (8760,3) DataFrame with columns 'pv', 'load', 'grid', values of these respectively at each timestep. """ pv_data = microgrid._pv_ts load_data = microgrid._load_ts pv_data = pv_data[pv_data.columns[0]] load_data = load_data[load_data.columns[0]] pv_data.name = 'pv' load_data.name = 'load' if microgrid.architecture['grid'] != 0: grid_data = microgrid._grid_status_ts if isinstance(grid_data, pd.DataFrame): grid_data = grid_data[grid_data.columns[0]] grid_data.name = 'grid' elif isinstance(grid_data, pd.Series): grid_data.name = 'grid' else: raise RuntimeError('Unable to handle microgrid._grid_status_ts of type {}.'.format(type(grid_data))) else: grid_data = pd.Series(data=[0] * len(microgrid._load_ts), index=pv_data.index, name='grid') return pd.concat([pv_data, load_data, grid_data], axis=1) class NoisyPVData: def __init__(self, pv_data = None,file_name = None): if pv_data is not None: if isinstance(pv_data,pd.Series): self.unmunged_data = pv_data.to_frame() self.data = pv_data.to_frame() elif not isinstance(pv_data, pd.DataFrame): raise TypeError('known_data must be of type pd.DataFrame or pd.Series, is ({})'.format(type(pv_data))) else: self.unmunged_data = pv_data.copy() self.data = pv_data.copy() elif file_name is not None: self.data, self.unmunged_data = self.import_file(file_name) else: raise RuntimeError('Unable to initialize data') self.num_hours = len(self.data) self.munged = False self.interpolated = False self.daily_maxes = None self.feature_functions = None self.feature_names = None self.interpolated_coef = None self.parabolic_baseline = None self.distribution_bounds = None def import_file(self,file_name): return pd.read_csv(file_name), pd.read_csv(file_name) def data_munge(self, verbose=False): # Get column name of pv values if len(self.data.columns.values)!=1: print('Warning multiple columns in pv_data, attempting to use \'GH illum (lx)\' as column name') col_name = 'GH illum (lx)' else: col_name = self.data.columns[0] hours = [j % 24 for j in range(self.num_hours)] day = [int(np.floor(j / 24)) for j in range(self.num_hours)] self.data['hour'] = pd.Series(data=hours) self.data['day'] = pd.Series(data=day) self.data = self.data.pivot(index='hour', columns='day', values=col_name) indices_of_max = self.data.idxmax(axis=0) maxes = self.data.max(axis=0) indices_of_max.name = 'time_of_max' maxes.name = 'max_GHI' self.daily_maxes = pd.concat([indices_of_max, maxes], axis=1) self.daily_maxes['cumulative_hr'] = self.daily_maxes['time_of_max'] + self.daily_maxes.index.values * 24 self.munged = True if verbose: print('Munging completed.') print(self.data.describe()) print(self.daily_maxes.describe()) def _add_feature_columns(self, num_feature_functions=1, period_scale=1., ): feature_names = [] feature_funcs = {} if not self.munged: raise RuntimeError('Data must be munged before adding feature columns or curve interpolation. ' 'Call data_munge first') name = 'ones' self.daily_maxes[name] = pd.Series(data = [1.0]*len(self.daily_maxes['cumulative_hr'])) def f(x): if isinstance(x, int) or isinstance(x, float): return 1.0 else: return pd.Series(data=[1.0] * len(x)) feature_names.append(name) feature_funcs[name] = f for k in range(num_feature_functions): if k % 2 == 0: num = int(np.floor((k + 2) / 2)) name = 'cos' + str(num) + 'x' self.daily_maxes[name] = np.cos( 2 * num * np.pi / 8760. * period_scale * (self.daily_maxes['cumulative_hr'] - 173 * 24)) def f(x): return np.cos(2 * num * np.pi / 8760. * period_scale * (x - 173 * 24)) assert all((f(self.daily_maxes['cumulative_hr']) == self.daily_maxes[name])), \ 'Function declaration failed' elif k % 2 == 1: num = int(np.floor((k + 1) / 2)) name = 'sin' + str(num) + 'x' self.daily_maxes[name] = np.sin( 2 * num * np.pi / 8760. * period_scale * (self.daily_maxes['cumulative_hr'] - 173 * 24)) def f(x): return np.sin(2 * num * np.pi / 8760. * period_scale * (x - 173 * 24)) else: raise RuntimeError('Should not be here') feature_funcs[name] = f feature_names.append(name) for name in feature_names: assert all((feature_funcs[name](self.daily_maxes['cumulative_hr']) == self.daily_maxes[name])), \ 'Something wrong with feature functions' self.feature_functions = feature_funcs self.feature_names = feature_names def max_min_curve_interpolate(self, num_feature_functions=1, percentile=0.8, plot_curve=False, use_preset_params = True, params = 'sf'): """ Interpolates the upper bound curve using cos/sin features so that at least percentile points are below the curve """ sf_presets = {'period_scale': 0.8, 'q_max': 0.9, 'q_min': 0.25} houston_presets = {'period_scale':0.8, 'q_max': 0.9, 'q_min':0.05} presets = {'sf' : sf_presets, 'houston' : houston_presets} if use_preset_params: if params in presets.keys(): parameters = presets[params] period_scale = parameters['period_scale'] q_max = parameters['q_max'] q_min = parameters['q_min'] else: raise NameError('If use_preset_params is True, params must be one of {\'sf\',\'houston\' ' 'denoting preset parameters') else: if not isinstance(params,dict): raise TypeError('params must be a dict of parameters, not ({})'.format(params)) period_scale = params['period_scale'] q_max = params['q_max'] q_min = params['q_min'] if not (1.0 >= percentile >= 0.0): raise ValueError('percentile must be in [0,1], is ({})'.format(percentile)) self._add_feature_columns(num_feature_functions=num_feature_functions, period_scale=period_scale) x_vars = self.daily_maxes[self.feature_names] quantile_reg_model = quantile_regression.QuantReg(self.daily_maxes['max_GHI'], x_vars) results = quantile_reg_model.fit(q=q_max) max_coef = results.params max_curve = max_coef['ones']*x_vars['ones'] for p_name in self.feature_names: if p_name == 'ones': continue else: max_curve+=max_coef[p_name]*x_vars[p_name] results = quantile_reg_model.fit(q=q_min) min_coef = results.params min_curve = min_coef['ones'] * x_vars['ones'] for p_name in self.feature_names: if p_name == 'ones': continue else: min_curve += min_coef[p_name] * x_vars[p_name] if plot_curve: plt.scatter(self.daily_maxes['cumulative_hr']/24, self.daily_maxes['max_GHI'], color='r', marker='.') plt.plot(self.daily_maxes['cumulative_hr']/24, max_curve, label='{}th percentile'.format(int(100 * q_max))) plt.plot(self.daily_maxes['cumulative_hr']/24, min_curve, color='k', label='{}th percentile'.format(int(100 * q_min))) plt.xlabel('Day') plt.legend() plt.title('Maximum daily PV upper/lower bounds') plt.show() self.interpolated_coef = {'max': max_coef, 'min': min_coef} self.interpolated = True def most_light_curve_eval(self, max_min, cumulative_hours=None, day_hour_pairs=None): """ Evaluates the interpolated upper bound curve at the time values in val """ to_return = [] if max_min =='max': interpolated_coef = self.interpolated_coef['max'] elif max_min == 'min': interpolated_coef = self.interpolated_coef['min'] else: raise ValueError('max_min must be one of \'max\' or \'min\', is {}',format(max_min)) if cumulative_hours is not None: try: cumul_times = pd.Series(data=cumulative_hours) y = pd.Series(data=[0] * len(cumul_times), name='Upper Bound Values') except TypeError: cumul_times = cumulative_hours y = interpolated_coef['ones'] for j, name in enumerate(self.feature_names): feature_function = self.feature_functions[name] y += interpolated_coef[name] * feature_function(cumul_times) if len(y) == 1: y = y[0] to_return.append(y) if day_hour_pairs is not None: cumul_times = [] for pair in day_hour_pairs: if len(pair) != 2: raise ValueError('pairs must be array-like of length two, containing days and hours') if pair[1] < 0 or pair[1] >= 24: raise ValueError('hour must be in [0,23], is ({})'.format(pair[1])) cumul_times.append(pair[0] * 24 + pair[1]) x = pd.Series(data=cumul_times) y_pairs = pd.Series(data=[0] * len(cumul_times), name='Upper Bound Values') for j, name in enumerate(self.feature_names): feature_function = self.feature_functions[name] y_pairs += interpolated_coef[name] * feature_function(x) if len(y_pairs) == 1: y_pairs = y_pairs[0] to_return.append(y_pairs) if len(to_return) == 1: to_return = to_return[0] return to_return def _sample_parabola(self,noise_type, noise_parameters, verbose, push_peak_val=False, push_peak_ratio=0.5): noisy_data = self.data.copy() # Columns are days, index is hours # Need three points for interpolation: two zeros # Get points for each day: lower_distribution_bounds = [] upper_distribution_bounds = [] for day in noisy_data.columns: if noisy_data[day][0] != 0: raise RuntimeError('It appears that it is sunny at midnight of day ({}). No good.'.format(day)) if noisy_data[day][23] != 0: raise RuntimeError('It appears that it is sunny at 11PM of day ({}). No good.'.format(day)) night_hours = np.where(noisy_data[day] == 0)[0] next_night_hours = np.roll(night_hours, -1) index_of_dawn = np.where(night_hours + 1 != next_night_hours)[0][0] dawn_time = night_hours[index_of_dawn] # Gives a zero: (dawn_time,0) dusk_time = night_hours[index_of_dawn + 1] # Another zero: (dusk_time,0) # time_of_most_light = self.daily_maxes.loc[day, 'time_of_max'] time_of_most_light = (dawn_time + dusk_time) / 2.0 interpolated_least_light = self.most_light_curve_eval(max_min='min', day_hour_pairs=((day, time_of_most_light),)) interpolated_most_light = self.most_light_curve_eval(max_min='max', day_hour_pairs=((day, time_of_most_light),)) # Check if these bounds are negative. if interpolated_least_light<0: if interpolated_most_light<0: # This is dumb, but it flips the negative bounds most_light = -min(interpolated_least_light, interpolated_most_light) least_light = -max(interpolated_least_light, interpolated_most_light) interpolated_most_light = most_light interpolated_least_light = least_light else: interpolated_least_light = 0 lower_b = interpolated_least_light upper_b = interpolated_most_light spread = upper_b - lower_b if noise_type == 'uniform': low = lower_b + noise_parameters['lower'] * spread high = upper_b + (noise_parameters['upper'] - 1) * spread lower_distribution_bounds.append(low) upper_distribution_bounds.append(high) peak_val = np.random.uniform(low=low, high=high) if verbose: print('Day {}'.format(day)) print('Using uniform distribution between {} and {}'.format(round(low, 1), round(high, 1))) print('Unscaled bounds: [{},{}]'.format(round(lower_b, 1), round(upper_b, 1))) print('Selected daily peak value {}'.format(peak_val)) elif noise_type == 'triangular': low = lower_b + noise_parameters['lower'] * spread high = upper_b + (noise_parameters['upper'] - 1) * spread if 'mode' in noise_parameters.keys(): mode_param = noise_parameters['mode'] if not 0 <= mode_param <= 1: raise ValueError( 'mode parameter ({}) invalid, must be scale value in [0,1]'.format(mode_param)) mode = spread * mode_param + lower_b assert high >= mode >= low, 'mode computation did not work' else: mode = 0.5 * (lower_b + upper_b) lower_distribution_bounds.append(low) upper_distribution_bounds.append(high) peak_val = np.random.triangular(left=low, mode=mode, right=high) if verbose: print('Day {}'.format(day)) print('using triangular distribution with low {}, mode {}, high {}'.format( round(low, 1), round(mode, 1), round(high, 1))) print('Unscaled bounds: [{},{}]'.format(round(lower_b, 1), round(upper_b, 1))) print('Selected daily peak value {}'.format(peak_val)) else: raise RuntimeError('Fell through in noise_types, unable to recognize ({})'.format(noise_type)) if push_peak_val: peak_val = peak_val+push_peak_ratio*(self.daily_maxes.loc[day, 'max_GHI']-peak_val) daytime_x = np.array([dawn_time, time_of_most_light, dusk_time]) daytime_y = np.array([0, peak_val, 0]) if any(np.diff(daytime_x) <= 0): raise RuntimeError('Something is wrong in interpolating daily curves, ' 'have dawn/peak/dusk times as ({}), not in order'.format(daytime_x)) # Interpolate that f = interp1d(daytime_x, daytime_y, kind='quadratic', bounds_error=False, fill_value=0) noisy_data[day] = f(noisy_data.index) self.parabolic_baseline = noisy_data.copy() self.distribution_bounds = (lower_distribution_bounds, upper_distribution_bounds) return noisy_data, lower_distribution_bounds, upper_distribution_bounds def sample(self, noise_types=('uniform', 'gaussian'), noise_params=({'lower': 0, 'upper': 1}, {'std_ratio': 0.05}), return_stacked_data = True, plot_noisy=False, days_to_plot=(0, 10), verbose=False, push_peak_val=False, push_peak_ratio=0.5, push_individual_vals=False, push_individual_ratio=0.5, **kwargs ): # TODO add param to push peak toward actual peak potential_noises = {0: (None, 'uniform', 'triangular'), 1: (None, 'gaussian')} noise_parameters = ({'lower': 0, 'upper': 1, 'mode':0.5}, {'std_ratio': 0.05}) for j, noise in enumerate(noise_types): if noise not in potential_noises[j]: raise ValueError('Noise ({}) not recognized in position ({}), must be one of {}'.format( noise, j, potential_noises[j])) if not self.munged: self.data_munge() if not self.interpolated: self.max_min_curve_interpolate() if not self.interpolated: raise RuntimeError('Must have an interpolating curve before adding noise. ' 'Call max_min_curve_interpolate first.') if len(noise_params) != 2: raise TypeError('Unable to parse noise_params, must be array-like length 2') for j, v in enumerate(noise_params): if v is not None and not isinstance(v, dict): raise TypeError('Element ({}) in noise_params must be None or dict, is {}'.format(j, type(v))) elif v is not None: for key in noise_parameters[j].keys(): if key in v.keys(): noise_parameters[j][key] = v[key] if noise_types[0] is None: if self.parabolic_baseline is None: raise ValueError('noise_types[0] is None, but there is no stored baseline') else: noisy_data = self.parabolic_baseline.copy() lower_distribution_bounds, upper_distribution_bounds = self.distribution_bounds else: noisy_data, lower_distribution_bounds, \ upper_distribution_bounds = self._sample_parabola(noise_types[0], noise_parameters[0], verbose, push_peak_val=push_peak_val, push_peak_ratio=push_peak_ratio) if noise_types[1] == 'gaussian': noisy_data += np.random.normal(scale=noise_parameters[1]['std_ratio'] * noisy_data) if plot_noisy or return_stacked_data: stacked_data = noisy_data.transpose().stack() stacked_data = stacked_data.reset_index() stacked_data = stacked_data.drop(columns=['hour', 'day']) assert len(stacked_data.columns)==1, 'stacked data should only have one column here' for name in stacked_data.columns: stacked_data.rename(columns={name:'pv'},inplace=True) if plot_noisy: if 'plot_ub_lb' in kwargs.keys() and kwargs['plot_ub_lb']: plot_upper_lower_bounds=True else: plot_upper_lower_bounds=False if 'plot_points_of_dist' in kwargs.keys() and kwargs['plot_points_of_dist']: plot_points_of_distribution = True else: plot_points_of_distribution = False self.plot(stacked_data, days_to_plot=days_to_plot, plot_original=True, plot_upper_lower_bounds=plot_upper_lower_bounds, plot_points_of_distribution=plot_points_of_distribution) if return_stacked_data: stacked_data = self._check_sample(stacked_data, verbose=verbose) if push_individual_vals: stacked_data['pv'] += push_individual_ratio*(self.unmunged_data['GH illum (lx)']-stacked_data['pv']) return stacked_data return noisy_data def _check_sample(self, stacked_data, verbose=False): temp_data = stacked_data.copy() temp_data = temp_data.squeeze() if not isinstance(temp_data, pd.Series): raise ValueError('stacked_data needs to be a series or a single column DataFrame, has shape {}'.format( stacked_data.shape)) negative_indices = temp_data < 0 if negative_indices.sum() > 0 and verbose: print('Found {} negative values in pv_data sample, forcing them to be 0'.format( negative_indices.sum())) value = 0 temp_data.loc[negative_indices] = value assert (temp_data >= 0).all(), 'There are still negative numbers in temp_data when checking sample of pv_data' if isinstance(stacked_data, pd.Series): return temp_data elif isinstance(stacked_data, pd.DataFrame): new_stacked_data = stacked_data.copy() new_stacked_data[new_stacked_data.columns[0]] = temp_data return new_stacked_data def plot(self, stacked_data, days_to_plot=(0,10), plot_sample=True, plot_original=True, plot_upper_lower_bounds=True, plot_points_of_distribution=False, plot_daily_maxes=False, plot_parabolas=False, month_xticks=False): if isinstance(stacked_data, pd.DataFrame): stacked_data = stacked_data.squeeze() if not isinstance(stacked_data, pd.Series): if plot_sample: print('Warning: stacked_data is an arbitrary sample. Must be pd.Series to plot passed stacked_data, is ' '{}'.format((type(stacked_data)))) stacked_data = self.sample() indices = slice(24 * days_to_plot[0], 24 * days_to_plot[1]) daily_slice = slice(*days_to_plot) if plot_sample: plt.plot(stacked_data[indices].index, stacked_data[indices].values, label='Sample') if plot_original: plt.plot(stacked_data[indices].index, self.unmunged_data[indices].values, label='Original') if plot_upper_lower_bounds: plt.plot(stacked_data[indices].index, self.most_light_curve_eval('max', cumulative_hours=stacked_data[indices].index), color='k', label='Parabola distribution UB') plt.plot(stacked_data[indices].index, self.most_light_curve_eval('min', cumulative_hours=stacked_data[indices].index), color='c', label='Parabola distribution LB') if plot_points_of_distribution: if self.distribution_bounds is None: raise RuntimeError('Could not find distribution bounds, must call \'sample\' at least once to plot') else: lower_distribution_bounds, upper_distribution_bounds = self.distribution_bounds plt.scatter(self.daily_maxes['cumulative_hr'].iloc[daily_slice], lower_distribution_bounds[daily_slice], marker='.', color='r') plt.scatter(self.daily_maxes['cumulative_hr'].iloc[daily_slice], upper_distribution_bounds[daily_slice], marker='.', color='r') if plot_daily_maxes: plt.scatter(self.daily_maxes['cumulative_hr'].iloc[daily_slice],self.daily_maxes['max_GHI'].iloc[daily_slice], marker='.', color='r', label='Underlying daily max pv') if plot_parabolas: parabolas = self.parabolic_baseline.transpose().stack().squeeze() print(parabolas) plt.plot(stacked_data[indices].index, parabolas.iloc[indices],color='c',label='Parabolic Baseline') if month_xticks: print(plt.xticks()) locs = [j*30*24 for j in range(13) if j*12>=days_to_plot[0] and j*12<=days_to_plot[1]] ticks = [j for j in range(13) if j*12>=days_to_plot[0] and j*12<=days_to_plot[1]] print(locs) print(ticks) plt.xticks(locs, ticks) plt.xlabel('Month') plt.ylabel('PV') plt.legend(loc='lower right') plt.savefig('daily max distribution.png', bbox_inches='tight') plt.show() class NoisyLoadData: def __init__(self, load_data=None, file_name=None): if load_data is not None: if isinstance(load_data,pd.Series): self.unmunged_data = load_data.to_frame() self.data = load_data.to_frame() elif not isinstance(load_data, pd.DataFrame): raise TypeError('known_data must be of type pd.DataFrame or pd.Series, is ({})'.format(type(load_data))) else: self.unmunged_data = load_data.copy() self.data = load_data.copy() elif file_name is not None: self.data, self.unmunged_data = self._import_file(file_name) else: raise RuntimeError('Unable to initialize data, either load_data or file_name must not be None') # Cut load data to the correct size self.data = self.data.iloc[:8760] self.unmunged_data = self.unmunged_data.iloc[:8760] self.num_hours = len(load_data) self.munged = False self.interpolated = False def _import_file(self, file_name): return pd.read_csv(file_name), pd.read_csv(file_name) def data_munge(self, verbose=False): # Get column name of pv values if len(self.data.columns.values)!=1: print('Warning multiple columns in load_data, attempting to use \'Electricity:Facility [kW](Hourly)\' as column name') col_name = 'Electricity:Facility [kW](Hourly)' else: col_name = self.data.columns[0] hours = [j % 24 for j in range(self.num_hours)] day = [int(np.floor(j / 24)) for j in range(self.num_hours)] self.data['hour'] = pd.Series(data=hours) self.data['day'] = pd.Series(data=day) self.data = self.data.pivot(index='day', columns='hour', values=col_name) self.data['day_of_week'] = self.data.index % 7 self.load_mean = self.data.groupby(['day_of_week']).mean() self.load_std = self.data.groupby(['day_of_week']).std().fillna(value=0) self.munged = True def sample(self, distribution='gaussian', load_variance_scale=1., return_stacked = True, verbose=False, **kwargs): if not self.munged: self.data_munge() possible_distributions = ('gaussian',) if distribution not in possible_distributions: raise ValueError( 'distribution {} not recognized, must be one of ({})'.format(distribution, possible_distributions)) if distribution == 'gaussian': copied_mean = self.data.copy() copied_mean = copied_mean.set_index([copied_mean.index, 'day_of_week']) copied_std = copied_mean.copy() for ind in copied_mean.index: copied_mean.loc[ind] = self.load_mean.loc[ind[1]] copied_std.loc[ind] = self.load_std.loc[ind[1]] else: raise RuntimeError('Unsupported') data_sample = pd.DataFrame(data=np.random.normal(loc=copied_mean, scale=load_variance_scale * copied_std), index=self.data.index, columns=self.data.columns[:-1]) if return_stacked: stacked_data = data_sample.stack() stacked_data = stacked_data.reset_index() stacked_data = stacked_data.drop(columns=['day', 'hour']) assert len(stacked_data.columns) == 1, 'stacked data should only have one column here' for name in stacked_data.columns: stacked_data.rename(columns={name: 'load'}, inplace=True) stacked_data = self._check_sample(stacked_data, verbose=verbose) return stacked_data return data_sample def _check_sample(self,stacked_data,verbose=False): temp_data = stacked_data.copy() temp_data = temp_data.squeeze() if not isinstance(temp_data,pd.Series): raise ValueError('stacked_data needs to be a series or a single column DataFrame, has shape {}'.format(stacked_data.shape)) negative_indices = temp_data < 0 if negative_indices.sum() > 0 and verbose: print('Found {} negative values in load_data, forcing them to be min of underlying data'.format(negative_indices.sum())) value = self.unmunged_data.min().squeeze() temp_data.loc[negative_indices] = value assert (temp_data>=0).all(), 'There are still negative numbers in temp_data when checking load_data sample' if isinstance(stacked_data, pd.Series): return temp_data elif isinstance(stacked_data, pd.DataFrame): new_stacked_data = stacked_data.copy() new_stacked_data[new_stacked_data.columns[0]] = temp_data return new_stacked_data def plot(self, sample, days_to_plot=(0, 10)): if not sample.shape[1]==1: raise ValueError('sample must be in stacked form') plt.plot(sample[24 * days_to_plot[0]:24 * days_to_plot[1]].values, label='sample') plt.plot(self.unmunged_data[24 * days_to_plot[0]:24 * days_to_plot[1]].values, label='original') plt.title('Load Sample') plt.legend() plt.show() class NoisyGridData: def __init__(self,grid_data,dist_type = 'markov'): if not (isinstance(grid_data,pd.DataFrame) or isinstance(grid_data,pd.Series)): raise TypeError('grid_data must be of type pd.DataFrame, is {}'.format(type(grid_data))) if not ((grid_data==1) | (grid_data==0)).all().item(): raise ValueError('Non-binary values found in grid_data') possible_dist_types = ('naive','markov') if dist_type not in possible_dist_types: raise TypeError('dist type ({}) not recognized, must be one of {}'.format(dist_type, possible_dist_types)) self.dist_type = dist_type self.data = grid_data.copy() self.unmunged_data = grid_data.copy() self.has_distribution = False self.transition_prob_matrix = None self.occurrences = None def learn_distribution(self): if self.dist_type == 'naive': transition_prob_matrix = np.zeros(2) probability_of_one = self.data.mean() transition_prob_matrix[0] = 1-probability_of_one transition_prob_matrix[1] = probability_of_one elif self.dist_type == 'markov': grid_vals = self.data.values transition_prob_matrix = np.zeros((2, 2)) occurrences = np.zeros(2) for j, val in enumerate(grid_vals): if j < len(grid_vals) - 1: # One less than length b/c we are counting transitions transition_prob_matrix[int(val), int(grid_vals[j + 1])] += 1 occurrences[int(val)] += 1 if occurrences[0] > 0: transition_prob_matrix[0, :] /= occurrences[0] else: transition_prob_matrix[0, 0] = 1 if occurrences[1] > 0: transition_prob_matrix[1, :] /= occurrences[1] else: transition_prob_matrix[1, 1] = 1 self.occurrences = occurrences assert all([np.sum(transition_prob_matrix[j, :]) == 1 for j in range(2)]), \ 'transition prob matrix invalid: {}'.format(transition_prob_matrix) else: raise RuntimeError('Should not be here') self.transition_prob_matrix = transition_prob_matrix self.has_distribution = True def sample(self): if not self.has_distribution: self.learn_distribution() if self.dist_type =='naive': generated_sample = np.random.choice([0, 1], size = len(self.data), p=self.transition_prob_matrix) generated_sample = pd.Series(data=generated_sample, name='grid') elif self.dist_type == 'markov': generated_sample = np.zeros(len(self.data)) probs = self.occurrences/np.sum(self.occurrences) generated_sample[0] = np.random.choice([0,1], p=probs) for j in range(1,len(self.data)): probs = self.transition_prob_matrix[int(generated_sample[j-1]),:] generated_sample[j] = np.random.choice([0,1], p=probs) generated_sample = pd.Series(data=generated_sample, name='grid') else: raise RuntimeError('Should not be here') return generated_sample class SampleGenerator: def __init__(self, microgrid, **forecast_args): self.microgrid = microgrid self.NPV = NoisyPVData(pv_data=self.microgrid._pv_ts) self.NL = NoisyLoadData(load_data=self.microgrid._load_ts) if self.microgrid.architecture['grid'] != 0: self.NG = NoisyGridData(grid_data=self.microgrid._grid_status_ts) else: self.NG = None self.underlying_data = return_underlying_data(self.microgrid) self.forecasts = self.create_forecasts(**forecast_args) self.samples = None def create_forecasts(self, pv_args=None, load_args=None, preset_to_use=None, print_mape=False, **forecast_args): """ Creates pv, load, and grid forecasts that are then used to create samples. :return: df, pd.DataFrame, shape (8760,3) DataFrame with columns of 'pv', 'load', and 'grid', containing values for each at all 8760 timesteps """ if pv_args is None and load_args is None and preset_to_use is not None: print('Using preset forecast arguments') args = ForecastArgSet(preset_to_use=preset_to_use) pv_args = args['pv_args'] load_args = args['load_args'] else: if pv_args is None: pv_args = dict() if load_args is None: load_args = dict() pv_forecast = self.NPV.sample(**pv_args) load_forecast = self.NL.sample(**load_args) if self.microgrid.architecture['grid'] != 0: grid_forecast = self.NG.sample() else: grid_forecast = pd.Series(data=[0] * len(self.microgrid._load_ts), name='grid') forecast = pd.concat([pv_forecast, load_forecast, grid_forecast], axis=1) if print_mape: mape = self.validate_forecasts(forecasts=forecast, aggregate=True) print('MAPE: {}'.format(mape)) if hasattr(self, 'forecasts'): self.forecasts = forecast else: return forecast def test_args(self, iters_per_set = 3): num_pv_noise_params_0 = 3 num_pv_std_ratio = 3 num_load_variance_scale = 3 max_load_var_scale = 2. max_pv_std_ratio = 0.5 num_push_peak_ratio = 3 num_push_individual_ratio = 3 forecast_args = ForecastArgs(num_pv_noise_params_0, num_pv_std_ratio, num_load_variance_scale, num_push_peak_ratio, num_push_individual_ratio, max_load_var_scale=max_load_var_scale, max_pv_std_ratio=max_pv_std_ratio) for j, arg_set in enumerate(forecast_args.param_sets): for k in range(iters_per_set): print('iter {}.{}'.format(j, k)) forecasts = self.create_forecasts(**arg_set) mape = self.validate_forecasts(forecasts, aggregate=True) arg_set.update_with_mape(mape) return forecast_args def validate_forecasts(self, forecasts=None, aggregate=False): if forecasts is None: forecasts = self.forecasts mape_vals = dict() for col in ('pv', 'load'): mape_vals[col] = self.mape(self.underlying_data[col], forecasts[col]) if aggregate: return np.sqrt(np.mean(np.array(list(mape_vals.values()))**2)) return mape_vals def mape(self, actual_vals, forecast_vals): if isinstance(actual_vals.squeeze(), pd.Series): actual_vals = actual_vals.to_numpy() elif isinstance(actual_vals, np.ndarray): pass else: raise TypeError('actual_vals must be squeezable to single column, has shape {}'.format(actual_vals.shape)) if isinstance(forecast_vals.squeeze(), pd.Series): forecast_vals = forecast_vals.to_numpy() elif isinstance(forecast_vals, np.ndarray): pass else: raise TypeError('forecast_vals must be squeezable to single column, has shape {}'.format(forecast_vals.shape)) ratios = np.abs(((actual_vals-forecast_vals)/actual_vals)) mape = np.mean(ratios[~np.isnan(ratios)]) return mape def sample_from_forecasts(self, n_samples=10, **sampling_args): """ Generates samples of load, grid, pv data by sampling from the distributions defined by using self.forecasts as a baseline in NoisyLoadData, NoisyPVData, NoisyGridData. :param n_samples: int, default 100 Number of samples to generate :param sampling_args: dict Sampling arguments to be passed to NPV.sample() and NL.sample() :return: samples: list of pd.DataFrame of shape (8760,3) list of samples created from sampling from distributions defined in forecasts. """ NPV = self.NPV NL = NoisyLoadData(load_data=self.forecasts['load']) NG = NoisyGridData(grid_data=self.forecasts['grid']) samples = [] if 'noise_types' not in sampling_args.keys(): sampling_args['noise_types'] = (None, 'gaussian') for j in range(n_samples): print('Creating sample {}'.format(j)) pv_forecast = NPV.sample(**sampling_args) load_forecast = NL.sample(**sampling_args) grid_forecast = NG.sample() sample = pd.concat([pv_forecast, load_forecast, grid_forecast], axis=1) truncated_index = min(len(NPV.unmunged_data), len(NL.unmunged_data), len(NG.unmunged_data)) sample = sample.iloc[:truncated_index] samples.append(sample) self.samples = samples return samples def plot(self, var='load', days_to_plot=(0, 10), original=True, forecast=True, samples=True): """ Function to plot the load, pv, or grid data versus the forecast or original data :param var: str, default 'load' one of 'load', 'pv', 'grid', which variable to plot :param days_to_plot: tuple, len 2. default (0,10) defines the days to plot. Plots all hours from days_to_plot[0] to days_to_plot[1] :param original: bool, default True whether to plot the underlying microgrid data :param forecast: bool, default True whether to plot the forecast stored in self.forecast :param samples: bool, default True whether to plot the samples stored in self.samples :return: None """ if var not in self.forecasts.columns: raise ValueError('Cound not find var {} in self.forecasts, should be one of {}'.format(var, self.forecasts.columns)) indices = slice(24 * days_to_plot[0], 24 * days_to_plot[1]) if original: plt.plot(self.underlying_data.loc[indices, var].index, self.underlying_data.loc[indices, var].values, label='original', color='b') if forecast: plt.plot(self.forecasts.loc[indices, var].index, self.forecasts.loc[indices, var].values, label='forecast', color='r') if samples: for sample in self.samples: plt.plot(sample.loc[indices, var].index, sample.loc[indices, var].values, color='k') plt.legend() plt.show() class ForecastArgSet(dict): def __init__(self, pv_param_set=None, load_param_set=None, preset_to_use=None): if pv_param_set is None and load_param_set is None and preset_to_use is not None: saved_dict = self.get_preset(preset_to_use) super(ForecastArgSet, self).__init__(saved_dict) elif pv_param_set is not None and load_param_set is not None and preset_to_use is None: super(ForecastArgSet, self).__init__(pv_args=pv_param_set, load_args=load_param_set) else: raise KeyError('Unable to parse inputs') self.mape_vals = [] self.mape_mean = None self.mape_std = None def update_with_mape(self, mape): self.mape_vals.append(mape) self.mape_mean = np.mean(self.mape_vals) self.mape_std = np.std(self.mape_vals) def get_preset(self,forecast_accuracy=50): potential_forecast_accuracies = (50, 70, 85) if forecast_accuracy not in potential_forecast_accuracies: raise ValueError('do not have relevant sampling parameters for forecast accuracy {}, must be one of {}'.format( forecast_accuracy, potential_forecast_accuracies)) if forecast_accuracy == 50: return {'pv_args': {'noise_params': ({'lower': 0.0, 'upper': 0.5}, {'std_ratio': 0.25}), 'push_peak_val': True, 'push_peak_ratio': 0.0, 'push_individual_vals': True, 'push_individual_ratio': 0.5}, 'load_args': {'load_variance_scale': 2.0}} if forecast_accuracy == 70: return {'pv_args': {'noise_params': ({'lower': 0.0, 'upper': 0.5}, {'std_ratio': 0.25}), 'push_peak_val': True, 'push_peak_ratio': 0.0, 'push_individual_vals': True, 'push_individual_ratio': 0.65}, 'load_args': {'load_variance_scale': 2.0}} elif forecast_accuracy == 85: return {'pv_args': {'noise_params': ({'lower': 0.0, 'upper': 0.5}, {'std_ratio': 0.25}), 'push_peak_val': True, 'push_peak_ratio': 0.0, 'push_individual_vals': True, 'push_individual_ratio': 1.0}, 'load_args': {'load_variance_scale': 2.0}} def __eq__(self, other): if type(self) != type(other): return NotImplemented return self.mape_mean == other.mape_mean def __lt__(self, other): if type(self) != type(other): return NotImplemented return self.mape_mean < other.mape_mean def __gt__(self, other): if type(self) != type(other): return NotImplemented return self.mape_mean > other.mape_mean class ForecastArgs: def __init__(self, num_pv_noise_params_0, num_pv_std_ratio, num_load_variance_scale, num_push_peak_ratio, num_push_individual_ratio, max_load_var_scale=2., max_pv_std_ratio=0.5): pv_params = self.pv_parameters(num_pv_noise_params_0, num_pv_std_ratio, num_push_peak_ratio, num_push_individual_ratio, max_std_ratio=max_pv_std_ratio) load_params = self.load_parameters(num_load_variance_scale, max_load_var_scale=max_load_var_scale) self.param_sets = self.combine_sets(pv_params, load_params) def pv_parameters(self,num_noise_params_0, num_std_ratio, num_push_peak_ratio, num_push_individual_ratio, max_std_ratio=0.5): pv_params = [] for individual_ratio in np.linspace(0,1,num_push_individual_ratio): for peak_ratio in np.linspace(0,1,num_push_peak_ratio): for std_ratio in np.linspace(0,max_std_ratio, num_std_ratio): for lower in np.linspace(0,1,num_noise_params_0): for upper in np.linspace(1,lower,num_noise_params_0): if upper >= lower: pv_params.append(dict(noise_params=(dict(lower=lower, upper=upper), dict(std_ratio=std_ratio)), push_peak_val=True, push_peak_ratio=peak_ratio, push_individual_vals=True, push_individual_ratio=individual_ratio)) else: print('upper not geq lower') return pv_params def load_parameters(self,num_load_variance_scale, max_load_var_scale=2.): load_params = [] for var_scale in np.linspace(0,max_load_var_scale,num_load_variance_scale): load_params.append(dict(load_variance_scale=var_scale)) return load_params def combine_sets(self, pv_params, load_params): sets = [] for pv_param in pv_params: for load_param in load_params: sets.append(ForecastArgSet(pv_param_set = pv_param, load_param_set = load_param)) return sets ================================================ FILE: src/pymgrid/utils/__init__.py ================================================ from .serialize import add_pymgrid_yaml_representers ================================================ FILE: src/pymgrid/utils/logger.py ================================================ from collections import UserDict import numpy as np import pandas as pd class ModularLogger(UserDict): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._log_length = max(len(v) for _, v in self.items()) if len(self.data) else 0 def flush(self): d = self.data.copy() self.clear() self._log_length = 0 return d def log(self, **log_dict): for key, value in log_dict.items(): try: self[key].append(value.item()) except AttributeError: self[key].append(value) except KeyError: self[key] = [np.nan]*self._log_length self[key].append(value) self._log_length += 1 def to_dict(self): return self.data.copy() def raw(self): return {k: list(map(float, v)) for k, v in self.data.items()} def to_frame(self): return pd.DataFrame(self.data) def serialize(self, key): return {key: self.to_frame()} if len(self) > 0 else {} def __len__(self): return self._log_length @classmethod def from_raw(cls, raw): if raw is None: return cls() elif isinstance(raw, str): raw = pd.read_csv(raw).to_dict() return cls(raw) ================================================ FILE: src/pymgrid/utils/ray.py ================================================ import functools from copy import copy def ray_decorator(func): """ ray raises an error when assigning values after ray.get to variables defined before ray.get. Easiest solution is to copy the values and try again. :meta private: """ @functools.wraps(func) def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except ValueError as e: if 'assignment destination is read-only' not in e.args[0]: raise else: return func(*(copy(a) for a in args), **{k: copy(v) for k, v in kwargs.items()}) return wrapper ================================================ FILE: src/pymgrid/utils/serialize.py ================================================ import numpy as np import pandas as pd import yaml from pathlib import Path TO_CSV_TYPES = np.ndarray, pd.core.generic.NDFrame def add_pymgrid_yaml_representers(): add_numpy_pandas_representers() from pymgrid.microgrid.trajectory import ( DeterministicTrajectory, StochasticTrajectory, FixedLengthStochasticTrajectory ) from pymgrid.microgrid.reward_shaping import ( PVCurtailmentShaper, BatteryDischargeShaper ) def dump_data(data_dict, stream, yaml_tag): if not hasattr(stream, "name"): return data_dict path = Path(stream.name).parent / "data" return add_path_to_arr_like(data_dict, path, yaml_tag) def add_path_to_arr_like(data_dict, path, yaml_tag): for key, value in data_dict.items(): if isinstance(value, dict): data_dict[key] = add_path_to_arr_like(value, path / key, yaml_tag) elif isinstance(value, TO_CSV_TYPES): if isinstance(value, np.ndarray): value = NDArraySubclass(value) value.path = path / f'{yaml_tag.lstrip("!")}/{key}.csv.gz' data_dict[key] = value return data_dict def add_numpy_pandas_representers(): yaml.SafeDumper.add_representer(pd.DataFrame, _pandas_df_representer) yaml.SafeDumper.add_multi_representer(np.ndarray, _numpy_arr_representer) yaml.SafeDumper.add_multi_representer(np.floating, _numpy_represent_floating) yaml.SafeDumper.add_multi_representer(np.integer, _numpy_represent_int) def add_numpy_pandas_constructors(): yaml.SafeLoader.add_constructor('!NDArray', _numpy_arr_constructor) yaml.SafeLoader.add_constructor('!DataFrame', _pandas_df_constructor) def _numpy_represent_floating(dumper, data): return dumper.represent_float(data.item()) def _numpy_represent_int(dumper, data): return dumper.represent_int(data.item()) def _numpy_arr_representer(dumper, data): return _arr_representer(dumper, data, 'NDArray') def _pandas_df_representer(dumper, data): return _arr_representer(dumper, data, 'DataFrame') def _arr_representer(dumper, data, r_type): if hasattr(data, "path"): rel_path = _dump_representation(data, data.path, Path(dumper.stream.name).parent) return dumper.represent_scalar(f'!{r_type}', rel_path) try: return dumper.represent_mapping(f'!{r_type}', data.to_dict()) except AttributeError: return dumper.represent_sequence(f'!{r_type}', data.tolist()) def _dump_representation(data, path, stream_loc): if not path.exists(): path.parent.mkdir(parents=True, exist_ok=True) pd.DataFrame(data).to_csv(path) return str(path.relative_to(stream_loc)) def _pandas_df_constructor(loader, node): if isinstance(node, yaml.MappingNode): return pd.DataFrame(loader.construct_mapping(node)) data_path = Path(loader.construct_scalar(node)) if not data_path.is_absolute(): try: stream_name = loader.stream.name except AttributeError: raise ValueError(f"Path {data_path} must be absolute if yaml stream has no 'name'.") data_path = Path(stream_name).parent / data_path return pd.read_csv(data_path, index_col=0) def _numpy_arr_constructor(loader, node): if isinstance(node, yaml.SequenceNode): return np.array(loader.construct_sequence(node)) return _pandas_df_constructor(loader, node).values class NDArraySubclass(np.ndarray): """ A simple python class that allows a 'path' attribute for serialization. `path` may be lost if object is manipulated. """ def __new__(cls, input_array, path=None): obj = np.asarray(input_array).view(cls) obj.path = path return obj def __array_finalize__(self, obj): if obj is None: return self.path = getattr(obj, 'path', None) ================================================ FILE: src/pymgrid/utils/space.py ================================================ import operator import numpy as np import warnings from abc import abstractmethod from gym.spaces import Box, Dict, Space, Tuple from typing import Union class _PymgridDict(Dict): def __init__(self, d, act_or_obs, normalized=False, seed=None): builtins = self._extract_builtins(d, act_or_obs=act_or_obs, normalized=normalized) try: super().__init__(builtins, seed=seed) except AssertionError: import gym warnings.warn(f"gym.Space does not accept argument 'seed' in version {gym.__version__}; this argument will " f"be ignored. Upgrade your gym version with 'pip install -U gym' to use this functionality.") super().__init__(builtins.spaces) def _extract_builtins(self, d, act_or_obs='act', normalized=False): if act_or_obs == 'act': spaces = self._extract_action_spaces(d) elif act_or_obs == 'obs': spaces = self._extract_observation_spaces(d) else: raise NameError(act_or_obs) return self._transform_builtins(spaces, normalized=normalized) def _extract_action_spaces(self, d): controllable = {} for module_name, module_list in d.items(): controllable_spaces = [v['action_space'] for v in module_list if 'controllable' in v['module_type']] if controllable_spaces: controllable[module_name] = controllable_spaces return controllable def _extract_observation_spaces(self, d): obs_spaces = {} for module_name, module_list in d.items(): spaces = [v['observation_space'] for v in module_list] if spaces: obs_spaces[module_name] = spaces return obs_spaces def _transform_builtins(self, d, normalized=False): space_key = 'normalized' if normalized else 'unnormalized' transformed = {} if isinstance(d, dict): transformed = {} for k, v in d.items(): if isinstance(v, Space): transformed[k] = v[space_key] else: transformed[k] = self._transform_builtins(v, normalized=normalized) transformed = Dict(transformed) elif isinstance(d, list): transformed = [] for v in d: if isinstance(v, Space): transformed.append(v[space_key]) else: transformed.append(self._transform_builtins(v, normalized=normalized)) transformed = Tuple(transformed) return transformed def get_attr(self, attr): return {k: [getattr(v, attr) for v in tup] for k, tup in self.items()} @property def low(self): return self.get_attr('low') @property def high(self): return self.get_attr('high') @property def shape(self): return self.get_attr('shape') @shape.setter def shape(self, value): """ Necessary for compatability with gym<0.21. """ assert value is None def __getattr__(self, item): """ Necessary for compatability with gym<0.21, where gym.spaces.Dict did not inherit from collections.Mapping. """ if item == 'spaces': raise AttributeError('spaces') try: return getattr(self.spaces, item) except AttributeError: raise AttributeError(item) class _PymgridSpace(Space): _unnormalized: Union[Box, _PymgridDict] _normalized: Union[Box, _PymgridDict] _spread: Union[np.ndarray, dict] def contains(self, x): """ Check if `x` is a valid member of the space. .. note:: This method checks if `x` is a valid member of the space. Use :meth:`.ModuleSpace.normalized.contains` to check if a value is a member of the normalized space. Parameters ---------- x : scalar or array-like Value to check membership. Returns ------- containment : bool Whether `x` is a valid member of the space. """ return x in self._unnormalized def sample(self, normalized=False): if normalized: return self._normalized.sample() return self._unnormalized.sample() def _shape_check(self, val, func): low = self._unnormalized.low if hasattr(val, '__len__') and len(val) != len(low): raise TypeError(f'Unable to {func} value of length {len(val)}, expected {len(low)}') elif isinstance(val, (int, float)) and len(low) != 1: raise TypeError(f'Unable to {func} scalar value, expected array-like of shape {len(low)}') @abstractmethod def normalize(self, val): pass @abstractmethod def denormalize(self, val): pass @property def normalized(self): return self._normalized @property def unnormalized(self): return self._unnormalized def __getitem__(self, item): if item == 'normalized': return self._normalized elif item == 'unnormalized': return self._unnormalized raise KeyError(item) def __repr__(self): return f'ModuleSpace{repr(self._unnormalized).replace("Box", "")}' def __eq__(self, other): if type(self) != type(other): return NotImplemented return self.unnormalized == other.unnormalized class ModuleSpace(_PymgridSpace): def __init__(self, unnormalized_low, unnormalized_high, shape=None, dtype=np.float64, seed=None): low = np.float64(unnormalized_low) if np.isscalar(unnormalized_low) else unnormalized_low.astype(np.float64) high = np.float64(unnormalized_high) if np.isscalar(unnormalized_high) else unnormalized_high.astype(np.float64) self._unnormalized = Box(low=low, high=high, shape=shape, dtype=dtype) self._normalized = Box(low=0, high=1, shape=self._unnormalized.shape, dtype=dtype) try: super().__init__(shape=self._unnormalized.shape, dtype=self._unnormalized.dtype, seed=seed) except TypeError: super().__init__(shape=self._unnormalized.shape, dtype=self._unnormalized.dtype) import gym warnings.warn(f"gym.Space does not accept argument 'seed' in version {gym.__version__}; this argument will " f"be ignored. Upgrade your gym version with 'pip install -U gym' to use this functionality.") self._spread = self._unnormalized.high - self._unnormalized.low self._spread[self._spread == 0] = 1 def normalize(self, val): low, high = self._unnormalized.low, self._unnormalized.high self._shape_check(val, 'normalize') self._bounds_check(val, low, high) normalized = (val - low) / self._spread try: return normalized.item() except (AttributeError, ValueError): return normalized def denormalize(self, val): low, high = self._unnormalized.low, self._unnormalized.high self._shape_check(val, 'denormalize') self._bounds_check(val, 0, 1) denormalized = low + self._spread * val try: return denormalized.item() except (AttributeError, ValueError): return denormalized def _bounds_check(self, val, low, high): array_like_check = hasattr(val, '__len__') and \ not (all((low <= val) & (val <= high)) or np.allclose(val, low) or np.allclose(val, high)) scalar_check = not hasattr(val, '__len__') and not low <= val <= high if array_like_check or scalar_check: warnings.warn(f'Value {val} resides out of expected bounds of value to be normalized: [{low}, {high}].') class MicrogridSpace(_PymgridSpace): def __init__(self, module_space_dict, act_or_obs, seed=None): self._unnormalized = _PymgridDict(module_space_dict, act_or_obs) self._normalized = _PymgridDict(module_space_dict, act_or_obs, normalized=True) try: super().__init__(shape=None, seed=seed) except TypeError: super().__init__(shape=None) import gym warnings.warn(f"gym.Space does not accept argument 'seed' in version {gym.__version__}; this argument will " f"be ignored. Upgrade your gym version with 'pip install -U gym' to use this functionality.") self._spread = self._get_spread() def _get_spread(self): spread = {} for k, high_list in self._unnormalized.high.items(): low_list = self._unnormalized.low[k] s = [h-l for h, l in zip(high_list, low_list)] for s_val in s: s_val[s_val == 0] = 1 spread[k] = s return spread def normalize(self, val): low, high = self._unnormalized.low, self._unnormalized.high self._shape_check(val, 'normalize') val_minus_low = self.dict_op(val, low, operator.sub) normalized = self.dict_op(val_minus_low, self._spread, operator.truediv) # normalized = (val - low) / self._spread return normalized def denormalize(self, val): low, high = self._unnormalized.low, self._unnormalized.high self._shape_check(val, 'denormalize') val_times_spread = self.dict_op(val, self._spread, operator.mul) denormalized = self.dict_op(val_times_spread, low, operator.add) return denormalized @staticmethod def dict_op(first, second, op): out = {} for k, first_list in first.items(): second_list = second[k] out[k] = [op(f, s) for f, s in zip(first_list, second_list)] return out ================================================ FILE: src/pymgrid/version.py ================================================ __version__ = '1.2.2' ================================================ FILE: tests/__init__.py ================================================ ================================================ FILE: tests/conftest.py ================================================ ================================================ FILE: tests/control/__init__.py ================================================ ================================================ FILE: tests/control/data_generation/__init__.py ================================================ ================================================ FILE: tests/control/data_generation/test_data_generator.py ================================================ import unittest from pymgrid.utils.DataGenerator import * from pandas import Series from pandas.testing import assert_frame_equal, assert_series_equal from numpy.testing import assert_array_equal, assert_array_almost_equal from matplotlib import pyplot as plt def create_pv_test_set(): test_set = np.zeros(48) test_set[7:20] = np.arange(7,20) test_set[7:20] = -20*(test_set[7:20]-13)**2 + 30*-1**(np.arange(7,20) % 2) + 5*(np.arange(6,19) %5) test_set[7:20] += -1*np.min(test_set[7:20]) n = 24 test_set[7+n:20+n] = np.arange(7,20) test_set[7+n:20+n] = -20*(test_set[7+n:20+n]-13)**2 + 20*-1**(np.arange(6,19) % 2) + 4*(np.arange(6,19) %3) test_set[7+n:20+n] += -1*np.min(test_set[7+n:20+n]) return test_set/10 class TestNoisyPV(unittest.TestCase): def setUp(self): self.test_data = create_pv_test_set() self.test_series = Series(data = self.test_data) def test_init(self): NPV = NoisyPVData(pv_data = self.test_series) df = pd.DataFrame(self.test_data) assert_frame_equal(NPV.unmunged_data, df) assert_frame_equal(NPV.data, df) def test_data_munge(self): NPV = NoisyPVData(pv_data=self.test_series) NPV.data_munge() # Assertions: assert_array_equal(NPV.data.values[:,0],self.test_data[:24]) assert_array_equal(NPV.data.values[:,1],self.test_data[24:]) assert_array_equal(NPV.daily_maxes['time_of_max'].values, np.array([13,13])) assert_array_equal(NPV.daily_maxes['cumulative_hr'], np.array([13, 37])) self.assertTrue(NPV.munged) def test_add_feature_columns(self): NPV = NoisyPVData(pv_data=self.test_series) NPV.data_munge() num_feature_functions = 1 period_scale = 0.8 NPV._add_feature_columns(num_feature_functions=num_feature_functions, period_scale=period_scale) self.assertIn('ones', NPV.daily_maxes.columns.values) self.assertIn('cos1x', NPV.daily_maxes.columns.values) assert_array_equal(NPV.daily_maxes['ones'], np.array([1,1])) cos1x = np.cos( 2 * np.pi / 8760. * period_scale * (NPV.daily_maxes['cumulative_hr'] - 173 * 24)) assert_array_equal(NPV.daily_maxes['cos1x'], cos1x) self.assertListEqual(NPV.feature_names, ['ones', 'cos1x']) for name in NPV.feature_names: assert_array_equal(NPV.feature_functions[name](NPV.daily_maxes['cumulative_hr']).values, NPV.daily_maxes[name].values) class TestNoisyGrid(unittest.TestCase): def setUp(self) -> None: always_on = np.ones(48) self.always_on = pd.Series(always_on) self.with_outages = self.always_on.copy() self.with_outages.iloc[3:6] = 0 self.with_outages.iloc[40:47] = 0 self.with_outages_data = dict(naive_probabilities = np.array([10/48, 38/48]), occurences=np.array([10,37]), transition_prob_matrix = np.array([ [8 / 10, 2 / 10], [2/37, 35/37] ])) self.dist_types = ('naive', 'markov') def test_init(self): for dist_type in self.dist_types: for data in self.always_on, self.with_outages: NGD = NoisyGridData(data,dist_type=dist_type) assert_series_equal(data, NGD.data) assert_series_equal(data, NGD.unmunged_data) def test_bad_grid_data(self): grid_data = self.with_outages.copy() grid_data[5] = -3 try: NoisyGridData(grid_data) except ValueError: pass except Exception: self.fail('unexpected exception raised') else: self.fail('ValueError not raised') grid_data[5] = 1.1 try: NoisyGridData(grid_data) except ValueError: pass except Exception: self.fail('unexpected exception raised') else: self.fail('ValueError not raised') def test_learn_distribution_always_on_naive(self): NGD = NoisyGridData(self.always_on, dist_type='naive') self.assertFalse(NGD.has_distribution) NGD.learn_distribution() self.assertTrue(NGD.has_distribution) assert_array_equal(NGD.transition_prob_matrix, np.array([0, 1])) def test_learn_distribution_always_on_markov(self): NGD = NoisyGridData(self.always_on, dist_type='markov') self.assertFalse(NGD.has_distribution) NGD.learn_distribution() self.assertTrue(NGD.has_distribution) assert_array_equal(NGD.occurrences, np.array([0, 47])) assert_array_equal(NGD.transition_prob_matrix, np.array([[1,0],[0,1]])) def test_learn_distribution_with_outages_naive(self): NGD = NoisyGridData(self.with_outages, dist_type='naive') self.assertFalse(NGD.has_distribution) NGD.learn_distribution() self.assertTrue(NGD.has_distribution) assert_array_almost_equal(NGD.transition_prob_matrix, self.with_outages_data['naive_probabilities']) def test_learn_distribution_with_outages_markov(self): NGD = NoisyGridData(self.with_outages, dist_type='markov') self.assertFalse(NGD.has_distribution) NGD.learn_distribution() self.assertTrue(NGD.has_distribution) assert_array_almost_equal(NGD.occurrences, self.with_outages_data['occurences']) assert_array_almost_equal(NGD.transition_prob_matrix, self.with_outages_data['transition_prob_matrix']) def test_sample_always_on_naive(self): NGD = NoisyGridData(self.always_on, dist_type='naive') NGD.learn_distribution() sample = NGD.sample() assert_array_equal(sample, np.ones(48)) def test_sample_always_on_markov(self): NGD = NoisyGridData(self.always_on, dist_type='markov') NGD.learn_distribution() sample = NGD.sample() assert_array_equal(sample, np.ones(48)) def test_sample_with_outages_naive(self): # This is a ridiculous unit test All it does is check that the data generated from the probability distribution # matches the distribution. Thus, can fail randomly. np.random.seed(0) num_tests = 50 NGD = NoisyGridData(self.with_outages, dist_type='naive') NGD.learn_distribution() probs_list = [] for j in range(num_tests): sample = NGD.sample() new_NGD = NoisyGridData(sample, dist_type='naive') new_NGD.learn_distribution() probs_list.append(new_NGD.transition_prob_matrix) transition_prob_mean = np.mean(np.array(probs_list), axis=0) assert_array_almost_equal(self.with_outages_data['naive_probabilities'], transition_prob_mean, decimal=2) def test_sample_with_outages_markov(self): """ This is also a ridiculous unit test. All it does is check that the data generated from the probability distribution matches the distribution. Thus, can fail randomly. :return: """ np.random.seed(0) num_tests = 50 NGD = NoisyGridData(self.with_outages, dist_type='markov') NGD.learn_distribution() probs_list = [] for j in range(num_tests): sample = NGD.sample() new_NGD = NoisyGridData(sample, dist_type='markov') new_NGD.learn_distribution() probs_list.append(new_NGD.transition_prob_matrix) transition_prob_mean = np.mean(np.array(probs_list), axis=0) assert_array_almost_equal(self.with_outages_data['transition_prob_matrix'], transition_prob_mean, decimal=1) class TestNoisyLoad(unittest.TestCase): def setUp(self) -> None: self.n_days = 12 load_data = np.array([304, 205, 200, 200, 202, 306, 524, 611, 569, 466, 571, 579, 569, 470, 466, 465, 597, 625, 620, 525, 521, 524, 522, 531, 305, 200, 199, 200, 202, 306, 524, 611, 568, 466, 568, 579, 569, 467, 467, 466, 597, 626, 626, 525, 525, 524, 522, 533]) load_data = np.concatenate([load_data + j % 5 for j in range(int(self.n_days/2))]) self.load_data = pd.Series(data = load_data) def test_init(self): NLD = NoisyLoadData(load_data=self.load_data) assert_frame_equal(NLD.data, self.load_data.to_frame()) assert_frame_equal(NLD.unmunged_data, self.load_data.to_frame()) def test_data_munge(self): NLD = NoisyLoadData(load_data=self.load_data) self.assertFalse(NLD.munged) NLD.data_munge() self.assertTrue(NLD.munged) self.assertTupleEqual(NLD.load_mean.shape, (7,24)) self.assertTupleEqual(NLD.load_std.shape, (7,24)) self.assertEqual(NLD.data.shape[0], self.n_days) self.assertFalse(np.isnan(NLD.load_mean).any(axis=None)) self.assertFalse(np.isnan(NLD.load_std).any(axis=None)) for j in range(7): NLD_computed_avg = NLD.load_mean.iloc[j,:].values NLD_computed_std = NLD.load_std.iloc[j,:].values slice = self.load_data[24*j:24*(j+1)].values for k in range(1, (self.n_days-j) // 7 + 1): if (j+k*7) >= self.n_days: continue slice = np.stack((slice,self.load_data[24*(j+k*7):24*(j+k*7+1)])) if len(slice.shape) == 1: slice = slice.reshape((1, 24)) assert_array_almost_equal(NLD_computed_avg, np.mean(slice, axis=0)) else: assert_array_almost_equal(NLD_computed_avg, np.mean(slice, axis=0)) assert_array_almost_equal(NLD_computed_std, np.std(slice, axis=0, ddof=1)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/control/test_control.py ================================================ import unittest ================================================ FILE: tests/control/test_mpc.py ================================================ import numpy as np from tests.helpers.test_case import TestCase from tests.helpers.modular_microgrid import get_modular_microgrid from pymgrid.algos import ModelPredictiveControl class TestMPC(TestCase): def test_init(self): microgrid = get_modular_microgrid() mpc = ModelPredictiveControl(microgrid) self.assertTrue(mpc.is_modular) self.assertEqual(mpc.horizon, 1) def test_run_with_load_pv_battery_grid(self): from pymgrid.modules import RenewableModule, LoadModule max_steps = 10 pv_const = 50 load_const = 60 pv = RenewableModule(time_series=pv_const*np.ones(100)) load = LoadModule(time_series=load_const*np.ones(100)) microgrid = get_modular_microgrid(remove_modules=["renewable", "load", "genset"], additional_modules=[pv, load]) mpc = ModelPredictiveControl(microgrid) mpc_output = mpc.run(max_steps=max_steps) self.assertEqual(mpc_output.shape[0], max_steps) self.assertEqual(mpc_output[("grid", 0, "grid_import")].values + mpc_output[("battery", 0, "discharge_amount")].values + mpc_output[("renewable", 0, "renewable_used")].values, [load_const] * mpc_output.shape[0] ) def test_run_with_load_pv_battery_genset(self): from pymgrid.modules import RenewableModule, LoadModule max_steps = 10 pv_const = 50 load_const = 60 pv = RenewableModule(time_series=pv_const*np.ones(100)) load = LoadModule(time_series=load_const*np.ones(100)) microgrid = get_modular_microgrid(remove_modules=["renewable", "load", "grid"], additional_modules=[pv, load]) mpc = ModelPredictiveControl(microgrid) mpc_output = mpc.run(max_steps=max_steps) self.assertEqual(mpc_output.shape[0], max_steps) self.assertEqual(mpc_output[("load", 0, "load_met")].values, [60.]*mpc_output.shape[0]) self.assertEqual(mpc_output[("genset", 0, "genset_production")].values + mpc_output[("battery", 0, "discharge_amount")].values, [10.] * mpc_output.shape[0]) def test_run_twice_with_load_pv_battery_genset(self): from pymgrid.modules import RenewableModule, LoadModule max_steps = 10 pv_const = 50 load_const = 60 pv = RenewableModule(time_series=pv_const*np.ones(100)) load = LoadModule(time_series=load_const*np.ones(100)) microgrid = get_modular_microgrid(remove_modules=["renewable", "load", "grid"], additional_modules=[pv, load]) mpc = ModelPredictiveControl(microgrid) mpc_output = mpc.run(max_steps=max_steps) self.assertEqual(mpc_output.shape[0], max_steps) self.assertEqual(mpc_output[("load", 0, "load_met")].values, [60.] * mpc_output.shape[0]) self.assertEqual(mpc_output[("genset", 0, "genset_production")].values + mpc_output[("battery", 0, "discharge_amount")].values, [10.] * mpc_output.shape[0]) mpc_output = mpc.run(max_steps=max_steps) self.assertEqual(mpc_output.shape[0], max_steps) self.assertEqual(mpc_output[("load", 0, "load_met")].values, [60.] * mpc_output.shape[0]) self.assertEqual(mpc_output[("genset", 0, "genset_production")].values, [10.] * mpc_output.shape[0]) def test_run_with_load_pv_battery_grid_different_names(self): from pymgrid.modules import RenewableModule, LoadModule max_steps = 10 pv_const = 50 load_const = 60 pv = RenewableModule(time_series=pv_const*np.ones(100)) load = LoadModule(time_series=load_const*np.ones(100)) microgrid = get_modular_microgrid(remove_modules=["renewable", "load", "genset"], additional_modules=[("pv_with_name", pv), ("load_with_name", load)]) mpc = ModelPredictiveControl(microgrid) mpc_output = mpc.run(max_steps=max_steps) self.assertEqual(mpc_output.shape[0], max_steps) self.assertEqual(mpc_output[("load_with_name", 0, "load_met")].values, [load_const]*mpc_output.shape[0]) self.assertEqual(mpc_output[("grid", 0, "grid_import")].values + mpc_output[("battery", 0, "discharge_amount")].values + mpc_output[("pv_with_name", 0, "renewable_used")].values, [load_const] * mpc_output.shape[0] ) self.assertEqual(mpc_output[("load_with_name", 0, "load_met")].values, [load_const]*mpc_output.shape[0]) ================================================ FILE: tests/control/test_rbc.py ================================================ from copy import deepcopy from tests.helpers.test_case import TestCase from tests.helpers.modular_microgrid import get_modular_microgrid from pymgrid.algos import RuleBasedControl class TestRBC(TestCase): def setUp(self) -> None: self.rbc = RuleBasedControl(get_modular_microgrid()) def test_init(self): microgrid = get_modular_microgrid() self.assertEqual(microgrid, self.rbc.microgrid) self.assertEqual(microgrid, deepcopy(self.rbc).microgrid) def test_priority_list(self): rbc = deepcopy(self.rbc) for j, (element_1, element_2) in enumerate(zip(rbc.priority_list[:-1], rbc.priority_list[1:])): with self.subTest(testing=f'element_{j}<=element_{j+1}'): self.assertLessEqual(element_1.marginal_cost, element_2.marginal_cost) def test_run_once(self): rbc = deepcopy(self.rbc) self.assertEqual(len(rbc.microgrid.log), 0) n_steps = 10 log = rbc.run(n_steps) self.assertEqual(len(log), n_steps) self.assertEqual(log, rbc.microgrid.log) return rbc def test_reset_after_run(self): rbc = self.test_run_once() rbc.reset() self.assertEqual(len(rbc.microgrid.log), 0) ================================================ FILE: tests/envs/__init__.py ================================================ ================================================ FILE: tests/envs/test_discrete.py ================================================ from copy import deepcopy from math import factorial from tests.helpers.test_case import TestCase from tests.helpers.modular_microgrid import get_modular_microgrid from pymgrid.envs import DiscreteMicrogridEnv class TestDiscreteEnv(TestCase): def test_init_from_microgrid(self): microgrid = get_modular_microgrid() env = DiscreteMicrogridEnv(microgrid) self.assertEqual(env.modules, microgrid.modules) self.assertIsNot(env.modules.to_tuples(), microgrid.modules.to_tuples()) n_obs = sum([x.observation_space['normalized'].shape[0] for x in microgrid.modules.to_list()]) self.assertEqual(env.observation_space.shape, (n_obs,)) def test_init_from_modules(self): microgrid = get_modular_microgrid() env = DiscreteMicrogridEnv(microgrid.modules.to_tuples(), add_unbalanced_module=False) self.assertEqual(env.modules, microgrid.modules) self.assertIsNot(env.modules.to_tuples(), microgrid.modules.to_tuples()) n_obs = sum([x.observation_space['normalized'].shape[0] for x in microgrid.modules.to_list()]) self.assertEqual(env.observation_space.shape, (n_obs,)) class TestDiscreteEnvScenario(TestCase): microgrid_number = 0 def setUp(self) -> None: self.env = DiscreteMicrogridEnv.from_scenario(microgrid_number=self.microgrid_number) def test_run_once(self): env = deepcopy(self.env) # sample environment then get log self.assertEqual(len(env.log), 0) for j in range(10): with self.subTest(step=j): action = env.sample_action(strict_bound=True) env.step(action) self.assertEqual(len(env.log), j+1) def test_reset_after_run(self): env = deepcopy(self.env) env.step(env.sample_action(strict_bound=True)) env.reset() self.assertEqual(len(env.log), 0) def test_run_again_after_reset(self): env = deepcopy(self.env) env.step(env.sample_action(strict_bound=True)) self.assertEqual(len(env.log), 1) env.reset() self.assertEqual(len(env.log), 0) for j in range(10): with self.subTest(step=j): action = env.sample_action(strict_bound=True) env.step(action) self.assertEqual(len(env.log), j+1) def test_action_space(self): env = deepcopy(self.env) n_action_modules = len(env.modules.controllable.sources) + len(env.modules.controllable.source_and_sinks) genset_modules = len(env.modules.genset) if hasattr(env.modules, 'genset') else 0 n_actions = factorial(n_action_modules) * (2 ** genset_modules) self.assertEqual(env.action_space.n, n_actions) def test_simple_observation_keys(self): keys_in_all_scenarios = ['load_current', 'renewable_current'] env = DiscreteMicrogridEnv.from_scenario(microgrid_number=self.microgrid_number, observation_keys=keys_in_all_scenarios) obs, _, _, _ = env.step(env.action_space.sample()) expected_obs = [ env.modules['load'].item().state_dict(normalized=True)['load_current'], env.modules['pv'].item().state_dict(normalized=True)['renewable_current'] ] self.assertEqual(obs.tolist(), expected_obs) class TestDiscreteEnvScenario1(TestDiscreteEnvScenario): microgrid_number = 1 class TestDiscreteEnvScenario2(TestDiscreteEnvScenario): microgrid_number = 2 class TestDiscreteEnvScenario3(TestDiscreteEnvScenario): microgrid_number = 3 class TestDiscreteEnvScenario4(TestDiscreteEnvScenario): microgrid_number = 4 class TestDiscreteEnvScenario5(TestDiscreteEnvScenario): microgrid_number = 5 class TestDiscreteEnvScenario6(TestDiscreteEnvScenario): microgrid_number = 6 class TestDiscreteEnvScenario47(TestDiscreteEnvScenario): microgrid_number = 7 class TestDiscreteEnvScenario8(TestDiscreteEnvScenario): microgrid_number = 8 class TestDiscreteEnvScenario9(TestDiscreteEnvScenario): microgrid_number = 9 class TestDiscreteEnvScenario10(TestDiscreteEnvScenario): microgrid_number = 10 class TestDiscreteEnvScenario11(TestDiscreteEnvScenario): microgrid_number = 11 class TestDiscreteEnvScenario12(TestDiscreteEnvScenario): microgrid_number = 12 class TestDiscreteEnvScenario13(TestDiscreteEnvScenario): microgrid_number = 13 class TestDiscreteEnvScenario14(TestDiscreteEnvScenario): microgrid_number = 14 class TestDiscreteEnvScenario15(TestDiscreteEnvScenario): microgrid_number = 15 class TestDiscreteEnvScenario16(TestDiscreteEnvScenario): microgrid_number = 16 class TestDiscreteEnvScenario17(TestDiscreteEnvScenario): microgrid_number = 17 class TestDiscreteEnvScenario18(TestDiscreteEnvScenario): microgrid_number = 18 class TestDiscreteEnvScenario19(TestDiscreteEnvScenario): microgrid_number = 19 class TestDiscreteEnvScenario20(TestDiscreteEnvScenario): microgrid_number = 20 class TestDiscreteEnvScenario21(TestDiscreteEnvScenario): microgrid_number = 21 class TestDiscreteEnvScenario22(TestDiscreteEnvScenario): microgrid_number = 22 class TestDiscreteEnvScenario23(TestDiscreteEnvScenario): microgrid_number = 23 class TestDiscreteEnvScenario24(TestDiscreteEnvScenario): microgrid_number = 24 ================================================ FILE: tests/envs/test_trajectory.py ================================================ import numpy as np from tests.helpers.test_case import TestCase from tests.helpers.modular_microgrid import get_modular_microgrid from pymgrid.envs import DiscreteMicrogridEnv class TestTrajectory(TestCase): def check_initial_final_steps(self, env, expected_env_initial, expected_env_final, expected_module_initial, expected_module_final): self.assertEqual(env.initial_step, expected_env_initial) self.assertEqual(env.final_step, expected_env_final) env.reset() self.assertEqual(env.initial_step, expected_env_initial) self.assertEqual(env.final_step, expected_env_final) self.assertEqual(env.modules.get_attrs('initial_step', unique=True).item(), expected_module_initial) self.assertEqual(env.modules.get_attrs('final_step', unique=True).item(), expected_module_final) def test_none_trajectory(self): timeseries_length = 100 modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True) env = DiscreteMicrogridEnv(modules, trajectory_func=None) self.check_initial_final_steps(env, 0, timeseries_length, 0, timeseries_length) def test_deterministic_trajectory(self): deterministic_initial, deterministic_final = 10, 20 def trajectory_func(initial_step, final_step): return deterministic_initial, deterministic_final timeseries_length = 100 modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True) env = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func) self.check_initial_final_steps(env, 0, timeseries_length, deterministic_initial, deterministic_final) def test_stochastic_trajectory(self): def trajectory_func(initial_step, final_step): initial = np.random.randint(low=initial_step+1, high=final_step-2) final = np.random.randint(low=initial, high=final_step) return initial, final timeseries_length = 100 modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True) env = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func) self.assertEqual(env.initial_step, 0) self.assertEqual(env.final_step, timeseries_length) env.reset() self.assertEqual(env.initial_step, 0) self.assertEqual(env.final_step, timeseries_length) self.assertGreater(env.modules.get_attrs('initial_step', unique=True).item(), 0) self.assertLess(env.modules.get_attrs('initial_step', unique=True).item(), timeseries_length) self.assertGreater(env.modules.get_attrs('final_step', unique=True).item(), 0) self.assertLess(env.modules.get_attrs('final_step', unique=True).item(), timeseries_length) self.assertLess(env.modules.get_attrs('initial_step', unique=True).item(), env.modules.get_attrs('final_step', unique=True).item()) def test_bad_trajectory_out_of_range(self): def trajectory_func(initial_step, final_step): return 10, 110 timeseries_length = 100 modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True) with self.assertRaises(ValueError): _ = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func) def test_bad_trajectory_bad_signature(self): def trajectory_func(initial_step): return 10, 110 timeseries_length = 100 modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True) with self.assertRaises(TypeError): _ = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func) def test_bad_trajectory_initial_gt_final(self): def trajectory_func(initial_step, final_step): return 20, 10 timeseries_length = 100 modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True) with self.assertRaises(ValueError): _ = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func) def test_bad_trajectory_scalar_output(self): def trajectory_func(initial_step, final_step): return 20 timeseries_length = 100 modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True) with self.assertRaises(TypeError): _ = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func) def test_bad_trajectory_too_many_outputs(self): def trajectory_func(initial_step, final_step): return 10, 20, 30 timeseries_length = 100 modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True) with self.assertRaises(TypeError): _ = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func) def test_bad_trajectory_wrong_output_types(self): def trajectory_func(initial_step, final_step): return 'abc', 10.0 timeseries_length = 100 modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True) with self.assertRaises(TypeError): _ = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func) def test_correct_trajectory_length(self): def trajectory_func(initial_step, final_step): trajectory_func.n_resets += 1 return 10, 11+trajectory_func.n_resets trajectory_func.n_resets = 0 timeseries_length = 100 modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True) env = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func) for correct_trajectory_length in range(3, 7): with self.subTest(correct_trajectory_length=correct_trajectory_length): env.reset() n_steps = 0 done = False while not done: _, _, done, _ = env.step(env.action_space.sample()) n_steps += 1 self.assertEqual(n_steps, correct_trajectory_length) def test_trajectory_serialization(self): import yaml from pymgrid.microgrid.trajectory import DeterministicTrajectory trajectory_func = DeterministicTrajectory(10, 20) timeseries_length = 100 modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True) env = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func) env.reset() loaded_env = yaml.safe_load(yaml.safe_dump(env)) self.assertIsNotNone(env.trajectory_func) self.assertEqual(env, loaded_env) ================================================ FILE: tests/helpers/__init__.py ================================================ ================================================ FILE: tests/helpers/genset_module_testing_utils.py ================================================ from pymgrid.modules import GensetModule default_params = dict(running_min_production=10, running_max_production=100, genset_cost=1, start_up_time=0, wind_down_time=0, allow_abortion=True, init_start_up=True, raise_errors=True) def get_genset(default_parameters=None, **new_params): params = default_parameters.copy() if default_parameters is not None else default_params.copy() params.update(new_params) return GensetModule(**params), params def normalize_production(production, max_production=None): max_production = max_production if max_production else default_params['running_max_production'] return production/max_production ================================================ FILE: tests/helpers/modular_microgrid.py ================================================ import numpy as np from pymgrid import Microgrid from pymgrid.modules import ( BatteryModule, GensetModule, GridModule, LoadModule, RenewableModule ) def get_modular_microgrid(remove_modules=(), retain_only=None, additional_modules=None, add_unbalanced_module=True, timeseries_length=100, modules_only=False): modules = dict( genset=GensetModule(running_min_production=10, running_max_production=50, genset_cost=0.5), battery=BatteryModule(min_capacity=0, max_capacity=100, max_charge=50, max_discharge=50, efficiency=1.0, init_soc=0.5), renewable=RenewableModule(time_series=50*np.ones(timeseries_length)), load=LoadModule(time_series=60*np.ones(timeseries_length)), grid=GridModule(max_import=100, max_export=0, time_series=np.ones((timeseries_length, 3)), raise_errors=True) ) if retain_only is not None: modules = {k: v for k, v in modules.items() if k in retain_only} if remove_modules: raise RuntimeError('Can pass either remove_modules or retain_only, but not both.') else: for module in remove_modules: try: modules.pop(module) except KeyError: raise NameError(f"Module {module} not one of default modules {list(modules.keys())}.") modules = list(modules.values()) modules.extend(additional_modules if additional_modules else []) if modules_only: return modules return Microgrid(modules, add_unbalanced_module=add_unbalanced_module) ================================================ FILE: tests/helpers/test_case.py ================================================ import unittest import numpy as np from warnings import warn class TestCase(unittest.TestCase): def assertEqual(self, first, second, msg=None) -> None: try: super().assertEqual(first, second, msg=msg) except (ValueError, AssertionError): # array-like or pandas obj try: # convert pandas obj first, second = first.values, second.values except AttributeError: # not a pandas obj pass try: np.testing.assert_equal(first, second, err_msg=msg if msg else '') except AssertionError as e: try: np.testing.assert_allclose(first, second, rtol=1e-7, atol=1e-10, err_msg=msg if msg else '') except TypeError: raise e ================================================ FILE: tests/microgrid/__init__.py ================================================ ================================================ FILE: tests/microgrid/modules/__init__.py ================================================ ================================================ FILE: tests/microgrid/modules/container_tests/__init__.py ================================================ ================================================ FILE: tests/microgrid/modules/container_tests/test_container.py ================================================ from tests.helpers.modular_microgrid import get_modular_microgrid from tests.helpers.test_case import TestCase class TestContainer(TestCase): def test_container_init(self): microgrid = get_modular_microgrid() self.assertTrue(len(microgrid.controllable.sources)) self.assertTrue(len(microgrid.controllable.source_and_sinks)) action = microgrid.sample_action() ================================================ FILE: tests/microgrid/modules/conversion_test/__init__.py ================================================ ================================================ FILE: tests/microgrid/modules/conversion_test/test_modular_conversion.py ================================================ import numpy as np from tests.helpers.test_case import TestCase class TestToModular(TestCase): def setUp(self) -> None: from pymgrid.MicrogridGenerator import MicrogridGenerator mgen = MicrogridGenerator() mgen.generate_microgrid(modular=False) self.weak_grids = [microgrid for microgrid in mgen.microgrids if self.is_weak_grid(microgrid)] self.genset_only = [microgrid for microgrid in mgen.microgrids if not microgrid.architecture["grid"]] self.strong_grid_only = [microgrid for microgrid in mgen.microgrids if (not microgrid.architecture["genset"]) and self.is_strong_grid(microgrid)] self.strong_grid_and_genset = [microgrid for microgrid in mgen.microgrids if microgrid.architecture["genset"] and self.is_strong_grid(microgrid)] @staticmethod def is_weak_grid(microgrid): return microgrid.architecture["grid"] and microgrid._grid_status_ts.min().item() < 1 @staticmethod def is_strong_grid(microgrid): return microgrid.architecture["grid"] and microgrid._grid_status_ts.min().item() == 1 def test_weak_grid_conversion_success(self): for microgrid in self.weak_grids: modular_microgrid = microgrid.to_modular() self.assertTrue(modular_microgrid.grid.item().weak_grid) def test_genset_only(self): for microgrid in self.genset_only: modular = microgrid.to_modular() self.assertTrue(len(modular.genset) == 1) genset_module = modular.genset[0] self.assertEqual(microgrid.genset.fuel_cost, genset_module.genset_cost) self.assertEqual(microgrid.genset.co2, genset_module.co2_per_unit) self.assertEqual(microgrid.genset.rated_power*microgrid.genset.p_max, genset_module.max_production) with self.assertRaises(AttributeError): _ = modular.grid ================================================ FILE: tests/microgrid/modules/forecaster_tests/__init__.py ================================================ ================================================ FILE: tests/microgrid/modules/forecaster_tests/test_forecaster.py ================================================ import numpy as np from tests.helpers.test_case import TestCase from pymgrid.forecast import ( get_forecaster, OracleForecaster, GaussianNoiseForecaster, UserDefinedForecaster, NoForecaster) from pymgrid.utils.space import ModuleSpace STATE_COMPONENTS = np.random.randint(low=1, high=10) FORECAST_HORIZON = np.random.randint(low=2, high=10) POSITIVE_OBSERVATION_SPACE = ModuleSpace( unnormalized_low=0, unnormalized_high=10, shape=(STATE_COMPONENTS*(FORECAST_HORIZON+1),) ) NEGATIVE_OBSERVATION_SPACE = ModuleSpace( unnormalized_low=-10, unnormalized_high=0, shape=(STATE_COMPONENTS*(FORECAST_HORIZON+1),) ) def get_test_inputs(n=None, state_components=None, negative=False): state_components = state_components if state_components else STATE_COMPONENTS n = n if n else FORECAST_HORIZON val_c_n = POSITIVE_OBSERVATION_SPACE.unnormalized.high[0] * np.random.rand(n, state_components) val_c = val_c_n[0, :] # val_c_n = val_c_n.reshape((FORECAST_HORIZON, STATE_COMPONENTS)) if negative: return -val_c, -val_c_n, n else: return val_c, val_c_n, n class TestOracleForecaster(TestCase): def setUp(self) -> None: self.forecaster = OracleForecaster(observation_space=POSITIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS)) def test_positive_inputs(self): val_c, val_c_n, n = get_test_inputs() forecast = self.forecaster(val_c, val_c_n, n) self.assertEqual(forecast, val_c_n) def test_negative_inputs(self): val_c, val_c_n, n = get_test_inputs(negative=True) forecast = self.forecaster(val_c, val_c_n, n) self.assertEqual(forecast, val_c_n) class TestGaussianNoiseForecaster(TestCase): def test_single_forecast_positive(self): noise_std = 1 forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=POSITIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS), increase_uncertainty=False) val_c, val_c_n, n = get_test_inputs() forecast = forecaster(val_c, val_c_n, n) self.assertEqual(noise_std, forecaster.noise_std) self.assertTrue((forecast >= 0).all()) def test_single_forecast_positive_high_std(self): noise_std = 100 forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=POSITIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS), increase_uncertainty=False) val_c, val_c_n, n = get_test_inputs() forecast = forecaster(val_c, val_c_n, n) self.assertEqual(noise_std, forecaster.noise_std) self.assertTrue((forecast >= 0).all()) def test_single_forecast_negative(self): noise_std = 1 forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=NEGATIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS), increase_uncertainty=False) val_c, val_c_n, n = get_test_inputs(negative=True) forecast = forecaster(val_c, val_c_n, n) self.assertEqual(noise_std, forecaster.noise_std) self.assertTrue((forecast <= 0).all()) def test_single_forecast_negative_high_std(self): noise_std = 100 forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=NEGATIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS), increase_uncertainty=False) val_c, val_c_n, n = get_test_inputs(negative=True) forecast = forecaster(val_c, val_c_n, n) self.assertEqual(noise_std, forecaster.noise_std) self.assertTrue((forecast <= 0).all()) def test_multiple_forecast_positive(self): noise_std = 1 forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=POSITIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS), increase_uncertainty=False) n = None for _ in range(2): val_c, val_c_n, n = get_test_inputs(n=n) forecast = forecaster(val_c, val_c_n, n) self.assertEqual(noise_std, forecaster.noise_std) self.assertTrue((forecast >= 0).all()) def test_multiple_forecast_positive_high_std(self): noise_std = 100 forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=POSITIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS), increase_uncertainty=False) n = None for _ in range(2): val_c, val_c_n, n = get_test_inputs(n=n) forecast = forecaster(val_c, val_c_n, n) self.assertEqual(noise_std, forecaster.noise_std) self.assertTrue((forecast >= 0).all()) def test_multiple_forecast_negative(self): noise_std = 1 forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=NEGATIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS), increase_uncertainty=False) n = None for _ in range(2): val_c, val_c_n, n = get_test_inputs(n=n, negative=True) forecast = forecaster(val_c, val_c_n, n) self.assertEqual(noise_std, forecaster.noise_std) self.assertTrue((forecast <= 0).all()) def test_multiple_forecast_negative_high_std(self): noise_std = 100 forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=NEGATIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS), increase_uncertainty=False) n = None for _ in range(2): val_c, val_c_n, n = get_test_inputs(n=n, negative=True) forecast = forecaster(val_c, val_c_n, n) self.assertEqual(noise_std, forecaster.noise_std) self.assertTrue((forecast <= 0).all()) def test_increasing_uncertainty_positive(self): noise_std = 1 forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=POSITIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS), increase_uncertainty=True) val_c, val_c_n, n = get_test_inputs() expected_noise_std = np.outer(noise_std*(1+np.log(1+np.arange(len(val_c_n)))), np.ones(STATE_COMPONENTS)) forecast = forecaster(val_c, val_c_n, n) self.assertTrue((noise_std != forecaster.noise_std).any()) self.assertEqual(expected_noise_std, forecaster.noise_std) self.assertTrue((forecast >= 0).all()) def test_increasing_uncertainty_negative(self): noise_std = 1 forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=NEGATIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS), increase_uncertainty=True) val_c, val_c_n, n = get_test_inputs(negative=True) expected_noise_std = np.outer(noise_std*(1+np.log(1+np.arange(len(val_c_n)))), np.ones(STATE_COMPONENTS)) forecast = forecaster(val_c, val_c_n, n) self.assertTrue((noise_std != forecaster.noise_std).any()) self.assertEqual(expected_noise_std, forecaster.noise_std) self.assertTrue((forecast <= 0).all()) def test_bad_shape(self): noise_std = 1 forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=POSITIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS), increase_uncertainty=False) n = np.random.randint(FORECAST_HORIZON, 2*FORECAST_HORIZON) val_c, val_c_n, n = get_test_inputs(n=n) with self.assertRaises(RuntimeError): _ = forecaster(val_c, val_c_n, n) # self.assertEqual(noise_std, forecaster.noise_std) # val_c, val_c_n, n = get_test_inputs(n=n_vals[1]) # with self.assertRaises(ValueError): # _ = forecaster(val_c, val_c_n, n) class TestUserDefinedForecaster(TestCase): def setUp(self) -> None: self.simple_time_series = np.arange(FORECAST_HORIZON).reshape((-1, 1)) @staticmethod def oracle_scalar_forecaster(val_c, val_c_n, n): return val_c_n.item() def get_oracle_forecaster(self, negative=False): return OracleForecaster(observation_space=self.get_obs_space(negative=negative), forecast_shape=(FORECAST_HORIZON,)) def get_obs_space(self, negative=False): if negative: low = -10 high = 0 else: low = 0 high = 10 return ModuleSpace(unnormalized_low=low, unnormalized_high=high, shape=(10, )) def test_user_defined_oracle_positive(self): forecaster = UserDefinedForecaster(forecaster_function=self.get_oracle_forecaster(), observation_space=self.get_obs_space(), forecast_shape=(FORECAST_HORIZON,), time_series=self.simple_time_series) val_c, val_c_n, n = get_test_inputs(state_components=1) forecast = forecaster(val_c, val_c_n, n) self.assertEqual(forecast, val_c_n) def test_user_defined_oracle_negative(self): forecaster = UserDefinedForecaster(forecaster_function=self.get_oracle_forecaster(negative=True), observation_space=self.get_obs_space(negative=True), forecast_shape=(FORECAST_HORIZON,), time_series=self.simple_time_series) val_c, val_c_n, n = get_test_inputs(state_components=1, negative=True) forecast = forecaster(val_c, val_c_n, n) self.assertEqual(forecast, val_c_n) def test_scalar_forecaster(self): forecaster = UserDefinedForecaster(forecaster_function=self.oracle_scalar_forecaster, observation_space=self.get_obs_space(negative=True), forecast_shape=(FORECAST_HORIZON,), time_series=self.simple_time_series) val_c, val_c_n, n = get_test_inputs(state_components=1, negative=True) forecast = forecaster(val_c, val_c_n, n) self.assertEqual(forecast, val_c_n) def test_vectorized_forecaster_bad_output_shape(self): bad_output_shape_forecaster = lambda val_c, val_c_n, n: np.append(val_c_n, [0]) with self.assertRaisesRegex(ValueError, "Forecaster output of shape (.*) " "cannot be casted to necessary forecast shape (.*, 1)"): _ = UserDefinedForecaster(forecaster_function=bad_output_shape_forecaster, observation_space=POSITIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS), time_series=self.simple_time_series) def test_vectorized_forecaster_bad_output_type(self): bad_output_type_forecaster = lambda val_c, val_c_n, n: np.array([str(x) for x in val_c_n]).reshape((-1, 1)) with self.assertRaisesRegex(TypeError, "Forecaster must return numeric np.ndarray or number but returned " "output of type"): _ = UserDefinedForecaster(forecaster_function=bad_output_type_forecaster, observation_space=POSITIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON,), time_series=self.simple_time_series) def test_vectorized_forecaster_bad_output_signs(self): def bad_output_type_forecaster(val_c, val_c_n, n): out = val_c_n.copy() pos = np.random.randint(low=1, high=len(out)) out[pos] *= -1 return out with self.assertRaisesRegex(ValueError, "Forecaster must return output of same " "sign \(or zero\) as input but returned output"): _ = UserDefinedForecaster(forecaster_function=bad_output_type_forecaster, observation_space=POSITIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS), time_series=self.simple_time_series) def test_bad_forecaster(self): bad_forecaster = lambda val_c, val_c_n, n: 0/0 with self.assertRaisesRegex(ValueError, "Unable to call forecaster with scalar inputs."): _ = UserDefinedForecaster(forecaster_function=bad_forecaster, observation_space=POSITIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS), time_series=self.simple_time_series) def test_scalar_forecaster_bad_output_shape(self): def bad_output_shape_forecaster(val_c, val_c_n, n): if hasattr(val_c_n, '__len__') and len(val_c_n) > 1: raise RuntimeError return [val_c_n]*2 with self.assertRaisesRegex(ValueError, "Forecaster must return scalar output with scalar input but returned."): _ = UserDefinedForecaster(forecaster_function=bad_output_shape_forecaster, observation_space=POSITIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS), time_series=self.simple_time_series) class TestGetForecaster(TestCase): def setUp(self) -> None: self.simple_time_series = np.arange(10).reshape((-1, 1)) self.forecaster_horizon = 24 def test_user_defined_forecaster(self): user_defined_forecaster = lambda val_c, val_c_n, n: val_c_n forecaster = get_forecaster(user_defined_forecaster, POSITIVE_OBSERVATION_SPACE, (FORECAST_HORIZON, STATE_COMPONENTS), time_series=self.simple_time_series) self.assertIsInstance(forecaster, UserDefinedForecaster) def test_oracle_forecaster(self): forecaster = get_forecaster("oracle", POSITIVE_OBSERVATION_SPACE, (FORECAST_HORIZON, STATE_COMPONENTS)) self.assertIsInstance(forecaster, OracleForecaster) def test_no_forecaster(self): forecaster = get_forecaster(None, POSITIVE_OBSERVATION_SPACE, (FORECAST_HORIZON, STATE_COMPONENTS)) self.assertIsInstance(forecaster, NoForecaster) def test_gaussian_noise_forecaster_init(self): noise_std = 0.5 forecaster = get_forecaster(noise_std, POSITIVE_OBSERVATION_SPACE, (FORECAST_HORIZON, STATE_COMPONENTS)) self.assertIsInstance(forecaster, GaussianNoiseForecaster) self.assertEqual(forecaster.input_noise_std, noise_std) def test_gaussian_noise_forecaster_increase_uncertainty_init(self): noise_std = 0.5 forecaster = get_forecaster(noise_std, POSITIVE_OBSERVATION_SPACE, (FORECAST_HORIZON, STATE_COMPONENTS), increase_uncertainty=True) self.assertIsInstance(forecaster, GaussianNoiseForecaster) self.assertEqual(forecaster.input_noise_std, noise_std) self.assertTrue((forecaster.noise_std != noise_std).any()) def test_gaussian_noise_forecaster_correct_size(self): noise_std = 0.5 forecaster = get_forecaster(noise_std, POSITIVE_OBSERVATION_SPACE, (FORECAST_HORIZON, STATE_COMPONENTS)) val_c, val_c_n, n = get_test_inputs() forecast = forecaster(val_c, val_c_n, n) self.assertEqual(forecast.shape, val_c_n.shape) self.assertEqual(forecast.shape, (FORECAST_HORIZON, STATE_COMPONENTS)) self.assertTrue((forecast.reshape(-1) >= 0).all()) def test_gaussian_noise_forecaster_insufficient_true_vals(self): noise_std = 0.5 forecaster = get_forecaster(noise_std, POSITIVE_OBSERVATION_SPACE, (FORECAST_HORIZON, STATE_COMPONENTS)) val_c, val_c_n, _ = get_test_inputs(n=FORECAST_HORIZON-2) forecast = forecaster(val_c, val_c_n, FORECAST_HORIZON) self.assertEqual(forecast.shape, (FORECAST_HORIZON, STATE_COMPONENTS)) self.assertTrue((forecast.reshape(-1) >= 0).all()) def test_gaussian_noise_forecaster_insufficient_true_vals_increasing_uncertainty(self): noise_std = 0.5 forecaster = get_forecaster(noise_std, POSITIVE_OBSERVATION_SPACE, (FORECAST_HORIZON, STATE_COMPONENTS), increase_uncertainty=True) val_c, val_c_n, _ = get_test_inputs(n=FORECAST_HORIZON-2) forecast = forecaster(val_c, val_c_n, FORECAST_HORIZON) self.assertEqual(forecast.shape, (FORECAST_HORIZON, STATE_COMPONENTS)) self.assertTrue((forecast.reshape(-1) >= 0).all()) ================================================ FILE: tests/microgrid/modules/module_tests/test_genset_long_status_changes.py ================================================ from tests.helpers.genset_module_testing_utils import get_genset, normalize_production from tests.helpers.test_case import TestCase import numpy as np from copy import deepcopy from itertools import product class TestGensetStartUp2WindDown3OnAtStartUp(TestCase): def setUp(self) -> None: self.genset, self.default_params = get_genset(init_start_up=True, start_up_time=2, wind_down_time=3) def get_genset(self, **new_params): if len(new_params) == 0: return deepcopy(self.genset), self.default_params return get_genset(default_parameters=self.default_params, **new_params) def turn_on(self, genset, unnormalized_production=0.): # Take a step, ask genset to turn on. action = np.array([1.0, normalize_production(unnormalized_production)]) obs, reward, done, info = genset.step(action) return obs, reward, done, info def turn_off(self, genset, unnormalized_production=50.): # Take a step, ask genset to turn on. action = np.array([0.0, normalize_production(unnormalized_production)]) obs, reward, done, info = genset.step(action) return obs, reward, done, info def test_on_at_start_up(self): genset, _ = self.get_genset() self.assertTrue(genset.current_status) self.assertEqual(genset.goal_status, 1) self.assertEqual(genset.state, np.array([1, 1, 0, 3])) def test_turn_off_step_1(self): genset, params = self.get_genset() unnormalized_production = 50. obs, reward, done, info = self.turn_off(genset, unnormalized_production) self.assertEqual(reward, -1.0*params['genset_cost']*unnormalized_production) self.assertTrue(genset.current_status) self.assertEqual(genset.goal_status, 0) self.assertEqual(genset.state, np.array([1, 0, 0, 2])) self.assertFalse(done) self.assertEqual(info['provided_energy'], unnormalized_production) def test_turn_off_step_2(self): genset, params = self.get_genset() unnormalized_production = 50. for j in range(2): obs, reward, done, info = self.turn_off(genset, unnormalized_production) self.assertEqual(reward, -1.0*params['genset_cost']*unnormalized_production) self.assertTrue(genset.current_status) self.assertEqual(genset.goal_status, 0) self.assertEqual(genset.state, np.array([1, 0, 0, 1])) self.assertFalse(done) self.assertEqual(info['provided_energy'], unnormalized_production) def test_turn_off_step_3(self): genset, params = self.get_genset() unnormalized_production = 50. for j in range(3): obs, reward, done, info = self.turn_off(genset, unnormalized_production) self.assertEqual(reward, -1.0*params['genset_cost']*unnormalized_production) self.assertTrue(genset.current_status) self.assertEqual(genset.goal_status, 0) self.assertEqual(genset.state, np.array([1, 0, 0, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], unnormalized_production) def test_turn_off_step_4_final(self): genset, params = self.get_genset() unnormalized_production = 50. for j in range(3): self.turn_off(genset, unnormalized_production) unnormalized_production = 0 obs, reward, done, info = self.turn_off(genset, unnormalized_production) self.assertEqual(reward, 0) self.assertFalse(genset.current_status) self.assertEqual(genset.goal_status, 0) self.assertEqual(genset.state, np.array([0, 0, 2, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], 0) def test_turn_on_after_turn_off_step_1(self): genset, params = self.get_genset() unnormalized_production = 50. for j in range(3): self.turn_off(genset, unnormalized_production) # Step 4, should be off. unnormalized_production = 0 obs, reward, done, info = self.turn_off(genset, unnormalized_production) self.assertEqual(reward, 0) self.assertFalse(genset.current_status) self.assertEqual(genset.goal_status, 0) self.assertEqual(genset.state, np.array([0, 0, 2, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], 0) unnormalized_production = 0 obs, reward, done, info = self.turn_on(genset, unnormalized_production) self.assertEqual(reward, 0) self.assertFalse(genset.current_status) self.assertEqual(genset.goal_status, 1) self.assertEqual(genset.state, np.array([0, 1, 1, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], 0) def test_turn_on_after_turn_off_step_2(self): genset, params = self.get_genset() unnormalized_production = 50. for j in range(3): self.turn_off(genset, unnormalized_production) # Step 4, should be off. unnormalized_production = 0 obs, reward, done, info = self.turn_off(genset, unnormalized_production) self.assertEqual(reward, 0) self.assertFalse(genset.current_status) self.assertEqual(genset.goal_status, 0) self.assertEqual(genset.state, np.array([0, 0, 2, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], 0) # Turning back on unnormalized_production = 0 for j in range(2): obs, reward, done, info = self.turn_on(genset, unnormalized_production) self.assertEqual(reward, 0) self.assertFalse(genset.current_status) self.assertEqual(genset.goal_status, 1) self.assertEqual(genset.state, np.array([0, 1, 0, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], 0) def test_turn_on_after_turn_off_final(self): genset, params = self.get_genset() unnormalized_production = 50. for j in range(3): self.turn_off(genset, unnormalized_production) # Step 4, should be off. unnormalized_production = 0 obs, reward, done, info = self.turn_off(genset, unnormalized_production) self.assertEqual(reward, 0) self.assertFalse(genset.current_status) self.assertEqual(genset.goal_status, 0) self.assertEqual(genset.state, np.array([0, 0, 2, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], 0) # Turning back on unnormalized_production = 0 for j in range(2): self.turn_on(genset, unnormalized_production) unnormalized_production = 50. obs, reward, done, info = self.turn_on(genset, unnormalized_production) self.assertEqual(reward, -1.0*unnormalized_production*params['genset_cost']) self.assertTrue(genset.current_status) self.assertEqual(genset.goal_status, 1) self.assertEqual(genset.state, np.array([1, 1, 0, 3])) self.assertFalse(done) self.assertEqual(info['provided_energy'], unnormalized_production) def test_turn_off_abortion(self): genset, params = self.get_genset() unnormalized_production = 50. for j in range(2): self.turn_off(genset, unnormalized_production) self.assertEqual(genset.state, np.array([1, 0, 0, 1])) # Step 3: abort! obs, reward, done, info = self.turn_on(genset, unnormalized_production) self.assertEqual(reward, -1.0*unnormalized_production*params['genset_cost']) self.assertTrue(genset.current_status) self.assertEqual(genset.goal_status, 1) self.assertEqual(genset.state, np.array([1, 1, 0, 3])) self.assertFalse(done) self.assertEqual(info['provided_energy'], unnormalized_production) def test_turn_on_abortion(self): genset, params = self.get_genset(init_start_up=False) unnormalized_production = 0. self.turn_on(genset, unnormalized_production) self.assertEqual(genset.state, np.array([0, 1, 1, 0])) # Step 3: abort! obs, reward, done, info = self.turn_off(genset, unnormalized_production) self.assertEqual(reward, 0) self.assertFalse(genset.current_status) self.assertEqual(genset.goal_status, 0) self.assertEqual(genset.state, np.array([0, 0, 2, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], 0) class TestManyStatusChanges(TestCase): def test_many_status_changes(self): n_steps = 5 def next_status(genset, goal_status): if goal_status: if genset.current_status: return 1 elif genset._steps_until_up == 0: return 1 else: return 0 else: if not genset.current_status: return 0 elif genset._steps_until_down == 0: return 0 else: return 1 for _running in True, False: for start_up_time in range(0, n_steps): for wind_down_time in range(0, n_steps): for goal_status in 0, 1: intermediate_goal_statuses = product([0, 1], repeat=n_steps - 1) for steps in intermediate_goal_statuses: genset, _ = get_genset(init_start_up=_running, start_up_time=start_up_time, wind_down_time=wind_down_time) _s = (goal_status, *steps) for j, sub_goal_status in enumerate(_s): with self.subTest(_running=_running, _steps_until_up=start_up_time, _steps_until_down=wind_down_time, goal_status=goal_status, step_combination=_s, step=j, goal_status_at_step=sub_goal_status): predicted_status = next_status(genset, sub_goal_status) genset.update_status(goal_status=sub_goal_status) self.assertEqual(predicted_status, genset.current_status) ================================================ FILE: tests/microgrid/modules/module_tests/test_genset_module.py ================================================ import numpy as np from tests.helpers.genset_module_testing_utils import default_params, get_genset, normalize_production from tests.helpers.test_case import TestCase class TestGensetModule(TestCase): def setUp(self) -> None: np.random.seed(0) self.default_params = default_params.copy() def get_genset(self, **new_params): return get_genset(**new_params) def test_init_start_up(self): genset, _ = self.get_genset() self.assertTrue(genset.current_status) genset, _ = self.get_genset(init_start_up=False) self.assertFalse(genset.current_status) def test_get_cost_linear(self): genset_cost = np.random.rand() genset, params = self.get_genset(genset_cost=genset_cost) production = params['running_min_production'] + (params['running_max_production']-params['running_min_production'])*np.random.rand() production_cost = production*genset_cost self.assertEqual(genset.get_cost(production), production_cost) def test_get_cost_callable(self): genset_cost = lambda x: x**2 genset, params = self.get_genset(genset_cost=genset_cost) production = params['running_min_production'] + (params['running_max_production']-params['running_min_production'])*np.random.rand() production_cost = genset_cost(production) self.assertEqual(genset.get_cost(production), production_cost) def test_step_out_of_range_goal_status(self): genset, _ = self.get_genset() action = np.array([-0.5, 0.5]) with self.assertRaises(AssertionError): genset.step(action) def test_step_out_of_normalized_range_production(self): genset, _ = self.get_genset() with self.assertRaises(AssertionError): action = np.array([-0.5, 2]) genset.step(action) def test_step_incorrect_action_shape(self): genset, _ = self.get_genset() with self.assertRaises(TypeError): action = 0.5 genset.step(action) with self.assertRaises(TypeError): action = np.ones(3) genset.step(action) def test_step_unnormalized_production(self): genset, _ = self.get_genset() action = np.array([1.0, 50]) # try: obs, reward, done, info = genset.step(action, normalized=False) self.assertEqual(reward, -1.0 * default_params['genset_cost']*action[1]) self.assertTrue(genset.current_status) self.assertEqual(genset.goal_status, 1) self.assertEqual(obs, np.array([1, 1, 0, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], action[1]) def test_step_normalized_production(self): genset, params = self.get_genset() unnormalized_production = 50 action = np.array([1.0, normalize_production(unnormalized_production)]) # try: obs, reward, done, info = genset.step(action, normalized=True) self.assertEqual(reward, -1.0 * params['genset_cost']*unnormalized_production) self.assertTrue(genset.current_status) self.assertEqual(genset.goal_status, 1) self.assertEqual(obs, np.array([1, 1, 0, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], unnormalized_production) def test_step_immediate_status_change(self): genset, params = self.get_genset() unnormalized_production = 0 action = np.array([0.0, normalize_production(unnormalized_production)]) self.assertTrue(genset.current_status) obs, reward, done, info = genset.step(action, normalized=True) self.assertEqual(reward, 0) self.assertFalse(genset.current_status) self.assertEqual(genset.goal_status, 0) self.assertEqual(obs, np.array([0, 0, 0, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], unnormalized_production) def test_step_genset_off_production_request_error_raise(self): genset, _ = self.get_genset() unnormalized_production = 50 action = np.array([0.0, normalize_production(unnormalized_production)]) # Genset starts on self.assertTrue(genset.current_status) self.assertEqual(genset.goal_status, 1) # Turn genset off (wind_down_time=0), and then ask for production. (no-no). with self.assertRaises(ValueError): genset.step(action, normalized=True) def test_step_genset_off_production_request_no_error_raise(self): genset, _ = self.get_genset(raise_errors=False) unnormalized_production = 50 action = np.array([0.0, normalize_production(unnormalized_production)]) obs, reward, done, info = genset.step(action) self.assertEqual(reward, 0) self.assertFalse(genset.current_status) self.assertEqual(genset.goal_status, 0) self.assertEqual(obs, np.array([0, 0, 0, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], 0) def test_step_genset_production_request_out_of_range_no_error_raise(self): genset, params = self.get_genset(raise_errors=False) requested_possible_warn = [(params['running_min_production']*np.random.rand(), params['running_min_production'], False), (params['running_max_production'] * (1+np.random.rand()), params['running_max_production'], True)] # First requested value is below min_production, second is above max_production. # Second should raise a warning. for requested, possible, raises_warn in requested_possible_warn: with self.subTest(requested_production=requested, possible_production=possible): action = np.array([1.0, normalize_production(requested)]) if raises_warn: with self.assertWarns(Warning): obs, reward, done, info = genset.step(action) else: obs, reward, done, info = genset.step(action) self.assertEqual(reward, -1.0 * params['genset_cost']*possible) self.assertTrue(genset.current_status) self.assertEqual(genset.goal_status, 1) self.assertEqual(obs, np.array([1, 1, 0, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], possible) ================================================ FILE: tests/microgrid/modules/module_tests/test_genset_module_start_up_1_wind_down_1.py ================================================ from tests.helpers.genset_module_testing_utils import get_genset, normalize_production from tests.helpers.test_case import TestCase import numpy as np from copy import deepcopy class TestGensetStartUp1WindDown0OffAtStartUp(TestCase): def setUp(self) -> None: self.genset, self.default_params = get_genset(init_start_up=False, start_up_time=1) self.warm_up(self.genset) def get_genset(self, new=False, **new_params): if len(new_params) == 0 and not new: return deepcopy(self.genset), self.default_params genset, params = get_genset(default_parameters=self.default_params, **new_params) if not new: self.warm_up(genset) return genset, params def warm_up(self, genset): # Take a step, ask genset to turn on. Warm-up takes one step so genset is still off at this point. unnormalized_production = 0 action = np.array([1.0, normalize_production(unnormalized_production)]) obs, reward, done, info = genset.step(action) return obs, reward, done, info def test_off_at_start_up(self): genset, _ = self.get_genset(new=True) self.assertFalse(genset.current_status) self.assertEqual(genset.goal_status, 0) self.assertEqual(genset.state, np.array([0, 0, 1, 0])) def test_warm_up(self): # Take a step, ask genset to turn on. Warm-up takes one step so genset is still off at this point. genset,_ = self.get_genset(new=True) obs, reward, done, info = self.warm_up(genset) self.assertEqual(reward, 0) self.assertFalse(genset.current_status) self.assertEqual(genset.goal_status, 1) self.assertEqual(obs, np.array([0, 1, 0, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], 0) def test_step_start_up_1_exception(self): # Assert that exception is thrown when production is requested while genset is off genset, _ = self.get_genset(new=True) self.assertFalse(genset.current_status) self.assertEqual(genset.goal_status, 0) unnormalized_production = 50 action = np.array([1.0, normalize_production(unnormalized_production)]) with self.assertRaises(ValueError) as e: genset.step(action) err_msg = e.exception.args[0] self.assertTrue('This may be because this genset module is not currently running.' in err_msg) def test_step_start_up_1_no_exception(self): # Genset is on now. Should be able to request production. genset, params = self.get_genset() unnormalized_production = 50 action = np.array([1.0, normalize_production(unnormalized_production)]) obs, reward, done, info = genset.step(action) self.assertEqual(reward, -1.0*params['genset_cost']*unnormalized_production) self.assertTrue(genset.current_status) self.assertEqual(genset.goal_status, 1) self.assertEqual(obs, np.array([1, 1, 0, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], unnormalized_production) def test_start_up_1_request_below_min_exception_raise(self): genset, params = self.get_genset() # Genset is on now. Requesting below min production. unnormalized_production = params['running_min_production']*np.random.rand() action = np.array([1.0, normalize_production(unnormalized_production)]) with self.assertRaises(ValueError): genset.step(action) def test_start_up_1_request_below_min_no_exception(self): # Genset is on, requesting production less than the min should return min production. genset, params = self.get_genset(raise_errors=False) # Genset is on now. Requesting below min production. unnormalized_production = params['running_min_production']*np.random.rand() action = np.array([1.0, normalize_production(unnormalized_production)]) obs, reward, done, info = genset.step(action) self.assertEqual(reward, -1.0*params['genset_cost']*params['running_min_production']) self.assertTrue(genset.current_status) self.assertEqual(genset.goal_status, 1) self.assertEqual(obs, np.array([1, 1, 0, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], params['running_min_production']) def test_start_up_1_then_shut_down_exception_raise(self): # Genset is on, requesting production less than the min should return min production. genset, params = self.get_genset() # Genset is on now. Requesting below min production. unnormalized_production = 50. action = np.array([0.1, normalize_production(unnormalized_production)]) with self.assertRaises(ValueError): genset.step(action) def test_start_up_1_then_shut_down_no_exception(self): # Genset is on, requesting production less than the min should return min production. genset, params = self.get_genset(raise_errors=False) # Genset is on now. Requesting below min production. unnormalized_production = 50. action = np.array([0.1, normalize_production(unnormalized_production)]) obs, reward, done, info = genset.step(action) self.assertEqual(reward, 0.0) self.assertFalse(genset.current_status) self.assertEqual(genset.goal_status, 0) self.assertEqual(obs, np.array([0, 0, params['start_up_time'], 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], 0.0) class TestGensetStartUp1WindDown0OnAtStartUp(TestCase): def setUp(self) -> None: self.genset, self.default_params = get_genset(init_start_up=True, start_up_time=1) self.warm_up(self.genset) def get_genset(self, new=False, **new_params): if len(new_params) == 0 and not new: return deepcopy(self.genset), self.default_params genset, params = get_genset(default_parameters=self.default_params, **new_params) if not new: self.warm_up(genset) return genset, params def warm_up(self, genset): # Take a step, ask genset to turn on. Genset begins on so should be on at this point. unnormalized_production = self.default_params['running_min_production'] action = np.array([1.0, normalize_production(unnormalized_production)]) obs, reward, done, info = genset.step(action) return obs, reward, done, info def test_on_at_start_up(self): genset, _ = self.get_genset(new=True) self.assertTrue(genset.current_status) self.assertEqual(genset.goal_status, 1) self.assertEqual(genset.state, np.array([1, 1, 0, 0])) def test_warm_up(self): # Take a step, ask genset to turn on. Genset begins on so should be on at this point. genset, params = self.get_genset(new=True) obs, reward, done, info = self.warm_up(genset) self.assertEqual(reward, -1.0*params['genset_cost']*params['running_min_production']) self.assertTrue(genset.current_status) self.assertEqual(genset.goal_status, 1) self.assertEqual(obs, np.array([1, 1, 0, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], params['running_min_production']) def test_shut_down(self): genset, _ = self.get_genset() unnormalized_production = 0 action = np.array([0.0, normalize_production(unnormalized_production)]) obs, reward, done, info = genset.step(action) self.assertEqual(reward, 0) self.assertFalse(genset.current_status) self.assertEqual(genset.goal_status, 0) self.assertEqual(obs, np.array([0, 0, 1, 0])) self.assertFalse(done) self.assertEqual(info['provided_energy'], 0) ================================================ FILE: tests/microgrid/modules/module_tests/test_load_module.py ================================================ import numpy as np from pymgrid.modules import LoadModule from tests.microgrid.modules.module_tests.timeseries_modules import ( TestTimeseriesModuleForecasting, TestTimeseriesModuleNoForecasting, TestTimeSeriesModuleForecastingNegativeVals, TestTimeSeriesModuleNoForecastingNegativeVals ) class TestLoadModuleNoForecasting(TestTimeseriesModuleNoForecasting): __test__ = True negative_time_series = True action_space_dim = 0 def get_module(self): return LoadModule(self.module_time_series) def test_init_current_load(self): load_module = self.get_module() self.assertEqual(load_module.current_load, -1 * self.time_series[0]) def test_step(self): load_module = self.get_module() self.assertEqual(load_module.current_load, -1 * self.time_series[0]) obs, reward, done, info = load_module.step(np.array([])) obs = load_module.from_normalized(obs, obs=True) self.assertEqual(obs, self.time_series[1]) self.assertEqual(reward, 0) self.assertFalse(done) self.assertEqual(info["absorbed_energy"], -1 * self.time_series[0]) class TestLoadModuleForecasting(TestTimeseriesModuleForecasting): __test__ = True negative_time_series = True action_space_dim = 0 def get_module(self): return LoadModule(self.module_time_series, forecaster="oracle", forecast_horizon=self.forecast_horizon) def test_step(self): load_module = self.get_module() self.assertEqual(load_module.current_load, -1 * self.time_series[0]) action = load_module.to_normalized(np.array([]), act=True) obs, reward, done, info = load_module.step(action) obs = load_module.from_normalized(obs, obs=True) self.assertEqual(obs, self.time_series[1:self.forecast_horizon+2]) self.assertEqual(reward, 0) self.assertFalse(done) self.assertEqual(info["absorbed_energy"], -1 * self.time_series[0]) class TestLoadModuleForecastingNegativeVals(TestTimeSeriesModuleForecastingNegativeVals, TestLoadModuleForecasting): pass class TestLoadModuleNoForecastingNegativeVals(TestTimeSeriesModuleNoForecastingNegativeVals, TestLoadModuleNoForecasting): pass ================================================ FILE: tests/microgrid/modules/module_tests/test_renewable_module.py ================================================ from pymgrid.modules import RenewableModule from tests.microgrid.modules.module_tests.timeseries_modules import ( TestTimeseriesModuleForecasting, TestTimeseriesModuleNoForecasting, TestTimeSeriesModuleForecastingNegativeVals, TestTimeSeriesModuleNoForecastingNegativeVals ) class TestRenewableModuleNoForecasting(TestTimeseriesModuleNoForecasting): __test__ = True action_space_dim = 1 def get_module(self): return RenewableModule(self.module_time_series) def test_init_current_renewable(self): renewable_module = self.get_module() self.assertEqual(renewable_module.current_renewable, self.time_series[0]) def test_step(self): renewable_module = self.get_module() self.assertEqual(renewable_module.current_renewable, self.time_series[0]) unnormalized_action = 1 action = renewable_module.to_normalized(unnormalized_action, act=True) obs, reward, done, info = renewable_module.step(action) obs = renewable_module.from_normalized(obs, obs=True) self.assertEqual(obs, self.time_series[1]) self.assertEqual(reward, 0) self.assertFalse(done) self.assertEqual(info["provided_energy"], unnormalized_action) self.assertEqual(info["curtailment"], 0) class TestRenewableModuleForecasting(TestTimeseriesModuleForecasting): __test__ = True action_space_dim = 1 def get_module(self): return RenewableModule(self.module_time_series, forecaster="oracle", forecast_horizon=self.forecast_horizon) def test_step(self): renewable_module = self.get_module() self.assertEqual(renewable_module.current_renewable, self.time_series[0]) unnormalized_action = 1 action = renewable_module.to_normalized(unnormalized_action, act=True) obs, reward, done, info = renewable_module.step(action) obs = renewable_module.from_normalized(obs, obs=True) self.assertEqual(obs, self.time_series[1:self.forecast_horizon+2]) self.assertEqual(reward, 0) self.assertFalse(done) self.assertEqual(info["provided_energy"], unnormalized_action) self.assertEqual(info["curtailment"], 0) class TestRenewableModuleForecastingNegativeVals(TestTimeSeriesModuleForecastingNegativeVals, TestRenewableModuleForecasting): pass class TestRenewableModuleNoForecastingNegativeVals(TestTimeSeriesModuleNoForecastingNegativeVals, TestRenewableModuleNoForecasting): pass ================================================ FILE: tests/microgrid/modules/module_tests/timeseries_modules.py ================================================ import numpy as np from abc import abstractmethod from gym.spaces import Box from pymgrid.utils.space import ModuleSpace from tests.helpers.test_case import TestCase class TestTimeseriesModule(TestCase): __test__ = False negative_time_series = False forecast_horizon: int action_space_dim: int def setUp(self) -> None: self.module_time_series = self._get_module_time_series() self.time_series = self._get_time_series() def _get_module_time_series(self): return self._get_time_series() def _get_time_series(self): sign = -1 if self.negative_time_series else 1 return sign * (2 - np.cos(np.pi * np.arange(100) / 2)) @abstractmethod def get_module(self): return NotImplemented def test_action_space(self): module = self.get_module() normalized_action_space = module.action_space["normalized"] unnormalized_action_space = module.action_space["unnormalized"] self.assertEqual(normalized_action_space, Box(low=0, high=1, shape=(self.action_space_dim, ))) self.assertEqual(unnormalized_action_space, Box(low=min(0, self.time_series.min()), high=max(0, self.time_series.max()), shape=(self.action_space_dim, ))) def test_observation_space(self): module = self.get_module() normalized_obs_space = module.observation_space["normalized"] unnormalized_obs_space = module.observation_space["unnormalized"] self.assertEqual(normalized_obs_space, Box(low=0, high=1, shape=(1+self.forecast_horizon,))) self.assertEqual(unnormalized_obs_space, Box(low=min(0, self.time_series.min()), high=max(0, self.time_series.max()), shape=(1+self.forecast_horizon,))) def test_observations_in_observation_space(self): module = self.get_module() observation_space = ModuleSpace( unnormalized_low=min(0, self.time_series.min()), unnormalized_high=max(0, self.time_series.max()), shape=(1 + module.forecast_horizon,) ) self.assertEqual(module.observation_space, observation_space) done = False while not done: obs, reward, done, info = module.step(module.action_space.sample(), normalized=False) if np.isscalar(obs): obs = np.array([obs]) self.assertIn(obs, observation_space['normalized']) self.assertIn(module.state, observation_space['unnormalized']) class TestTimeseriesModuleNoForecasting(TestTimeseriesModule): forecast_horizon = 0 def test_init(self): module = self.get_module() self.assertIsNone(module.forecast()) self.assertEqual(module.state, self.time_series[0]) self.assertEqual(len(module.state_dict()), 1+self.forecast_horizon) class TestTimeseriesModuleForecasting(TestTimeseriesModule): forecast_horizon = 24 def test_init(self): module = self.get_module() self.assertIsNotNone(module.forecast()) self.assertEqual(module.forecast(), self.time_series[1:1 + self.forecast_horizon].reshape((-1, 1))) self.assertEqual(module.state, self.time_series[:1 + self.forecast_horizon]) self.assertEqual(len(module.state_dict()), 1 + self.forecast_horizon) class TestTimeSeriesModuleNoForecastingNegativeVals(TestTimeseriesModuleNoForecasting): def _get_module_time_series(self): return -1 * self._get_time_series() class TestTimeSeriesModuleForecastingNegativeVals(TestTimeseriesModuleForecasting): def _get_module_time_series(self): return -1 * self._get_time_series() ================================================ FILE: tests/microgrid/serialize/test_microgrid_serialization.py ================================================ import numpy as np from pymgrid import Microgrid from tests.helpers.modular_microgrid import get_modular_microgrid from tests.helpers.test_case import TestCase class TestMicrogridSerialization(TestCase): def test_serialize_no_modules(self): microgrid = Microgrid([], add_unbalanced_module=False) dump = microgrid.dump() loaded = Microgrid.load(dump) self.assertEqual(microgrid, loaded) def test_serialize_with_renewable(self): microgrid = get_modular_microgrid(remove_modules=["genset", "battery", "load", "grid"], add_unbalanced_module=False) self.assertEqual(len(microgrid.modules), 1) self.assertEqual(microgrid, Microgrid.load(microgrid.dump())) ================================================ FILE: tests/microgrid/test_microgrid.py ================================================ import numpy as np import pandas as pd from pymgrid import Microgrid from pymgrid.modules import LoadModule, RenewableModule from tests.helpers.modular_microgrid import get_modular_microgrid from tests.helpers.test_case import TestCase class TestMicrogrid(TestCase): def test_from_scenario(self): for j in range(25): with self.subTest(microgrid_number=j): microgrid = Microgrid.from_scenario(j) self.assertTrue(hasattr(microgrid, "load")) self.assertTrue(hasattr(microgrid, "pv")) self.assertTrue(hasattr(microgrid, "battery")) self.assertTrue(hasattr(microgrid, "grid") or hasattr(microgrid, "genset")) def test_empty_action_without_load(self): microgrid = get_modular_microgrid(remove_modules=('load', )) action = microgrid.get_empty_action() self.assertIn('battery', action) self.assertIn('genset', action) self.assertIn('grid', action) self.assertTrue(all(v == [None] for v in action.values())) def test_empty_action_with_load(self): microgrid = get_modular_microgrid() action = microgrid.get_empty_action() self.assertIn('battery', action) self.assertIn('genset', action) self.assertIn('grid', action) self.assertNotIn('load', action) self.assertTrue(all(v == [None] for v in action.values())) def test_action_space(self): microgrid = get_modular_microgrid() action = microgrid.microgrid_action_space.sample() for module_name, module_list in microgrid.modules.iterdict(): for module_num, module in enumerate(module_list): if 'controllable' in module.module_type: with self.subTest(module_name=module_name, module_num=module_num): self.assertIn(action[module_name][module_num], module.action_space) def test_action_space_normalize(self): microgrid = get_modular_microgrid() action = microgrid.microgrid_action_space.sample() normalized = microgrid.microgrid_action_space.normalize(action) for module_name, module_list in microgrid.modules.iterdict(): for module_num, module in enumerate(module_list): if 'controllable' in module.module_type: with self.subTest(module_name=module_name, module_num=module_num): self.assertIn(normalized[module_name][module_num], module.action_space.normalized) def test_action_space_denormalize(self): microgrid = get_modular_microgrid() action = microgrid.microgrid_action_space.sample(normalized=True) denormalized = microgrid.microgrid_action_space.denormalize(action) for module_name, module_list in microgrid.modules.iterdict(): for module_num, module in enumerate(module_list): if 'controllable' in module.module_type: with self.subTest(module_name=module_name, module_num=module_num): self.assertIn(denormalized[module_name][module_num], module.action_space.unnormalized) def test_sample_action(self): microgrid = get_modular_microgrid() action = microgrid.sample_action() for module_name, action_list in action.items(): for module_num, _act in enumerate(action_list): with self.subTest(module_name=module_name, module_num=module_num): action_arr = np.array(_act) if not action_arr.shape: action_arr = np.array([_act]) self.assertTrue(microgrid.modules[module_name][module_num].action_space.shape[0]) self.assertIn(action_arr, microgrid.modules[module_name][module_num].action_space.normalized) def test_sample_action_all_modules_populated(self): microgrid = get_modular_microgrid() action = microgrid.sample_action() for module_name, module_list in microgrid.fixed.iterdict(): for module_num, module in enumerate(module_list): with self.subTest(module_name=module_name, module_num=module_num): empty_action_space = module.action_space.shape == (0, ) try: _ = action[module_name][module_num] has_corresponding_action = True except KeyError: has_corresponding_action = False self.assertTrue(empty_action_space != has_corresponding_action) # XOR def test_current_step(self): microgrid = get_modular_microgrid() self.assertEqual(microgrid.current_step, 0) for j in range(4): with self.subTest(step=j): microgrid.run(microgrid.sample_action()) self.assertEqual(microgrid.current_step, j+1) def test_current_step_after_reset(self): microgrid = get_modular_microgrid() self.assertEqual(microgrid.current_step, 0) microgrid.run(microgrid.sample_action()) self.assertEqual(microgrid.current_step, 1) microgrid.reset() self.assertEqual(microgrid.current_step, 0) def test_set_module_attr_forecast_horizon(self): forecast_horizon = 50 microgrid = get_modular_microgrid() microgrid.set_module_attr('forecast_horizon', forecast_horizon) microgrid_fh = [module.forecast_horizon for module in microgrid.modules.iterlist() if hasattr(module, 'forecast_horizon')] self.assertEqual(min(microgrid_fh), max(microgrid_fh)) self.assertEqual(min(microgrid_fh), forecast_horizon) def test_set_module_attr_bad_attr_name(self): microgrid = get_modular_microgrid() with self.assertRaises(AttributeError): microgrid.set_module_attr('blah', 'blah') def test_get_cost_info(self): modules = 'genset', 'battery', 'renewable', 'load', 'grid', 'balancing' microgrid = get_modular_microgrid() cost_info = microgrid.get_cost_info() for module in modules: with self.subTest(info_of_module=cost_info): self.assertIn(module, cost_info.keys()) self.assertEqual(len(cost_info[module]), 1) self.assertIsInstance(cost_info[module][0], dict) self.assertIn('production_marginal_cost', cost_info[module][0]) self.assertIn('absorption_marginal_cost', cost_info[module][0]) self.assertEqual(len(cost_info[module][0]), 2) self.assertTrue(pd.api.types.is_number(cost_info[module][0]['production_marginal_cost'])) self.assertTrue(pd.api.types.is_number(cost_info[module][0]['absorption_marginal_cost'])) def test_set_initial_step(self): microgrid = get_modular_microgrid() self.assertEqual(microgrid.initial_step, 0) for module_name, module in microgrid.modules.iterdict(): with self.subTest(module_name=module_name): try: initial_step = module.initial_step except AttributeError: continue self.assertEqual(initial_step, 0) microgrid.initial_step = 1 for module_name, module in microgrid.modules.iterdict(): with self.subTest(module_name=module_name): try: initial_step = module.initial_step except AttributeError: continue self.assertEqual(initial_step, 1) class TestMicrogridLoadPV(TestCase): def setUp(self): self.load_ts, self.pv_ts = self.set_ts() self.microgrid, self.n_loads, self.n_pvs = self.set_microgrid() self.n_modules = 1 + self.n_loads + self.n_pvs def set_ts(self): ts = 10 * np.random.rand(100) return ts, ts def set_microgrid(self): load = LoadModule(time_series=self.load_ts, raise_errors=True) pv = RenewableModule(time_series=self.pv_ts, raise_errors=True) return Microgrid([load, pv]), 1, 1 def test_populated_correctly(self): self.assertTrue(hasattr(self.microgrid.modules, 'load')) self.assertTrue(hasattr(self.microgrid.modules, 'renewable')) self.assertEqual(len(self.microgrid.modules), self.n_modules) # load, pv, unbalanced def test_current_load_correct(self): try: current_load = self.microgrid.modules.load.item().current_load except ValueError: # More than one load module current_load = sum(load.current_load for load in self.microgrid.modules.load) self.assertEqual(current_load, self.load_ts[0]) def test_current_pv_correct(self): try: current_renewable = self.microgrid.modules.renewable.item().current_renewable except ValueError: # More than one load module current_renewable = sum(renewable.current_renewable for renewable in self.microgrid.modules.renewable) self.assertEqual(current_renewable, self.pv_ts[0]) def test_sample_action(self): sampled_action = self.microgrid.sample_action() self.assertEqual(len(sampled_action), 0) def test_sample_action_with_flex(self): sampled_action = self.microgrid.sample_action(sample_flex_modules=True) self.assertEqual(len(sampled_action), 2) self.assertIn('renewable', sampled_action) self.assertIn('balancing', sampled_action) self.assertEqual(len(sampled_action['renewable']), self.n_pvs) def test_state_dict(self): sd = self.microgrid.state_dict() self.assertIn('load', sd) self.assertIn('renewable', sd) self.assertIn('balancing', sd) self.assertEqual(len(sd['load']), self.n_loads) self.assertEqual(len(sd['balancing']), 1) def test_state_series(self): ss = self.microgrid.state_series() self.assertEqual({'load', 'renewable'}, set(ss.index.get_level_values(0))) self.assertEqual(ss['load'].index.get_level_values(0).nunique(), self.n_loads) self.assertEqual(ss['renewable'].index.get_level_values(0).nunique(), self.n_pvs) self.assertEqual(ss['load'].index.get_level_values(0).nunique(), self.n_loads) def test_to_nonmodular(self): if self.n_pvs > 1 or self.n_loads > 1: with self.assertRaises(ValueError) as e: self.microgrid.to_nonmodular() self.assertIn("Cannot convert modular microgrid with multiple modules of same type", e) else: nonmodular = self.microgrid.to_nonmodular() self.assertTrue(nonmodular.architecture['PV']) self.assertFalse(nonmodular.architecture['battery']) self.assertFalse(nonmodular.architecture['grid']) self.assertFalse(nonmodular.architecture['genset']) def check_step(self, microgrid, step_number=0): control = microgrid.get_empty_action() self.assertEqual(len(control), 0) obs, reward, done, info = microgrid.run(control) loss_load = self.load_ts[step_number]-self.pv_ts[step_number] loss_load_cost = self.microgrid.modules.balancing[0].loss_load_cost * max(loss_load, 0) self.assertEqual(loss_load_cost, -1*reward) self.assertEqual(len(microgrid.log), step_number + 1) self.assertTrue(all(module in microgrid.log for module in microgrid.modules.names())) load_met = min(self.load_ts[step_number], self.pv_ts[step_number]) loss_load = max(self.load_ts[step_number] - load_met, 0) pv_curtailment = max(self.pv_ts[step_number]-load_met, 0) # Checking the log populated correctly. log_row = microgrid.log.iloc[step_number] log_entry = lambda module, entry: log_row.loc[pd.IndexSlice[module, :, entry]].sum() # Check that there are log entries for all modules of each name self.assertEqual(log_row['load'].index.get_level_values(0).nunique(), self.n_loads) self.assertEqual(log_entry('load', 'load_current'), -1 * self.load_ts[step_number]) self.assertEqual(log_entry('load', 'load_met'), self.load_ts[step_number]) if loss_load == 0: self.assertEqual(log_entry('load', 'load_met'), load_met) self.assertEqual(log_entry('renewable', 'renewable_current'), self.pv_ts[step_number]) self.assertEqual(log_entry('renewable', 'renewable_used'), load_met) self.assertEqual(log_entry('renewable', 'curtailment'), pv_curtailment) self.assertEqual(log_entry('balancing', 'loss_load'), loss_load) self.assertEqual(log_entry('balance', 'reward'), -1 * loss_load_cost) self.assertEqual(log_entry('balance', 'overall_provided_to_microgrid'), self.load_ts[step_number]) self.assertEqual(log_entry('balance', 'overall_absorbed_from_microgrid'), self.load_ts[step_number]) self.assertEqual(log_entry('balance', 'fixed_provided_to_microgrid'), 0.0) self.assertEqual(log_entry('balance', 'fixed_absorbed_from_microgrid'), self.load_ts[step_number]) self.assertEqual(log_entry('balance', 'controllable_absorbed_from_microgrid'), 0.0) self.assertEqual(log_entry('balance', 'controllable_provided_to_microgrid'), 0.0) return microgrid def test_run_one_step(self): microgrid = self.microgrid self.check_step(microgrid=microgrid, step_number=0) def test_run_n_steps(self): microgrid = self.microgrid for step in range(len(self.load_ts)): with self.subTest(step=step): microgrid = self.check_step(microgrid=microgrid, step_number=step) class TestMicrogridLoadExcessPV(TestMicrogridLoadPV): # Same as above but pv is greater than load. def set_ts(self): load_ts = 10*np.random.rand(100) pv_ts = load_ts + 5*np.random.rand(100) return load_ts, pv_ts class TestMicrogridPVExcessLoad(TestMicrogridLoadPV): # Load greater than PV. def set_ts(self): pv_ts = 10 * np.random.rand(100) load_ts = pv_ts + 5 * np.random.rand(100) return load_ts, pv_ts class TestMicrogridTwoLoads(TestMicrogridLoadPV): def set_microgrid(self): load_1_ts = self.load_ts*(1-np.random.rand(*self.load_ts.shape)) load_2_ts = self.load_ts - load_1_ts assert all(load_1_ts > 0) assert all(load_2_ts > 0) load_1 = LoadModule(time_series=load_1_ts, raise_errors=True) load_2 = LoadModule(time_series=load_2_ts, raise_errors=True) pv = RenewableModule(time_series=self.pv_ts, raise_errors=True) return Microgrid([load_1, load_2, pv]), 2, 1 class TestMicrogridTwoPV(TestMicrogridLoadPV): def set_microgrid(self): pv_1_ts = self.pv_ts*(1-np.random.rand(*self.pv_ts.shape)) pv_2_ts = self.pv_ts - pv_1_ts assert all(pv_1_ts > 0) assert all(pv_2_ts > 0) load = LoadModule(time_series=self.load_ts, raise_errors=True) pv_1 = RenewableModule(time_series=pv_1_ts, raise_errors=True) pv_2 = RenewableModule(time_series=pv_2_ts) return Microgrid([load, pv_1, pv_2]), 1, 2 class TestMicrogridTwoEach(TestMicrogridLoadPV): def set_microgrid(self): load_1_ts = self.load_ts*(1-np.random.rand(*self.load_ts.shape)) load_2_ts = self.load_ts - load_1_ts pv_1_ts = self.pv_ts*(1-np.random.rand(*self.pv_ts.shape)) pv_2_ts = self.pv_ts - pv_1_ts assert all(load_1_ts > 0) assert all(load_2_ts > 0) assert all(pv_1_ts > 0) assert all(pv_2_ts > 0) load_1 = LoadModule(time_series=load_1_ts, raise_errors=True) load_2 = LoadModule(time_series=load_2_ts, raise_errors=True) pv_1 = RenewableModule(time_series=pv_1_ts, raise_errors=True) pv_2 = RenewableModule(time_series=pv_2_ts) return Microgrid([load_1, load_2, pv_1, pv_2]), 2, 2 class TestMicrogridManyEach(TestMicrogridLoadPV): def set_microgrid(self): n_loads = np.random.randint(3, 10) n_pvs = np.random.randint(3, 10) load_ts = [self.load_ts * (1 - np.random.rand(*self.load_ts.shape))] pv_ts = [self.pv_ts * (1 - np.random.rand(*self.pv_ts.shape))] for ts_list, ts_sum, n_modules in zip( [load_ts, pv_ts], [self.load_ts, self.pv_ts], [n_loads, n_pvs] ): remaining = ts_sum-ts_list[0] for j in range(1, n_modules-1): ts_list.append(remaining*(1-np.random.rand(*ts_sum.shape))) assert all(ts_list[-1] > 0) remaining -= ts_list[-1] assert all(remaining > 0) ts_list.append(remaining) load_modules = [LoadModule(time_series=ts) for ts in load_ts] pv_modules = [RenewableModule(time_series=ts) for ts in pv_ts] return Microgrid([*load_modules, *pv_modules]), n_loads, n_pvs class TestMicrogridManyEachExcessPV(TestMicrogridManyEach): def set_ts(self): load_ts = 10*np.random.rand(100) pv_ts = load_ts + 5*np.random.rand(100) return load_ts, pv_ts class TestMicrogridManyEachExcessLoad(TestMicrogridManyEach): def set_ts(self): pv_ts = 10*np.random.rand(100) load_ts = pv_ts + 5*np.random.rand(100) return load_ts, pv_ts class TestMicrogridRewardShaping(TestMicrogridLoadPV): def set_microgrid(self): original_microgrid, n_loads, n_pvs = super().set_microgrid() new_microgrid = Microgrid(original_microgrid.modules.to_tuples(), add_unbalanced_module=False, reward_shaping_func=self.reward_shaping_func) return new_microgrid, n_loads, n_pvs @staticmethod def reward_shaping_func(energy_info, cost_info): total = 0 for module_name, info_list in energy_info.items(): for module_info in info_list: for j, (energy_type, energy_amount) in enumerate(module_info.items()): if energy_type == 'absorbed_energy': marginal_cost = cost_info[module_name][j]['absorption_marginal_cost'] elif energy_type == 'provided_energy': marginal_cost = cost_info[module_name][j]['production_marginal_cost'] else: # Some other key continue total += energy_amount * marginal_cost return total ================================================ FILE: tests/test_microgridgenerator.py ================================================ """ Copyright 2020 Total S.A. Authors:Gonzague Henri Permission to use, modify, and distribute this software is given under the terms of the pymgrid License. NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Date: 2020/08/27 08:04 $ Gonzague Henri """ import numpy as np import pandas as pd from numpy.testing import assert_allclose import os, sys sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) from pymgrid.MicrogridGenerator import MicrogridGenerator import unittest class TestMicogridGenerator(unittest.TestCase): def setUp(self): self.mgen = MicrogridGenerator() def test_get_random_file(self): import inspect, pymgrid from pathlib import Path path = Path(inspect.getfile(pymgrid)).parent path = path / 'data/pv' data = self.mgen._get_random_file(path) self.assertEqual(len(data), 8760) def test_scale_ts(self): ts = pd.DataFrame( [i for i in range(10)]) factor = 4 scaled = self.mgen._scale_ts(ts, factor) assert_allclose(ts/ts.sum()*factor, scaled) def test_get_genset(self): genset = self.mgen._get_genset() self.assertEqual (1000, genset['rated_power']) def test_get_battery(self): battery = self.mgen._get_battery() self.assertEqual (1000, battery['capa']) def test_get_grid_price_ts(self): price = self.mgen._get_grid_price_ts(10, price=0.2) self.assertTrue(all([p == 0.2 for p in price])) def test_get_grid(self): grid = self.mgen._get_grid() self.assertEqual(1000, grid['grid_power_import']) def test_size_mg(self): ts = pd.DataFrame([i for i in range(10)]) mg = self.mgen._size_mg(ts, 10) self.assertEqual(18, mg['grid']) def test_size_genset(self): self.assertEqual(int(np.ceil(10/0.9)), self.mgen._size_genset([10, 10, 10])) def test_size_battery(self): size = self.mgen._size_battery([10, 10, 10]) self.assertLessEqual(30, size) self.assertGreaterEqual(50, size) def test_generate_microgrid(self): microgrids = self.mgen.generate_microgrid().microgrids self.assertEqual(self.mgen.nb_microgrids, len(microgrids)) def test_create_microgrid(self): mg = self.mgen._create_microgrid() self.assertEqual(1, mg.architecture['battery']) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/test_nonmodular_microgrid.py ================================================ """ Copyright 2020 Total S.A. Authors:Gonzague Henri Permission to use, modify, and distribute this software is given under the terms of the pymgrid License. NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Date: 2020/08/27 08:04 $ Gonzague Henri """ import unittest import numpy as np from pymgrid.MicrogridGenerator import MicrogridGenerator class TestNonmodularMicrogrid(unittest.TestCase): def setUp(self): mgen = MicrogridGenerator() self.mg = mgen._create_microgrid() @staticmethod def random_control(): return dict(pv_consummed=np.random.rand(), battery_charge=np.random.rand(), battery_discharge=np.random.rand(), grid_import=np.random.rand(), grid_export=np.random.rand() ) def test_set_horizon(self): self.mg.set_horizon(25) self.assertEqual(25, self.mg.horizon) def test_get_updated_values(self): mg_data = self.mg.get_updated_values() self.assertEqual(0, mg_data['pv']) def test_forecast_all(self): self.mg.set_horizon(24) forecast = self.mg.forecast_all() self.assertEqual(24, len(forecast['load'])) def test_forecast_pv(self): self.mg.set_horizon(24) forecast = self.mg.forecast_pv() self.assertEqual (24, len(forecast)) def test_forecast_load(self): self.mg.set_horizon(24) forecast = self.mg.forecast_load() self.assertEqual (24, len(forecast)) def test_run(self): pv1 = self.mg.forecast_pv()[1] self.mg.run(self.random_control()) pv2 = self.mg.pv self.assertEqual(pv1, pv2) def test_train_test_split(self): self.mg.train_test_split() self.assertEqual('training',self.mg._data_set_to_use) def test_reset(self): self.mg.run(self.random_control()) self.mg.reset() self.assertEqual (0, self.mg._tracking_timestep) if __name__ == '__main__': unittest.main()