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.

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()