diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml new file mode 100644 index 0000000..6ae668a --- /dev/null +++ b/.github/workflows/python-app.yml @@ -0,0 +1,42 @@ +# This workflow will install Python dependencies, run tests and lint with a single version of Python +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: MERCS + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.8 + uses: actions/setup-python@v2 + with: + python-version: 3.8 + - name: Install Poetry + uses: dschep/install-poetry-action@v1.3 + with: + # Use the preview version of Poetry + preview: false + - name: Install dependencies + run: | + poetry install + python3 -m pip install --upgrade pip + pip install flake8 pytest + python -m pip install "dask[complete]" + - 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: | + pytest diff --git a/.gitignore b/.gitignore index 0f00085..850c839 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Notebooks .ipynb_checkpoints */ipynb_checkpoints/* +note/ #Models */*.pkl @@ -36,3 +37,10 @@ MANIFEST # Sphinx documentation docs/_build/ + +# mkdocs build +site/ + +# VSCode config +.vscode +.DS_Store \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index d26921d..0000000 --- a/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -language: - python - -python: - - 3.6 - -install: - - source tests/travis_setup.sh - -script: - - python setup.py develop - - pytest tests -v -# - pytest tests/integration/ -v -# - pytest tests/unit/ -v - -after_script: - - travis-cleanup - -notifications: - email: - recipients: - - elia.vanwolputte@gmail.com - on_success: change # default: change - on_failure: always # default: always - - - diff --git a/.vscode/.ropeproject/config.py b/.vscode/.ropeproject/config.py deleted file mode 100644 index dee2d1a..0000000 --- a/.vscode/.ropeproject/config.py +++ /dev/null @@ -1,114 +0,0 @@ -# The default ``config.py`` -# flake8: noqa - - -def set_prefs(prefs): - """This function is called before opening the project""" - - # Specify which files and folders to ignore in the project. - # Changes to ignored resources are not added to the history and - # VCSs. Also they are not returned in `Project.get_files()`. - # Note that ``?`` and ``*`` match all characters but slashes. - # '*.pyc': matches 'test.pyc' and 'pkg/test.pyc' - # 'mod*.pyc': matches 'test/mod1.pyc' but not 'mod/1.pyc' - # '.svn': matches 'pkg/.svn' and all of its children - # 'build/*.o': matches 'build/lib.o' but not 'build/sub/lib.o' - # 'build//*.o': matches 'build/lib.o' and 'build/sub/lib.o' - prefs['ignored_resources'] = ['*.pyc', '*~', '.ropeproject', - '.hg', '.svn', '_svn', '.git', '.tox'] - - # Specifies which files should be considered python files. It is - # useful when you have scripts inside your project. Only files - # ending with ``.py`` are considered to be python files by - # default. - # prefs['python_files'] = ['*.py'] - - # Custom source folders: By default rope searches the project - # for finding source folders (folders that should be searched - # for finding modules). You can add paths to that list. Note - # that rope guesses project source folders correctly most of the - # time; use this if you have any problems. - # The folders should be relative to project root and use '/' for - # separating folders regardless of the platform rope is running on. - # 'src/my_source_folder' for instance. - # prefs.add('source_folders', 'src') - - # You can extend python path for looking up modules - # prefs.add('python_path', '~/python/') - - # Should rope save object information or not. - prefs['save_objectdb'] = True - prefs['compress_objectdb'] = False - - # If `True`, rope analyzes each module when it is being saved. - prefs['automatic_soa'] = True - # The depth of calls to follow in static object analysis - prefs['soa_followed_calls'] = 0 - - # If `False` when running modules or unit tests "dynamic object - # analysis" is turned off. This makes them much faster. - prefs['perform_doa'] = True - - # Rope can check the validity of its object DB when running. - prefs['validate_objectdb'] = True - - # How many undos to hold? - prefs['max_history_items'] = 32 - - # Shows whether to save history across sessions. - prefs['save_history'] = True - prefs['compress_history'] = False - - # Set the number spaces used for indenting. According to - # :PEP:`8`, it is best to use 4 spaces. Since most of rope's - # unit-tests use 4 spaces it is more reliable, too. - prefs['indent_size'] = 4 - - # Builtin and c-extension modules that are allowed to be imported - # and inspected by rope. - prefs['extension_modules'] = [] - - # Add all standard c-extensions to extension_modules list. - prefs['import_dynload_stdmods'] = True - - # If `True` modules with syntax errors are considered to be empty. - # The default value is `False`; When `False` syntax errors raise - # `rope.base.exceptions.ModuleSyntaxError` exception. - prefs['ignore_syntax_errors'] = False - - # If `True`, rope ignores unresolvable imports. Otherwise, they - # appear in the importing namespace. - prefs['ignore_bad_imports'] = False - - # If `True`, rope will insert new module imports as - # `from import ` by default. - prefs['prefer_module_from_imports'] = False - - # If `True`, rope will transform a comma list of imports into - # multiple separate import statements when organizing - # imports. - prefs['split_imports'] = False - - # If `True`, rope will remove all top-level import statements and - # reinsert them at the top of the module when making changes. - prefs['pull_imports_to_top'] = True - - # If `True`, rope will sort imports alphabetically by module name instead - # of alphabetically by import statement, with from imports after normal - # imports. - prefs['sort_imports_alphabetically'] = False - - # Location of implementation of - # rope.base.oi.type_hinting.interfaces.ITypeHintingFactory In general - # case, you don't have to change this value, unless you're an rope expert. - # Change this value to inject you own implementations of interfaces - # listed in module rope.base.oi.type_hinting.providers.interfaces - # For example, you can add you own providers for Django Models, or disable - # the search type-hinting in a class hierarchy, etc. - prefs['type_hinting_factory'] = ( - 'rope.base.oi.type_hinting.factory.default_type_hinting_factory') - - -def project_opened(project): - """This function is called after opening the project""" - # Do whatever you like here! diff --git a/.vscode/.ropeproject/objectdb b/.vscode/.ropeproject/objectdb deleted file mode 100644 index 0a47446..0000000 Binary files a/.vscode/.ropeproject/objectdb and /dev/null differ diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 590490e..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "python.pythonPath": "/home/zissou/miniconda3/bin/python", - "python.formatting.provider": "black" -} \ No newline at end of file diff --git a/AUTHORS.rst b/AUTHORS.rst index 7352ba5..55314b4 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -3,3 +3,4 @@ Contributors ============ * Elia vw +* Andrés Reverón Molina diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 226e6f5..cc3ea59 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,9 +2,24 @@ Changelog ========= -Version 0.1 +Version 0.0.45 =========== -- Feature A added -- FIX: nasty bug #1729 fixed -- add your changes here! +- Added tests on several datasets +- Fixed label detection +- Fixed nrmse calculation +- Fixed target detection +- Fixed mixed model scoring +- Updated decision-tree-morfist@0.3.3 + +Version 0.0.44 +=========== + +- Added the option to work with mixed(regression and classification) tasks +- Removed unused code +- General cleanup + +Version 0.0.37 +=========== + +- Initial version diff --git a/README.md b/README.md index 7e66afa..7460573 100644 --- a/README.md +++ b/README.md @@ -4,24 +4,23 @@ MERCS stands for **multi-directional ensembles of classification and regression ## Installation -Easy via pip; +Easy via pip: ``` pip install mercs ``` -## Website +## Documentation -Our (very small) website can be found [here](https://eliavw.github.io/mercs/). +All the documentation and a quickstart guide can be accessed here: +[https://eliavw.github.io/mercs/](https://eliavw.github.io/mercs/) +## Run/Build locally +To run the project, you need [Poetry](https://python-poetry.org). Once installed: -## Tutorials - -Cf. the [quickstart section](https://eliavw.github.io/mercs/quickstart) of the website. - -## Code - -MERCS is fully open-source cf. our [github-repository](https://github.com/eliavw/mercs/) +1. Clone the repository. +2. Run `poetry install`. +3. The development environment is ready. You can test it by running `pytest`. ## Publications @@ -45,4 +44,4 @@ People involved in this project: * [Elia Van Wolputte](https://eliavw.github.io/) * Evgeniya Korneva * [Prof. Hendrik Blockeel](https://people.cs.kuleuven.be/~hendrik.blockeel/) - +* [Andrés Reverón Molina](https://andres.reveronmolina.me) diff --git a/config/.gitignore b/config/.gitignore deleted file mode 100644 index 5e7d273..0000000 --- a/config/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore diff --git a/data/auto-mpg.csv b/data/auto-mpg.csv new file mode 100644 index 0000000..e04ef5d --- /dev/null +++ b/data/auto-mpg.csv @@ -0,0 +1,393 @@ +mpg,cylinders,displacement,horsepower,weight,acceleration,modelyear,origin +18,4,307,130,3504,12,0,0 +15,4,350,165,3693,11.5,0,0 +18,4,318,150,3436,11,0,0 +16,4,304,150,3433,12,0,0 +17,4,302,140,3449,10.5,0,0 +15,4,429,198,4341,10,0,0 +14,4,454,220,4354,9,0,0 +14,4,440,215,4312,8.5,0,0 +14,4,455,225,4425,10,0,0 +15,4,390,190,3850,8.5,0,0 +15,4,383,170,3563,10,0,0 +14,4,340,160,3609,8,0,0 +15,4,400,150,3761,9.5,0,0 +14,4,455,225,3086,10,0,0 +24,1,113,95,2372,15,0,2 +22,3,198,95,2833,15.5,0,0 +18,3,199,97,2774,15.5,0,0 +21,3,200,85,2587,16,0,0 +27,1,97,88,2130,14.5,0,2 +26,1,97,46,1835,20.5,0,1 +25,1,110,87,2672,17.5,0,1 +24,1,107,90,2430,14.5,0,1 +25,1,104,95,2375,17.5,0,1 +26,1,121,113,2234,12.5,0,1 +21,3,199,90,2648,15,0,0 +10,4,360,215,4615,14,0,0 +10,4,307,200,4376,15,0,0 +11,4,318,210,4382,13.5,0,0 +9,4,304,193,4732,18.5,0,0 +27,1,97,88,2130,14.5,1,2 +28,1,140,90,2264,15.5,1,0 +25,1,113,95,2228,14,1,2 +19,3,232,100,2634,13,1,0 +16,3,225,105,3439,15.5,1,0 +17,3,250,100,3329,15.5,1,0 +19,3,250,88,3302,15.5,1,0 +18,3,232,100,3288,15.5,1,0 +14,4,350,165,4209,12,1,0 +14,4,400,175,4464,11.5,1,0 +14,4,351,153,4154,13.5,1,0 +14,4,318,150,4096,13,1,0 +12,4,383,180,4955,11.5,1,0 +13,4,400,170,4746,12,1,0 +13,4,400,175,5140,12,1,0 +18,3,258,110,2962,13.5,1,0 +22,1,140,72,2408,19,1,0 +19,3,250,100,3282,15,1,0 +18,3,250,88,3139,14.5,1,0 +23,1,122,86,2220,14,1,0 +28,1,116,90,2123,14,1,1 +30,1,79,70,2074,19.5,1,1 +30,1,88,76,2065,14.5,1,1 +31,1,71,65,1773,19,1,2 +35,1,72,69,1613,18,1,2 +27,1,97,60,1834,19,1,1 +26,1,91,70,1955,20.5,1,0 +24,1,113,95,2278,15.5,2,2 +25,1,97.5,80,2126,17,2,0 +23,1,97,54,2254,23.5,2,1 +20,1,140,90,2408,19.5,2,0 +21,1,122,86,2226,16.5,2,0 +13,4,350,165,4274,12,2,0 +14,4,400,175,4385,12,2,0 +15,4,318,150,4135,13.5,2,0 +14,4,351,153,4129,13,2,0 +17,4,304,150,3672,11.5,2,0 +11,4,429,208,4633,11,2,0 +13,4,350,155,4502,13.5,2,0 +12,4,350,160,4456,13.5,2,0 +13,4,400,190,4422,12.5,2,0 +19,0,70,97,2330,13.5,2,2 +15,4,304,150,3892,12.5,2,0 +13,4,307,130,4098,14,2,0 +13,4,302,140,4294,16,2,0 +14,4,318,150,4077,14,2,0 +18,1,121,112,2933,14.5,2,1 +22,1,121,76,2511,18,2,1 +21,1,120,87,2979,19.5,2,1 +26,1,96,69,2189,18,2,1 +22,1,122,86,2395,16,2,0 +28,1,97,92,2288,17,2,2 +23,1,120,97,2506,14.5,2,2 +28,1,98,80,2164,15,2,0 +27,1,97,88,2100,16.5,2,2 +13,4,350,175,4100,13,3,0 +14,4,304,150,3672,11.5,3,0 +13,4,350,145,3988,13,3,0 +14,4,302,137,4042,14.5,3,0 +15,4,318,150,3777,12.5,3,0 +12,4,429,198,4952,11.5,3,0 +13,4,400,150,4464,12,3,0 +13,4,351,158,4363,13,3,0 +14,4,318,150,4237,14.5,3,0 +13,4,440,215,4735,11,3,0 +12,4,455,225,4951,11,3,0 +13,4,360,175,3821,11,3,0 +18,3,225,105,3121,16.5,3,0 +16,3,250,100,3278,18,3,0 +18,3,232,100,2945,16,3,0 +18,3,250,88,3021,16.5,3,0 +23,3,198,95,2904,16,3,0 +26,1,97,46,1950,21,3,1 +11,4,400,150,4997,14,3,0 +12,4,400,167,4906,12.5,3,0 +13,4,360,170,4654,13,3,0 +12,4,350,180,4499,12.5,3,0 +18,3,232,100,2789,15,3,0 +20,1,97,88,2279,19,3,2 +21,1,140,72,2401,19.5,3,0 +22,1,108,94,2379,16.5,3,2 +18,0,70,90,2124,13.5,3,2 +19,1,122,85,2310,18.5,3,0 +21,3,155,107,2472,14,3,0 +26,1,98,90,2265,15.5,3,1 +15,4,350,145,4082,13,3,0 +16,4,400,230,4278,9.5,3,0 +29,1,68,49,1867,19.5,3,1 +24,1,116,75,2158,15.5,3,1 +20,1,114,91,2582,14,3,1 +19,1,121,112,2868,15.5,3,1 +15,4,318,150,3399,11,3,0 +24,1,121,110,2660,14,3,1 +20,3,156,122,2807,13.5,3,2 +11,4,350,180,3664,11,3,0 +20,3,198,95,3102,16.5,4,0 +19,3,232,100,2901,16,4,0 +15,3,250,100,3336,17,4,0 +31,1,79,67,1950,19,4,2 +26,1,122,80,2451,16.5,4,0 +32,1,71,65,1836,21,4,2 +25,1,140,75,2542,17,4,0 +16,3,250,100,3781,17,4,0 +16,3,258,110,3632,18,4,0 +18,3,225,105,3613,16.5,4,0 +16,4,302,140,4141,14,4,0 +13,4,350,150,4699,14.5,4,0 +14,4,318,150,4457,13.5,4,0 +14,4,302,140,4638,16,4,0 +14,4,304,150,4257,15.5,4,0 +29,1,98,83,2219,16.5,4,1 +26,1,79,67,1963,15.5,4,1 +26,1,97,78,2300,14.5,4,1 +31,1,76,52,1649,16.5,4,2 +32,1,83,61,2003,19,4,2 +28,1,90,75,2125,14.5,4,0 +24,1,90,75,2108,15.5,4,1 +26,1,116,75,2246,14,4,1 +24,1,120,97,2489,15,4,2 +26,1,108,93,2391,15.5,4,2 +31,1,79,67,2000,16,4,1 +19,3,225,95,3264,16,5,0 +18,3,250,105,3459,16,5,0 +15,3,250,72,3432,21,5,0 +15,3,250,72,3158,19.5,5,0 +16,4,400,170,4668,11.5,5,0 +15,4,350,145,4440,14,5,0 +16,4,318,150,4498,14.5,5,0 +14,4,351,148,4657,13.5,5,0 +17,3,231,110,3907,21,5,0 +16,3,250,105,3897,18.5,5,0 +15,3,258,110,3730,19,5,0 +18,3,225,95,3785,19,5,0 +21,3,231,110,3039,15,5,0 +20,4,262,110,3221,13.5,5,0 +13,4,302,129,3169,12,5,0 +29,1,97,75,2171,16,5,2 +23,1,140,83,2639,17,5,0 +20,3,232,100,2914,16,5,0 +23,1,140,78,2592,18.5,5,0 +24,1,134,96,2702,13.5,5,2 +25,1,90,71,2223,16.5,5,1 +24,1,119,97,2545,17,5,2 +18,3,171,97,2984,14.5,5,0 +29,1,90,70,1937,14,5,1 +19,3,232,90,3211,17,5,0 +23,1,115,95,2694,15,5,1 +23,1,120,88,2957,17,5,1 +22,1,121,98,2945,14.5,5,1 +25,1,121,115,2671,13.5,5,1 +33,1,91,53,1795,17.5,5,2 +28,1,107,86,2464,15.5,6,1 +25,1,116,81,2220,16.9,6,1 +25,1,140,92,2572,14.9,6,0 +26,1,98,79,2255,17.7,6,0 +27,1,101,83,2202,15.3,6,1 +17.5,4,305,140,4215,13,6,0 +16,4,318,150,4190,13,6,0 +15.5,4,304,120,3962,13.9,6,0 +14.5,4,351,152,4215,12.8,6,0 +22,3,225,100,3233,15.4,6,0 +22,3,250,105,3353,14.5,6,0 +24,3,200,81,3012,17.6,6,0 +22.5,3,232,90,3085,17.6,6,0 +29,1,85,52,2035,22.2,6,0 +24.5,1,98,60,2164,22.1,6,0 +29,1,90,70,1937,14.2,6,1 +33,1,91,53,1795,17.4,6,2 +20,3,225,100,3651,17.7,6,0 +18,3,250,78,3574,21,6,0 +18.5,3,250,110,3645,16.2,6,0 +17.5,3,258,95,3193,17.8,6,0 +29.5,1,97,71,1825,12.2,6,1 +32,1,85,70,1990,17,6,2 +28,1,97,75,2155,16.4,6,2 +26.5,1,140,72,2565,13.6,6,0 +20,1,130,102,3150,15.7,6,1 +13,4,318,150,3940,13.2,6,0 +19,1,120,88,3270,21.9,6,1 +19,3,156,108,2930,15.5,6,2 +16.5,3,168,120,3820,16.7,6,1 +16.5,4,350,180,4380,12.1,6,0 +13,4,350,145,4055,12,6,0 +13,4,302,130,3870,15,6,0 +13,4,318,150,3755,14,6,0 +31.5,1,98,68,2045,18.5,7,2 +30,1,111,80,2155,14.8,7,0 +36,1,79,58,1825,18.6,7,1 +25.5,1,122,96,2300,15.5,7,0 +33.5,1,85,70,1945,16.8,7,2 +17.5,4,305,145,3880,12.5,7,0 +17,4,260,110,4060,19,7,0 +15.5,4,318,145,4140,13.7,7,0 +15,4,302,130,4295,14.9,7,0 +17.5,3,250,110,3520,16.4,7,0 +20.5,3,231,105,3425,16.9,7,0 +19,3,225,100,3630,17.7,7,0 +18.5,3,250,98,3525,19,7,0 +16,4,400,180,4220,11.1,7,0 +15.5,4,350,170,4165,11.4,7,0 +15.5,4,400,190,4325,12.2,7,0 +16,4,351,149,4335,14.5,7,0 +29,1,97,78,1940,14.5,7,1 +24.5,1,151,88,2740,16,7,0 +26,1,97,75,2265,18.2,7,2 +25.5,1,140,89,2755,15.8,7,0 +30.5,1,98,63,2051,17,7,0 +33.5,1,98,83,2075,15.9,7,0 +30,1,97,67,1985,16.4,7,2 +30.5,1,97,78,2190,14.1,7,1 +22,3,146,97,2815,14.5,7,2 +21.5,1,121,110,2600,12.8,7,1 +21.5,0,80,110,2720,13.5,7,2 +43.1,1,90,48,1985,21.5,8,1 +36.1,1,98,66,1800,14.4,8,0 +32.8,1,78,52,1985,19.4,8,2 +39.4,1,85,70,2070,18.6,8,2 +36.1,1,91,60,1800,16.4,8,2 +19.9,4,260,110,3365,15.5,8,0 +19.4,4,318,140,3735,13.2,8,0 +20.2,4,302,139,3570,12.8,8,0 +19.2,3,231,105,3535,19.2,8,0 +20.5,3,200,95,3155,18.2,8,0 +20.2,3,200,85,2965,15.8,8,0 +25.1,1,140,88,2720,15.4,8,0 +20.5,3,225,100,3430,17.2,8,0 +19.4,3,232,90,3210,17.2,8,0 +20.6,3,231,105,3380,15.8,8,0 +20.8,3,200,85,3070,16.7,8,0 +18.6,3,225,110,3620,18.7,8,0 +18.1,3,258,120,3410,15.1,8,0 +19.2,4,305,145,3425,13.2,8,0 +17.7,3,231,165,3445,13.4,8,0 +18.1,4,302,139,3205,11.2,8,0 +17.5,4,318,140,4080,13.7,8,0 +30,1,98,68,2155,16.5,8,0 +27.5,1,134,95,2560,14.2,8,2 +27.2,1,119,97,2300,14.7,8,2 +30.9,1,105,75,2230,14.5,8,0 +21.1,1,134,95,2515,14.8,8,2 +23.2,1,156,105,2745,16.7,8,0 +23.8,1,151,85,2855,17.6,8,0 +23.9,1,119,97,2405,14.9,8,2 +20.3,2,131,103,2830,15.9,8,1 +17,3,163,125,3140,13.6,8,1 +21.6,1,121,115,2795,15.7,8,1 +16.2,3,163,133,3410,15.8,8,1 +31.5,1,89,71,1990,14.9,8,1 +29.5,1,98,68,2135,16.6,8,2 +21.5,3,231,115,3245,15.4,9,0 +19.8,3,200,85,2990,18.2,9,0 +22.3,1,140,88,2890,17.3,9,0 +20.2,3,232,90,3265,18.2,9,0 +20.6,3,225,110,3360,16.6,9,0 +17,4,305,130,3840,15.4,9,0 +17.6,4,302,129,3725,13.4,9,0 +16.5,4,351,138,3955,13.2,9,0 +18.2,4,318,135,3830,15.2,9,0 +16.9,4,350,155,4360,14.9,9,0 +15.5,4,351,142,4054,14.3,9,0 +19.2,4,267,125,3605,15,9,0 +18.5,4,360,150,3940,13,9,0 +31.9,1,89,71,1925,14,9,1 +34.1,1,86,65,1975,15.2,9,2 +35.7,1,98,80,1915,14.4,9,0 +27.4,1,121,80,2670,15,9,0 +25.4,2,183,77,3530,20.1,9,1 +23,4,350,125,3900,17.4,9,0 +27.2,1,141,71,3190,24.8,9,1 +23.9,4,260,90,3420,22.2,9,0 +34.2,1,105,70,2200,13.2,9,0 +34.5,1,105,70,2150,14.9,9,0 +31.8,1,85,65,2020,19.2,9,2 +37.3,1,91,69,2130,14.7,9,1 +28.4,1,151,90,2670,16,9,0 +28.8,3,173,115,2595,11.3,9,0 +26.8,3,173,115,2700,12.9,9,0 +33.5,1,151,90,2556,13.2,9,0 +41.5,1,98,76,2144,14.7,10,1 +38.1,1,89,60,1968,18.8,10,2 +32.1,1,98,70,2120,15.5,10,0 +37.2,1,86,65,2019,16.4,10,2 +28,1,151,90,2678,16.5,10,0 +26.4,1,140,88,2870,18.1,10,0 +24.3,1,151,90,3003,20.1,10,0 +19.1,3,225,90,3381,18.7,10,0 +34.3,1,97,78,2188,15.8,10,1 +29.8,1,134,90,2711,15.5,10,2 +31.3,1,120,75,2542,17.5,10,2 +37,1,119,92,2434,15,10,2 +32.2,1,108,75,2265,15.2,10,2 +46.6,1,86,65,2110,17.9,10,2 +27.9,1,156,105,2800,14.4,10,0 +40.8,1,85,65,2110,19.2,10,2 +44.3,1,90,48,2085,21.7,10,1 +43.4,1,90,48,2335,23.7,10,1 +36.4,2,121,67,2950,19.9,10,1 +30,1,146,67,3250,21.8,10,1 +44.6,1,91,67,1850,13.8,10,2 +33.8,1,97,67,2145,18,10,2 +29.8,1,89,62,1845,15.3,10,1 +32.7,3,168,132,2910,11.4,10,2 +23.7,0,70,100,2420,12.5,10,2 +35,1,122,88,2500,15.1,10,1 +32.4,1,107,72,2290,17,10,2 +27.2,1,135,84,2490,15.7,11,0 +26.6,1,151,84,2635,16.4,11,0 +25.8,1,156,92,2620,14.4,11,0 +23.5,3,173,110,2725,12.6,11,0 +30,1,135,84,2385,12.9,11,0 +39.1,1,79,58,1755,16.9,11,2 +39,1,86,64,1875,16.4,11,0 +35.1,1,81,60,1760,16.1,11,2 +32.3,1,97,67,2065,17.8,11,2 +37,1,85,65,1975,19.4,11,2 +37.7,1,89,62,2050,17.3,11,2 +34.1,1,91,68,1985,16,11,2 +34.7,1,105,63,2215,14.9,11,0 +34.4,1,98,65,2045,16.2,11,0 +29.9,1,98,65,2380,20.7,11,0 +33,1,105,74,2190,14.2,11,1 +33.7,1,107,75,2210,14.4,11,2 +32.4,1,108,75,2350,16.8,11,2 +32.9,1,119,100,2615,14.8,11,2 +31.6,1,120,74,2635,18.3,11,2 +28.1,1,141,80,3230,20.4,11,1 +30.7,3,145,76,3160,19.6,11,1 +25.4,3,168,116,2900,12.6,11,2 +24.2,3,146,120,2930,13.8,11,2 +22.4,3,231,110,3415,15.8,11,0 +26.6,4,350,105,3725,19,11,0 +20.2,3,200,88,3060,17.1,11,0 +17.6,3,225,85,3465,16.6,11,0 +28,1,112,88,2605,19.6,12,0 +27,1,112,88,2640,18.6,12,0 +34,1,112,88,2395,18,12,0 +31,1,112,85,2575,16.2,12,0 +29,1,135,84,2525,16,12,0 +27,1,151,90,2735,18,12,0 +24,1,140,92,2865,16.4,12,0 +36,1,105,74,1980,15.3,12,1 +37,1,91,68,2025,18.2,12,2 +31,1,91,68,1970,17.6,12,2 +38,1,105,63,2125,14.7,12,0 +36,1,98,70,2125,17.3,12,0 +36,1,120,88,2160,14.5,12,2 +36,1,107,75,2205,14.5,12,2 +34,1,108,70,2245,16.9,12,2 +38,1,91,67,1965,15,12,2 +32,1,91,67,1965,15.7,12,2 +38,1,91,67,1995,16.2,12,2 +25,3,181,110,2945,16.4,12,0 +38,3,262,85,3015,17,12,0 +26,1,156,92,2585,14.5,12,0 +22,3,232,112,2835,14.7,12,0 +32,1,144,96,2665,13.9,12,2 +36,1,135,84,2370,13,12,0 +27,1,151,90,2950,17.3,12,0 +27,1,140,86,2790,15.6,12,0 +44,1,97,52,2130,24.6,12,1 +32,1,135,84,2295,11.6,12,0 +28,1,120,79,2625,18.6,12,0 +31,1,119,82,2720,19.4,12,0 \ No newline at end of file diff --git a/data/heart_failure_clinical_records.csv b/data/heart_failure_clinical_records.csv new file mode 100644 index 0000000..915ecc5 --- /dev/null +++ b/data/heart_failure_clinical_records.csv @@ -0,0 +1,300 @@ +age,anaemia,creatinine_phosphokinase,diabetes,ejection_fraction,high_blood_pressure,platelets,serum_creatinine,serum_sodium,sex,smoking,time,DEATH_EVENT +75,0,582,0,20,1,265000,1.9,130,1,0,4,1 +55,0,7861,0,38,0,263358.03,1.1,136,1,0,6,1 +65,0,146,0,20,0,162000,1.3,129,1,1,7,1 +50,1,111,0,20,0,210000,1.9,137,1,0,7,1 +65,1,160,1,20,0,327000,2.7,116,0,0,8,1 +90,1,47,0,40,1,204000,2.1,132,1,1,8,1 +75,1,246,0,15,0,127000,1.2,137,1,0,10,1 +60,1,315,1,60,0,454000,1.1,131,1,1,10,1 +65,0,157,0,65,0,263358.03,1.5,138,0,0,10,1 +80,1,123,0,35,1,388000,9.4,133,1,1,10,1 +75,1,81,0,38,1,368000,4,131,1,1,10,1 +62,0,231,0,25,1,253000,0.9,140,1,1,10,1 +45,1,981,0,30,0,136000,1.1,137,1,0,11,1 +50,1,168,0,38,1,276000,1.1,137,1,0,11,1 +49,1,80,0,30,1,427000,1,138,0,0,12,0 +82,1,379,0,50,0,47000,1.3,136,1,0,13,1 +87,1,149,0,38,0,262000,0.9,140,1,0,14,1 +45,0,582,0,14,0,166000,0.8,127,1,0,14,1 +70,1,125,0,25,1,237000,1,140,0,0,15,1 +48,1,582,1,55,0,87000,1.9,121,0,0,15,1 +65,1,52,0,25,1,276000,1.3,137,0,0,16,0 +65,1,128,1,30,1,297000,1.6,136,0,0,20,1 +68,1,220,0,35,1,289000,0.9,140,1,1,20,1 +53,0,63,1,60,0,368000,0.8,135,1,0,22,0 +75,0,582,1,30,1,263358.03,1.83,134,0,0,23,1 +80,0,148,1,38,0,149000,1.9,144,1,1,23,1 +95,1,112,0,40,1,196000,1,138,0,0,24,1 +70,0,122,1,45,1,284000,1.3,136,1,1,26,1 +58,1,60,0,38,0,153000,5.8,134,1,0,26,1 +82,0,70,1,30,0,200000,1.2,132,1,1,26,1 +94,0,582,1,38,1,263358.03,1.83,134,1,0,27,1 +85,0,23,0,45,0,360000,3,132,1,0,28,1 +50,1,249,1,35,1,319000,1,128,0,0,28,1 +50,1,159,1,30,0,302000,1.2,138,0,0,29,0 +65,0,94,1,50,1,188000,1,140,1,0,29,1 +69,0,582,1,35,0,228000,3.5,134,1,0,30,1 +90,1,60,1,50,0,226000,1,134,1,0,30,1 +82,1,855,1,50,1,321000,1,145,0,0,30,1 +60,0,2656,1,30,0,305000,2.3,137,1,0,30,0 +60,0,235,1,38,0,329000,3,142,0,0,30,1 +70,0,582,0,20,1,263358.03,1.83,134,1,1,31,1 +50,0,124,1,30,1,153000,1.2,136,0,1,32,1 +70,0,571,1,45,1,185000,1.2,139,1,1,33,1 +72,0,127,1,50,1,218000,1,134,1,0,33,0 +60,1,588,1,60,0,194000,1.1,142,0,0,33,1 +50,0,582,1,38,0,310000,1.9,135,1,1,35,1 +51,0,1380,0,25,1,271000,0.9,130,1,0,38,1 +60,0,582,1,38,1,451000,0.6,138,1,1,40,1 +80,1,553,0,20,1,140000,4.4,133,1,0,41,1 +57,1,129,0,30,0,395000,1,140,0,0,42,1 +68,1,577,0,25,1,166000,1,138,1,0,43,1 +53,1,91,0,20,1,418000,1.4,139,0,0,43,1 +60,0,3964,1,62,0,263358.03,6.8,146,0,0,43,1 +70,1,69,1,50,1,351000,1,134,0,0,44,1 +60,1,260,1,38,0,255000,2.2,132,0,1,45,1 +95,1,371,0,30,0,461000,2,132,1,0,50,1 +70,1,75,0,35,0,223000,2.7,138,1,1,54,0 +60,1,607,0,40,0,216000,0.6,138,1,1,54,0 +49,0,789,0,20,1,319000,1.1,136,1,1,55,1 +72,0,364,1,20,1,254000,1.3,136,1,1,59,1 +45,0,7702,1,25,1,390000,1,139,1,0,60,1 +50,0,318,0,40,1,216000,2.3,131,0,0,60,1 +55,0,109,0,35,0,254000,1.1,139,1,1,60,0 +45,0,582,0,35,0,385000,1,145,1,0,61,1 +45,0,582,0,80,0,263358.03,1.18,137,0,0,63,0 +60,0,68,0,20,0,119000,2.9,127,1,1,64,1 +42,1,250,1,15,0,213000,1.3,136,0,0,65,1 +72,1,110,0,25,0,274000,1,140,1,1,65,1 +70,0,161,0,25,0,244000,1.2,142,0,0,66,1 +65,0,113,1,25,0,497000,1.83,135,1,0,67,1 +41,0,148,0,40,0,374000,0.8,140,1,1,68,0 +58,0,582,1,35,0,122000,0.9,139,1,1,71,0 +85,0,5882,0,35,0,243000,1,132,1,1,72,1 +65,0,224,1,50,0,149000,1.3,137,1,1,72,0 +69,0,582,0,20,0,266000,1.2,134,1,1,73,1 +60,1,47,0,20,0,204000,0.7,139,1,1,73,1 +70,0,92,0,60,1,317000,0.8,140,0,1,74,0 +42,0,102,1,40,0,237000,1.2,140,1,0,74,0 +75,1,203,1,38,1,283000,0.6,131,1,1,74,0 +55,0,336,0,45,1,324000,0.9,140,0,0,74,0 +70,0,69,0,40,0,293000,1.7,136,0,0,75,0 +67,0,582,0,50,0,263358.03,1.18,137,1,1,76,0 +60,1,76,1,25,0,196000,2.5,132,0,0,77,1 +79,1,55,0,50,1,172000,1.8,133,1,0,78,0 +59,1,280,1,25,1,302000,1,141,0,0,78,1 +51,0,78,0,50,0,406000,0.7,140,1,0,79,0 +55,0,47,0,35,1,173000,1.1,137,1,0,79,0 +65,1,68,1,60,1,304000,0.8,140,1,0,79,0 +44,0,84,1,40,1,235000,0.7,139,1,0,79,0 +57,1,115,0,25,1,181000,1.1,144,1,0,79,0 +70,0,66,1,45,0,249000,0.8,136,1,1,80,0 +60,0,897,1,45,0,297000,1,133,1,0,80,0 +42,0,582,0,60,0,263358.03,1.18,137,0,0,82,0 +60,1,154,0,25,0,210000,1.7,135,1,0,82,1 +58,0,144,1,38,1,327000,0.7,142,0,0,83,0 +58,1,133,0,60,1,219000,1,141,1,0,83,0 +63,1,514,1,25,1,254000,1.3,134,1,0,83,0 +70,1,59,0,60,0,255000,1.1,136,0,0,85,0 +60,1,156,1,25,1,318000,1.2,137,0,0,85,0 +63,1,61,1,40,0,221000,1.1,140,0,0,86,0 +65,1,305,0,25,0,298000,1.1,141,1,0,87,0 +75,0,582,0,45,1,263358.03,1.18,137,1,0,87,0 +80,0,898,0,25,0,149000,1.1,144,1,1,87,0 +42,0,5209,0,30,0,226000,1,140,1,1,87,0 +60,0,53,0,50,1,286000,2.3,143,0,0,87,0 +72,1,328,0,30,1,621000,1.7,138,0,1,88,1 +55,0,748,0,45,0,263000,1.3,137,1,0,88,0 +45,1,1876,1,35,0,226000,0.9,138,1,0,88,0 +63,0,936,0,38,0,304000,1.1,133,1,1,88,0 +45,0,292,1,35,0,850000,1.3,142,1,1,88,0 +85,0,129,0,60,0,306000,1.2,132,1,1,90,1 +55,0,60,0,35,0,228000,1.2,135,1,1,90,0 +50,0,369,1,25,0,252000,1.6,136,1,0,90,0 +70,1,143,0,60,0,351000,1.3,137,0,0,90,1 +60,1,754,1,40,1,328000,1.2,126,1,0,91,0 +58,1,400,0,40,0,164000,1,139,0,0,91,0 +60,1,96,1,60,1,271000,0.7,136,0,0,94,0 +85,1,102,0,60,0,507000,3.2,138,0,0,94,0 +65,1,113,1,60,1,203000,0.9,140,0,0,94,0 +86,0,582,0,38,0,263358.03,1.83,134,0,0,95,1 +60,1,737,0,60,1,210000,1.5,135,1,1,95,0 +66,1,68,1,38,1,162000,1,136,0,0,95,0 +60,0,96,1,38,0,228000,0.75,140,0,0,95,0 +60,1,582,0,30,1,127000,0.9,145,0,0,95,0 +60,0,582,0,40,0,217000,3.7,134,1,0,96,1 +43,1,358,0,50,0,237000,1.3,135,0,0,97,0 +46,0,168,1,17,1,271000,2.1,124,0,0,100,1 +58,1,200,1,60,0,300000,0.8,137,0,0,104,0 +61,0,248,0,30,1,267000,0.7,136,1,1,104,0 +53,1,270,1,35,0,227000,3.4,145,1,0,105,0 +53,1,1808,0,60,1,249000,0.7,138,1,1,106,0 +60,1,1082,1,45,0,250000,6.1,131,1,0,107,0 +46,0,719,0,40,1,263358.03,1.18,137,0,0,107,0 +63,0,193,0,60,1,295000,1.3,145,1,1,107,0 +81,0,4540,0,35,0,231000,1.18,137,1,1,107,0 +75,0,582,0,40,0,263358.03,1.18,137,1,0,107,0 +65,1,59,1,60,0,172000,0.9,137,0,0,107,0 +68,1,646,0,25,0,305000,2.1,130,1,0,108,0 +62,0,281,1,35,0,221000,1,136,0,0,108,0 +50,0,1548,0,30,1,211000,0.8,138,1,0,108,0 +80,0,805,0,38,0,263358.03,1.1,134,1,0,109,1 +46,1,291,0,35,0,348000,0.9,140,0,0,109,0 +50,0,482,1,30,0,329000,0.9,132,0,0,109,0 +61,1,84,0,40,1,229000,0.9,141,0,0,110,0 +72,1,943,0,25,1,338000,1.7,139,1,1,111,1 +50,0,185,0,30,0,266000,0.7,141,1,1,112,0 +52,0,132,0,30,0,218000,0.7,136,1,1,112,0 +64,0,1610,0,60,0,242000,1,137,1,0,113,0 +75,1,582,0,30,0,225000,1.83,134,1,0,113,1 +60,0,2261,0,35,1,228000,0.9,136,1,0,115,0 +72,0,233,0,45,1,235000,2.5,135,0,0,115,1 +62,0,30,1,60,1,244000,0.9,139,1,0,117,0 +50,0,115,0,45,1,184000,0.9,134,1,1,118,0 +50,0,1846,1,35,0,263358.03,1.18,137,1,1,119,0 +65,1,335,0,35,1,235000,0.8,136,0,0,120,0 +60,1,231,1,25,0,194000,1.7,140,1,0,120,0 +52,1,58,0,35,0,277000,1.4,136,0,0,120,0 +50,0,250,0,25,0,262000,1,136,1,1,120,0 +85,1,910,0,50,0,235000,1.3,134,1,0,121,0 +59,1,129,0,45,1,362000,1.1,139,1,1,121,0 +66,1,72,0,40,1,242000,1.2,134,1,0,121,0 +45,1,130,0,35,0,174000,0.8,139,1,1,121,0 +63,1,582,0,40,0,448000,0.9,137,1,1,123,0 +50,1,2334,1,35,0,75000,0.9,142,0,0,126,1 +45,0,2442,1,30,0,334000,1.1,139,1,0,129,1 +80,0,776,1,38,1,192000,1.3,135,0,0,130,1 +53,0,196,0,60,0,220000,0.7,133,1,1,134,0 +59,0,66,1,20,0,70000,2.4,134,1,0,135,1 +65,0,582,1,40,0,270000,1,138,0,0,140,0 +70,0,835,0,35,1,305000,0.8,133,0,0,145,0 +51,1,582,1,35,0,263358.03,1.5,136,1,1,145,0 +52,0,3966,0,40,0,325000,0.9,140,1,1,146,0 +70,1,171,0,60,1,176000,1.1,145,1,1,146,0 +50,1,115,0,20,0,189000,0.8,139,1,0,146,0 +65,0,198,1,35,1,281000,0.9,137,1,1,146,0 +60,1,95,0,60,0,337000,1,138,1,1,146,0 +69,0,1419,0,40,0,105000,1,135,1,1,147,0 +49,1,69,0,50,0,132000,1,140,0,0,147,0 +63,1,122,1,60,0,267000,1.2,145,1,0,147,0 +55,0,835,0,40,0,279000,0.7,140,1,1,147,0 +40,0,478,1,30,0,303000,0.9,136,1,0,148,0 +59,1,176,1,25,0,221000,1,136,1,1,150,1 +65,0,395,1,25,0,265000,1.2,136,1,1,154,1 +75,0,99,0,38,1,224000,2.5,134,1,0,162,1 +58,1,145,0,25,0,219000,1.2,137,1,1,170,1 +60.667,1,104,1,30,0,389000,1.5,136,1,0,171,1 +50,0,582,0,50,0,153000,0.6,134,0,0,172,1 +60,0,1896,1,25,0,365000,2.1,144,0,0,172,1 +60.667,1,151,1,40,1,201000,1,136,0,0,172,0 +40,0,244,0,45,1,275000,0.9,140,0,0,174,0 +80,0,582,1,35,0,350000,2.1,134,1,0,174,0 +64,1,62,0,60,0,309000,1.5,135,0,0,174,0 +50,1,121,1,40,0,260000,0.7,130,1,0,175,0 +73,1,231,1,30,0,160000,1.18,142,1,1,180,0 +45,0,582,0,20,1,126000,1.6,135,1,0,180,1 +77,1,418,0,45,0,223000,1.8,145,1,0,180,1 +45,0,582,1,38,1,263358.03,1.18,137,0,0,185,0 +65,0,167,0,30,0,259000,0.8,138,0,0,186,0 +50,1,582,1,20,1,279000,1,134,0,0,186,0 +60,0,1211,1,35,0,263358.03,1.8,113,1,1,186,0 +63,1,1767,0,45,0,73000,0.7,137,1,0,186,0 +45,0,308,1,60,1,377000,1,136,1,0,186,0 +70,0,97,0,60,1,220000,0.9,138,1,0,186,0 +60,0,59,0,25,1,212000,3.5,136,1,1,187,0 +78,1,64,0,40,0,277000,0.7,137,1,1,187,0 +50,1,167,1,45,0,362000,1,136,0,0,187,0 +40,1,101,0,40,0,226000,0.8,141,0,0,187,0 +85,0,212,0,38,0,186000,0.9,136,1,0,187,0 +60,1,2281,1,40,0,283000,1,141,0,0,187,0 +49,0,972,1,35,1,268000,0.8,130,0,0,187,0 +70,0,212,1,17,1,389000,1,136,1,1,188,0 +50,0,582,0,62,1,147000,0.8,140,1,1,192,0 +78,0,224,0,50,0,481000,1.4,138,1,1,192,0 +48,1,131,1,30,1,244000,1.6,130,0,0,193,1 +65,1,135,0,35,1,290000,0.8,134,1,0,194,0 +73,0,582,0,35,1,203000,1.3,134,1,0,195,0 +70,0,1202,0,50,1,358000,0.9,141,0,0,196,0 +54,1,427,0,70,1,151000,9,137,0,0,196,1 +68,1,1021,1,35,0,271000,1.1,134,1,0,197,0 +55,0,582,1,35,1,371000,0.7,140,0,0,197,0 +73,0,582,0,20,0,263358.03,1.83,134,1,0,198,1 +65,0,118,0,50,0,194000,1.1,145,1,1,200,0 +42,1,86,0,35,0,365000,1.1,139,1,1,201,0 +47,0,582,0,25,0,130000,0.8,134,1,0,201,0 +58,0,582,1,25,0,504000,1,138,1,0,205,0 +75,0,675,1,60,0,265000,1.4,125,0,0,205,0 +58,1,57,0,25,0,189000,1.3,132,1,1,205,0 +55,1,2794,0,35,1,141000,1,140,1,0,206,0 +65,0,56,0,25,0,237000,5,130,0,0,207,0 +72,0,211,0,25,0,274000,1.2,134,0,0,207,0 +60,0,166,0,30,0,62000,1.7,127,0,0,207,1 +70,0,93,0,35,0,185000,1.1,134,1,1,208,0 +40,1,129,0,35,0,255000,0.9,137,1,0,209,0 +53,1,707,0,38,0,330000,1.4,137,1,1,209,0 +53,1,582,0,45,0,305000,1.1,137,1,1,209,0 +77,1,109,0,50,1,406000,1.1,137,1,0,209,0 +75,0,119,0,50,1,248000,1.1,148,1,0,209,0 +70,0,232,0,30,0,173000,1.2,132,1,0,210,0 +65,1,720,1,40,0,257000,1,136,0,0,210,0 +55,1,180,0,45,0,263358.03,1.18,137,1,1,211,0 +70,0,81,1,35,1,533000,1.3,139,0,0,212,0 +65,0,582,1,30,0,249000,1.3,136,1,1,212,0 +40,0,90,0,35,0,255000,1.1,136,1,1,212,0 +73,1,1185,0,40,1,220000,0.9,141,0,0,213,0 +54,0,582,1,38,0,264000,1.8,134,1,0,213,0 +61,1,80,1,38,0,282000,1.4,137,1,0,213,0 +55,0,2017,0,25,0,314000,1.1,138,1,0,214,1 +64,0,143,0,25,0,246000,2.4,135,1,0,214,0 +40,0,624,0,35,0,301000,1,142,1,1,214,0 +53,0,207,1,40,0,223000,1.2,130,0,0,214,0 +50,0,2522,0,30,1,404000,0.5,139,0,0,214,0 +55,0,572,1,35,0,231000,0.8,143,0,0,215,0 +50,0,245,0,45,1,274000,1,133,1,0,215,0 +70,0,88,1,35,1,236000,1.2,132,0,0,215,0 +53,1,446,0,60,1,263358.03,1,139,1,0,215,0 +52,1,191,1,30,1,334000,1,142,1,1,216,0 +65,0,326,0,38,0,294000,1.7,139,0,0,220,0 +58,0,132,1,38,1,253000,1,139,1,0,230,0 +45,1,66,1,25,0,233000,0.8,135,1,0,230,0 +53,0,56,0,50,0,308000,0.7,135,1,1,231,0 +55,0,66,0,40,0,203000,1,138,1,0,233,0 +62,1,655,0,40,0,283000,0.7,133,0,0,233,0 +65,1,258,1,25,0,198000,1.4,129,1,0,235,1 +68,1,157,1,60,0,208000,1,140,0,0,237,0 +61,0,582,1,38,0,147000,1.2,141,1,0,237,0 +50,1,298,0,35,0,362000,0.9,140,1,1,240,0 +55,0,1199,0,20,0,263358.03,1.83,134,1,1,241,1 +56,1,135,1,38,0,133000,1.7,140,1,0,244,0 +45,0,582,1,38,0,302000,0.9,140,0,0,244,0 +40,0,582,1,35,0,222000,1,132,1,0,244,0 +44,0,582,1,30,1,263358.03,1.6,130,1,1,244,0 +51,0,582,1,40,0,221000,0.9,134,0,0,244,0 +67,0,213,0,38,0,215000,1.2,133,0,0,245,0 +42,0,64,0,40,0,189000,0.7,140,1,0,245,0 +60,1,257,1,30,0,150000,1,137,1,1,245,0 +45,0,582,0,38,1,422000,0.8,137,0,0,245,0 +70,0,618,0,35,0,327000,1.1,142,0,0,245,0 +70,0,582,1,38,0,25100,1.1,140,1,0,246,0 +50,1,1051,1,30,0,232000,0.7,136,0,0,246,0 +55,0,84,1,38,0,451000,1.3,136,0,0,246,0 +70,0,2695,1,40,0,241000,1,137,1,0,247,0 +70,0,582,0,40,0,51000,2.7,136,1,1,250,0 +42,0,64,0,30,0,215000,3.8,128,1,1,250,0 +65,0,1688,0,38,0,263358.03,1.1,138,1,1,250,0 +50,1,54,0,40,0,279000,0.8,141,1,0,250,0 +55,1,170,1,40,0,336000,1.2,135,1,0,250,0 +60,0,253,0,35,0,279000,1.7,140,1,0,250,0 +45,0,582,1,55,0,543000,1,132,0,0,250,0 +65,0,892,1,35,0,263358.03,1.1,142,0,0,256,0 +90,1,337,0,38,0,390000,0.9,144,0,0,256,0 +45,0,615,1,55,0,222000,0.8,141,0,0,257,0 +60,0,320,0,35,0,133000,1.4,139,1,0,258,0 +52,0,190,1,38,0,382000,1,140,1,1,258,0 +63,1,103,1,35,0,179000,0.9,136,1,1,270,0 +62,0,61,1,38,1,155000,1.1,143,1,1,270,0 +55,0,1820,0,38,0,270000,1.2,139,0,0,271,0 +45,0,2060,1,60,0,742000,0.8,138,0,0,278,0 +45,0,2413,0,38,0,140000,1.4,140,1,1,280,0 +50,0,196,0,45,0,395000,1.6,136,1,1,285,0 diff --git a/data/raw/.gitignore b/data/raw/.gitignore deleted file mode 100644 index 5e7d273..0000000 --- a/data/raw/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore diff --git a/data/sf1.csv b/data/sf1.csv new file mode 100644 index 0000000..c5eabe6 --- /dev/null +++ b/data/sf1.csv @@ -0,0 +1,324 @@ +mod_zurich_class,largest_spot_size,spot_distribution,activity,evolution,previous_day_activity,hist_complex,become_hist_complex,area,area_largest,c-class,m-class,x-class +1,2,1,0,1,0,0,1,0,1,0.,0.,0. +2,2,1,0,2,0,0,1,0,1,0.,0.,0. +1,2,1,0,2,0,0,1,0,0,0.,0.,0. +2,2,1,0,2,0,0,1,0,1,0.,0.,0. +2,3,1,0,2,0,0,1,0,1,0.,0.,0. +2,3,1,0,1,0,0,1,0,1,0.,0.,0. +2,3,1,0,1,0,0,1,0,0,0.,0.,0. +2,3,1,0,1,0,0,1,0,1,0.,0.,0. +2,5,1,0,2,0,0,1,0,1,0.,0.,0. +1,1,1,0,2,0,0,1,0,0,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +2,2,1,0,1,0,0,1,0,0,0.,0.,0. +1,4,2,0,2,0,0,1,0,1,0.,0.,0. +2,1,1,0,2,0,0,1,0,0,0.,0.,0. +0,0,1,0,1,0,0,1,0,0,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +2,5,2,0,2,0,0,1,0,1,0.,0.,0. +2,2,1,0,1,0,0,1,0,1,0.,0.,0. +2,1,1,0,1,0,0,1,0,0,0.,0.,0. +1,3,2,0,1,0,0,1,0,1,0.,0.,0. +1,2,1,0,1,0,0,1,0,0,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +4,5,2,0,2,0,1,1,0,1,0.,0.,0. +0,0,1,0,1,0,0,1,0,0,0.,0.,0. +5,1,0,0,1,0,0,0,0,1,0.,0.,0. +0,0,2,0,2,0,0,1,0,0,0.,0.,0. +1,1,2,0,2,0,0,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +0,0,1,0,2,0,0,1,0,1,0.,0.,0. +2,3,2,0,2,0,1,1,0,1,0.,0.,0. +2,3,1,0,2,0,0,1,0,1,1.,0.,1. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +2,3,2,0,2,0,0,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,1,0.,0.,0. +2,1,1,0,2,0,0,1,0,1,0.,0.,0. +2,3,1,0,1,0,0,1,0,0,0.,0.,0. +1,3,2,0,2,0,0,1,0,0,0.,0.,0. +2,3,2,0,1,0,1,1,0,0,1.,0.,0. +2,3,2,1,1,2,0,1,0,1,0.,0.,0. +2,3,2,0,1,0,1,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +2,1,1,0,0,0,0,1,0,0,0.,0.,0. +2,3,2,0,1,0,0,1,0,0,0.,0.,0. +2,2,1,0,0,0,0,1,0,0,0.,0.,0. +2,2,2,0,2,0,0,1,0,0,0.,0.,0. +2,3,2,0,2,0,1,1,0,1,2.,1.,0. +2,3,2,1,2,0,1,1,0,0,0.,0.,0. +2,3,2,0,1,0,1,1,0,0,0.,0.,0. +0,0,1,0,1,0,0,1,0,0,0.,0.,0. +2,2,1,0,2,0,1,1,0,1,0.,0.,0. +2,2,1,0,2,0,0,1,0,0,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +2,3,1,0,2,0,1,1,0,1,0.,0.,0. +2,5,3,1,2,0,1,1,0,1,1.,1.,0. +2,3,2,0,2,0,1,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +2,3,1,0,2,0,1,1,0,1,0.,0.,0. +2,2,2,0,2,0,0,1,0,0,0.,0.,0. +2,5,3,0,1,0,0,1,0,1,0.,0.,0. +2,3,2,0,1,0,0,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +2,2,1,0,1,0,1,1,0,1,0.,0.,0. +2,5,3,1,2,2,1,1,0,1,1.,2.,1. +3,5,2,1,2,0,1,1,0,1,0.,0.,0. +2,2,2,0,2,0,1,1,0,1,1.,0.,0. +1,2,1,0,1,0,1,1,0,1,0.,0.,0. +2,2,2,0,2,0,1,1,0,1,0.,0.,0. +5,4,0,0,1,0,1,1,0,0,1.,0.,0. +2,2,2,0,2,0,1,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +1,1,1,0,2,0,0,1,0,0,0.,0.,0. +5,2,0,0,1,0,0,0,0,1,0.,0.,0. +2,3,1,0,1,0,1,1,0,1,0.,0.,0. +2,5,3,1,1,2,1,1,0,1,0.,0.,0. +2,5,2,0,2,0,1,1,0,1,0.,2.,1. +2,2,2,0,1,0,1,1,0,0,0.,1.,0. +1,3,1,0,1,0,1,1,0,1,0.,0.,0. +2,2,1,0,0,0,1,1,0,1,0.,0.,0. +5,2,0,0,2,0,1,1,0,1,0.,0.,0. +2,5,2,0,2,0,1,1,0,1,0.,0.,0. +5,1,0,0,1,0,0,1,0,1,0.,0.,0. +0,0,1,0,1,0,0,1,0,0,0.,0.,0. +5,2,0,0,2,0,0,0,0,1,0.,0.,0. +1,2,1,0,0,0,1,1,0,1,0.,0.,0. +2,5,3,1,1,2,1,1,0,1,0.,0.,0. +2,3,2,0,1,0,1,1,0,1,0.,0.,0. +1,2,1,1,1,0,1,1,0,0,0.,0.,0. +1,2,1,0,1,0,1,1,0,1,0.,0.,0. +1,2,1,0,1,0,1,1,0,1,0.,0.,0. +1,2,1,1,2,0,1,1,0,1,0.,0.,0. +2,5,2,0,2,0,1,1,0,1,0.,1.,0. +5,1,0,0,1,0,0,1,0,1,0.,0.,0. +5,2,0,0,2,0,0,0,0,1,0.,0.,0. +1,2,1,0,1,0,0,1,0,1,1.,0.,0. +1,5,1,0,1,2,1,1,0,1,0.,0.,0. +1,2,1,0,0,2,1,1,0,1,0.,0.,0. +1,2,1,0,0,0,1,1,0,1,0.,0.,0. +1,5,2,0,2,0,1,1,0,1,0.,0.,0. +3,3,3,0,2,0,1,1,0,1,0.,0.,0. +5,1,0,0,1,0,0,1,0,1,0.,0.,0. +5,2,0,0,1,0,0,0,0,1,0.,0.,0. +5,1,0,0,1,0,0,1,0,1,0.,0.,0. +5,2,0,1,1,0,0,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,1,0.,0.,0. +1,2,2,0,1,0,1,1,0,1,0.,0.,0. +5,2,0,0,0,0,1,1,0,1,0.,0.,1. +2,5,3,0,2,2,1,1,0,1,0.,1.,0. +2,3,2,1,1,2,1,1,0,1,0.,0.,0. +5,2,0,0,1,0,0,1,0,1,0.,0.,0. +0,0,1,0,1,0,0,1,0,0,0.,0.,0. +1,2,2,1,2,2,0,1,0,0,0.,1.,0. +1,2,1,0,0,0,0,1,0,1,0.,1.,0. +5,5,0,1,1,2,1,1,0,1,0.,0.,0. +2,5,2,0,2,0,1,1,0,1,0.,0.,0. +5,3,0,0,2,0,0,1,0,1,0.,0.,0. +1,1,1,0,0,0,0,1,0,1,0.,0.,0. +1,1,1,0,2,0,0,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,1.,0.,0. +5,5,0,0,2,0,1,1,0,1,0.,0.,0. +1,5,2,0,2,0,1,1,0,1,0.,0.,0. +5,2,0,0,1,0,0,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +1,1,2,1,2,2,0,1,0,1,0.,0.,0. +5,1,0,0,1,2,0,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +2,1,1,0,2,0,0,1,0,1,0.,0.,0. +5,5,0,0,1,0,1,1,0,1,0.,0.,0. +2,5,2,0,1,0,1,1,0,1,0.,0.,0. +5,4,0,0,2,0,0,1,0,1,0.,0.,0. +0,0,2,0,2,0,0,1,0,0,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +0,0,2,0,2,0,0,1,0,0,0.,0.,0. +2,1,1,1,1,0,0,1,0,1,1.,0.,0. +5,3,0,0,2,0,1,1,0,1,0.,0.,0. +1,5,1,0,1,0,1,1,0,1,0.,0.,0. +5,2,0,0,1,0,0,1,0,1,0.,0.,0. +0,0,1,0,1,0,0,1,0,0,0.,0.,0. +0,0,1,0,1,0,0,1,0,0,1.,0.,0. +1,1,1,0,2,0,0,1,0,0,0.,0.,0. +0,0,2,0,2,0,0,1,0,0,0.,0.,0. +1,3,1,0,2,0,1,1,0,1,0.,0.,0. +1,5,2,0,1,0,1,1,0,1,0.,0.,0. +5,2,0,0,1,0,0,1,0,1,0.,0.,0. +2,2,2,0,2,0,0,1,0,0,0.,0.,0. +0,0,1,0,1,0,0,1,0,0,0.,0.,0. +0,0,1,1,1,0,0,1,0,0,0.,0.,0. +5,2,0,0,1,0,0,0,0,1,0.,0.,0. +5,3,0,0,2,0,0,1,0,1,0.,0.,0. +1,5,2,0,2,0,1,1,0,1,2.,4.,0. +0,0,1,0,2,0,0,1,0,1,0.,0.,0. +5,2,0,0,2,0,0,0,0,1,0.,0.,0. +1,2,1,0,2,0,0,1,0,1,0.,1.,0. +1,3,2,0,2,0,0,1,0,1,0.,0.,0. +5,2,0,0,2,0,0,0,0,1,0.,0.,0. +2,2,1,0,2,0,0,1,0,1,1.,0.,0. +1,2,1,0,1,2,1,1,0,1,0.,0.,0. +0,0,1,0,1,0,0,1,0,0,0.,0.,0. +5,2,0,0,1,0,0,0,0,1,0.,0.,0. +1,2,1,0,2,0,0,1,0,1,0.,0.,0. +1,2,1,0,2,0,0,1,0,1,0.,0.,0. +5,3,0,0,2,0,0,0,0,1,2.,0.,0. +0,0,1,1,0,0,0,1,0,0,1.,0.,0. +5,1,0,0,1,0,0,0,0,1,0.,0.,0. +1,2,1,1,1,0,1,1,0,1,0.,1.,0. +5,2,0,0,2,0,0,0,0,1,0.,0.,0. +5,2,0,1,1,2,0,1,0,1,0.,0.,0. +1,2,1,0,1,0,0,1,0,1,0.,0.,0. +1,3,2,0,2,0,0,1,0,1,0.,0.,0. +3,2,2,0,2,0,0,1,0,1,0.,2.,0. +0,0,1,0,1,0,0,1,0,0,0.,0.,0. +2,2,1,0,1,0,0,1,0,1,1.,0.,0. +1,2,1,0,0,0,1,1,0,1,0.,0.,0. +1,2,1,0,1,0,0,1,0,1,0.,0.,0. +5,2,0,0,0,0,0,1,0,1,0.,0.,0. +1,2,1,0,1,0,0,1,0,1,0.,0.,0. +1,2,2,1,1,0,0,1,0,1,0.,0.,0. +2,2,1,0,1,0,1,1,0,1,2.,4.,0. +2,2,1,0,2,0,0,1,0,1,1.,0.,0. +0,0,1,0,2,0,0,1,0,1,0.,0.,0. +1,3,1,0,2,0,0,1,0,1,0.,0.,0. +1,2,1,0,2,0,0,1,0,1,0.,0.,0. +1,1,2,0,2,0,0,1,0,1,0.,0.,0. +0,0,1,0,1,2,1,1,0,1,0.,0.,0. +0,0,2,1,2,0,0,1,0,1,1.,0.,0. +2,4,1,0,1,0,0,1,0,1,0.,0.,0. +5,2,0,0,0,0,0,1,0,1,0.,0.,0. +5,1,0,0,1,0,0,1,0,1,0.,0.,0. +5,3,0,0,1,0,0,1,0,1,0.,0.,0. +1,1,2,0,1,0,0,1,0,1,0.,0.,0. +1,1,1,1,0,0,0,1,0,1,0.,0.,0. +2,5,1,0,2,0,0,1,0,1,1.,0.,0. +2,1,1,0,1,0,0,1,0,1,0.,0.,0. +5,2,0,0,1,0,0,1,0,1,0.,0.,0. +0,0,1,0,1,0,0,1,0,0,0.,0.,0. +0,0,2,0,2,0,0,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +1,2,1,0,2,0,0,1,0,1,1.,1.,0. +2,3,2,0,2,0,0,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,1,0.,1.,0. +0,0,1,0,1,0,0,1,0,1,0.,0.,0. +0,0,2,0,2,0,0,1,0,0,0.,0.,0. +0,0,2,0,2,0,0,1,0,0,0.,0.,0. +2,3,2,0,2,0,0,1,0,1,0.,0.,0. +1,4,2,1,2,0,0,1,0,1,0.,0.,0. +2,5,1,0,2,0,1,1,0,1,2.,0.,0. +0,0,1,0,2,0,0,1,0,1,1.,0.,0. +1,5,2,0,2,0,0,1,0,0,0.,0.,0. +1,3,1,0,1,0,0,1,0,1,0.,0.,0. +2,3,2,0,1,0,0,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,1,0.,0.,0. +0,0,2,0,2,0,0,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,1,1.,1.,0. +0,0,2,0,1,0,1,1,0,1,0.,0.,0. +0,0,2,0,2,0,0,1,0,0,0.,0.,0. +1,3,2,0,2,0,1,1,0,1,0.,0.,0. +1,4,2,1,1,2,0,1,0,1,1.,1.,0. +4,5,2,0,1,0,1,1,0,1,1.,1.,0. +1,1,1,0,1,2,0,1,0,1,0.,0.,0. +3,3,1,0,1,0,0,1,0,1,0.,0.,0. +1,2,1,0,0,0,0,1,0,1,0.,0.,0. +2,3,2,0,2,0,1,1,0,1,0.,0.,0. +0,0,1,1,2,0,0,1,0,1,0.,1.,0. +1,1,1,0,2,0,0,1,0,1,0.,0.,0. +2,2,2,0,1,0,1,1,0,1,0.,0.,0. +5,3,0,0,2,0,0,0,0,1,0.,0.,0. +0,0,1,0,1,0,0,1,0,0,0.,0.,0. +1,3,1,0,2,0,1,1,0,1,0.,0.,0. +2,4,2,0,2,0,0,1,0,1,0.,0.,0. +4,3,2,1,2,0,1,1,0,1,0.,0.,0. +3,5,1,0,2,0,0,1,0,1,1.,0.,0. +5,2,0,0,2,0,0,1,0,1,0.,0.,0. +2,5,3,0,2,0,1,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +0,0,1,1,1,2,0,1,0,0,0.,0.,0. +2,3,2,0,2,0,0,1,0,1,0.,0.,0. +1,3,2,0,2,0,1,1,0,1,0.,0.,0. +5,1,0,0,1,0,0,0,0,1,0.,0.,0. +1,1,1,0,0,0,1,1,0,0,0.,0.,0. +2,4,2,1,2,2,1,1,0,1,0.,0.,0. +3,5,2,1,1,2,1,1,0,1,0.,1.,0. +3,5,2,0,2,0,0,1,0,1,0.,0.,0. +1,2,1,0,1,0,0,1,0,1,0.,0.,0. +2,5,3,0,2,0,1,1,0,1,1.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +0,0,1,1,1,2,0,1,0,0,0.,0.,0. +2,2,1,0,2,0,1,1,0,1,0.,0.,0. +5,1,0,0,2,0,0,1,0,1,0.,0.,0. +5,3,0,0,2,0,1,1,0,1,0.,0.,0. +5,1,0,0,1,0,0,0,0,1,0.,0.,0. +5,2,0,0,2,0,0,1,0,1,0.,0.,0. +1,1,2,0,2,0,0,1,0,1,0.,0.,0. +1,4,2,0,1,0,1,1,0,1,1.,0.,0. +4,3,2,0,2,0,1,1,0,1,0.,1.,0. +3,5,2,1,2,0,1,1,0,1,0.,0.,0. +5,2,0,0,1,0,0,1,0,1,0.,0.,0. +2,5,3,0,2,0,1,1,0,1,0.,1.,1. +2,2,2,0,2,0,1,1,0,1,0.,0.,0. +5,3,0,0,2,0,1,1,0,1,0.,1.,1. +5,1,0,0,1,0,0,0,0,0,0.,0.,0. +5,2,0,0,1,0,0,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,1,0.,0.,0. +1,4,1,0,1,0,1,1,0,1,0.,0.,0. +4,3,2,1,2,2,1,1,0,1,0.,1.,0. +3,5,3,0,2,0,1,1,0,1,0.,1.,0. +1,2,1,0,2,0,0,1,0,1,0.,0.,0. +2,5,3,1,2,0,1,1,1,1,2.,0.,0. +1,2,1,0,1,0,1,1,0,1,0.,0.,0. +1,1,1,0,1,0,1,1,0,0,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +5,1,0,0,2,0,0,1,0,1,0.,0.,0. +3,3,2,0,2,0,0,1,0,1,0.,0.,0. +0,0,1,0,1,0,0,1,0,0,0.,0.,0. +5,2,0,1,2,0,1,1,0,1,0.,0.,0. +3,3,2,1,1,2,1,1,0,1,0.,0.,0. +3,5,2,0,1,0,1,1,0,1,1.,0.,0. +5,2,0,0,2,0,0,1,0,1,0.,0.,0. +2,5,3,1,2,2,1,1,1,1,0.,2.,0. +1,2,2,0,1,0,1,1,0,0,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +3,3,2,0,2,0,1,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +5,5,0,0,1,0,1,1,0,1,0.,0.,0. +4,5,2,0,2,2,1,1,1,1,0.,0.,0. +3,3,2,1,1,2,1,1,0,1,0.,1.,0. +5,4,0,0,2,0,0,1,0,1,0.,0.,0. +2,5,3,1,1,0,1,1,1,1,1.,0.,0. +1,3,1,0,2,0,1,1,0,1,0.,0.,0. +3,5,2,0,2,0,0,1,0,1,0.,0.,0. +5,2,0,0,1,0,1,1,0,1,0.,0.,0. +4,2,1,0,1,0,1,1,0,1,0.,0.,0. +3,3,2,1,1,0,1,1,0,1,2.,0.,0. +5,2,0,0,1,0,0,1,0,1,0.,0.,0. +2,5,3,1,1,2,1,1,1,1,1.,2.,0. +5,2,0,0,0,0,1,1,0,1,0.,0.,0. +3,2,2,0,2,0,0,1,0,1,0.,0.,0. +5,2,0,0,1,0,1,1,0,1,0.,0.,0. +4,2,1,0,1,0,1,1,0,1,0.,0.,0. +3,2,1,1,1,2,1,1,0,1,0.,1.,0. +5,2,0,0,1,0,0,1,0,1,0.,0.,0. +2,5,3,1,1,0,1,1,1,1,1.,1.,0. +5,2,0,0,1,0,1,1,0,1,0.,0.,0. +1,2,1,0,1,0,1,1,0,1,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +0,0,1,0,2,0,0,1,0,0,0.,0.,0. +5,2,0,0,2,0,0,0,0,1,0.,0.,0. +5,2,0,0,1,0,1,1,0,1,0.,0.,0. +3,3,1,1,2,0,1,1,0,1,0.,0.,0. +5,2,0,0,2,0,0,1,0,1,0.,0.,0. +2,5,3,1,1,2,1,1,1,1,1.,0.,1. +5,2,0,0,2,0,1,1,0,1,0.,0.,0. +1,3,1,0,1,0,1,1,0,1,0.,0.,0. +2,3,1,0,2,0,0,1,0,1,0.,0.,0. +2,2,1,0,2,0,0,1,0,1,0.,0.,0. +1,2,1,0,0,2,1,1,0,1,0.,0.,0. +5,2,0,0,1,0,0,1,0,1,0.,0.,0. +2,5,3,1,2,2,1,1,1,1,0.,0.,0. +1,1,1,0,1,0,1,1,0,1,0.,0.,0. +2,1,1,0,2,0,0,1,0,1,0.,0.,0. +3,3,1,0,2,0,0,1,0,1,0.,0.,0. +1,1,1,0,2,0,0,1,0,0,0.,0.,0. +3,5,3,0,2,0,0,1,1,1,0.,2.,0. diff --git a/data/step-01/.gitignore b/data/step-01/.gitignore deleted file mode 100644 index 5e7d273..0000000 --- a/data/step-01/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore diff --git a/data/student-por.csv b/data/student-por.csv new file mode 100755 index 0000000..6d57dd6 --- /dev/null +++ b/data/student-por.csv @@ -0,0 +1,650 @@ +school,sex,age,address,famsize,Pstatus,Medu,Fedu,Mjob,Fjob,reason,guardian,traveltime,studytime,failures,schoolsup,famsup,paid,activities,nursery,higher,internet,romantic,famrel,freetime,goout,Dalc,Walc,health,absences,G1,G2,G3 +0,0,18,0,1,1,4,4,3,0,2,0,1,1,0,1,0,0,0,1,1,0,0,3,2,3,0,0,2,4,0,11,11 +0,0,17,0,1,0,1,1,3,4,2,1,0,1,0,0,1,0,0,0,1,1,0,4,2,2,0,0,2,2,9,11,11 +0,0,15,0,0,0,1,1,3,4,3,0,0,1,0,1,0,0,0,1,1,1,0,3,2,1,1,2,2,6,12,13,12 +0,0,15,0,1,0,4,2,1,2,0,0,0,2,0,0,1,0,1,1,1,1,1,2,1,1,0,0,4,0,14,14,14 +0,0,16,0,1,0,3,3,4,4,0,1,0,1,0,0,1,0,0,1,1,0,0,3,2,1,0,1,4,0,11,13,13 +0,1,16,0,0,0,4,3,2,4,1,0,0,1,0,0,1,0,1,1,1,1,0,4,3,1,0,1,4,6,12,12,13 +0,1,16,0,0,0,2,2,4,4,0,0,0,1,0,0,0,0,0,1,1,1,0,3,3,3,0,0,2,0,13,12,13 +0,0,17,0,1,1,4,4,4,0,0,0,1,1,0,1,1,0,0,1,1,0,0,3,0,3,0,0,0,2,10,13,13 +0,1,15,0,0,1,3,2,2,4,0,0,0,1,0,0,1,0,0,1,1,1,0,3,1,1,0,0,0,0,15,16,17 +0,1,15,0,1,0,3,4,4,4,0,0,0,1,0,0,1,0,1,1,1,1,0,4,4,0,0,0,4,0,12,12,13 +0,0,15,0,1,0,4,4,0,1,1,0,0,1,0,0,1,0,0,1,1,1,0,2,2,2,0,1,1,2,14,14,14 +0,0,15,0,1,0,2,1,2,4,1,1,2,2,0,0,1,0,1,1,1,1,0,4,1,1,0,0,3,0,10,12,13 +0,1,15,0,0,0,4,4,1,2,2,1,0,0,0,0,1,0,1,1,1,1,0,3,2,2,0,2,4,0,12,13,12 +0,1,15,0,1,0,4,3,0,4,2,0,1,1,0,0,1,0,0,1,1,1,0,4,3,2,0,1,2,0,12,12,13 +0,1,15,0,1,1,2,2,4,4,0,2,0,2,0,0,1,0,0,1,1,1,1,3,4,1,0,0,2,0,14,14,15 +0,0,16,0,1,0,4,4,1,4,0,0,0,0,0,0,1,0,0,1,1,1,0,3,3,3,0,1,1,6,17,17,17 +0,0,16,0,1,0,4,4,2,2,1,0,0,2,0,0,1,0,1,1,1,1,0,2,1,2,0,1,1,10,13,13,14 +0,0,16,0,1,0,3,3,4,4,1,0,2,1,0,1,1,0,1,1,1,0,0,4,2,1,0,0,3,2,13,14,14 +0,1,17,0,1,0,3,2,2,2,2,0,0,0,3,0,1,1,1,1,1,1,0,4,4,4,1,3,4,2,8,8,7 +0,1,16,0,0,0,4,3,1,4,0,1,0,0,0,0,0,0,1,1,1,1,0,2,0,2,0,2,4,6,12,12,12 +0,1,15,0,1,0,4,3,0,4,1,0,0,1,0,0,0,0,0,1,1,1,0,3,3,0,0,0,0,0,12,13,14 +0,1,15,0,1,0,4,4,1,1,3,1,0,0,0,0,1,1,0,1,1,1,0,4,3,1,0,0,4,0,11,12,12 +0,1,16,0,0,0,4,2,0,4,2,0,0,1,0,0,0,0,1,1,1,1,0,3,4,0,0,2,4,0,12,13,14 +0,1,16,0,0,0,2,2,4,4,1,0,1,1,0,0,1,0,1,1,1,1,0,4,3,3,1,3,4,2,10,10,10 +0,0,15,1,1,0,2,4,2,1,2,0,0,2,0,1,1,0,1,1,1,1,0,3,2,1,0,0,4,2,10,11,10 +0,0,16,0,1,0,2,2,2,2,0,0,0,0,0,0,1,0,0,0,1,1,0,0,1,1,0,2,4,6,10,11,12 +0,1,15,0,1,0,2,2,4,4,0,0,0,0,0,0,1,0,0,1,1,1,0,3,1,1,0,1,4,8,11,12,12 +0,1,15,0,1,0,4,2,1,2,3,0,0,0,0,0,0,0,0,1,1,1,0,1,1,3,1,3,0,0,11,11,11 +0,1,16,0,0,1,3,4,2,4,0,0,0,1,0,1,1,1,1,1,1,1,0,4,2,2,0,0,4,2,12,12,13 +0,1,16,0,1,0,4,4,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,3,3,4,4,4,4,4,12,11,12 +0,1,15,0,1,0,4,4,1,2,0,0,0,1,0,0,1,1,0,0,1,1,0,4,3,1,2,3,4,0,10,11,11 +0,1,15,0,1,0,4,4,2,2,1,0,1,1,0,0,1,0,1,1,1,1,0,3,2,0,0,0,4,2,15,15,15 +0,1,15,1,1,0,4,3,0,3,2,0,0,1,0,0,1,0,1,1,1,1,1,3,4,1,0,0,4,0,13,14,15 +0,1,15,0,0,0,3,3,4,4,2,0,0,1,0,0,0,0,1,0,1,1,0,4,2,1,0,0,1,0,13,12,12 +0,1,16,0,1,0,3,2,4,4,0,0,0,0,0,0,1,0,0,0,1,1,0,4,3,2,0,0,4,4,12,12,12 +0,0,15,0,1,0,2,3,4,4,3,1,1,0,0,0,1,0,1,1,1,0,0,2,4,0,0,0,4,4,11,11,11 +0,1,15,0,0,0,4,3,0,2,0,0,0,2,0,0,1,0,1,1,1,1,0,4,3,2,0,0,3,0,14,14,14 +0,1,16,1,1,1,4,4,4,0,1,0,1,2,0,0,1,0,1,1,1,1,1,1,3,2,0,0,4,4,13,13,13 +0,0,15,1,1,0,3,4,2,1,2,0,0,2,0,1,1,0,1,1,1,1,0,3,2,1,0,0,4,2,11,12,12 +0,0,15,1,1,0,2,2,3,4,1,0,0,0,0,1,1,0,1,1,1,0,0,3,2,0,0,0,1,8,14,13,12 +0,0,16,0,0,0,2,2,4,4,0,0,1,1,0,0,1,0,1,0,1,1,1,2,2,2,0,1,2,16,11,11,10 +0,1,15,0,0,0,4,4,0,4,0,2,0,0,0,0,1,0,0,0,1,1,1,4,3,2,1,3,4,8,10,11,11 +0,1,15,0,1,0,4,4,2,0,2,1,0,1,0,0,1,0,1,1,1,1,0,3,2,2,0,0,4,0,14,15,15 +0,1,15,0,1,0,2,2,2,2,2,1,0,0,0,1,1,0,0,1,1,1,0,4,3,0,0,0,0,0,9,10,10 +0,0,16,0,0,0,2,2,4,3,2,1,1,1,1,1,0,0,1,1,1,1,0,3,2,2,1,1,4,14,10,11,11 +0,0,15,0,0,1,4,3,4,4,2,0,0,1,0,1,1,1,1,1,1,1,1,4,1,1,0,0,4,4,10,11,11 +0,0,16,0,0,1,3,3,4,2,0,0,0,1,0,0,1,0,0,1,1,1,0,1,2,4,0,3,2,6,13,12,13 +0,1,16,0,1,0,4,3,1,2,1,0,0,3,0,0,0,0,1,1,1,1,0,3,1,1,0,0,1,2,17,17,17 +0,1,15,0,1,0,4,2,0,4,0,0,0,1,0,0,1,0,0,1,1,0,0,3,2,2,1,1,4,4,11,12,13 +0,0,15,0,1,0,4,4,2,0,3,1,0,1,0,1,1,0,1,0,1,1,0,3,3,3,0,0,2,2,13,12,12 +0,0,16,0,0,0,2,2,2,2,2,0,2,1,0,0,1,0,0,1,1,1,0,3,2,2,1,2,3,0,14,13,13 +0,0,15,0,0,0,4,2,1,4,3,0,0,1,0,0,1,0,0,1,1,1,0,3,2,2,0,0,4,0,16,14,16 +0,1,15,0,0,1,4,2,1,1,3,1,1,0,0,0,0,0,0,1,1,0,0,4,4,4,2,3,4,4,10,9,9 +0,0,15,0,1,0,4,4,2,2,2,0,0,0,0,1,1,0,0,1,1,1,0,2,2,3,1,2,4,0,13,12,12 +0,0,15,0,0,1,3,3,4,4,3,0,0,0,0,0,0,0,0,1,1,1,0,4,2,3,3,3,0,0,13,12,13 +0,0,16,0,1,1,2,1,4,4,3,0,0,1,0,0,0,0,1,1,1,1,1,4,2,3,0,0,1,2,12,13,12 +0,0,15,0,1,1,4,3,2,2,1,0,0,1,0,0,1,0,1,1,1,1,0,3,2,1,0,0,0,0,15,14,15 +0,1,15,0,1,0,4,4,0,1,1,0,0,1,0,0,1,0,1,1,1,0,0,2,1,1,0,0,4,8,15,15,16 +0,1,15,0,0,0,1,2,4,3,0,1,0,1,0,1,1,0,1,1,1,1,0,3,2,1,0,0,4,0,14,13,14 +0,0,16,0,1,0,4,2,2,4,2,0,0,1,0,0,1,1,0,1,1,1,0,3,1,2,0,0,4,2,16,15,16 +0,0,16,1,1,0,4,4,1,0,3,0,0,1,0,0,1,0,1,1,1,0,0,1,3,3,1,2,3,0,17,16,16 +0,0,16,0,1,0,1,1,2,2,2,1,3,0,0,1,1,0,1,0,1,1,1,4,4,4,4,4,4,0,10,10,16 +0,0,16,0,0,0,1,2,4,2,1,1,0,1,0,1,0,0,1,1,1,1,0,3,3,2,0,0,0,0,13,13,10 +0,0,16,0,1,0,4,3,0,1,0,0,0,2,0,1,1,0,1,1,1,1,0,2,3,3,1,3,3,0,14,13,13 +0,0,15,0,0,0,4,3,2,2,1,1,0,1,0,1,0,0,1,1,1,1,1,3,3,3,1,3,1,0,13,12,12 +0,0,16,0,0,0,4,3,0,2,2,0,2,1,0,0,1,0,1,1,1,1,0,4,3,2,0,1,0,2,16,15,16 +0,1,15,0,1,1,4,4,4,2,1,0,0,3,0,0,1,0,1,0,1,1,1,0,2,2,4,4,2,0,11,12,12 +0,0,16,0,1,0,3,1,2,4,2,0,0,3,0,1,1,0,0,1,1,1,0,3,2,2,0,1,4,0,10,9,10 +0,0,15,1,0,0,2,2,1,2,1,0,1,1,0,1,1,0,0,1,1,1,0,3,0,2,0,2,3,0,11,10,11 +0,0,15,1,0,0,3,1,4,4,1,1,1,3,0,0,1,0,0,0,1,1,0,3,3,1,1,2,2,6,15,15,15 +0,1,16,0,1,0,3,1,4,4,1,1,1,3,0,0,1,0,0,1,1,1,0,3,2,1,0,0,4,2,13,11,11 +0,1,15,0,1,0,4,2,4,4,2,0,0,3,0,0,0,0,0,1,1,1,0,2,2,2,0,0,2,0,11,9,10 +0,0,15,1,1,0,1,1,4,4,1,0,0,1,0,1,1,0,0,0,1,1,1,2,2,3,1,3,4,2,13,11,11 +0,1,16,0,1,0,3,1,4,4,1,0,0,0,0,0,0,0,1,1,1,0,0,4,2,1,1,1,4,0,13,13,14 +0,0,16,0,1,0,3,3,4,2,0,0,0,1,0,1,1,0,1,1,1,1,0,3,2,2,1,3,4,4,11,11,11 +0,1,15,0,1,0,4,3,0,4,0,0,0,1,0,0,1,0,1,1,1,1,0,3,2,2,1,2,4,0,11,11,11 +0,1,15,0,1,0,4,0,0,4,2,0,1,3,0,0,0,0,1,1,1,1,0,2,3,2,0,0,0,0,12,11,11 +0,0,16,0,1,0,2,2,4,4,1,0,0,3,0,0,0,0,0,1,1,1,1,4,1,2,0,2,2,1,13,13,13 +0,1,17,0,1,0,2,1,4,4,0,0,1,0,3,1,1,0,1,1,0,1,0,3,4,0,0,0,2,0,9,9,10 +0,0,16,0,1,0,3,4,3,4,2,0,0,1,0,0,1,0,0,1,1,1,0,1,3,2,0,1,2,14,12,11,11 +0,1,15,0,1,0,2,3,4,2,2,1,0,0,0,1,1,0,1,0,1,1,1,2,1,1,0,2,2,0,11,11,12 +0,1,15,0,1,0,2,3,4,4,0,0,0,2,0,1,0,0,0,0,1,1,0,4,2,1,0,1,4,2,10,9,9 +0,0,15,0,0,0,3,2,2,4,1,0,0,1,0,0,1,0,0,1,1,1,0,3,3,3,0,0,4,4,12,11,11 +0,1,15,0,0,0,2,2,2,2,0,0,1,1,0,0,0,1,1,1,1,1,0,4,2,2,0,2,3,2,13,12,13 +0,0,15,0,1,0,1,1,4,4,0,1,0,1,0,0,1,0,1,0,1,1,0,3,2,1,1,2,3,2,13,12,12 +0,0,15,0,1,0,4,4,2,2,1,1,1,1,0,0,0,0,0,1,1,1,1,3,3,3,1,2,4,4,12,11,12 +0,0,16,0,0,0,2,2,3,4,2,0,0,1,0,0,1,0,0,1,1,0,0,3,2,3,0,1,1,6,13,11,11 +0,0,15,0,1,0,4,2,4,4,1,0,0,2,0,0,1,0,1,1,1,1,0,4,2,2,0,2,0,4,15,15,15 +0,1,16,0,1,0,2,2,2,4,1,1,1,1,0,0,0,0,1,0,1,1,0,3,3,1,0,0,2,6,12,10,11 +0,1,16,0,0,1,4,4,0,1,1,0,0,1,0,0,1,0,0,1,1,0,0,3,0,2,2,4,4,6,9,9,10 +0,0,16,0,1,0,3,3,4,4,0,0,0,2,0,0,1,0,0,1,1,1,1,3,2,2,0,2,3,2,9,11,11 +0,0,15,0,1,0,4,3,2,4,1,0,0,0,0,0,0,0,1,1,1,1,0,3,4,4,0,2,0,6,14,13,13 +0,0,16,0,0,0,3,1,4,4,0,1,0,1,0,1,1,0,0,1,1,0,0,2,2,2,1,2,1,0,12,13,12 +0,0,16,0,1,0,4,2,0,2,0,0,1,1,0,0,1,0,1,1,1,1,0,4,2,2,0,0,0,2,13,14,14 +0,1,15,0,0,0,2,2,2,1,1,0,0,3,0,0,1,0,1,1,1,1,0,3,2,3,0,0,3,2,11,12,12 +0,0,15,1,1,0,1,1,3,4,0,0,1,3,0,1,1,1,1,1,1,1,0,2,0,1,0,0,0,4,13,13,13 +0,1,16,1,1,0,4,3,2,4,1,0,1,0,0,1,1,1,1,0,1,1,0,2,2,2,0,0,3,6,9,11,11 +0,0,16,0,1,0,2,1,4,4,2,0,0,1,0,0,1,0,0,1,1,0,1,3,2,4,0,0,4,0,13,12,12 +0,0,16,0,1,0,4,4,4,4,1,0,0,0,0,0,0,0,1,0,1,1,0,4,2,3,0,1,0,4,12,13,13 +0,0,16,0,1,0,4,3,4,3,2,0,0,2,0,1,1,0,0,1,1,1,0,4,2,4,0,0,2,2,12,13,13 +0,1,16,0,1,0,4,4,2,2,3,0,0,0,0,1,1,0,1,1,1,1,0,3,4,4,4,4,3,12,9,9,8 +0,1,16,0,1,0,4,4,2,0,3,1,0,2,0,0,1,0,1,1,1,1,1,3,3,2,0,0,3,0,16,16,16 +0,1,15,0,1,0,4,4,2,4,2,0,0,0,0,0,1,1,1,0,1,1,0,4,2,2,0,0,4,2,12,13,12 +0,0,15,0,1,0,3,2,2,4,0,0,1,1,0,1,1,0,0,1,1,1,0,3,2,4,0,0,1,16,11,10,10 +0,1,15,0,1,1,3,4,2,4,2,0,0,1,0,0,1,0,1,1,1,1,0,4,3,3,0,0,0,0,16,16,16 +0,0,15,0,1,1,3,3,4,1,1,1,0,3,0,1,0,0,0,1,1,0,0,3,2,2,0,0,3,10,10,10,10 +0,0,15,0,1,0,2,2,4,4,2,0,0,3,0,1,1,0,0,1,1,1,0,4,0,1,0,0,2,4,10,10,10 +0,1,16,0,1,0,3,3,2,4,0,1,0,2,0,0,1,0,1,1,1,1,0,4,2,2,0,0,4,4,13,14,14 +0,1,15,1,1,0,4,4,4,4,0,1,3,3,0,0,1,0,1,1,1,1,1,0,2,4,2,4,0,8,12,10,11 +0,0,16,0,0,0,4,4,1,1,3,0,0,2,0,0,1,0,1,1,1,1,1,4,3,4,0,0,3,2,15,15,14 +0,1,15,0,0,1,4,4,0,0,2,0,0,0,0,0,0,0,1,1,1,1,0,4,4,2,0,0,3,4,13,14,14 +0,0,16,1,1,0,3,3,2,4,1,1,0,2,0,1,1,0,1,1,1,1,0,3,0,1,0,0,1,4,11,11,11 +0,0,16,0,1,0,2,2,3,4,0,0,0,1,1,1,0,0,1,1,1,1,0,2,0,1,0,0,4,12,8,10,10 +0,1,15,0,0,0,4,2,0,4,2,0,0,0,0,0,0,0,0,1,1,1,0,2,4,1,0,0,2,10,18,17,18 +0,1,15,1,1,0,2,1,1,2,1,0,0,1,0,0,0,0,1,1,1,1,1,4,3,1,0,0,4,4,10,9,10 +0,1,16,0,1,0,4,4,0,0,2,1,0,1,0,0,1,0,1,1,1,1,0,4,3,3,0,1,4,6,16,14,14 +0,1,15,0,1,0,4,4,4,0,1,1,1,1,0,0,1,0,1,1,1,0,0,3,3,2,0,0,1,4,16,15,16 +0,1,16,0,1,0,3,3,4,2,0,1,1,0,0,0,0,0,1,1,1,1,0,4,3,1,0,0,4,6,14,14,15 +0,1,17,1,1,0,1,3,4,4,2,1,2,1,1,0,1,0,1,1,1,1,0,4,1,3,0,3,4,14,12,11,11 +0,1,15,0,1,0,3,4,4,4,1,1,0,0,0,0,0,0,0,1,1,1,0,2,3,2,0,1,3,2,14,13,14 +0,0,15,0,1,0,1,2,3,2,2,0,0,1,0,0,0,0,0,0,1,1,0,2,1,2,0,1,0,0,14,14,14 +0,1,15,0,1,0,2,2,2,2,0,1,0,3,0,0,1,0,1,1,1,1,0,4,4,3,0,1,4,6,14,13,13 +0,0,16,0,0,0,2,4,4,1,2,1,1,1,0,0,1,0,1,1,1,1,1,3,1,1,0,1,4,2,14,12,13 +0,1,16,0,1,0,4,4,1,4,2,0,0,0,0,0,1,0,1,1,1,1,0,2,3,3,0,3,4,4,12,13,13 +0,0,16,0,1,0,2,2,4,4,0,0,0,1,0,0,0,0,0,1,1,1,1,4,3,3,0,0,4,0,12,11,11 +0,1,15,0,1,0,3,4,2,2,0,1,0,0,0,1,0,0,0,1,1,1,0,4,4,4,2,1,4,2,9,9,9 +0,0,15,0,0,1,3,4,4,4,0,0,0,1,0,1,0,0,1,1,1,1,1,4,2,1,0,0,0,0,10,11,11 +0,0,19,0,1,0,0,1,3,4,2,2,0,1,2,0,1,0,0,0,0,0,0,2,3,1,0,0,4,0,9,10,11 +0,1,16,1,1,0,4,4,0,0,2,0,0,0,0,0,0,0,1,1,1,1,0,2,4,4,1,4,3,8,14,14,15 +0,1,16,0,1,0,2,3,4,4,2,0,1,2,0,0,1,0,0,0,1,1,1,2,1,2,1,1,0,4,13,12,13 +0,0,15,1,1,0,3,4,2,0,2,1,1,2,0,0,1,0,0,1,1,1,1,3,1,1,1,1,4,0,10,11,12 +0,0,18,0,1,0,2,1,2,4,1,0,0,1,3,0,1,0,1,1,0,1,1,4,3,4,0,2,4,10,10,9,8 +0,0,17,0,0,1,2,1,4,4,2,0,2,0,0,0,1,0,0,1,1,1,0,2,1,1,0,1,4,8,11,10,11 +0,0,15,0,1,0,1,1,3,4,2,0,2,0,0,0,1,0,1,0,1,1,1,3,2,2,0,1,3,6,11,12,13 +0,0,17,0,0,0,2,2,4,4,2,1,0,0,0,0,1,0,0,1,1,1,1,2,3,3,0,2,4,2,13,12,12 +0,0,16,0,1,1,3,4,2,4,2,1,0,0,0,0,0,0,0,1,1,1,0,2,1,0,0,3,4,12,15,13,14 +0,1,16,0,1,0,2,1,3,4,2,0,3,0,0,0,0,0,0,1,1,0,0,2,1,0,0,0,1,4,9,9,11 +0,0,16,0,1,1,2,2,4,4,0,0,0,0,1,0,0,0,0,1,1,0,0,4,2,3,0,0,4,12,13,11,11 +0,1,15,1,1,0,3,4,3,0,2,0,3,1,0,0,1,0,0,1,1,0,1,4,2,2,0,0,4,2,12,11,11 +0,0,15,0,1,0,4,4,2,3,2,0,0,2,0,0,1,0,1,1,1,1,1,3,2,2,0,0,4,4,13,14,15 +0,1,17,1,1,0,3,4,3,4,2,0,2,1,0,0,0,0,0,1,1,0,0,4,3,4,1,3,4,2,10,9,10 +0,0,16,1,1,0,1,1,3,4,2,0,3,1,0,0,1,0,0,1,1,0,0,4,0,2,0,0,2,0,14,13,13 +0,1,18,0,0,0,3,1,2,2,2,0,1,0,0,0,0,0,1,1,1,1,1,2,2,3,3,4,3,2,11,11,12 +0,0,18,0,1,1,3,2,4,2,2,2,0,2,0,0,1,0,1,0,1,1,1,3,2,2,4,0,4,10,12,11,11 +0,0,16,1,1,0,1,1,4,2,1,0,1,0,0,0,1,0,1,1,1,0,1,2,2,2,0,1,0,8,12,11,11 +0,0,16,0,1,1,3,3,4,4,2,2,1,0,0,0,1,0,1,0,1,1,1,3,2,1,0,0,4,4,9,9,10 +0,1,16,0,0,0,1,1,2,4,2,0,0,1,2,0,0,0,0,1,1,0,1,3,3,3,0,2,4,0,10,10,10 +0,0,15,0,1,0,4,4,0,0,2,0,1,0,0,0,0,0,1,1,1,1,0,3,2,1,0,0,4,6,13,14,14 +0,0,15,1,1,0,1,1,4,4,2,0,2,0,1,0,0,0,1,1,1,1,1,4,4,4,0,0,0,2,8,9,9 +0,1,15,0,1,0,4,3,0,2,2,1,1,3,0,1,1,0,0,1,1,1,0,1,1,1,0,0,2,6,9,11,11 +0,0,15,0,1,1,3,3,2,2,0,0,0,1,0,0,0,0,0,0,1,0,1,0,2,1,1,2,0,24,9,8,9 +0,1,16,0,1,0,4,4,2,2,2,0,0,2,0,0,1,0,1,1,1,1,0,4,2,2,0,2,4,0,15,13,13 +0,1,16,0,0,0,2,2,2,2,1,1,1,0,0,0,1,0,1,1,1,1,0,1,2,2,1,1,1,4,12,11,11 +0,0,15,0,1,0,4,4,0,2,2,0,0,2,0,0,1,0,1,1,1,1,0,3,1,1,0,0,4,2,13,13,13 +0,0,16,0,0,0,1,1,3,3,2,0,0,0,0,0,0,0,0,1,1,1,0,2,3,3,2,2,0,4,10,11,11 +0,1,17,0,1,0,2,1,4,4,0,0,0,0,0,0,1,0,0,1,1,1,0,4,3,4,0,1,4,22,9,7,6 +0,0,15,0,1,0,1,1,4,2,2,1,0,1,0,0,1,0,0,1,1,1,0,3,3,1,0,1,4,0,12,12,12 +0,0,15,0,0,1,2,1,3,4,0,0,1,0,0,0,1,0,1,1,0,1,1,3,3,1,0,0,4,0,11,10,10 +0,0,15,0,1,0,3,2,1,2,0,1,0,1,1,0,1,0,0,1,1,1,0,2,2,1,0,0,2,2,11,11,11 +0,0,15,0,1,0,1,2,3,4,2,0,0,1,0,0,1,0,0,0,1,1,0,3,2,1,0,0,4,6,13,12,13 +0,0,15,0,1,0,1,2,3,2,2,1,0,1,0,0,0,0,0,0,1,0,1,1,2,3,1,3,0,6,11,11,11 +0,1,16,0,1,0,4,4,0,0,2,0,0,0,0,0,1,0,0,1,0,1,1,2,2,1,1,0,4,16,9,9,8 +0,1,15,0,0,1,2,1,2,4,2,0,3,0,0,0,0,0,0,1,1,1,0,3,4,4,1,4,4,0,12,11,11 +0,1,18,0,0,0,1,1,4,4,2,0,0,0,2,0,0,0,0,1,0,1,1,1,2,4,1,4,3,0,11,9,0 +0,1,16,0,0,0,2,1,3,4,2,0,0,0,1,0,0,0,1,1,1,0,1,3,3,3,2,4,4,6,9,10,10 +0,0,15,1,1,0,3,3,2,2,1,2,1,2,0,0,1,1,1,1,1,1,1,3,1,0,1,2,2,2,13,13,13 +0,1,19,0,1,0,3,2,2,3,0,0,0,0,0,0,1,0,0,1,0,1,1,3,4,3,0,0,3,6,11,9,11 +0,0,17,0,1,0,4,4,4,0,2,0,0,0,0,1,1,0,0,1,1,0,1,3,1,0,0,0,3,0,13,13,13 +0,1,15,1,1,0,2,3,3,2,2,0,0,1,0,1,0,1,1,1,1,0,0,3,3,3,0,0,0,0,7,8,8 +0,1,17,1,0,0,1,2,4,4,1,0,0,0,3,0,0,0,0,1,1,0,0,1,1,1,2,2,4,14,9,8,10 +0,0,18,1,1,0,1,1,3,4,2,0,2,0,3,0,1,0,1,0,1,0,0,4,1,4,0,4,3,6,11,10,11 +0,1,16,1,1,0,2,2,3,4,2,0,2,0,0,0,0,0,0,0,1,0,0,3,1,1,0,1,2,4,12,10,11 +0,1,16,0,1,0,3,3,4,2,2,1,0,1,1,0,1,0,0,1,1,1,1,3,4,4,3,3,4,0,10,10,1 +0,1,16,0,0,0,1,2,1,2,2,0,1,0,2,0,0,0,0,0,1,1,0,3,3,4,2,4,4,0,9,8,10 +0,1,17,1,0,0,2,1,3,4,2,0,1,0,1,0,0,1,1,1,0,1,1,2,2,1,1,1,4,8,8,8,9 +0,1,17,1,1,0,3,2,4,4,2,0,1,1,2,1,1,0,0,1,1,1,1,3,3,3,0,3,2,4,7,6,8 +0,1,15,0,0,0,1,2,4,4,2,0,1,0,0,0,0,0,1,1,1,0,0,3,3,3,1,3,4,2,8,9,10 +0,1,16,0,1,0,1,3,3,2,2,1,0,0,1,0,0,0,0,1,0,1,0,4,2,2,0,3,1,2,9,8,8 +0,1,17,1,0,0,1,1,4,2,2,0,3,1,0,0,0,0,1,1,0,0,1,4,2,4,0,4,4,0,8,8,8 +0,1,17,0,1,0,3,2,2,2,2,0,1,0,3,0,1,0,1,0,0,0,0,3,4,1,0,0,1,10,8,7,8 +0,1,16,0,1,0,2,2,4,4,2,1,0,1,0,0,0,0,0,1,0,1,0,3,2,4,1,3,3,0,9,10,11 +0,0,16,0,1,0,4,2,1,2,0,1,0,1,0,0,0,0,0,1,1,1,1,3,1,2,0,0,2,0,17,17,18 +0,0,16,0,1,0,2,2,4,4,0,0,0,1,0,0,1,0,0,0,1,1,0,4,0,4,0,0,3,0,12,12,13 +0,0,16,0,1,0,4,4,1,1,1,0,0,1,0,0,1,0,0,1,1,1,1,3,3,1,0,0,2,0,16,16,17 +0,1,16,0,1,0,3,4,4,4,2,1,2,0,1,0,1,0,1,0,1,1,0,2,3,4,1,3,1,4,9,9,10 +0,1,16,0,1,0,1,0,4,4,1,0,1,1,0,0,1,0,1,1,1,1,1,3,2,1,0,0,2,0,16,17,18 +0,1,17,0,0,0,4,4,0,4,1,0,0,1,0,0,1,0,1,1,1,1,0,3,3,3,0,2,4,0,11,9,10 +0,0,16,0,1,0,1,3,3,2,0,0,0,1,0,0,0,0,1,0,1,1,1,3,2,4,0,0,2,0,14,13,13 +0,0,16,0,0,0,3,3,4,4,1,0,1,1,0,0,1,0,1,1,1,1,0,3,3,4,0,0,3,0,14,14,15 +0,1,17,0,0,0,4,3,0,4,2,0,1,1,0,0,0,0,1,1,1,1,0,3,3,3,3,3,3,0,10,11,11 +0,0,16,0,1,0,2,2,2,4,1,0,1,1,0,0,0,0,1,0,1,1,0,2,3,3,0,3,4,0,13,12,14 +0,1,17,0,1,0,3,3,4,4,1,1,0,1,0,0,0,0,1,0,1,1,0,3,2,3,0,3,3,4,11,9,10 +0,1,16,1,1,0,4,2,0,2,3,0,0,0,0,0,1,0,1,1,1,1,1,3,2,2,2,3,2,8,10,9,11 +0,1,17,0,1,0,4,3,4,4,2,0,0,1,0,0,1,1,1,1,1,1,1,4,1,2,0,0,1,4,11,11,13 +0,1,16,0,1,0,4,3,0,4,0,0,0,1,0,0,1,1,1,1,1,1,0,2,3,2,1,2,2,4,11,10,11 +0,1,16,0,1,0,3,3,2,4,0,0,0,1,0,0,0,0,1,1,1,1,1,3,1,2,0,1,2,0,11,12,13 +0,0,17,0,1,0,2,4,2,2,1,1,0,1,0,0,1,0,1,1,1,0,0,4,3,1,1,2,4,0,17,18,17 +0,0,17,0,0,0,3,3,4,4,1,0,0,1,0,0,1,0,1,1,1,1,1,4,2,2,1,2,0,32,14,13,14 +0,0,16,0,1,0,3,2,4,4,1,0,0,1,0,0,1,0,0,1,1,1,0,0,1,1,0,1,0,8,14,15,16 +0,1,17,0,1,0,3,3,2,2,3,0,0,1,0,0,1,0,1,1,1,1,1,3,2,3,1,2,3,6,11,13,14 +0,1,16,0,1,0,1,2,2,2,3,0,0,0,0,0,1,0,1,1,1,1,1,2,2,2,0,1,2,0,10,9,11 +0,1,16,0,0,0,2,1,4,4,2,0,0,1,0,0,0,0,1,1,1,1,1,3,1,2,0,1,4,0,13,14,16 +0,0,17,0,1,1,3,3,1,4,1,0,0,1,0,0,1,0,0,0,1,1,1,2,2,2,0,2,2,10,12,13,14 +0,1,17,1,1,0,1,2,3,4,0,0,0,1,0,0,0,0,0,1,1,0,0,2,0,2,0,4,2,6,9,9,10 +0,0,16,0,1,0,2,3,2,2,2,0,0,1,0,0,0,0,0,1,1,1,0,3,2,2,0,0,1,6,12,12,13 +0,0,17,0,1,0,1,1,3,2,2,0,0,1,0,0,0,0,1,1,1,1,0,4,2,2,0,0,2,0,12,11,12 +0,1,17,0,1,0,1,2,3,2,3,2,1,1,0,0,0,0,1,0,1,1,0,3,3,3,3,4,4,16,10,11,12 +0,1,16,1,1,0,3,3,2,2,1,0,0,0,0,0,1,0,1,1,1,1,0,3,2,1,2,3,4,0,11,10,10 +0,1,16,0,1,0,2,3,4,4,0,1,1,0,0,0,0,0,0,1,1,1,0,4,2,2,0,0,2,0,13,12,12 +0,0,17,0,0,0,2,4,2,2,2,1,0,1,0,0,0,0,1,1,1,1,1,3,2,1,0,0,4,8,14,15,16 +0,1,17,0,1,0,4,4,2,0,0,0,0,0,0,0,0,0,0,1,1,1,0,4,1,2,0,1,4,4,13,13,14 +0,1,16,1,0,0,3,3,0,4,0,1,2,0,0,0,1,0,1,1,1,1,0,2,2,3,2,4,2,16,10,11,12 +0,0,17,0,1,0,4,4,2,0,0,0,1,0,1,0,1,0,0,1,1,1,0,3,1,3,1,2,1,30,14,15,16 +0,0,16,0,0,0,4,4,0,0,1,0,0,1,0,0,1,0,0,1,1,1,0,3,4,1,0,1,2,0,11,10,11 +0,0,16,0,1,0,4,3,1,4,0,0,0,1,0,0,1,0,1,1,1,1,0,3,2,4,0,4,1,2,14,14,15 +0,0,16,0,1,0,2,3,4,4,1,0,0,1,0,1,1,0,1,1,1,0,0,3,3,2,0,2,3,4,11,12,12 +0,0,17,0,1,0,1,1,4,4,2,0,0,1,0,0,1,0,0,0,1,0,0,3,3,3,0,2,0,0,14,15,15 +0,0,17,1,1,0,2,2,4,4,1,0,0,0,0,0,1,0,0,1,1,1,0,4,2,1,0,1,2,21,13,13,13 +0,0,16,1,1,0,2,2,2,2,1,0,1,3,0,0,1,0,1,0,1,1,0,4,2,4,0,0,4,6,13,13,13 +0,0,17,0,1,0,3,4,3,2,0,0,0,2,1,0,1,1,0,1,1,1,1,3,3,2,2,3,4,14,8,9,8 +0,0,16,0,1,1,3,1,2,4,2,0,0,1,0,0,1,0,0,1,1,1,0,1,2,2,1,1,3,2,11,11,12 +0,0,16,0,1,0,4,3,0,4,3,0,0,1,0,0,0,0,1,1,1,1,1,0,2,1,0,0,0,4,14,15,15 +0,0,16,0,1,0,1,1,3,4,0,0,1,0,0,0,1,0,0,1,1,0,0,3,2,1,0,3,4,2,12,13,13 +0,0,17,1,1,0,4,3,0,4,1,0,1,2,0,0,1,0,1,1,1,1,1,3,3,1,0,0,3,0,11,12,12 +0,0,19,0,1,0,3,3,4,4,1,2,0,3,0,0,1,0,1,1,1,1,0,3,2,2,0,1,2,4,12,12,12 +0,1,17,0,0,0,4,4,2,4,0,0,0,1,0,0,1,0,0,1,1,1,1,4,2,4,3,4,2,15,13,12,12 +0,0,16,0,1,1,2,2,4,4,1,0,0,1,0,1,1,0,0,1,1,1,0,2,2,3,0,0,3,0,13,13,13 +0,1,18,0,1,0,2,2,2,4,0,0,0,1,0,0,1,0,1,1,1,1,0,3,3,3,1,3,4,10,12,11,11 +0,0,17,1,0,0,4,4,2,4,3,0,0,0,0,0,1,0,0,1,1,0,0,4,1,0,0,1,2,6,12,11,11 +0,0,17,0,0,0,3,2,4,4,1,0,1,1,0,0,0,0,0,1,1,1,0,3,3,3,0,2,0,2,14,16,15 +0,0,17,0,1,0,4,3,4,4,1,0,0,1,0,0,0,0,0,1,1,1,1,2,3,4,1,3,0,16,11,9,10 +0,1,18,0,0,0,3,3,2,1,0,1,0,1,0,0,1,0,0,1,1,1,0,2,1,3,1,3,3,10,10,10,10 +0,0,17,0,1,0,2,3,3,4,0,1,1,0,0,0,1,0,0,1,1,0,0,2,2,2,0,3,2,4,12,13,13 +0,0,17,0,1,0,2,2,3,3,2,0,0,2,0,0,1,0,1,1,1,1,0,3,2,2,0,0,3,0,12,12,13 +0,0,17,1,1,0,2,1,3,2,1,0,1,1,0,0,1,0,1,1,1,1,0,3,1,4,0,1,4,0,11,10,11 +0,0,17,0,1,0,1,1,3,4,1,0,0,2,0,0,1,0,1,1,1,0,1,3,2,3,0,0,4,12,12,12,12 +0,0,16,0,1,0,2,3,2,0,3,0,0,1,0,1,0,0,0,1,1,1,0,1,2,0,0,0,2,0,13,13,14 +0,1,18,0,1,0,2,2,4,4,0,0,1,1,3,0,1,1,0,1,1,1,0,2,2,2,4,4,3,9,10,9,10 +0,0,16,0,1,0,4,4,0,2,0,0,0,2,0,0,1,0,1,0,1,1,0,4,2,1,0,0,4,4,15,16,16 +0,0,18,1,1,0,3,1,4,4,1,0,0,1,0,0,0,0,1,1,1,1,1,4,2,2,0,0,3,4,8,8,8 +0,0,17,0,1,0,3,2,4,4,2,0,0,1,0,0,0,0,1,0,1,1,0,4,2,3,0,2,2,2,17,18,17 +0,1,17,0,0,0,2,3,2,2,1,1,0,1,0,0,1,0,0,0,1,1,0,4,2,2,0,2,2,0,10,11,11 +0,1,18,0,0,0,2,1,3,4,2,0,3,1,0,1,1,0,1,1,1,1,1,3,2,1,3,4,2,2,9,10,11 +0,0,17,0,1,1,2,1,4,4,2,0,1,2,0,0,0,0,1,1,1,1,1,2,1,2,0,1,2,0,15,15,16 +0,0,17,0,0,0,4,3,1,4,1,1,0,1,0,0,0,0,1,1,1,1,1,2,1,2,0,1,2,0,14,12,12 +0,1,17,1,1,0,2,2,4,4,2,1,1,1,0,0,1,0,1,1,1,1,0,3,4,1,0,0,0,0,12,13,13 +0,1,17,0,1,0,4,4,0,0,1,0,0,1,0,1,1,0,1,1,1,1,1,3,4,4,0,2,1,0,13,13,13 +0,1,16,0,1,0,4,4,1,4,1,1,0,1,0,0,1,0,1,1,1,1,0,3,1,3,1,3,0,0,13,13,14 +0,1,16,0,0,0,1,1,4,4,0,0,1,1,0,0,1,0,0,1,1,1,0,2,3,1,0,0,4,2,9,9,9 +0,1,16,0,1,0,3,2,3,4,1,0,1,2,0,0,0,0,1,1,1,1,1,4,2,2,0,2,1,0,12,12,12 +0,1,17,0,0,0,2,2,4,4,0,1,0,1,0,0,0,0,1,0,1,1,1,3,3,1,4,4,3,0,16,16,16 +0,0,16,0,1,0,2,1,4,4,0,0,0,0,0,0,0,0,0,1,1,1,1,3,4,1,0,0,4,4,9,10,10 +0,0,16,0,1,1,4,1,4,4,0,0,0,1,0,0,0,0,1,1,1,1,1,4,2,2,0,1,4,0,14,13,13 +0,0,18,0,0,1,2,4,2,4,2,0,1,1,1,0,1,0,0,1,1,1,0,3,2,2,0,0,2,18,10,10,10 +0,0,18,0,0,0,2,2,3,2,2,0,0,1,1,0,1,0,0,0,1,1,1,4,2,0,0,0,4,16,9,8,10 +0,0,18,0,1,0,3,3,4,4,2,0,1,0,1,0,0,0,0,1,0,1,0,3,0,0,0,0,2,14,8,7,7 +0,1,18,0,1,0,2,2,4,3,2,2,0,0,1,0,1,0,1,0,0,1,1,3,3,2,1,1,0,26,7,8,8 +0,1,17,0,1,0,4,4,0,0,2,0,0,0,0,0,1,0,1,0,1,1,0,3,1,0,0,1,4,6,10,8,9 +0,0,17,0,1,0,3,2,4,4,2,1,0,1,0,0,0,0,1,1,1,0,0,4,3,1,0,0,2,4,14,14,15 +0,0,17,0,0,0,1,1,3,3,2,0,0,2,0,0,1,0,1,1,1,1,1,3,2,1,0,1,3,10,11,10,10 +0,0,16,0,1,0,1,2,4,4,2,0,0,0,0,0,0,0,0,1,0,1,0,4,2,4,0,1,4,4,12,11,11 +0,0,17,1,1,0,2,1,3,2,2,0,2,1,0,0,0,0,1,1,1,0,0,1,0,0,0,0,2,2,13,13,13 +0,0,17,1,0,1,1,4,4,4,2,2,3,0,1,0,1,0,0,1,1,1,0,4,4,3,0,0,4,14,9,9,8 +0,1,18,0,1,0,2,2,4,2,1,1,0,1,0,0,0,0,0,1,0,1,0,4,4,3,2,4,1,16,8,7,8 +0,0,17,0,0,1,2,2,4,4,0,0,0,0,1,0,1,0,0,0,0,1,0,2,0,1,0,0,0,8,11,9,10 +0,0,17,1,0,0,1,1,3,4,2,0,1,2,0,0,0,0,1,1,1,1,0,3,2,2,0,2,4,4,15,14,15 +0,0,17,0,0,1,4,2,0,4,2,0,0,1,0,0,1,0,1,1,1,0,0,3,2,1,0,0,3,4,15,14,14 +0,1,17,0,0,0,4,3,1,4,2,0,1,1,0,0,0,0,1,1,1,1,1,1,4,4,0,3,4,8,15,15,15 +0,1,17,1,0,1,4,4,0,4,2,0,1,1,0,0,1,0,0,1,1,1,0,2,2,2,1,2,3,0,12,12,12 +0,1,16,0,0,0,4,3,0,4,2,0,0,0,0,0,0,0,1,0,1,1,0,4,3,4,0,0,2,7,14,14,15 +0,1,16,0,1,0,4,4,2,2,2,0,0,0,0,0,0,1,1,1,1,1,0,4,2,1,0,1,4,4,14,15,15 +0,0,17,0,1,0,4,4,0,2,2,0,0,1,0,0,1,1,0,1,1,1,1,4,2,0,0,3,4,2,11,11,12 +0,1,17,1,1,0,1,1,4,4,0,1,1,2,0,0,0,0,0,0,1,1,1,3,2,2,0,0,0,2,13,14,15 +0,0,17,0,1,0,3,3,2,4,0,0,1,2,0,0,1,0,0,1,1,1,1,3,1,1,1,2,4,10,11,11,11 +0,0,17,0,1,0,1,1,3,4,2,0,0,1,0,1,0,0,0,0,1,0,1,3,2,1,0,0,3,10,10,9,10 +0,0,18,0,1,0,2,1,4,4,2,2,1,2,0,0,1,0,0,0,1,1,1,3,3,3,0,0,2,10,12,10,11 +0,1,16,0,1,0,2,1,4,4,2,0,2,0,0,0,0,0,0,1,1,1,0,3,2,2,0,0,3,7,15,16,16 +0,0,17,0,1,0,1,1,4,2,2,1,0,1,0,0,1,0,0,1,1,0,0,3,2,3,0,1,4,4,11,10,11 +0,1,17,0,1,0,2,3,4,4,2,1,1,0,0,0,0,0,0,1,1,1,0,4,1,1,0,0,1,2,9,12,13 +0,1,22,0,1,0,3,1,2,2,3,0,0,0,3,0,0,0,0,0,0,1,1,4,3,4,4,4,0,12,7,8,5 +0,1,18,1,0,0,3,3,4,2,2,0,0,1,0,0,1,0,0,1,1,1,1,3,2,2,0,2,4,8,10,9,10 +0,1,16,0,1,0,0,2,4,4,3,0,0,0,0,0,0,0,0,0,1,1,0,3,2,1,1,3,4,0,11,12,11 +0,1,18,0,1,0,3,2,2,4,2,0,1,0,0,0,0,0,0,1,0,1,0,3,3,4,1,3,4,8,7,8,7 +0,1,16,0,1,0,3,3,3,4,1,2,2,1,1,1,1,0,0,0,1,1,0,4,2,2,0,2,1,4,9,11,10 +0,1,18,0,1,0,2,1,2,2,3,0,0,0,2,0,0,0,0,0,0,1,0,2,1,4,1,4,4,4,7,8,6 +0,1,16,1,1,0,2,1,4,4,2,0,1,0,0,0,0,0,1,0,1,0,0,2,2,1,0,2,2,2,14,13,12 +0,1,17,1,1,0,2,1,4,4,2,0,0,0,0,0,0,0,0,0,1,1,0,3,3,1,1,3,4,0,12,12,13 +0,1,17,0,0,0,1,1,1,4,2,0,1,0,1,0,1,0,1,1,1,1,0,3,3,3,0,1,4,0,9,10,10 +0,0,18,0,0,1,2,1,4,4,2,0,0,1,0,0,1,0,0,0,1,1,1,3,2,3,0,2,4,2,12,12,13 +0,0,17,0,0,0,4,2,0,2,1,0,0,3,0,0,1,0,1,1,1,1,0,3,1,2,0,0,3,2,14,15,17 +0,0,19,0,1,0,2,2,2,2,0,0,0,1,0,0,1,0,0,1,1,1,0,3,2,2,0,0,4,0,10,10,11 +0,1,18,0,0,0,2,1,2,4,2,0,2,1,1,0,0,0,1,0,0,1,0,3,3,4,3,3,4,4,11,10,11 +0,0,17,1,1,0,4,2,4,4,2,0,0,2,0,0,1,0,1,1,1,1,0,3,2,3,0,2,4,2,11,12,14 +0,0,18,0,0,0,1,1,4,3,0,0,0,2,0,0,1,0,0,0,1,0,0,3,3,2,1,2,2,4,11,12,14 +0,0,18,1,1,0,2,2,4,4,0,0,0,1,0,1,0,0,0,1,1,0,0,2,1,2,0,0,4,4,11,11,13 +0,1,19,0,0,1,4,3,2,3,1,0,0,1,0,0,1,0,0,1,1,1,0,3,2,0,0,0,0,4,11,13,14 +0,1,18,0,1,0,2,1,4,4,0,0,0,1,0,0,0,0,1,1,1,1,0,4,1,3,0,1,3,2,16,16,16 +0,1,17,1,1,0,2,2,4,2,3,0,1,0,0,0,0,0,0,0,0,0,0,4,1,1,0,0,3,0,9,10,10 +0,0,17,0,0,0,2,2,2,2,2,1,0,3,0,0,0,0,1,1,1,1,1,2,3,0,0,0,1,2,10,11,12 +0,0,20,1,1,0,2,1,4,4,2,2,1,1,0,0,1,1,1,1,0,1,1,0,1,2,0,1,1,8,10,12,12 +0,0,18,0,1,0,4,3,2,4,0,1,0,1,0,0,1,0,0,1,1,1,1,2,0,1,0,2,1,2,15,15,15 +0,1,18,0,1,0,4,3,0,4,2,0,0,1,0,0,1,0,0,0,1,1,0,3,2,1,0,0,2,2,10,10,11 +0,1,18,1,1,0,3,2,4,4,2,0,0,2,0,0,0,0,1,0,1,0,0,4,2,1,0,0,2,2,10,11,12 +0,0,17,0,1,0,3,3,4,4,0,0,0,2,0,0,0,0,1,0,1,0,0,2,1,2,0,0,3,2,15,12,13 +0,0,18,0,1,0,2,2,3,2,0,0,0,2,0,0,1,0,1,1,1,1,1,3,2,2,0,0,2,0,11,12,13 +0,1,17,0,1,0,2,2,4,4,0,1,1,0,0,0,0,0,0,1,0,1,0,3,3,3,1,2,3,8,8,8,9 +0,1,18,1,0,1,3,4,4,4,1,0,1,1,0,0,1,0,1,1,1,1,0,3,1,4,2,3,0,6,15,16,16 +0,1,17,0,1,0,3,1,2,4,3,0,0,1,0,0,0,0,1,1,1,1,1,4,3,3,2,3,4,0,11,11,14 +0,0,18,1,1,0,4,4,0,4,1,0,1,1,0,0,0,0,1,1,1,1,0,3,2,3,1,1,3,8,10,11,12 +0,1,18,0,1,0,4,2,1,4,1,1,0,1,0,0,1,0,1,1,1,1,1,4,3,4,0,2,4,4,10,12,14 +0,0,18,1,1,0,2,1,4,4,1,0,1,1,0,0,1,0,0,1,0,1,1,3,2,4,0,1,2,12,8,9,10 +0,0,19,0,1,0,3,3,4,2,0,2,0,1,0,0,1,0,1,1,1,1,0,3,2,4,2,2,4,16,11,12,12 +0,0,18,0,1,0,2,3,4,2,1,1,0,3,0,0,1,0,1,1,1,1,1,3,4,4,0,2,1,10,16,16,16 +0,0,18,0,0,0,1,1,4,4,0,0,1,1,0,0,1,0,0,0,1,0,0,3,3,2,0,0,2,2,13,13,13 +0,1,17,1,1,0,1,2,3,3,0,0,0,1,0,0,1,0,1,0,1,0,1,2,4,1,1,1,0,2,16,17,18 +0,0,18,0,1,0,2,1,4,4,0,0,0,1,0,0,1,0,0,1,1,1,1,3,1,4,0,1,0,8,14,14,15 +0,0,17,0,1,0,2,4,3,1,1,0,1,1,0,0,1,0,0,1,1,1,1,3,2,2,0,0,0,6,15,16,16 +0,0,17,0,0,0,2,2,2,4,2,0,1,1,0,1,1,0,0,1,1,1,1,3,3,3,1,2,4,6,12,12,12 +0,0,18,1,1,1,3,2,4,2,0,0,1,1,0,0,0,0,0,0,0,1,1,3,0,0,0,0,4,15,12,9,10 +0,1,18,0,1,0,4,4,0,2,0,0,1,0,0,0,0,0,1,1,1,1,0,2,1,3,0,3,2,6,11,12,12 +0,0,18,0,1,0,4,4,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,3,3,0,0,3,2,14,12,13 +0,0,17,0,1,0,2,2,4,2,1,1,2,2,0,0,1,0,0,1,1,1,1,3,1,2,0,0,0,8,13,15,15 +0,0,19,1,1,0,3,2,2,2,1,1,0,1,1,1,1,0,0,1,0,1,0,2,2,2,3,2,2,0,9,8,10 +0,1,18,0,0,0,4,3,0,2,2,0,1,0,0,0,0,0,1,1,1,1,0,3,1,2,0,1,0,0,10,10,10 +0,1,18,0,1,0,1,2,3,4,0,2,1,0,0,0,0,0,0,0,0,1,0,2,3,3,1,3,3,10,10,10,11 +0,1,17,0,0,1,4,1,2,4,0,0,1,0,0,0,0,0,1,1,1,1,1,3,4,3,1,3,4,22,11,11,10 +0,1,17,0,0,1,3,2,0,2,0,0,0,0,0,0,0,0,0,1,1,1,0,3,3,3,2,3,2,18,13,13,13 +0,0,18,1,0,0,1,1,3,4,1,0,1,3,0,0,1,0,1,1,1,0,0,4,1,1,0,0,2,2,17,17,18 +0,0,18,0,1,0,1,1,4,4,0,0,1,1,0,1,0,0,1,1,1,1,0,4,3,3,0,0,3,0,12,13,13 +0,0,17,0,1,0,2,2,4,4,2,0,0,1,0,0,1,0,0,0,1,1,0,4,3,4,0,1,4,12,12,12,14 +0,0,18,0,1,0,2,1,4,4,1,0,1,1,0,0,0,0,1,1,1,1,1,3,2,0,0,0,4,10,12,13,14 +0,1,17,0,1,0,1,1,4,4,1,1,0,1,0,0,0,0,0,0,1,1,0,3,2,2,0,1,3,0,12,12,12 +0,0,18,0,1,0,2,2,3,3,3,0,0,2,0,0,1,0,0,1,1,1,0,3,2,2,0,1,1,0,18,18,18 +0,0,17,0,1,0,1,1,2,0,1,0,0,2,0,0,1,0,0,1,1,1,0,3,2,2,0,0,2,0,13,13,14 +0,1,18,0,1,0,2,1,2,2,1,0,0,2,0,0,0,0,1,1,1,1,0,3,1,3,0,2,1,0,14,15,15 +0,1,18,0,0,1,4,4,0,0,1,0,0,1,0,0,1,0,1,1,1,1,0,4,3,2,0,0,1,0,17,17,17 +0,1,18,0,1,0,4,2,0,4,0,0,0,1,0,0,1,0,1,1,1,1,1,3,2,1,0,3,4,2,15,16,16 +0,0,17,0,1,0,4,3,1,2,1,0,0,2,0,0,1,0,0,1,1,1,0,3,1,1,0,1,2,0,17,18,18 +0,0,17,1,0,0,3,1,2,4,1,0,1,3,0,0,1,0,0,1,1,0,0,2,0,1,0,0,2,0,18,19,19 +0,1,18,1,0,0,3,2,2,4,1,0,1,2,0,0,1,0,1,1,1,1,0,4,3,1,0,0,3,0,14,15,15 +0,1,17,0,1,0,3,3,1,4,0,0,0,0,0,0,1,0,0,1,1,1,0,3,3,2,0,2,4,0,14,15,15 +0,0,19,0,1,0,4,4,1,4,1,2,1,1,0,0,1,0,1,1,1,1,0,1,2,3,1,2,1,2,14,13,13 +0,0,18,0,0,0,4,3,4,4,0,2,1,1,0,0,1,0,0,1,1,1,1,3,3,4,0,1,1,0,13,14,14 +0,0,18,0,1,0,4,3,4,4,1,1,0,3,0,0,1,0,0,1,1,1,0,3,2,2,0,0,2,0,16,17,17 +0,1,18,0,0,0,4,4,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,0,3,1,1,1,0,0,18,18,17 +0,0,18,0,0,1,4,4,1,4,0,0,0,1,0,0,1,1,0,1,1,1,1,3,1,3,0,0,3,0,14,15,15 +0,1,17,0,0,0,4,4,4,0,0,1,1,0,0,0,0,0,0,1,1,1,0,3,0,0,1,1,4,0,12,13,13 +0,0,17,1,1,0,4,4,2,2,1,0,1,2,0,0,1,0,1,1,1,1,0,4,2,3,0,0,4,0,7,7,8 +0,0,17,0,1,0,4,2,4,4,1,0,1,2,0,0,1,0,0,1,1,1,0,3,2,2,0,0,2,0,16,16,16 +0,0,17,0,1,0,3,2,1,1,1,1,0,3,0,0,1,0,1,0,1,1,0,4,1,1,0,1,4,0,18,18,18 +0,1,19,1,0,0,2,1,3,2,2,0,1,2,1,0,0,0,1,1,1,1,1,3,2,0,0,0,4,0,9,10,11 +0,1,20,0,1,1,3,2,2,4,2,2,0,0,2,0,0,0,1,1,1,0,0,4,4,2,0,0,4,0,14,15,15 +0,1,19,1,1,0,3,3,4,2,1,1,0,1,0,0,0,0,1,1,1,0,1,3,4,2,0,1,4,0,10,10,11 +0,0,18,0,1,0,1,4,4,0,0,0,0,1,0,1,1,0,0,0,1,0,1,2,3,3,0,1,4,2,10,10,11 +0,0,18,0,1,0,2,1,2,4,2,0,1,1,0,0,1,0,1,1,1,1,0,4,2,2,0,1,0,2,12,12,15 +0,0,17,0,1,0,2,3,4,4,2,1,1,1,0,0,0,0,1,1,1,1,1,3,1,0,0,0,2,2,11,12,14 +0,0,17,1,1,0,4,4,0,0,2,0,0,0,0,0,0,0,1,1,1,1,0,3,3,3,0,0,4,2,15,16,17 +0,0,18,0,1,0,4,3,4,4,2,0,0,2,0,0,1,0,1,1,1,1,1,3,2,3,0,0,4,2,14,15,17 +0,0,18,0,0,0,4,3,1,2,2,0,1,0,0,0,1,0,0,1,1,1,0,2,1,3,0,3,0,8,12,12,15 +0,0,17,1,1,0,3,4,3,2,2,1,0,2,0,0,1,0,1,0,1,1,0,3,2,3,1,4,4,2,15,15,17 +0,0,18,0,1,0,3,3,3,4,2,1,0,1,0,0,1,0,0,1,1,1,0,3,0,3,0,0,2,8,11,12,14 +0,1,19,0,1,0,4,2,1,4,2,0,1,1,0,0,1,0,1,1,1,1,1,4,3,3,0,0,0,9,11,10,10 +0,0,18,0,1,0,4,4,0,4,2,0,0,1,0,0,1,0,0,1,1,1,0,3,3,3,2,2,4,0,12,11,13 +0,0,18,0,1,0,3,4,4,4,2,0,0,0,0,0,1,0,1,1,1,1,1,4,3,3,0,0,0,4,11,12,14 +0,0,17,0,1,0,4,4,1,1,2,0,0,0,0,0,0,0,1,1,1,1,0,4,2,3,0,1,4,2,14,15,17 +0,0,17,0,1,1,4,3,2,2,2,0,0,1,0,0,1,0,0,1,1,1,1,4,1,1,0,1,4,14,15,14,17 +0,0,17,0,0,1,3,3,2,4,0,0,0,1,0,1,1,0,0,1,1,1,0,4,2,2,0,0,4,0,12,12,13 +0,0,17,0,0,0,2,1,4,4,0,1,0,1,0,0,0,0,1,1,1,1,0,3,1,2,1,1,1,2,11,12,14 +0,1,18,0,0,0,4,4,4,4,1,1,0,0,0,0,1,0,0,1,1,1,0,3,1,4,2,3,4,2,8,9,11 +0,0,19,0,1,0,1,1,4,4,2,2,2,2,0,0,0,0,1,1,0,0,1,0,4,4,3,2,4,12,10,10,11 +0,0,19,0,0,1,1,1,4,4,2,2,2,1,2,0,1,0,0,0,1,1,1,4,2,3,0,0,3,2,8,8,9 +0,0,18,0,1,0,2,2,4,4,2,0,0,0,0,0,1,0,1,1,1,1,1,3,2,4,1,3,4,2,10,10,10 +0,0,17,0,1,0,2,2,4,4,2,0,0,1,0,0,1,0,0,1,1,0,1,3,1,1,0,0,2,4,14,13,13 +0,0,17,1,0,0,2,2,2,2,2,0,0,2,0,0,1,0,1,1,1,1,0,2,2,1,1,1,2,0,11,11,10 +0,0,17,0,1,0,3,1,2,2,2,1,0,2,0,0,1,0,0,0,1,1,0,2,3,2,1,2,4,0,17,18,17 +0,0,17,0,0,0,0,2,3,3,0,1,1,2,0,0,0,0,0,1,1,1,0,2,2,2,1,2,1,0,14,14,15 +0,0,18,0,1,0,1,1,4,4,0,0,1,2,0,0,0,0,1,1,1,1,0,3,4,4,0,1,1,0,14,14,14 +0,1,18,0,1,0,4,4,4,4,2,0,0,2,0,0,0,0,1,1,1,1,0,3,2,2,1,1,2,0,13,14,13 +0,1,17,0,1,0,3,3,4,2,1,0,0,0,0,0,0,0,1,0,1,1,0,3,2,4,2,4,4,0,17,18,17 +0,1,17,1,1,0,2,2,2,4,2,0,3,0,0,0,1,0,0,1,1,1,0,3,3,4,4,4,3,2,11,10,10 +0,0,17,0,1,0,4,4,0,2,2,0,0,2,0,0,1,0,1,1,1,1,0,4,3,3,0,2,3,0,13,12,13 +0,0,17,0,1,0,4,4,0,0,2,0,1,2,0,0,1,0,0,0,1,1,1,3,2,2,0,1,3,4,15,14,15 +0,0,17,0,1,0,3,3,3,4,2,0,0,0,0,0,1,1,1,1,1,1,0,3,1,4,1,4,4,2,11,12,11 +0,1,18,0,0,0,2,2,4,4,2,0,0,3,0,0,1,1,1,1,1,1,0,3,4,4,1,3,4,0,11,11,12 +0,1,19,1,1,0,3,2,3,2,0,2,0,0,0,0,1,0,0,0,1,0,1,4,2,3,1,1,4,0,11,10,10 +0,0,18,0,1,0,2,2,3,4,2,0,3,1,0,0,0,0,1,1,1,0,1,3,1,4,0,0,1,2,10,9,10 +0,0,17,1,1,0,2,4,3,4,2,1,0,2,0,0,1,0,0,1,1,1,1,3,3,2,0,0,4,0,15,15,15 +0,1,18,0,1,0,2,2,4,4,1,0,0,0,0,0,0,0,0,0,1,1,0,4,3,1,0,1,4,6,15,14,15 +0,0,18,0,1,0,3,3,2,2,0,0,0,1,0,0,0,0,1,1,1,1,0,4,2,3,0,0,3,8,10,11,12 +0,0,18,0,0,0,2,2,4,4,0,2,0,1,0,0,0,0,1,0,1,1,1,3,2,2,0,0,1,0,10,9,12 +0,0,18,1,1,0,2,2,3,4,2,0,1,3,0,0,0,0,1,1,1,0,0,3,3,3,0,0,3,6,14,13,14 +0,0,17,0,1,0,3,4,2,4,2,0,0,2,0,0,0,0,0,1,1,1,0,3,3,4,0,2,4,8,11,13,14 +0,0,17,0,1,0,3,2,4,4,0,0,0,1,0,0,1,0,0,1,1,1,1,3,2,1,1,2,1,0,12,13,15 +0,0,18,0,0,0,3,3,2,2,0,0,0,3,0,0,1,0,0,1,1,1,0,4,2,2,0,0,0,4,14,14,15 +0,0,17,1,1,1,3,2,4,4,0,0,0,1,0,0,1,0,0,1,1,1,0,3,2,2,1,2,1,0,14,14,16 +0,1,18,0,1,0,4,4,0,2,0,1,0,1,0,0,1,0,1,1,1,1,0,3,2,2,1,1,1,0,12,12,13 +0,1,18,0,0,0,3,4,2,4,0,0,0,1,0,0,0,0,1,1,1,1,1,3,2,2,0,2,4,6,16,16,17 +0,0,17,0,1,1,2,2,3,3,0,1,0,1,0,0,1,0,0,1,1,1,1,2,2,0,0,1,3,18,10,12,14 +0,0,18,0,1,0,2,3,3,4,2,0,0,2,0,0,1,0,0,1,1,1,0,3,2,2,0,1,2,0,11,12,14 +0,0,18,0,1,0,3,2,4,2,3,0,0,2,0,0,0,0,0,1,1,1,1,4,3,2,1,2,0,4,14,16,17 +0,1,18,1,1,0,4,3,0,2,2,0,0,2,0,0,0,0,0,1,1,1,1,4,2,1,0,1,3,4,15,14,17 +0,1,18,0,1,0,4,3,0,4,2,0,0,2,0,0,1,0,0,1,1,1,1,4,3,4,1,2,4,0,14,13,14 +0,0,17,0,1,0,4,3,1,4,1,0,0,2,0,0,1,0,1,1,1,1,1,3,3,2,0,2,3,0,11,12,13 +0,0,17,0,1,0,2,1,2,4,2,0,1,1,0,0,1,0,1,1,1,1,1,3,2,3,1,1,0,10,12,15,15 +0,0,17,0,1,0,2,1,2,4,1,0,0,1,0,0,1,0,1,1,1,1,0,3,2,4,1,3,3,4,12,16,16 +0,0,19,0,0,1,2,3,3,4,0,2,1,0,1,0,0,0,0,1,0,1,0,1,1,2,2,3,4,16,10,11,11 +0,0,17,0,1,0,3,1,4,3,0,0,0,0,1,0,1,1,0,1,1,1,1,3,0,1,0,0,2,6,10,13,13 +0,0,21,0,0,0,4,4,4,4,1,2,0,2,2,0,0,1,1,1,1,1,0,2,2,1,0,0,4,0,9,12,12 +0,1,18,0,0,0,2,2,2,2,1,0,0,1,0,0,1,0,1,0,0,1,0,3,3,3,0,2,2,11,9,11,12 +0,1,18,0,0,1,3,4,4,4,1,2,0,1,0,0,0,0,1,1,1,1,1,3,2,4,0,3,1,9,13,14,15 +0,0,17,0,1,0,2,2,2,2,1,0,0,1,0,0,1,0,1,1,1,1,0,3,2,3,0,2,3,0,13,17,17 +0,1,17,0,0,1,4,4,1,4,1,0,0,2,0,0,1,0,0,1,1,1,0,3,3,1,0,1,3,2,12,15,15 +0,0,18,0,0,0,4,2,0,4,2,0,0,1,0,0,1,0,1,1,1,1,0,3,1,1,0,0,2,0,14,17,17 +0,1,21,1,0,0,1,1,3,4,2,2,1,1,2,0,1,0,1,1,0,1,1,4,2,2,4,1,3,21,9,10,10 +0,0,20,1,1,0,1,1,4,4,1,2,1,2,0,0,0,0,0,1,1,1,1,2,1,1,0,2,2,8,11,15,15 +0,0,19,0,1,0,4,4,0,4,0,2,0,0,1,0,1,0,0,1,1,1,1,2,1,4,3,3,4,5,9,10,11 +0,1,17,0,0,1,3,2,4,4,1,0,0,1,0,0,1,0,0,1,1,1,0,3,3,3,0,1,4,10,16,18,18 +0,0,18,0,1,0,3,2,3,4,1,1,0,2,0,0,1,0,0,1,1,1,1,3,2,3,0,1,1,5,14,17,17 +0,1,18,1,1,0,2,3,4,2,1,1,0,0,0,0,0,0,0,1,1,1,0,2,0,2,3,4,3,13,13,14,14 +0,1,19,0,1,0,2,1,4,4,1,0,0,0,0,0,0,0,0,1,1,1,0,4,2,3,0,3,3,10,7,11,11 +0,0,18,0,0,1,2,2,2,4,1,0,1,1,0,0,1,0,0,1,1,1,0,3,0,3,0,2,3,10,14,17,17 +0,0,20,0,1,0,1,0,4,4,1,0,1,0,1,1,0,0,0,1,1,1,1,4,2,0,0,0,4,5,8,10,10 +0,0,18,0,1,0,3,2,2,4,0,0,0,1,0,0,1,0,1,0,1,1,1,2,0,1,0,1,0,4,10,13,13 +1,0,16,0,1,0,1,3,3,4,3,1,1,0,0,0,1,0,0,1,0,1,1,3,2,2,0,2,4,11,10,11,11 +1,0,16,1,1,0,2,2,4,4,2,0,1,1,0,0,1,0,1,1,1,1,0,3,3,3,0,0,4,0,12,12,12 +1,0,15,1,1,0,1,1,3,2,3,0,0,0,1,0,1,0,0,1,1,0,1,3,0,2,0,0,1,6,10,10,10 +1,0,15,1,1,0,3,3,3,4,2,0,1,0,0,0,1,0,0,1,1,1,0,4,3,3,1,2,4,4,10,10,11 +1,0,16,1,1,0,2,3,3,2,2,0,1,1,0,0,0,0,0,1,1,0,0,3,4,1,0,1,4,0,16,17,17 +1,0,15,1,0,0,2,1,3,4,0,0,1,0,0,0,0,0,0,1,0,0,0,0,2,3,0,0,0,0,6,8,9 +1,1,16,1,0,1,4,4,3,4,0,0,0,1,0,0,1,0,0,1,1,0,0,4,2,1,0,2,1,5,10,11,11 +1,1,16,0,1,1,1,2,4,4,3,0,0,2,0,1,0,0,0,1,1,1,0,3,3,2,0,0,4,0,10,11,11 +1,0,17,1,1,0,3,2,3,4,2,1,0,1,1,0,0,0,0,1,1,0,1,3,4,3,0,1,4,0,10,10,10 +1,0,17,1,1,0,1,1,4,4,3,1,0,0,1,0,1,0,0,0,0,1,0,4,3,3,1,1,4,0,6,6,7 +1,0,15,1,1,0,4,4,0,4,2,0,1,0,0,0,0,0,0,1,1,1,1,0,4,0,2,4,4,0,13,14,14 +1,0,16,0,0,1,2,2,3,4,1,0,1,3,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,4,10,9,11 +1,0,15,1,0,0,1,1,3,2,1,1,1,1,0,0,1,0,0,1,1,1,0,4,3,2,0,1,3,0,10,10,10 +1,0,15,1,0,0,1,1,4,2,2,0,1,0,1,0,1,0,0,1,1,1,1,3,3,2,0,1,1,4,6,7,8 +1,0,16,1,1,0,0,2,4,4,3,0,1,0,0,0,1,0,1,1,1,0,0,2,1,2,0,1,1,0,12,11,12 +1,0,17,1,1,0,2,3,4,4,2,0,1,0,0,0,1,0,0,1,1,1,0,4,4,4,0,2,2,2,10,11,12 +1,0,15,1,1,0,3,3,4,2,2,1,1,0,0,0,0,0,0,0,1,1,0,3,0,2,0,0,3,0,14,16,16 +1,1,16,0,1,0,1,1,3,2,0,0,1,1,0,0,1,0,1,1,1,0,1,4,3,4,3,4,2,0,7,0,0 +1,1,17,0,1,0,1,1,4,4,0,0,0,1,0,0,0,1,0,0,1,1,0,3,3,2,1,3,4,4,8,9,9 +1,1,15,1,0,0,4,1,1,2,1,1,0,1,0,0,1,0,1,1,1,1,0,4,2,3,0,1,1,0,12,13,14 +1,1,15,1,0,0,4,1,1,2,1,1,0,1,0,0,1,0,1,1,1,1,0,4,2,3,0,1,1,7,7,9,8 +1,1,16,1,1,0,3,4,4,1,3,0,2,1,0,0,0,0,0,0,1,0,0,2,3,4,0,1,4,4,9,10,11 +1,1,15,1,1,0,1,1,4,4,2,0,3,1,0,0,1,0,1,1,1,0,1,4,3,4,1,3,3,8,7,9,9 +1,1,15,0,0,0,3,3,3,3,1,1,0,1,0,0,1,0,1,1,1,1,0,4,2,2,0,0,4,0,11,11,11 +1,1,17,1,1,0,2,1,4,4,3,0,2,0,0,0,0,0,1,1,0,0,1,4,4,4,4,4,2,8,8,10,9 +1,0,16,1,1,0,4,4,0,0,2,0,1,2,0,0,0,0,1,1,1,1,1,3,1,1,0,0,3,6,16,16,17 +1,0,15,1,1,0,1,2,4,2,2,0,1,0,0,0,0,0,0,1,1,0,0,4,0,1,0,0,0,3,11,13,13 +1,0,16,1,1,0,2,3,4,2,2,0,2,1,0,0,1,0,0,1,1,1,0,3,4,3,0,1,0,2,15,15,15 +1,1,16,1,1,0,1,2,4,4,2,1,1,1,0,0,0,0,0,1,1,0,0,3,2,2,0,0,4,0,10,11,11 +1,0,16,1,1,0,2,2,4,4,2,0,2,1,0,0,1,0,0,1,1,1,0,3,3,4,0,0,3,4,9,10,11 +1,0,16,0,1,0,1,2,4,2,2,0,0,2,1,0,1,0,0,1,1,0,0,0,2,1,0,1,3,0,10,8,8 +1,0,16,0,1,0,1,2,4,2,2,0,0,2,1,0,1,0,0,1,1,0,0,0,2,1,0,1,3,3,9,8,8 +1,0,15,0,1,0,2,1,3,4,0,0,0,1,0,1,1,0,0,0,1,1,0,3,3,1,2,2,1,0,9,10,9 +1,0,16,0,1,0,1,1,3,4,2,1,0,1,0,0,1,0,0,0,1,0,1,4,3,2,1,0,1,0,13,14,15 +1,1,17,1,0,0,1,2,3,2,1,0,0,0,0,0,1,0,1,1,1,1,0,4,4,4,4,4,2,4,10,11,11 +1,0,16,1,1,0,1,1,4,4,0,1,3,3,0,0,1,0,0,0,1,1,0,3,2,1,0,0,0,0,13,10,13 +1,0,16,1,1,0,1,1,3,4,3,1,3,2,0,1,1,0,0,1,1,0,0,3,3,2,0,0,4,2,10,9,10 +1,0,15,1,1,0,1,1,3,4,0,1,1,1,0,0,1,0,1,1,1,1,0,3,2,2,0,0,1,1,11,10,11 +1,0,16,1,1,0,1,1,3,4,3,0,1,0,0,0,0,0,1,1,1,1,1,3,1,1,3,2,1,0,13,12,14 +1,0,15,1,1,0,1,1,3,3,2,1,2,1,0,0,1,0,0,1,1,0,0,3,1,0,0,1,1,0,13,14,14 +1,0,15,1,0,0,2,2,4,4,3,1,0,2,0,1,1,0,0,1,1,0,0,3,3,2,1,1,4,2,14,11,12 +1,1,16,1,1,0,1,1,3,4,3,1,1,0,0,0,0,0,1,1,1,0,0,2,3,3,2,3,4,6,11,11,11 +1,0,18,0,1,0,1,2,4,4,2,1,0,1,1,0,1,0,1,1,1,1,1,2,3,3,1,2,4,9,9,8,8 +1,1,15,0,1,0,3,1,4,2,0,0,1,0,0,0,1,0,0,1,1,0,0,2,1,2,0,2,3,0,10,9,11 +1,0,16,1,1,0,2,2,4,2,2,1,2,1,0,0,1,0,1,1,1,1,0,4,2,3,0,0,1,1,14,13,14 +1,1,15,0,1,0,2,2,1,4,1,0,2,0,0,0,0,0,0,1,1,0,0,3,2,2,0,1,3,1,13,12,13 +1,1,16,0,1,0,4,4,4,0,2,1,0,1,0,0,1,0,1,1,1,0,1,3,2,0,0,0,2,0,13,12,13 +1,0,15,1,1,0,3,3,2,4,1,0,0,1,0,0,1,0,0,1,1,1,1,3,4,3,0,0,0,4,13,12,12 +1,0,16,1,1,0,2,2,3,4,2,0,1,1,1,0,1,0,1,0,1,0,0,3,3,3,1,2,4,2,12,11,12 +1,0,16,1,0,0,2,2,4,4,0,1,2,0,0,0,1,0,1,1,1,0,1,3,2,1,0,0,3,0,14,14,16 +1,1,16,0,0,0,2,1,3,2,2,0,1,0,0,0,1,0,1,1,1,1,0,1,3,2,1,2,3,4,10,8,10 +1,1,15,1,0,0,1,3,3,4,1,1,2,0,0,0,1,0,1,1,1,1,0,3,1,3,2,4,2,2,10,11,11 +1,0,15,0,1,0,2,2,4,2,2,0,1,2,0,0,1,0,1,1,1,0,0,4,2,1,0,0,3,0,12,13,14 +1,0,16,1,0,0,2,1,4,4,0,0,0,0,0,0,1,0,0,1,1,1,1,4,3,2,0,0,4,2,10,8,8 +1,1,15,0,1,0,3,3,2,2,2,1,1,0,0,0,1,0,1,0,1,1,0,3,2,2,1,3,2,11,12,10,11 +1,0,16,1,1,0,1,1,3,4,2,1,1,1,3,1,1,0,0,1,1,0,0,2,3,2,0,0,0,0,7,7,8 +1,0,17,0,1,0,2,2,4,3,2,0,0,0,0,0,1,0,1,1,0,0,0,3,4,2,0,0,4,4,9,9,10 +1,0,19,0,1,0,2,3,3,2,2,2,0,0,1,0,0,0,0,1,0,1,1,3,3,3,0,0,1,0,9,9,10 +1,0,17,1,1,0,2,1,3,4,2,0,2,0,0,0,1,0,1,1,0,0,1,4,4,2,0,0,2,2,9,10,11 +1,0,15,1,0,0,1,1,3,4,2,0,1,0,0,0,1,0,0,1,0,0,1,4,1,0,0,2,3,0,9,10,9 +1,0,16,1,1,0,2,2,4,4,2,1,2,1,0,0,1,0,0,1,0,1,0,2,3,4,0,1,0,1,9,10,11 +1,0,16,0,0,1,2,2,4,4,0,0,0,0,0,0,1,0,0,1,0,0,0,3,2,3,0,1,0,6,7,7,8 +1,0,17,1,1,0,2,2,3,4,2,0,1,1,0,0,1,0,0,1,1,1,0,3,2,4,0,1,3,0,11,10,11 +1,0,16,0,1,0,2,2,4,2,2,1,0,0,1,0,1,1,1,0,1,1,0,3,3,2,0,3,2,1,9,10,10 +1,0,18,1,0,1,3,2,4,4,2,2,1,2,2,0,1,0,0,0,0,0,1,2,2,1,0,0,1,6,7,9,10 +1,0,19,0,1,0,1,1,3,2,2,0,0,2,1,0,0,0,1,1,0,0,1,4,2,0,0,0,2,6,7,9,9 +1,1,18,1,1,0,1,1,4,4,0,0,1,0,1,0,0,0,1,1,0,1,0,3,3,2,2,3,3,0,8,9,10 +1,0,18,1,1,0,1,1,3,3,2,0,1,0,1,0,0,0,0,0,0,1,1,2,1,2,0,0,1,4,9,11,10 +1,0,19,0,1,0,1,1,4,4,2,2,1,1,1,0,1,0,0,1,1,1,1,0,0,3,3,0,0,12,7,8,9 +1,0,16,1,1,1,2,2,1,4,2,0,0,1,0,0,0,0,0,0,1,0,1,2,2,1,0,0,2,2,8,10,10 +1,0,17,0,1,0,0,1,4,3,2,1,1,0,0,0,0,0,1,0,1,0,0,1,3,3,2,4,4,5,9,9,10 +1,0,16,1,0,0,1,2,3,4,2,0,0,1,0,0,0,0,1,1,0,1,0,3,3,4,0,2,2,0,8,9,9 +1,0,16,0,1,0,3,3,4,4,1,0,0,0,0,0,0,0,1,1,0,1,1,3,4,3,0,0,3,0,14,13,13 +1,0,16,1,0,0,1,1,2,2,0,0,0,0,0,0,1,0,1,1,1,1,1,3,3,3,1,1,3,2,14,14,14 +1,1,17,0,1,0,3,3,2,3,2,0,1,3,1,0,1,1,1,1,1,0,0,4,3,4,2,3,4,0,10,11,10 +1,0,16,0,1,0,2,1,4,2,2,0,0,1,0,0,1,0,1,1,1,1,0,4,2,2,0,0,0,0,14,13,14 +1,0,16,0,1,0,2,2,2,4,2,0,0,0,0,0,1,1,1,1,1,0,1,3,1,4,0,1,4,0,17,16,16 +1,1,17,0,1,0,1,2,4,4,2,1,0,0,1,0,1,0,1,1,0,1,1,4,2,4,4,4,0,12,6,7,7 +1,1,16,0,0,0,4,3,4,4,2,1,0,0,0,0,0,0,1,1,1,1,0,3,1,4,0,4,4,8,14,12,13 +1,1,17,1,0,0,2,2,2,2,4,0,2,3,1,0,1,0,0,1,1,0,0,0,2,4,2,4,2,2,10,8,9 +1,0,16,0,1,0,1,1,4,4,2,2,0,3,0,1,1,0,1,1,1,1,0,1,1,0,0,0,4,0,14,14,14 +1,0,19,0,0,0,2,2,4,4,0,0,0,2,0,0,0,0,0,1,1,1,1,4,3,4,0,0,0,0,12,13,13 +1,0,17,1,1,0,1,1,3,4,1,0,1,0,0,0,1,0,1,0,1,1,1,3,3,4,0,1,4,0,11,11,11 +1,0,20,0,1,0,3,3,3,2,3,0,1,1,1,0,0,0,1,1,1,1,1,2,2,3,1,3,2,8,11,9,10 +1,0,17,0,0,0,1,1,4,2,2,1,0,2,0,0,1,0,0,1,1,0,1,3,2,2,0,0,2,0,11,11,10 +1,1,17,1,1,0,2,2,4,4,2,0,2,0,1,0,1,0,0,0,1,1,0,3,3,4,0,1,4,0,10,9,9 +1,0,16,1,0,0,1,1,3,4,2,1,2,1,0,0,1,0,0,1,1,0,0,4,2,1,0,0,0,0,16,17,18 +1,0,17,1,1,0,2,2,4,4,1,0,1,1,0,0,1,0,1,1,1,0,0,4,2,1,0,0,0,0,15,17,17 +1,0,17,0,1,1,1,0,4,4,3,0,1,1,0,0,0,0,0,1,1,1,1,3,3,4,0,0,3,1,11,9,10 +1,0,18,1,1,0,1,1,3,4,3,0,0,1,1,0,1,0,0,1,1,1,1,3,2,1,0,0,4,9,7,7,7 +1,0,16,0,1,0,3,1,4,4,2,0,0,0,0,0,0,0,1,1,1,1,0,2,0,2,0,2,0,0,8,6,8 +1,0,16,0,1,0,3,2,2,3,2,0,0,0,0,0,0,0,0,1,1,1,0,2,0,2,0,3,2,2,7,6,7 +1,0,18,0,0,0,1,1,4,3,1,0,1,1,0,1,0,0,0,1,1,0,0,1,2,4,0,3,2,8,9,8,10 +1,0,16,1,1,0,4,4,1,0,1,1,0,1,0,0,0,0,1,0,1,1,1,3,2,2,1,2,1,0,14,16,16 +1,0,16,1,0,0,1,2,4,4,1,0,1,0,0,0,0,0,1,1,1,1,0,4,3,4,0,3,1,0,14,14,15 +1,0,18,0,1,1,2,4,4,2,1,1,0,1,1,0,1,0,0,1,1,1,0,1,2,1,0,2,0,8,8,5,8 +1,1,16,1,1,0,2,1,4,2,1,0,1,1,0,0,0,0,1,1,1,1,0,4,1,0,0,0,1,0,8,7,0 +1,0,16,0,0,0,1,1,3,4,3,0,2,1,0,0,1,0,0,1,1,1,0,3,2,1,0,2,4,6,6,8,8 +1,0,16,1,1,0,2,3,3,2,3,0,1,1,0,0,1,0,1,1,1,1,0,2,2,2,0,0,1,0,8,10,10 +1,0,16,0,1,0,4,4,1,1,2,0,0,1,0,0,1,0,0,1,1,1,1,3,2,3,0,1,2,4,8,8,8 +1,1,18,0,0,0,4,4,3,1,0,0,0,3,0,0,1,0,1,1,0,1,1,4,4,4,4,4,4,2,5,6,6 +1,0,16,1,0,0,3,4,3,4,3,0,2,1,0,0,1,0,0,0,1,0,0,3,1,0,0,0,1,2,7,9,8 +1,1,17,0,0,0,4,4,4,2,0,0,0,2,0,0,1,0,0,1,1,1,0,3,3,2,0,1,4,0,15,14,16 +1,0,17,1,1,0,4,1,4,4,3,0,0,0,0,0,0,0,0,1,1,1,1,3,1,2,0,1,4,1,13,14,14 +1,1,16,0,0,0,2,2,2,2,3,0,3,2,0,0,0,0,0,1,1,0,0,4,0,2,1,1,2,0,10,9,10 +1,0,17,1,1,0,2,2,3,4,3,0,0,0,0,0,1,1,0,1,1,1,0,4,0,2,0,1,4,5,9,9,9 +1,0,16,0,0,0,4,4,2,2,3,1,1,0,0,0,1,0,0,1,1,0,0,4,0,2,0,1,4,1,11,11,11 +1,1,17,0,1,0,3,3,2,2,0,0,0,0,0,0,1,0,1,1,1,1,0,3,0,3,4,4,2,8,7,10,9 +1,1,17,0,1,0,1,1,3,2,3,0,2,1,0,0,0,0,0,1,1,1,1,4,0,2,2,2,0,0,10,10,10 +1,1,16,0,1,0,2,1,1,2,3,0,1,1,0,0,0,0,0,0,1,1,1,3,1,1,0,3,4,2,9,7,8 +1,0,16,0,0,0,2,1,4,2,3,0,0,1,0,0,0,0,0,1,1,1,1,2,1,1,0,0,2,0,14,15,16 +1,1,16,0,0,0,4,4,0,1,3,1,0,0,0,0,1,0,0,1,1,1,0,3,0,1,1,4,4,0,11,12,12 +1,1,15,1,1,0,1,2,4,2,2,0,2,1,0,0,1,0,1,1,1,0,0,4,4,4,0,2,4,11,9,11,10 +1,1,15,0,0,1,2,2,4,4,1,0,2,3,0,0,1,0,1,1,1,0,0,4,3,4,1,2,4,8,13,14,14 +1,1,15,0,0,1,2,1,2,2,2,0,0,0,0,0,0,0,1,1,1,1,0,3,2,2,0,1,4,11,12,13,12 +1,0,16,1,0,0,2,2,4,4,2,0,0,2,0,0,1,0,0,0,1,0,1,3,2,2,1,1,4,2,11,11,11 +1,0,16,0,0,0,4,1,4,4,0,0,1,1,0,0,1,0,1,1,1,1,0,0,1,3,1,1,0,8,9,10,10 +1,0,17,0,1,0,3,2,3,4,0,0,1,0,0,0,0,0,0,1,1,0,1,3,2,2,1,1,0,5,9,11,11 +1,0,17,1,1,0,2,2,4,4,3,0,1,1,0,1,0,1,0,1,1,0,0,4,0,2,0,0,4,0,11,9,11 +1,0,16,0,1,0,4,4,0,2,2,0,1,2,0,0,1,0,0,1,1,1,1,4,2,4,0,3,4,1,10,11,12 +1,1,17,1,1,0,4,4,1,4,2,1,2,0,3,0,0,0,1,1,1,1,1,2,2,2,0,2,4,2,9,9,8 +1,1,17,1,0,0,1,3,4,4,2,1,1,0,0,0,0,0,1,1,1,0,1,4,0,1,2,2,4,2,12,11,12 +1,1,17,0,1,0,3,4,2,4,3,0,0,1,1,0,1,0,1,0,1,1,1,4,3,3,2,3,4,8,8,9,8 +1,0,17,0,1,0,4,4,1,1,2,1,0,1,0,0,1,0,0,1,1,1,0,4,1,4,0,0,4,0,13,15,16 +1,1,16,1,0,0,4,1,4,3,3,1,0,0,0,0,0,0,0,1,1,1,0,3,0,1,1,0,1,0,10,11,11 +1,0,17,0,1,1,1,1,3,3,3,0,0,1,0,0,0,0,1,1,1,1,1,3,4,4,0,1,2,2,11,10,11 +1,0,17,1,1,0,4,2,4,4,2,0,1,1,0,1,1,0,0,0,1,1,0,3,2,2,1,2,4,0,17,18,18 +1,1,16,0,0,1,2,2,4,2,2,1,1,1,0,0,1,0,0,0,1,1,1,3,0,1,1,1,4,0,12,13,13 +1,1,17,0,1,0,3,2,4,4,3,1,1,1,0,0,1,1,0,1,1,1,0,3,0,1,1,1,0,0,13,14,13 +1,1,19,0,1,0,1,1,4,4,3,0,0,1,2,0,1,0,1,1,0,1,0,3,3,2,2,3,3,2,9,9,10 +1,1,17,0,0,1,1,0,4,4,0,0,0,0,0,0,0,0,0,1,1,0,1,3,0,1,0,0,4,4,11,11,12 +1,0,17,1,1,0,1,1,3,3,2,1,1,0,0,0,1,0,1,1,0,1,1,2,4,4,1,1,3,3,10,11,10 +1,0,16,1,1,0,1,2,4,4,0,1,0,2,0,1,1,0,0,0,1,1,1,3,2,3,0,0,2,5,13,14,13 +1,1,16,1,0,0,1,2,4,3,2,0,0,0,0,0,0,0,0,1,1,0,0,3,3,3,1,3,4,4,9,10,11 +1,0,17,1,1,0,3,1,4,4,2,0,1,1,3,0,1,0,1,0,1,1,1,4,3,3,0,0,4,2,7,9,10 +1,1,17,1,1,0,2,2,4,4,2,0,1,0,0,0,0,0,1,1,0,0,1,4,4,4,2,4,4,0,8,13,10 +1,1,18,1,1,0,1,0,3,3,2,2,2,0,1,1,1,0,0,1,1,0,0,3,2,1,0,0,3,0,12,12,13 +1,1,17,1,1,0,1,1,4,2,2,0,1,0,0,0,1,0,1,0,1,1,1,3,4,4,0,2,1,0,10,9,10 +1,1,18,0,0,0,1,1,3,3,2,0,1,1,0,0,1,0,1,1,1,0,0,3,2,2,0,3,4,6,10,9,10 +1,0,16,1,0,0,2,2,4,2,2,1,0,1,0,0,0,0,1,1,1,0,1,4,3,2,0,0,0,0,11,13,12 +1,1,17,0,1,0,2,2,4,4,2,0,0,0,1,0,0,0,1,1,1,0,1,0,1,0,1,2,4,0,7,0,0 +1,1,16,1,1,0,3,2,2,4,2,1,1,0,0,0,0,0,0,1,1,1,0,3,4,4,1,2,4,2,11,9,10 +1,1,16,1,0,0,1,1,3,4,2,0,1,0,0,0,0,0,1,1,1,1,0,3,4,4,1,3,4,0,10,10,9 +1,1,18,1,1,0,1,1,2,4,2,2,1,0,1,0,1,0,0,1,0,1,1,4,2,2,1,2,4,2,9,7,9 +1,1,18,1,1,0,3,2,2,4,2,0,0,0,1,0,0,0,0,1,0,1,0,1,2,0,1,1,4,0,4,0,0 +1,1,19,0,1,0,3,2,3,2,2,0,1,0,3,0,0,0,1,1,1,0,0,2,1,0,0,0,2,4,6,11,9 +1,1,18,0,1,0,3,3,3,3,2,0,0,1,2,0,1,0,1,1,0,1,0,3,3,4,0,2,2,9,4,8,8 +1,1,16,1,1,0,2,2,2,2,2,0,1,0,0,0,1,0,1,1,1,1,1,4,3,2,1,3,3,6,7,8,8 +1,1,19,0,1,0,2,1,3,4,2,2,1,0,3,0,0,0,1,0,0,1,1,3,3,2,0,2,4,4,8,9,9 +1,0,16,0,1,1,3,2,2,3,2,0,1,1,2,0,1,0,1,1,1,0,1,1,4,4,0,0,0,8,5,5,7 +1,0,17,0,1,0,1,1,4,3,2,0,0,0,0,0,1,0,1,1,1,0,0,3,2,1,0,1,4,9,7,9,10 +1,1,20,1,1,0,1,1,4,4,2,2,1,0,1,0,1,0,0,1,0,1,1,3,3,2,1,3,3,12,8,11,10 +1,0,18,1,1,1,4,3,2,2,2,0,0,0,0,0,1,0,0,1,1,1,0,4,3,3,2,3,1,8,10,11,10 +1,1,18,1,1,0,3,2,4,4,2,0,1,0,0,0,1,0,0,0,1,1,0,1,4,4,4,4,4,8,9,10,11 +1,1,19,1,1,0,1,1,4,2,0,2,2,1,1,0,0,0,0,1,1,1,0,4,3,3,2,2,1,8,10,9,11 +1,1,17,0,1,0,3,3,1,4,2,0,1,1,1,0,1,0,0,1,1,1,0,3,4,3,1,2,2,4,8,9,10 +1,1,18,0,0,0,1,3,3,2,2,0,0,0,0,0,0,0,0,1,0,1,1,3,2,2,1,2,2,0,9,10,9 +1,1,19,1,1,0,1,1,4,4,0,2,2,0,1,0,1,0,0,1,1,1,0,3,3,3,2,2,4,4,8,9,10 +1,0,18,0,1,1,1,2,3,4,2,0,1,1,2,0,1,0,0,1,1,0,0,3,2,2,0,0,4,2,6,8,8 +1,0,19,0,0,1,1,1,3,4,2,0,0,0,0,0,1,0,0,1,0,0,0,0,3,3,0,0,4,0,6,8,7 +1,0,18,1,1,0,2,2,4,4,3,0,1,0,1,0,0,0,0,1,0,1,1,4,4,4,0,0,2,0,8,6,0 +1,0,17,1,1,0,0,0,3,4,2,0,1,0,0,0,1,0,0,1,1,1,0,3,3,2,0,0,4,0,10,11,11 +1,0,17,1,0,1,3,1,4,3,2,2,1,2,0,0,1,1,0,1,0,0,0,3,1,2,1,1,2,5,8,7,8 +1,0,17,0,1,0,4,2,0,2,0,0,0,1,0,1,1,0,1,1,1,1,0,4,4,4,0,2,4,0,8,8,0 +1,0,18,1,0,0,2,2,2,2,2,0,0,1,1,0,1,0,1,1,1,1,0,1,2,2,0,1,3,3,7,6,8 +1,0,17,0,1,0,4,1,1,3,2,0,0,0,0,0,1,0,0,1,1,0,1,2,1,1,0,0,4,0,8,10,9 +1,0,17,0,0,0,1,2,3,4,2,1,0,0,0,0,0,0,0,1,1,1,0,4,4,0,0,0,2,0,7,10,10 +1,0,18,0,1,0,1,1,4,4,2,0,2,1,2,0,0,0,1,1,1,0,1,2,3,3,1,1,4,3,7,8,7 +1,0,18,0,1,0,2,2,2,3,1,1,1,1,0,0,0,0,1,0,1,1,0,3,2,4,0,0,0,2,12,13,14 +1,0,17,0,1,0,3,3,2,2,2,0,1,0,0,0,1,0,0,1,1,1,0,3,3,2,0,0,3,0,11,12,13 +1,0,18,0,0,1,1,2,3,4,1,0,1,1,0,0,0,0,0,1,1,1,0,3,3,2,0,1,3,0,12,13,14 +1,0,18,0,1,0,4,4,0,0,1,0,1,1,0,0,0,0,1,0,1,1,0,3,2,4,0,1,0,0,18,18,18 +1,1,18,0,0,0,4,4,2,4,1,0,0,0,0,0,1,0,1,1,1,1,0,4,3,4,0,0,4,3,17,17,17 +1,0,17,0,1,0,4,2,4,4,2,0,1,1,0,0,1,0,0,1,1,1,0,3,2,2,0,1,3,0,17,18,18 +1,0,18,1,1,0,2,2,3,4,2,0,2,1,1,0,0,0,1,1,1,0,1,3,2,2,0,0,3,0,9,0,0 +1,1,18,0,0,0,1,2,3,2,0,0,1,0,0,0,1,0,0,0,1,0,0,3,0,3,4,4,0,8,10,11,11 +1,1,18,1,1,0,4,4,3,2,3,0,2,0,0,0,1,1,1,1,1,1,1,1,4,4,0,0,0,5,12,13,14 +1,1,17,1,1,0,1,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0,0,3,1,2,2,3,3,4,12,13,14 +1,0,18,0,1,0,2,2,4,4,2,0,1,1,0,0,1,0,0,0,1,1,1,0,2,0,0,0,1,4,8,8,10 +1,0,18,0,0,0,2,2,2,2,2,1,1,2,0,0,0,0,0,1,1,1,1,4,3,4,0,3,2,0,11,12,13 +1,0,18,1,0,1,4,2,0,4,1,0,0,1,0,0,0,0,1,1,1,1,1,4,2,0,0,0,4,0,5,0,0 +1,0,18,0,1,0,1,1,3,2,2,0,2,1,1,0,0,0,0,1,0,0,0,3,3,1,0,1,1,2,9,10,10 +1,0,19,0,1,0,1,1,3,2,3,1,1,0,1,0,0,0,0,1,0,0,0,4,4,4,1,2,1,0,5,0,0 +1,0,17,0,1,0,4,2,0,4,2,1,1,3,0,0,0,0,0,1,1,1,1,3,1,2,2,0,4,0,18,18,18 +1,0,17,1,0,1,2,1,2,4,1,0,1,1,0,0,0,0,1,1,1,1,1,4,2,2,0,1,1,5,11,11,12 +1,0,18,0,0,1,1,1,3,2,2,0,0,1,0,0,0,0,0,1,1,0,1,4,1,2,0,1,2,2,8,10,11 +1,0,18,0,1,0,1,2,3,3,2,1,1,1,0,0,1,0,0,1,0,0,0,3,0,0,0,0,3,0,11,11,12 +1,0,19,1,1,1,1,1,3,3,2,2,1,1,3,0,1,0,1,1,0,0,1,2,4,3,0,3,0,0,8,0,0 +1,0,18,1,1,0,2,2,2,4,0,0,1,2,0,0,0,0,0,1,1,1,1,3,1,0,0,0,3,5,14,14,15 +1,1,17,1,1,0,4,3,2,4,0,0,1,1,1,0,1,1,1,0,1,1,1,3,4,4,0,2,1,4,10,11,11 +1,0,18,0,1,0,3,3,2,2,2,1,0,1,0,0,1,0,0,1,1,0,1,4,2,3,0,0,4,0,10,10,10 +1,0,17,1,1,0,4,4,0,2,3,1,1,1,0,0,1,1,1,1,1,1,0,3,2,2,0,1,4,2,12,12,12 +1,0,17,0,0,1,3,2,2,4,1,0,1,1,0,0,0,0,0,1,1,0,1,0,1,2,0,1,4,0,15,14,15 +1,1,18,0,0,0,1,1,4,2,0,1,1,0,0,0,0,0,0,0,1,1,1,2,2,1,0,1,2,2,14,13,14 +1,0,18,0,0,0,1,1,3,2,2,1,1,2,0,0,0,0,0,1,1,1,0,4,2,1,0,0,3,0,19,17,18 +1,0,18,1,0,1,1,2,3,4,2,0,2,1,0,0,0,0,0,1,1,0,1,3,2,3,0,3,4,0,16,15,15 +1,0,18,0,1,0,3,3,2,2,3,0,1,1,0,0,1,0,0,1,1,1,1,3,2,1,0,2,2,6,13,12,13 +1,0,17,0,0,0,4,4,3,3,2,0,0,1,0,0,1,0,1,1,1,1,1,1,2,3,0,0,0,4,15,14,15 +1,0,17,1,1,0,1,2,4,2,2,1,1,1,0,0,0,0,0,0,1,0,0,2,1,1,0,1,2,0,13,13,13 +1,1,18,1,1,0,1,3,3,4,2,0,1,1,0,0,1,1,0,1,1,0,0,2,2,3,1,3,2,0,8,10,9 +1,1,18,0,0,0,4,4,0,2,3,0,1,2,0,0,0,0,0,1,1,1,1,3,1,1,1,1,4,0,15,16,16 +1,0,17,1,1,0,1,1,4,2,1,0,2,0,1,0,1,0,0,1,1,1,1,4,1,0,0,1,0,0,8,8,9 +1,0,18,0,1,0,2,3,3,2,2,1,1,0,0,0,1,0,0,1,1,1,1,4,1,2,0,1,3,0,10,10,10 +1,0,18,1,1,0,4,4,4,0,3,1,2,1,0,0,1,0,0,0,1,1,1,2,1,1,3,1,4,0,7,5,0 +1,1,18,1,0,0,1,2,3,2,3,1,2,0,0,0,1,0,1,1,0,1,1,3,2,2,1,2,2,3,9,10,10 +1,0,17,0,1,0,2,2,4,3,0,0,0,2,0,0,0,0,1,1,1,0,1,2,3,2,0,0,2,8,10,11,12 +1,0,17,1,1,0,1,2,4,4,2,0,0,0,0,0,0,0,1,1,1,1,0,2,4,4,0,2,0,4,7,8,9 +1,0,18,1,0,0,4,4,4,4,1,0,1,2,0,0,0,0,0,1,1,1,0,4,3,3,0,0,0,0,15,17,17 +1,0,18,1,1,0,1,1,4,4,0,0,3,2,0,0,0,0,0,1,1,1,0,3,2,1,0,1,3,4,10,11,12 +1,0,19,1,1,0,1,1,3,4,2,2,1,1,1,0,1,0,0,1,1,1,1,3,2,2,0,0,2,4,7,8,9 +1,0,18,1,0,0,4,4,0,2,2,0,0,1,0,0,0,0,1,1,1,1,0,4,3,2,2,3,1,1,13,14,14 +1,0,18,0,1,0,3,3,4,4,0,0,0,1,0,0,0,0,0,1,1,1,1,3,0,2,0,1,0,1,16,16,16 +1,0,17,1,1,0,3,1,3,4,1,0,0,1,0,0,1,0,1,0,1,1,0,3,4,3,1,2,0,10,8,9,9 +1,1,18,0,1,0,4,4,0,0,0,1,0,1,0,0,0,0,1,0,1,1,0,2,1,3,0,3,1,4,17,18,19 +1,1,18,1,1,0,2,1,4,4,3,0,1,0,0,0,0,0,1,0,1,1,1,3,3,2,0,2,4,0,7,7,0 +1,1,17,0,1,0,2,3,4,2,0,1,1,1,0,0,0,0,1,1,1,1,0,3,3,2,0,0,2,4,14,15,16 +1,1,19,1,1,0,1,1,4,2,3,0,1,0,1,0,0,0,0,1,1,0,0,3,2,1,0,2,4,0,5,8,0 +1,1,18,1,1,0,4,2,4,4,0,1,1,0,1,0,0,1,0,1,1,0,0,4,3,2,3,2,2,0,7,7,0 +1,0,18,1,1,0,2,2,3,4,3,0,1,2,0,0,0,0,0,1,1,0,0,4,2,2,0,2,3,0,14,17,15 +1,0,17,0,1,0,4,3,0,4,3,0,1,1,0,0,0,0,0,1,1,1,0,4,4,3,0,0,0,0,6,9,11 +1,0,18,1,1,0,4,4,0,3,1,0,2,0,0,0,1,0,1,1,1,1,1,3,3,2,1,1,4,4,7,9,10 +1,0,19,1,1,0,2,3,2,4,2,0,0,2,1,0,0,0,1,0,1,1,0,4,3,1,0,1,4,4,10,11,10 +1,0,18,0,0,0,3,1,0,2,2,0,0,1,0,0,1,0,0,1,1,1,0,3,2,3,0,0,0,4,15,15,16 +1,0,18,0,1,0,1,1,4,4,2,0,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,4,6,11,12,9 +1,1,17,0,0,0,3,1,2,2,2,0,1,0,0,0,0,0,0,0,1,1,0,1,3,4,2,3,1,6,10,10,10 +1,1,18,1,0,0,3,2,2,4,2,0,2,0,0,0,0,0,0,0,1,1,0,3,3,0,2,3,4,4,10,11,11 \ No newline at end of file diff --git a/data/wine-quality.csv b/data/wine-quality.csv new file mode 100644 index 0000000..a7b65e2 --- /dev/null +++ b/data/wine-quality.csv @@ -0,0 +1,4899 @@ +fixed acidity,volatile acidity,citric acid,residual sugar,chlorides,free sulfur dioxide,total sulfur dioxide,density,pH,sulphates,alcohol,quality +7,0.27,0.36,20.7,0.045,45,170,1.001,3,0.45,8.8,3 +6.3,0.3,0.34,1.6,0.049,14,132,0.994,3.3,0.49,9.5,3 +8.1,0.28,0.4,6.9,0.05,30,97,0.9951,3.26,0.44,10.1,3 +7.2,0.23,0.32,8.5,0.058,47,186,0.9956,3.19,0.4,9.9,3 +7.2,0.23,0.32,8.5,0.058,47,186,0.9956,3.19,0.4,9.9,3 +8.1,0.28,0.4,6.9,0.05,30,97,0.9951,3.26,0.44,10.1,3 +6.2,0.32,0.16,7,0.045,30,136,0.9949,3.18,0.47,9.6,3 +7,0.27,0.36,20.7,0.045,45,170,1.001,3,0.45,8.8,3 +6.3,0.3,0.34,1.6,0.049,14,132,0.994,3.3,0.49,9.5,3 +8.1,0.22,0.43,1.5,0.044,28,129,0.9938,3.22,0.45,11,3 +8.1,0.27,0.41,1.45,0.033,11,63,0.9908,2.99,0.56,12,2 +8.6,0.23,0.4,4.2,0.035,17,109,0.9947,3.14,0.53,9.7,2 +7.9,0.18,0.37,1.2,0.04,16,75,0.992,3.18,0.63,10.8,2 +6.6,0.16,0.4,1.5,0.044,48,143,0.9912,3.54,0.52,12.4,4 +8.3,0.42,0.62,19.25,0.04,41,172,1.0002,2.98,0.67,9.7,2 +6.6,0.17,0.38,1.5,0.032,28,112,0.9914,3.25,0.55,11.4,4 +6.3,0.48,0.04,1.1,0.046,30,99,0.9928,3.24,0.36,9.6,3 +6.2,0.66,0.48,1.2,0.029,29,75,0.9892,3.33,0.39,12.8,5 +7.4,0.34,0.42,1.1,0.033,17,171,0.9917,3.12,0.53,11.3,3 +6.5,0.31,0.14,7.5,0.044,34,133,0.9955,3.22,0.5,9.5,2 +6.2,0.66,0.48,1.2,0.029,29,75,0.9892,3.33,0.39,12.8,5 +6.4,0.31,0.38,2.9,0.038,19,102,0.9912,3.17,0.35,11,4 +6.8,0.26,0.42,1.7,0.049,41,122,0.993,3.47,0.48,10.5,5 +7.6,0.67,0.14,1.5,0.074,25,168,0.9937,3.05,0.51,9.3,2 +6.6,0.27,0.41,1.3,0.052,16,142,0.9951,3.42,0.47,10,3 +7,0.25,0.32,9,0.046,56,245,0.9955,3.25,0.5,10.4,3 +6.9,0.24,0.35,1,0.052,35,146,0.993,3.45,0.44,10,3 +7,0.28,0.39,8.7,0.051,32,141,0.9961,3.38,0.53,10.5,3 +7.4,0.27,0.48,1.1,0.047,17,132,0.9914,3.19,0.49,11.6,3 +7.2,0.32,0.36,2,0.033,37,114,0.9906,3.1,0.71,12.3,4 +8.5,0.24,0.39,10.4,0.044,20,142,0.9974,3.2,0.53,10,3 +8.3,0.14,0.34,1.1,0.042,7,47,0.9934,3.47,0.4,10.2,3 +7.4,0.25,0.36,2.05,0.05,31,100,0.992,3.19,0.44,10.8,3 +6.2,0.12,0.34,1.5,0.045,43,117,0.9939,3.42,0.51,9,3 +5.8,0.27,0.2,14.95,0.044,22,179,0.9962,3.37,0.37,10.2,2 +7.3,0.28,0.43,1.7,0.08,21,123,0.9905,3.19,0.42,12.8,2 +6.5,0.39,0.23,5.4,0.051,25,149,0.9934,3.24,0.35,10,2 +7,0.33,0.32,1.2,0.053,38,138,0.9906,3.13,0.28,11.2,3 +7.3,0.24,0.39,17.95,0.057,45,149,0.9999,3.21,0.36,8.6,2 +7.3,0.24,0.39,17.95,0.057,45,149,0.9999,3.21,0.36,8.6,2 +6.7,0.23,0.39,2.5,0.172,63,158,0.9937,3.11,0.36,9.4,3 +6.7,0.24,0.39,2.9,0.173,63,157,0.9937,3.1,0.34,9.4,3 +7,0.31,0.26,7.4,0.069,28,160,0.9954,3.13,0.46,9.8,3 +6.6,0.24,0.27,1.4,0.057,33,152,0.9934,3.22,0.56,9.5,3 +6.7,0.23,0.26,1.4,0.06,33,154,0.9934,3.24,0.56,9.5,3 +7.4,0.18,0.31,1.4,0.058,38,167,0.9931,3.16,0.53,10,4 +6.2,0.45,0.26,4.4,0.063,63,206,0.994,3.27,0.52,9.8,1 +6.2,0.46,0.25,4.4,0.066,62,207,0.9939,3.25,0.52,9.8,2 +7,0.31,0.26,7.4,0.069,28,160,0.9954,3.13,0.46,9.8,3 +6.9,0.19,0.35,5,0.067,32,150,0.995,3.36,0.48,9.8,2 +7.2,0.19,0.31,1.6,0.062,31,173,0.9917,3.35,0.44,11.7,3 +6.6,0.25,0.29,1.1,0.068,39,124,0.9914,3.34,0.58,11,4 +6.2,0.16,0.33,1.1,0.057,21,82,0.991,3.32,0.46,10.9,4 +6.4,0.18,0.35,1,0.045,39,108,0.9911,3.31,0.35,10.9,3 +6.8,0.2,0.59,0.9,0.147,38,132,0.993,3.05,0.38,9.1,3 +6.9,0.25,0.35,1.3,0.039,29,191,0.9908,3.13,0.52,11,3 +7.2,0.21,0.34,11.9,0.043,37,213,0.9962,3.09,0.5,9.6,3 +6,0.19,0.26,12.4,0.048,50,147,0.9972,3.3,0.36,8.9,3 +6.6,0.38,0.15,4.6,0.044,25,78,0.9931,3.11,0.38,10.2,3 +7.4,0.2,0.36,1.2,0.038,44,111,0.9926,3.36,0.34,9.9,3 +6.8,0.22,0.24,4.9,0.092,30,123,0.9951,3.03,0.46,8.6,3 +6,0.19,0.26,12.4,0.048,50,147,0.9972,3.3,0.36,8.9,3 +7,0.47,0.07,1.1,0.035,17,151,0.991,3.02,0.34,10.5,2 +6.6,0.38,0.15,4.6,0.044,25,78,0.9931,3.11,0.38,10.2,3 +7.2,0.24,0.27,1.4,0.038,31,122,0.9927,3.15,0.46,10.3,3 +6.2,0.35,0.03,1.2,0.064,29,120,0.9934,3.22,0.54,9.1,2 +6.4,0.26,0.24,6.4,0.04,27,124,0.9903,3.22,0.49,12.6,4 +6.7,0.25,0.13,1.2,0.041,81,174,0.992,3.14,0.42,9.8,2 +6.7,0.23,0.31,2.1,0.046,30,96,0.9926,3.33,0.64,10.7,5 +7.4,0.24,0.29,10.1,0.05,21,105,0.9962,3.13,0.35,9.5,2 +6.2,0.27,0.43,7.8,0.056,48,244,0.9956,3.1,0.51,9,3 +6.8,0.3,0.23,4.6,0.061,50.5,238.5,0.9958,3.32,0.6,9.5,2 +6,0.27,0.28,4.8,0.063,31,201,0.9964,3.69,0.71,10,2 +8.6,0.23,0.46,1,0.054,9,72,0.9941,2.95,0.49,9.1,3 +6.7,0.23,0.31,2.1,0.046,30,96,0.9926,3.33,0.64,10.7,5 +7.4,0.24,0.29,10.1,0.05,21,105,0.9962,3.13,0.35,9.5,2 +7.1,0.18,0.36,1.4,0.043,31,87,0.9898,3.26,0.37,12.7,4 +7,0.32,0.34,1.3,0.042,20,69,0.9912,3.31,0.65,12,4 +7.4,0.18,0.3,8.8,0.064,26,103,0.9961,2.94,0.56,9.3,2 +6.7,0.54,0.28,5.4,0.06,21,105,0.9949,3.27,0.37,9,2 +6.8,0.22,0.31,1.4,0.053,34,114,0.9929,3.39,0.77,10.6,3 +7.1,0.2,0.34,16,0.05,51,166,0.9985,3.21,0.6,9.2,3 +7.1,0.34,0.2,6.1,0.063,47,164,0.9946,3.17,0.42,10,2 +7.3,0.22,0.3,8.2,0.047,42,207,0.9966,3.33,0.46,9.5,3 +7.1,0.43,0.61,11.8,0.045,54,155,0.9974,3.11,0.45,8.7,2 +7.1,0.44,0.62,11.8,0.044,52,152,0.9975,3.12,0.46,8.7,3 +7.2,0.39,0.63,11,0.044,55,156,0.9974,3.09,0.44,8.7,3 +6.8,0.25,0.31,13.3,0.05,69,202,0.9972,3.22,0.48,9.7,3 +7.1,0.43,0.61,11.8,0.045,54,155,0.9974,3.11,0.45,8.7,2 +7.1,0.44,0.62,11.8,0.044,52,152,0.9975,3.12,0.46,8.7,3 +7.2,0.39,0.63,11,0.044,55,156,0.9974,3.09,0.44,8.7,3 +6.1,0.27,0.43,7.5,0.049,65,243,0.9957,3.12,0.47,9,2 +6.9,0.24,0.33,1.7,0.035,47,136,0.99,3.26,0.4,12.6,4 +6.9,0.21,0.33,1.8,0.034,48,136,0.9899,3.25,0.41,12.6,4 +7.5,0.17,0.32,1.7,0.04,51,148,0.9916,3.21,0.44,11.5,4 +7.1,0.26,0.29,12.4,0.044,62,240,0.9969,3.04,0.42,9.2,3 +6,0.34,0.66,15.9,0.046,26,164,0.9979,3.14,0.5,8.8,3 +8.6,0.265,0.36,1.2,0.034,15,80,0.9913,2.95,0.36,11.4,4 +9.8,0.36,0.46,10.5,0.038,4,83,0.9956,2.89,0.3,10.1,1 +6,0.34,0.66,15.9,0.046,26,164,0.9979,3.14,0.5,8.8,3 +7.4,0.25,0.37,13.5,0.06,52,192,0.9975,3,0.44,9.1,2 +7.1,0.12,0.32,9.6,0.054,64,162,0.9962,3.4,0.41,9.4,2 +6,0.21,0.24,12.1,0.05,55,164,0.997,3.34,0.39,9.4,2 +7.5,0.305,0.4,18.9,0.059,44,170,1,2.99,0.46,9,2 +7.4,0.25,0.37,13.5,0.06,52,192,0.9975,3,0.44,9.1,2 +7.3,0.13,0.32,14.4,0.051,34,109,0.9974,3.2,0.35,9.2,3 +7.1,0.12,0.32,9.6,0.054,64,162,0.9962,3.4,0.41,9.4,2 +7.1,0.23,0.35,16.5,0.04,60,171,0.999,3.16,0.59,9.1,3 +7.1,0.23,0.35,16.5,0.04,60,171,0.999,3.16,0.59,9.1,3 +6.9,0.33,0.28,1.3,0.051,37,187,0.9927,3.27,0.6,10.3,2 +6.5,0.17,0.54,8.5,0.082,64,163,0.9959,2.89,0.39,8.8,3 +7.2,0.27,0.46,18.75,0.052,45,255,1,3.04,0.52,8.9,2 +7.2,0.31,0.5,13.3,0.056,68,195,0.9982,3.01,0.47,9.2,2 +6.7,0.41,0.34,9.2,0.049,29,150,0.9968,3.22,0.51,9.1,2 +6.7,0.41,0.34,9.2,0.049,29,150,0.9968,3.22,0.51,9.1,2 +5.5,0.485,0,1.5,0.065,8,103,0.994,3.63,0.4,9.7,1 +6,0.31,0.24,3.3,0.041,25,143,0.9914,3.31,0.44,11.3,3 +7,0.14,0.4,1.7,0.035,16,85,0.9911,3.19,0.42,11.8,3 +7.2,0.31,0.5,13.3,0.056,68,195,0.9982,3.01,0.47,9.2,2 +7.3,0.32,0.48,13.3,0.06,57,196,0.9982,3.04,0.5,9.2,2 +5.9,0.36,0.04,5.7,0.046,21,87,0.9934,3.22,0.51,10.2,2 +7.8,0.24,0.32,12.2,0.054,42,138,0.9984,3.01,0.54,8.8,2 +7.4,0.16,0.31,6.85,0.059,31,131,0.9952,3.29,0.34,9.7,2 +6.9,0.19,0.28,5,0.058,14,146,0.9952,3.29,0.36,9.1,3 +6.4,0.13,0.47,1.6,0.092,40,158,0.9928,3.21,0.36,9.8,3 +6.7,0.19,0.36,1.1,0.026,63,143,0.9912,3.27,0.48,11,3 +7.4,0.39,0.23,7,0.033,29,126,0.994,3.14,0.42,10.5,2 +6.5,0.24,0.32,7.6,0.038,48,203,0.9958,3.45,0.54,9.7,4 +6.1,0.3,0.56,2.8,0.044,47,179,0.9924,3.3,0.57,10.9,4 +6.1,0.3,0.56,2.7,0.046,46,184,0.9924,3.31,0.57,10.9,3 +5.7,0.26,0.25,10.4,0.02,7,57,0.994,3.39,0.37,10.6,2 +6.5,0.24,0.32,7.6,0.038,48,203,0.9958,3.45,0.54,9.7,4 +6.5,0.425,0.4,13.1,0.038,59,241,0.9979,3.23,0.57,9,2 +6.6,0.24,0.27,15.8,0.035,46,188,0.9982,3.24,0.51,9.2,2 +6.8,0.27,0.22,8.1,0.034,55,203,0.9961,3.19,0.52,8.9,2 +6.7,0.27,0.31,15.7,0.036,44,179,0.9979,3.26,0.56,9.6,2 +8.2,0.23,0.4,1.2,0.027,36,121,0.992,3.12,0.38,10.7,3 +7.1,0.37,0.67,10.5,0.045,49,155,0.9975,3.16,0.44,8.7,2 +6.8,0.19,0.36,1.9,0.035,30,96,0.9917,3.15,0.54,10.8,4 +8.1,0.28,0.39,1.9,0.029,18,79,0.9923,3.23,0.52,11.8,3 +6.3,0.31,0.34,2.2,0.045,20,77,0.9927,3.3,0.43,10.2,2 +7.1,0.37,0.67,10.5,0.045,49,155,0.9975,3.16,0.44,8.7,2 +7.9,0.21,0.4,1.2,0.039,38,107,0.992,3.21,0.54,10.8,3 +8.5,0.21,0.41,4.3,0.036,24,99,0.9947,3.18,0.53,9.7,3 +8.1,0.2,0.4,2,0.037,19,87,0.9921,3.12,0.54,11.2,3 +6.3,0.255,0.37,1.1,0.04,37,114,0.9905,3,0.39,10.9,3 +5.6,0.16,0.27,1.4,0.044,53,168,0.9918,3.28,0.37,10.1,3 +6.4,0.595,0.14,5.2,0.058,15,97,0.9951,3.38,0.36,9,1 +6.3,0.34,0.33,4.6,0.034,19,80,0.9917,3.38,0.58,12,4 +6.9,0.25,0.3,4.1,0.054,23,116,0.994,2.99,0.38,9.4,3 +7.9,0.22,0.38,8,0.043,46,152,0.9934,3.12,0.32,11.5,4 +7.6,0.18,0.46,10.2,0.055,58,135,0.9968,3.14,0.43,9.9,3 +6.9,0.25,0.3,4.1,0.054,23,116,0.994,2.99,0.38,9.4,3 +7.2,0.18,0.41,1.2,0.048,41,97,0.9919,3.14,0.45,10.4,2 +8.2,0.23,0.4,7.5,0.049,12,76,0.9966,3.06,0.84,9.7,3 +7.4,0.24,0.42,14,0.066,48,198,0.9979,2.89,0.42,8.9,3 +7.4,0.24,0.42,14,0.066,48,198,0.9979,2.89,0.42,8.9,3 +6.1,0.32,0.24,1.5,0.036,38,124,0.9898,3.29,0.42,12.4,4 +5.2,0.44,0.04,1.4,0.036,43,119,0.9894,3.36,0.33,12.1,5 +5.2,0.44,0.04,1.4,0.036,43,119,0.9894,3.36,0.33,12.1,5 +6.1,0.32,0.24,1.5,0.036,38,124,0.9898,3.29,0.42,12.4,4 +6.4,0.22,0.56,14.5,0.055,27,159,0.998,2.98,0.4,9.1,2 +6.3,0.36,0.3,4.8,0.049,14,85,0.9932,3.28,0.39,10.6,2 +7.4,0.24,0.42,14,0.066,48,198,0.9979,2.89,0.42,8.9,3 +6.7,0.24,0.35,13.1,0.05,64,205,0.997,3.15,0.5,9.5,2 +7,0.23,0.36,13,0.051,72,177,0.9972,3.16,0.49,9.8,2 +8.4,0.27,0.46,8.7,0.048,39,197,0.9974,3.14,0.59,9.6,3 +6.7,0.46,0.18,2.4,0.034,25,98,0.9896,3.08,0.44,12.6,4 +7.5,0.29,0.31,8.95,0.055,20,151,0.9968,3.08,0.54,9.3,2 +9.8,0.42,0.48,9.85,0.034,5,110,0.9958,2.87,0.29,10,2 +7.1,0.3,0.46,1.5,0.066,29,133,0.9906,3.12,0.54,12.7,3 +7.9,0.19,0.45,1.5,0.045,17,96,0.9917,3.13,0.39,11,3 +7.6,0.48,0.37,0.8,0.037,4,100,0.9902,3.03,0.39,11.4,1 +6.3,0.22,0.43,4.55,0.038,31,130,0.9918,3.35,0.33,11.5,4 +7.5,0.27,0.31,17.7,0.051,33,173,0.999,3.09,0.64,10.2,2 +6.9,0.23,0.4,7.5,0.04,50,151,0.9927,3.11,0.27,11.4,3 +7.2,0.32,0.47,5.1,0.044,19,65,0.991,3.03,0.41,12.6,1 +5.9,0.23,0.3,12.9,0.054,57,170,0.9972,3.28,0.39,9.4,2 +6,0.67,0.07,1.2,0.06,9,108,0.9931,3.11,0.35,8.7,1 +6.4,0.25,0.32,5.5,0.049,41,176,0.995,3.19,0.68,9.2,3 +6.4,0.33,0.31,5.5,0.048,42,173,0.9951,3.19,0.66,9.3,3 +7.1,0.34,0.15,1.2,0.053,61,183,0.9936,3.09,0.43,9.2,2 +6.8,0.28,0.4,22,0.048,48,167,1.001,2.93,0.5,8.7,2 +6.9,0.27,0.4,14,0.05,64,227,0.9979,3.18,0.58,9.6,3 +6.8,0.26,0.56,11.9,0.043,64,226,0.997,3.02,0.63,9.3,2 +6.8,0.29,0.56,11.9,0.043,66,230,0.9972,3.02,0.63,9.3,2 +6.7,0.24,0.41,9.4,0.04,49,166,0.9954,3.12,0.61,9.9,3 +5.9,0.3,0.23,4.2,0.038,42,119,0.9924,3.15,0.5,11,2 +6.8,0.53,0.35,3.8,0.034,26,109,0.9906,3.26,0.57,12.7,5 +6.5,0.28,0.28,8.5,0.047,54,210,0.9962,3.09,0.54,8.9,1 +6.6,0.28,0.28,8.5,0.052,55,211,0.9962,3.09,0.55,8.9,3 +6.8,0.28,0.4,22,0.048,48,167,1.001,2.93,0.5,8.7,2 +6.8,0.28,0.36,8,0.045,28,123,0.9928,3.02,0.37,11.4,3 +6.6,0.15,0.34,5.1,0.055,34,125,0.9942,3.36,0.42,9.6,2 +6.4,0.29,0.44,3.6,0.2,75,181,0.9942,3.02,0.41,9.1,2 +6.4,0.3,0.45,3.5,0.197,76,180,0.9942,3.02,0.39,9.1,3 +6.4,0.29,0.44,3.6,0.197,75,183,0.9942,3.01,0.38,9.1,2 +6.8,0.26,0.24,7.8,0.052,54,214,0.9961,3.13,0.47,8.9,2 +7.1,0.32,0.24,13.1,0.05,52,204,0.998,3.1,0.49,8.8,2 +6.8,0.26,0.24,7.8,0.052,54,214,0.9961,3.13,0.47,8.9,2 +6.8,0.27,0.26,16.1,0.049,55,196,0.9984,3.15,0.5,9.3,2 +7.1,0.32,0.24,13.1,0.05,52,204,0.998,3.1,0.49,8.8,2 +6.9,0.54,0.32,13.2,0.05,53,236,0.9973,3.2,0.5,9.6,2 +6.8,0.26,0.34,13.9,0.034,39,134,0.9949,3.33,0.53,12,3 +5.8,0.28,0.35,2.3,0.053,36,114,0.9924,3.28,0.5,10.2,1 +6.4,0.21,0.5,11.6,0.042,45,153,0.9972,3.15,0.43,8.8,2 +7,0.16,0.32,8.3,0.045,38,126,0.9958,3.21,0.34,9.2,2 +10.2,0.44,0.88,6.2,0.049,20,124,0.9968,2.99,0.51,9.9,1 +6.8,0.57,0.29,2.2,0.04,15,77,0.9938,3.32,0.74,10.2,2 +6.1,0.4,0.31,0.9,0.048,23,170,0.993,3.22,0.77,9.5,3 +5.6,0.245,0.25,9.7,0.032,12,68,0.994,3.31,0.34,10.5,2 +6.8,0.18,0.38,1.4,0.038,35,111,0.9918,3.32,0.59,11.2,4 +7,0.16,0.32,8.3,0.045,38,126,0.9958,3.21,0.34,9.2,2 +6.7,0.13,0.29,5.3,0.051,31,122,0.9944,3.44,0.37,9.7,3 +6.2,0.25,0.25,1.4,0.03,35,105,0.9912,3.3,0.44,11.1,4 +5.8,0.26,0.24,9.2,0.044,55,152,0.9961,3.31,0.38,9.4,2 +7.5,0.27,0.36,7,0.036,45,164,0.9939,3.03,0.33,11,2 +5.8,0.26,0.24,9.2,0.044,55,152,0.9961,3.31,0.38,9.4,2 +5.7,0.28,0.24,17.5,0.044,60,167,0.9989,3.31,0.44,9.4,2 +7.5,0.23,0.36,7,0.036,43,161,0.9938,3.04,0.32,11,2 +7.5,0.27,0.36,7,0.036,45,164,0.9939,3.03,0.33,11,2 +7.2,0.685,0.21,9.5,0.07,33,172,0.9971,3,0.55,9.1,3 +6.2,0.25,0.25,1.4,0.03,35,105,0.9912,3.3,0.44,11.1,4 +6.5,0.19,0.3,0.8,0.043,33,144,0.9936,3.42,0.39,9.1,3 +6.3,0.495,0.22,1.8,0.046,31,140,0.9929,3.39,0.54,10.4,3 +7.1,0.24,0.41,17.8,0.046,39,145,0.9998,3.32,0.39,8.7,2 +6.4,0.17,0.32,2.4,0.048,41,200,0.9938,3.5,0.5,9.7,3 +7.1,0.25,0.32,10.3,0.041,66,272,0.9969,3.17,0.52,9.1,3 +6.4,0.17,0.32,2.4,0.048,41,200,0.9938,3.5,0.5,9.7,3 +7.1,0.24,0.41,17.8,0.046,39,145,0.9998,3.32,0.39,8.7,2 +6.8,0.64,0.08,9.7,0.062,26,142,0.9972,3.37,0.46,8.9,1 +8.3,0.28,0.4,7.8,0.041,38,194,0.9976,3.34,0.51,9.6,3 +8.2,0.27,0.39,7.8,0.039,49,208,0.9976,3.31,0.51,9.5,3 +7.2,0.23,0.38,14.3,0.058,55,194,0.9979,3.09,0.44,9,3 +7.2,0.23,0.38,14.3,0.058,55,194,0.9979,3.09,0.44,9,3 +7.2,0.23,0.38,14.3,0.058,55,194,0.9979,3.09,0.44,9,3 +7.2,0.23,0.38,14.3,0.058,55,194,0.9979,3.09,0.44,9,3 +6.8,0.52,0.32,13.2,0.044,54,221,0.9972,3.27,0.5,9.6,3 +7,0.26,0.59,1.4,0.037,40,120,0.9918,3.34,0.41,11.1,4 +6.2,0.25,0.21,15.55,0.039,28,159,0.9982,3.48,0.64,9.6,3 +7.3,0.32,0.23,13.7,0.05,49,197,0.9985,3.2,0.46,8.7,2 +7.7,0.31,0.26,7.8,0.031,23,90,0.9944,3.13,0.5,10.4,2 +7.1,0.21,0.37,2.4,0.026,23,100,0.9903,3.15,0.38,11.4,4 +6.8,0.24,0.34,2.7,0.047,64.5,218.5,0.9934,3.3,0.58,9.7,3 +6.9,0.4,0.56,11.2,0.043,40,142,0.9975,3.14,0.46,8.7,2 +6.1,0.18,0.36,2,0.038,20,249.5,0.9923,3.37,0.79,11.3,3 +6.8,0.21,0.27,2.1,0.03,26,139,0.99,3.16,0.61,12.6,4 +5.8,0.2,0.27,1.4,0.031,12,77,0.9905,3.25,0.36,10.9,4 +5.6,0.19,0.26,1.4,0.03,12,76,0.9905,3.25,0.37,10.9,4 +6.1,0.41,0.14,10.4,0.037,18,119,0.996,3.38,0.45,10,2 +5.9,0.21,0.28,4.6,0.053,40,199,0.9964,3.72,0.7,10,1 +8.5,0.26,0.21,16.2,0.074,41,197,0.998,3.02,0.5,9.8,0 +6.9,0.4,0.56,11.2,0.043,40,142,0.9975,3.14,0.46,8.7,2 +5.8,0.24,0.44,3.5,0.029,5,109,0.9913,3.53,0.43,11.7,0 +5.8,0.24,0.39,1.5,0.054,37,158,0.9932,3.21,0.52,9.3,3 +6.7,0.26,0.39,1.1,0.04,45,147,0.9935,3.32,0.58,9.6,5 +6.3,0.35,0.3,5.7,0.035,8,97,0.9927,3.27,0.41,11,4 +6.3,0.35,0.3,5.7,0.035,8,97,0.9927,3.27,0.41,11,4 +6.4,0.23,0.39,1.8,0.032,23,118,0.9912,3.32,0.5,11.8,3 +5.8,0.36,0.38,0.9,0.037,3,75,0.9904,3.28,0.34,11.4,1 +6.9,0.115,0.35,5.4,0.048,36,108,0.9939,3.32,0.42,10.2,3 +6.9,0.29,0.4,19.45,0.043,36,156,0.9996,2.93,0.47,8.9,2 +6.9,0.28,0.4,8.2,0.036,15,95,0.9944,3.17,0.33,10.2,2 +7.2,0.29,0.4,13.6,0.045,66,231,0.9977,3.08,0.59,9.6,3 +6.2,0.24,0.35,1.2,0.038,22,167,0.9912,3.1,0.48,10.6,3 +6.9,0.29,0.4,19.45,0.043,36,156,0.9996,2.93,0.47,8.9,2 +6.9,0.32,0.26,8.3,0.053,32,180,0.9965,3.25,0.51,9.2,3 +5.3,0.58,0.07,6.9,0.043,34,149,0.9944,3.34,0.57,9.7,2 +5.3,0.585,0.07,7.1,0.044,34,145,0.9945,3.34,0.57,9.7,3 +5.4,0.59,0.07,7,0.045,36,147,0.9944,3.34,0.57,9.7,3 +6.9,0.32,0.26,8.3,0.053,32,180,0.9965,3.25,0.51,9.2,3 +5.2,0.6,0.07,7,0.044,33,147,0.9944,3.33,0.58,9.7,2 +5.8,0.25,0.26,13.1,0.051,44,148,0.9972,3.29,0.38,9.3,2 +6.6,0.58,0.3,5.1,0.057,30,123,0.9949,3.24,0.38,9,2 +7,0.29,0.54,10.7,0.046,59,234,0.9966,3.05,0.61,9.5,2 +6.6,0.19,0.41,8.9,0.046,51,169,0.9954,3.14,0.57,9.8,3 +6.7,0.2,0.41,9.1,0.044,50,166,0.9954,3.14,0.58,9.8,3 +7.7,0.26,0.4,1.1,0.042,9,60,0.9915,2.89,0.5,10.6,2 +6.8,0.32,0.34,1.2,0.044,14,67,0.9919,3.05,0.47,10.6,1 +7,0.3,0.49,4.7,0.036,17,105,0.9916,3.26,0.68,12.4,4 +7,0.24,0.36,2.8,0.034,22,112,0.99,3.19,0.38,12.6,5 +6.1,0.31,0.58,5,0.039,36,114,0.9909,3.3,0.6,12.3,5 +6.8,0.44,0.37,5.1,0.047,46,201,0.9938,3.08,0.65,10.5,1 +6.7,0.34,0.3,15.6,0.054,51,196,0.9982,3.19,0.49,9.3,2 +7.1,0.35,0.24,15.4,0.055,46,198,0.9988,3.12,0.49,8.8,2 +7.3,0.32,0.25,7.2,0.056,47,180,0.9961,3.08,0.47,8.8,2 +6.5,0.28,0.33,15.7,0.053,51,190,0.9978,3.22,0.51,9.7,3 +7.2,0.23,0.39,14.2,0.058,49,192,0.9979,2.98,0.48,9,4 +7.2,0.23,0.39,14.2,0.058,49,192,0.9979,2.98,0.48,9,4 +7.2,0.23,0.39,14.2,0.058,49,192,0.9979,2.98,0.48,9,4 +7.2,0.23,0.39,14.2,0.058,49,192,0.9979,2.98,0.48,9,4 +5.9,0.15,0.31,5.8,0.041,53,155,0.9945,3.52,0.46,10.5,3 +7.4,0.28,0.42,19.8,0.066,53,195,1,2.96,0.44,9.1,2 +6.2,0.28,0.22,7.3,0.041,26,157,0.9957,3.44,0.64,9.8,4 +9.1,0.59,0.38,1.6,0.066,34,182,0.9968,3.23,0.38,8.5,0 +6.3,0.33,0.27,1.2,0.046,34,175,0.9934,3.37,0.54,9.4,3 +8.3,0.39,0.7,10.6,0.045,33,169,0.9976,3.09,0.57,9.4,2 +7.2,0.19,0.46,3.8,0.041,82,187,0.9932,3.19,0.6,11.2,4 +7.5,0.17,0.44,11.3,0.046,65,146,0.997,3.17,0.45,10,3 +6.7,0.17,0.5,2.1,0.043,27,122,0.9923,3.15,0.45,10.3,3 +6.1,0.41,0,1.6,0.063,36,87,0.9914,3.27,0.67,10.8,3 +8.3,0.2,0.35,0.9,0.05,12,74,0.992,3.13,0.38,10.5,3 +6.1,0.41,0,1.6,0.063,36,87,0.9914,3.27,0.67,10.8,3 +6,0.29,0.21,1.3,0.055,42,168,0.9914,3.32,0.43,11.1,3 +7.3,0.41,0.24,6.8,0.057,41,163,0.9949,3.2,0.41,9.9,3 +7.3,0.41,0.24,6.8,0.057,41,163,0.9949,3.2,0.41,9.9,3 +7.2,0.43,0.24,6.7,0.058,40,163,0.995,3.2,0.41,9.9,2 +7.3,0.4,0.24,6.7,0.058,41,166,0.995,3.2,0.41,9.9,3 +6.2,0.33,0.27,4.9,0.036,30,134,0.9927,3.2,0.42,10.4,4 +6.2,0.31,0.26,4.8,0.037,36,148,0.9928,3.21,0.41,10.4,3 +6.1,0.36,0.27,2.1,0.035,16,100,0.9917,3.4,0.71,11.5,4 +5,0.55,0.14,8.3,0.032,35,164,0.9918,3.53,0.51,12.5,5 +7.8,0.25,0.41,3.7,0.042,37,149,0.9954,3.36,0.45,10,3 +5.7,0.36,0.21,6.7,0.038,51,166,0.9941,3.29,0.63,10,3 +5.8,0.34,0.21,6.6,0.04,50,167,0.9941,3.29,0.62,10,2 +6.8,0.28,0.6,1.1,0.132,42,127,0.9934,3.09,0.44,9.1,3 +6.8,0.25,0.34,4.7,0.031,34,134,0.9927,3.21,0.38,10.6,3 +6.6,0.24,0.35,7.7,0.031,36,135,0.9938,3.19,0.37,10.5,2 +5.9,0.3,0.47,7.85,0.03,19,133,0.9933,3.52,0.43,11.5,4 +6.1,0.125,0.25,3.3,0.04,10,69,0.9934,3.54,0.59,10.1,3 +6,0.1,0.24,1.1,0.041,15,65,0.9927,3.61,0.61,10.3,4 +6.6,0.24,0.35,7.7,0.031,36,135,0.9938,3.19,0.37,10.5,2 +6.8,0.25,0.34,4.7,0.031,34,134,0.9927,3.21,0.38,10.6,3 +6.8,0.28,0.44,9.3,0.031,35,137,0.9946,3.16,0.36,10.4,3 +8.3,0.41,0.51,2,0.046,11,207,0.993,3.02,0.55,11.4,2 +7.5,0.27,0.31,5.8,0.057,131,313,0.9946,3.18,0.59,10.5,2 +7.9,0.26,0.41,15.15,0.04,38,216,0.9976,2.96,0.6,10,3 +6.4,0.34,0.23,6.3,0.039,37,143,0.9944,3.19,0.65,10,3 +6.5,0.28,0.35,15.4,0.042,55,195,0.9978,3.23,0.5,9.6,3 +7.2,0.21,0.41,1.3,0.036,33,85,0.992,3.17,0.51,10.4,2 +6.4,0.32,0.35,4.8,0.03,34,101,0.9912,3.36,0.6,12.5,5 +6.8,0.24,0.34,4.6,0.032,37,135,0.9927,3.2,0.39,10.6,2 +6.3,0.23,0.3,1.8,0.033,16,91,0.9906,3.28,0.4,11.8,3 +6.5,0.28,0.34,9.9,0.038,30,133,0.9954,3.11,0.44,9.8,2 +5.6,0.26,0.26,5.7,0.031,12,80,0.9923,3.25,0.38,10.8,2 +6.3,0.23,0.3,1.8,0.033,16,91,0.9906,3.28,0.4,11.8,3 +6.3,0.23,0.33,1.5,0.036,15,105,0.991,3.32,0.42,11.2,3 +5.8,0.27,0.27,12.3,0.045,55,170,0.9972,3.28,0.42,9.3,3 +5.9,0.26,0.4,1.3,0.047,12,139,0.9945,3.45,0.53,10.4,2 +6.6,0.18,0.35,1.5,0.049,49,141,0.9934,3.43,0.85,10.2,4 +7.4,0.2,0.43,7.8,0.045,27,153,0.9964,3.19,0.55,9,4 +8,0.24,0.36,1.5,0.047,17,129,0.9948,3.2,0.54,10,3 +6.4,0.26,0.42,9.7,0.044,30,140,0.9962,3.18,0.47,9.1,3 +5.4,0.31,0.47,3,0.053,46,144,0.9931,3.29,0.76,10,2 +5.4,0.29,0.47,3,0.052,47,145,0.993,3.29,0.75,10,3 +7.1,0.145,0.33,4.6,0.05,33,131,0.9942,3.28,0.4,9.6,3 +5.6,0.34,0.1,1.3,0.031,20,68,0.9906,3.36,0.51,11.2,4 +6.7,0.19,0.41,15.6,0.056,75,155,0.9995,3.2,0.44,8.8,3 +7.8,0.18,0.46,13.6,0.052,38,118,0.998,3.15,0.5,10,3 +7.6,0.17,0.45,11.2,0.054,56,137,0.997,3.15,0.47,10,2 +6.3,0.12,0.36,2.1,0.044,47,146,0.9914,3.27,0.74,11.4,4 +7.3,0.33,0.4,6.85,0.038,32,138,0.992,3.03,0.3,11.9,4 +5.5,0.335,0.3,2.5,0.071,27,128,0.9924,3.14,0.51,9.6,3 +7.3,0.33,0.4,6.85,0.038,32,138,0.992,3.03,0.3,11.9,4 +5.8,0.4,0.42,4.4,0.047,38.5,245,0.9937,3.25,0.57,9.6,3 +7.3,0.22,0.37,14.3,0.063,48,191,0.9978,2.89,0.38,9,3 +7.3,0.22,0.37,14.3,0.063,48,191,0.9978,2.89,0.38,9,3 +6.1,0.36,0.33,1.1,0.05,24,169,0.9927,3.15,0.78,9.5,3 +10,0.2,0.39,1.4,0.05,19,152,0.994,3,0.42,10.4,3 +6.9,0.24,0.34,4.7,0.04,43,161,0.9935,3.2,0.59,10.6,3 +6.4,0.24,0.32,14.9,0.047,54,162,0.9968,3.28,0.5,10.2,3 +7.1,0.365,0.14,1.2,0.055,24,84,0.9941,3.15,0.43,8.9,2 +6.8,0.15,0.3,5.3,0.05,40,127,0.9942,3.4,0.39,9.7,3 +7.3,0.22,0.37,14.3,0.063,48,191,0.9978,2.89,0.38,9,3 +6.8,0.16,0.4,2.3,0.037,18,102,0.9923,3.49,0.42,11.4,4 +6,0.26,0.32,3.5,0.028,29,113,0.9912,3.4,0.71,12.3,4 +6,0.18,0.27,1.5,0.089,40,143,0.9923,3.49,0.62,10.8,3 +6.9,0.33,0.21,1,0.053,39,148,0.9927,3.12,0.45,9.4,3 +7.7,0.29,0.48,2.3,0.049,36,178,0.9931,3.17,0.64,10.6,3 +7.1,0.39,0.35,12.5,0.044,26,72,0.9941,3.17,0.29,11.6,2 +6.9,0.33,0.21,1,0.053,39,148,0.9927,3.12,0.45,9.4,3 +7.7,0.29,0.48,2.3,0.049,36,178,0.9931,3.17,0.64,10.6,3 +6.6,0.905,0.19,0.8,0.048,17,204,0.9934,3.34,0.56,10,2 +7.2,0.27,0.27,2.4,0.048,30,149,0.9936,3.1,0.51,9.2,3 +5.1,0.33,0.22,1.6,0.027,18,89,0.9893,3.51,0.38,12.5,4 +5.1,0.33,0.22,1.6,0.027,18,89,0.9893,3.51,0.38,12.5,4 +6.4,0.31,0.28,1.5,0.037,12,119,0.9919,3.32,0.51,10.4,4 +7.3,0.2,0.44,1.4,0.045,21,98,0.9924,3.15,0.46,10,4 +5.7,0.32,0.5,2.6,0.049,17,155,0.9927,3.22,0.64,10,3 +6.4,0.31,0.28,1.5,0.037,12,119,0.9919,3.32,0.51,10.4,4 +7.3,0.2,0.44,1.4,0.045,21,98,0.9924,3.15,0.46,10,4 +7.2,0.28,0.26,12.5,0.046,48,179,0.9975,3.1,0.52,9,3 +7.5,0.35,0.28,9.6,0.051,26,157,0.9969,3.12,0.53,9.2,3 +7.2,0.27,0.27,2.4,0.048,30,149,0.9936,3.1,0.51,9.2,3 +6,0.36,0.39,3.2,0.027,20,125,0.991,3.38,0.39,11.3,4 +5.1,0.33,0.22,1.6,0.027,18,89,0.9893,3.51,0.38,12.5,4 +5,0.17,0.56,1.5,0.026,24,115,0.9906,3.48,0.39,10.8,4 +6.3,0.39,0.35,5.9,0.04,82.5,260,0.9941,3.12,0.66,10.1,2 +6.7,0.21,0.32,5.4,0.047,29,140,0.995,3.39,0.46,9.7,3 +7,0.3,0.38,14.9,0.032,60,181,0.9983,3.18,0.61,9.3,4 +7,0.3,0.38,14.9,0.032,60,181,0.9983,3.18,0.61,9.3,4 +6.5,0.36,0.32,1.1,0.031,13,66,0.9916,3.1,0.46,10.6,2 +6.1,0.55,0.15,9.8,0.031,19,125,0.9957,3.36,0.47,10.2,3 +7.3,0.24,0.43,2,0.021,20,69,0.99,3.08,0.56,12.2,3 +6.8,0.37,0.51,11.8,0.044,62,163,0.9976,3.19,0.44,8.8,2 +6.8,0.27,0.12,1.3,0.04,87,168,0.992,3.18,0.41,10,2 +8.2,0.28,0.42,1.8,0.031,30,93,0.9917,3.09,0.39,11.4,2 +6.3,0.2,0.4,1.5,0.037,35,107,0.9917,3.46,0.5,11.4,3 +5.9,0.26,0.27,18.2,0.048,52,168,0.9993,3.35,0.44,9.4,2 +6.4,0.19,0.42,2.9,0.032,32,83,0.9908,3.3,0.41,11.7,3 +6.3,0.2,0.4,1.5,0.037,35,107,0.9917,3.46,0.5,11.4,3 +6.8,0.37,0.51,11.8,0.044,62,163,0.9976,3.19,0.44,8.8,2 +6.1,0.35,0.07,1.4,0.069,22,108,0.9934,3.23,0.52,9.2,2 +7.1,0.27,0.31,18.2,0.046,55,252,1,3.07,0.56,8.7,2 +6.8,0.22,0.31,6.3,0.035,33,170,0.9918,3.24,0.66,12.6,3 +6.8,0.27,0.12,1.3,0.04,87,168,0.992,3.18,0.41,10,2 +5.8,0.28,0.34,4,0.031,40,99,0.9896,3.39,0.39,12.8,4 +6.9,0.49,0.24,1.2,0.049,13,125,0.9932,3.17,0.51,9.4,2 +6.3,0.14,0.39,1.2,0.044,26,116,0.992,3.26,0.53,10.3,3 +8.2,0.28,0.42,1.8,0.031,30,93,0.9917,3.09,0.39,11.4,2 +7.2,0.25,0.39,18.95,0.038,42,155,0.9999,2.97,0.47,9,3 +7.3,0.28,0.36,12.7,0.04,38,140,0.998,3.3,0.79,9.6,3 +7.2,0.19,0.39,1.2,0.036,32,85,0.9918,3.16,0.5,10.5,2 +7.2,0.19,0.39,1.2,0.036,32,85,0.9918,3.16,0.5,10.5,2 +7.2,0.25,0.39,18.95,0.038,42,155,0.9999,2.97,0.47,9,3 +7.3,0.28,0.36,12.7,0.04,38,140,0.998,3.3,0.79,9.6,3 +7.4,0.21,0.27,1.2,0.041,27,99,0.9927,3.19,0.33,9.8,3 +6.8,0.26,0.22,7.7,0.047,57,210,0.9959,3.1,0.47,9,2 +7.4,0.21,0.27,1.2,0.041,27,99,0.9927,3.19,0.33,9.8,3 +7.4,0.31,0.28,1.6,0.05,33,137,0.9929,3.31,0.56,10.5,3 +7,0.22,0.31,2.7,0.03,41,136,0.9898,3.16,0.37,12.7,4 +7,0.21,0.28,8.7,0.045,37,222,0.9954,3.25,0.54,10.4,3 +7,0.21,0.28,8.6,0.045,37,221,0.9954,3.25,0.54,10.4,3 +7,0.21,0.28,8.6,0.045,37,221,0.9954,3.25,0.54,10.4,3 +6.9,0.23,0.38,8.3,0.047,47,162,0.9954,3.34,0.52,10.5,4 +7,0.21,0.28,8.7,0.045,37,222,0.9954,3.25,0.54,10.4,3 +7,0.21,0.28,8.6,0.045,37,221,0.9954,3.25,0.54,10.4,3 +6.8,0.29,0.5,13.3,0.053,48,194,0.9974,3.09,0.45,9.4,2 +7.8,0.21,0.27,1.2,0.051,20,89,0.9936,3.06,0.46,9.1,2 +7.1,0.31,0.47,13.6,0.056,54,197,0.9978,3.1,0.49,9.3,2 +6.8,0.29,0.5,13.3,0.053,48,194,0.9974,3.09,0.45,9.4,2 +6.4,0.34,0.1,1.1,0.048,19,84,0.9927,3.21,0.38,9.8,2 +7.4,0.155,0.34,2.3,0.045,73.5,214,0.9934,3.18,0.61,9.9,4 +7.2,0.55,0.09,1.5,0.108,16,151,0.9938,3.07,0.57,9.2,1 +7,0.23,0.36,7.1,0.028,31,104,0.9922,3.35,0.47,12.1,5 +6.9,0.2,0.37,6.2,0.027,24,97,0.992,3.38,0.49,12.2,4 +6.1,0.28,0.32,2.5,0.042,23,218.5,0.9935,3.27,0.6,9.8,2 +6.6,0.16,0.32,1.4,0.035,49,186,0.9906,3.35,0.64,12.4,5 +7.4,0.155,0.34,2.3,0.045,73.5,214,0.9934,3.18,0.61,9.9,4 +6.2,0.35,0.04,1.2,0.06,23,108,0.9934,3.26,0.54,9.2,2 +6.7,0.22,0.37,1.6,0.028,24,102,0.9913,3.29,0.59,11.6,4 +6.1,0.38,0.2,6.6,0.033,25,137,0.9938,3.3,0.69,10.4,3 +6,0.25,0.28,2.2,0.026,54,126,0.9898,3.43,0.65,12.9,5 +6.6,0.52,0.44,12.2,0.048,54,245,0.9975,3.26,0.54,9.3,3 +6.9,0.24,0.36,20.8,0.031,40,139,0.9975,3.2,0.33,11,3 +7.1,0.32,0.32,11,0.038,16,66,0.9937,3.24,0.4,11.5,0 +5.8,0.28,0.27,2.6,0.054,30,156,0.9914,3.53,0.42,12.4,2 +6.5,0.41,0.24,14,0.048,24,113,0.9982,3.44,0.53,9.8,3 +6.5,0.41,0.24,14,0.048,24,113,0.9982,3.44,0.53,9.8,3 +6.4,0.28,0.29,1.6,0.052,34,127,0.9929,3.48,0.56,10.5,4 +7.2,0.6,0.2,9.9,0.07,21,174,0.9971,3.03,0.54,9.1,2 +6.1,0.2,0.25,1.2,0.038,34,128,0.9921,3.24,0.44,10.1,2 +5.9,0.46,0.14,2.7,0.042,27,160,0.9931,3.46,0.51,10.6,4 +6,0.27,0.27,1.6,0.046,32,113,0.9924,3.41,0.51,10.5,4 +6.4,0.28,0.29,1.6,0.052,34,127,0.9929,3.48,0.56,10.5,4 +6.4,0.41,0.24,14,0.048,24,113,0.9982,3.44,0.53,9.8,3 +6.3,0.23,0.31,1.5,0.022,11,82,0.9892,3.3,0.4,12.9,4 +7.1,0.21,0.27,8.6,0.056,26,111,0.9956,2.95,0.52,9.5,2 +6,0.37,0.32,1,0.053,31,218.5,0.9924,3.29,0.72,9.8,3 +6.1,0.43,0.35,9.1,0.059,83,249,0.9971,3.37,0.5,8.5,2 +7.1,0.21,0.27,8.6,0.056,26,111,0.9956,2.95,0.52,9.5,2 +7,0.25,0.29,15.2,0.047,40,171,0.9982,3.22,0.45,9.3,2 +5.9,0.25,0.19,12.4,0.047,50,162,0.9973,3.35,0.38,9.5,2 +6.8,0.32,0.21,2.2,0.044,15,68,0.9932,3.17,0.39,9.4,3 +7.2,0.39,0.62,11,0.047,66,178,0.9976,3.16,0.5,8.7,2 +6.3,0.21,0.58,10,0.081,34,126,0.9962,2.95,0.46,8.9,2 +7,0.14,0.32,9,0.039,54,141,0.9956,3.22,0.43,9.4,3 +6.8,0.32,0.21,2.2,0.044,15,68,0.9932,3.17,0.39,9.4,3 +7.2,0.39,0.62,11,0.047,66,178,0.9976,3.16,0.5,8.7,2 +7.2,0.29,0.53,18.15,0.047,59,182,0.9992,3.09,0.52,9.6,2 +8.6,0.37,0.7,12.15,0.039,21,158,0.9983,3,0.73,9.3,3 +6.5,0.38,0.34,3.4,0.036,34,200,0.9937,3.14,0.76,10,2 +6.6,0.24,0.29,2,0.023,19,86,0.99,3.25,0.45,12.5,3 +7,0.17,0.31,4.8,0.034,34,132,0.9944,3.36,0.48,9.6,4 +5.5,0.16,0.22,4.5,0.03,30,102,0.9938,3.24,0.36,9.4,3 +7,0.24,0.51,11,0.029,55,227,0.9965,3.03,0.61,9.5,2 +7.4,0.28,0.36,1.1,0.028,42,105,0.9893,2.99,0.39,12.4,4 +7,0.22,0.28,1.5,0.037,29,115,0.9927,3.11,0.55,10.5,3 +7.1,0.55,0.13,1.7,0.073,21,165,0.994,2.97,0.58,9.2,3 +6.3,0.22,0.33,1.7,0.041,67,164,0.9928,3.32,0.56,10.4,3 +6.7,0.47,0.34,8.9,0.043,31,172,0.9964,3.22,0.6,9.2,2 +5.9,0.36,0.41,1.3,0.047,45,104,0.9917,3.33,0.51,10.6,3 +5.8,0.25,0.24,13.3,0.044,41,137,0.9972,3.34,0.42,9.5,2 +6.7,0.47,0.34,8.9,0.043,31,172,0.9964,3.22,0.6,9.2,2 +6.2,0.37,0.3,6.6,0.346,79,200,0.9954,3.29,0.58,9.6,2 +6.2,0.18,0.38,1.5,0.028,36,117,0.993,3.47,0.54,9.7,3 +6,0.16,0.37,1.5,0.025,43,117,0.9928,3.46,0.51,9.7,3 +6.6,0.34,0.28,1.3,0.035,32,90,0.9916,3.1,0.42,10.7,3 +7.4,0.29,0.29,1.6,0.045,53,180,0.9936,3.34,0.68,10.5,3 +7.4,0.26,0.31,7.6,0.047,52,177,0.9962,3.13,0.45,8.9,3 +7,0.28,0.36,1,0.035,8,70,0.9899,3.09,0.46,12.1,3 +7.1,0.23,0.39,1.6,0.032,12,65,0.9898,3.25,0.4,12.7,4 +7.8,0.19,0.26,8.9,0.039,42,182,0.996,3.18,0.46,9.9,3 +6.3,0.19,0.28,1.8,0.022,28,158,0.9907,3.2,0.64,11.4,3 +6.8,0.2,0.38,4.7,0.04,27,103,0.994,3.37,0.58,10.7,3 +5.7,0.44,0.13,7,0.025,28,173,0.9913,3.33,0.48,12.5,3 +7.2,0.4,0.62,10.8,0.041,70,189,0.9976,3.08,0.49,8.6,1 +6.8,0.23,0.32,1.6,0.026,43,147,0.9904,3.29,0.54,12.5,3 +5.7,0.335,0.34,1,0.04,13,174,0.992,3.27,0.66,10,2 +7.2,0.4,0.62,10.8,0.041,70,189,0.9976,3.08,0.49,8.6,1 +7.2,0.28,0.54,16.7,0.045,54,200,0.999,3.08,0.49,9.5,3 +6.8,0.19,0.58,14.2,0.038,51,164,0.9975,3.12,0.48,9.6,3 +6.4,0.3,0.3,2.25,0.038,8,210,0.9937,3.2,0.62,9.9,3 +6.5,0.3,0.29,2.25,0.037,8,210,0.9937,3.19,0.62,9.9,2 +7.8,0.18,0.31,12.2,0.053,46,140,0.998,3.06,0.53,8.9,3 +7.8,0.18,0.31,12.2,0.053,46,140,0.998,3.06,0.53,8.9,3 +7.3,0.51,0.26,3.3,0.09,7,135,0.9944,3.01,0.52,8.8,2 +6,0.24,0.27,1.9,0.048,40,170,0.9938,3.64,0.54,10,4 +5.9,0.62,0.28,3.5,0.039,55,152,0.9907,3.44,0.44,12,3 +6,0.24,0.27,1.9,0.048,40,170,0.9938,3.64,0.54,10,4 +6.7,0.27,0.12,1.3,0.041,62,138,0.9921,3.21,0.42,10,3 +7.8,0.34,0.35,1.8,0.042,8,167,0.9908,3.11,0.41,12.1,3 +7.3,0.26,0.36,5.2,0.04,31,141,0.9931,3.16,0.59,11,3 +7.4,0.36,0.33,1.4,0.025,27,55,0.9915,3.21,0.33,11.2,3 +7.8,0.28,0.32,9,0.036,34,115,0.9952,3.17,0.39,10.3,4 +6.1,0.31,0.26,2.2,0.051,28,167,0.9926,3.37,0.47,10.4,3 +6.8,0.18,0.37,1.6,0.055,47,154,0.9934,3.08,0.45,9.1,2 +7.4,0.15,0.42,1.7,0.045,49,154,0.992,3,0.6,10.4,3 +5.9,0.13,0.28,1.9,0.05,20,78,0.9918,3.43,0.64,10.8,3 +7.2,0.34,0.34,12.6,0.048,7,41,0.9942,3.19,0.4,11.7,2 +7.9,0.19,0.26,2.1,0.039,8,143,0.9942,3.05,0.74,9.8,2 +7.9,0.19,0.26,2.1,0.039,8,143,0.9942,3.05,0.74,9.8,2 +6.9,0.25,0.4,1.3,0.038,22,101,0.9901,3.03,0.39,11.4,3 +5.8,0.36,0.32,1.7,0.033,22,96,0.9898,3.03,0.38,11.2,3 +5.6,0.35,0.37,1,0.038,6,72,0.9902,3.37,0.34,11.4,2 +5.9,0.32,0.39,3.3,0.114,24,140,0.9934,3.09,0.45,9.2,3 +7.2,0.31,0.46,5,0.04,3,29,0.9906,3.04,0.53,12.5,1 +6.1,0.28,0.22,1.8,0.034,32,116,0.9898,3.36,0.44,12.6,3 +5.2,0.36,0.02,1.6,0.031,24,104,0.9896,3.44,0.35,12.2,3 +5.6,0.19,0.47,4.5,0.03,19,112,0.9922,3.56,0.45,11.2,3 +6.4,0.1,0.35,4.9,0.048,31,103,0.9947,3.43,0.79,9.7,3 +6.4,0.18,0.48,4,0.186,64,150,0.9945,3.06,0.4,9.3,2 +7.4,0.25,0.36,13.2,0.067,53,178,0.9976,3.01,0.48,9,3 +7.4,0.25,0.36,13.2,0.067,53,178,0.9976,3.01,0.48,9,3 +7.4,0.25,0.36,13.2,0.067,53,178,0.9976,3.01,0.48,9,3 +7.9,0.345,0.51,15.3,0.047,54,171,0.9987,3.09,0.51,9.1,2 +7.9,0.345,0.51,15.3,0.047,54,171,0.9987,3.09,0.51,9.1,2 +7.4,0.25,0.36,13.2,0.067,53,178,0.9976,3.01,0.48,9,3 +6.1,0.24,0.3,1.5,0.045,22,61,0.992,3.31,0.54,10.4,2 +6.8,0.25,0.24,4.55,0.053,41,211,0.9955,3.37,0.67,9.5,3 +6.7,0.31,0.31,9.9,0.04,10,175,0.9953,3.46,0.55,11.4,1 +7.2,0.46,0.65,10.4,0.05,76,192,0.9976,3.16,0.42,8.7,2 +5.5,0.35,0.35,1.1,0.045,14,167,0.992,3.34,0.68,9.9,3 +6.7,0.24,0.41,8.7,0.036,29,148,0.9952,3.22,0.62,9.9,3 +6.8,0.28,0.17,13.9,0.047,49,162,0.9983,3.21,0.51,9,3 +6.4,0.16,0.22,1.4,0.04,41,149,0.9933,3.49,0.58,10,3 +6.3,0.26,0.24,7.2,0.039,38,172,0.9958,3.49,0.64,9.7,3 +7.7,0.22,0.42,1.9,0.052,10,87,0.9922,3.3,0.49,11.8,3 +6.5,0.18,0.31,1.7,0.044,30,127,0.9928,3.49,0.5,10.2,4 +7.2,0.46,0.65,10.4,0.05,76,192,0.9976,3.16,0.42,8.7,2 +7,0.3,0.51,13.6,0.05,40,168,0.9976,3.07,0.52,9.6,4 +9.2,0.25,0.34,1.2,0.026,31,93,0.9916,2.93,0.37,11.3,4 +7.8,0.28,0.34,1.6,0.028,32,118,0.9901,3,0.38,12.1,4 +7,0.3,0.51,13.6,0.05,40,168,0.9976,3.07,0.52,9.6,4 +7.8,0.28,0.34,1.6,0.028,32,118,0.9901,3,0.38,12.1,4 +9.2,0.25,0.34,1.2,0.026,31,93,0.9916,2.93,0.37,11.3,4 +8.4,0.35,0.71,12.2,0.046,22,160,0.9982,2.98,0.65,9.4,2 +6.1,0.41,0.24,1.6,0.049,16,137,0.993,3.32,0.5,10.4,3 +5.9,0.21,0.24,12.1,0.044,53,165,0.9969,3.25,0.39,9.5,2 +7.2,0.34,0.44,4.2,0.047,51,144,0.991,3.01,0.76,12.3,3 +6.7,0.21,0.42,9.1,0.049,31,150,0.9953,3.12,0.74,9.9,4 +5.9,0.37,0.1,1.6,0.057,39,128,0.9924,3.24,0.48,10.1,2 +7.7,0.34,0.27,8.8,0.063,39,184,0.9969,3.09,0.63,9.2,3 +7.4,0.3,0.22,1.4,0.046,16,135,0.9928,3.08,0.77,10.4,4 +6.8,0.51,0.3,4.2,0.066,38,165,0.9945,3.2,0.42,9.1,2 +7.8,0.22,0.38,10.3,0.059,28,99,0.9967,3.12,0.47,10,3 +7.2,0.35,0.34,12.4,0.051,6,37,0.9944,3.13,0.39,11.5,3 +6,0.26,0.5,2.2,0.048,59,153,0.9928,3.08,0.61,9.8,2 +6.1,0.26,0.51,2.2,0.05,61,154,0.9929,3.08,0.6,9.8,3 +6.5,0.28,0.27,5.2,0.04,44,179,0.9948,3.19,0.69,9.4,3 +7.4,0.41,0.66,10.8,0.051,77,194,0.9976,3.05,0.46,8.7,2 +6.5,0.28,0.29,2.7,0.038,26,107,0.9912,3.32,0.41,11.6,4 +6.7,0.34,0.54,16.3,0.047,44,181,0.9987,3.04,0.56,8.8,2 +7.2,0.2,0.34,2.7,0.032,49,151,0.99,3.16,0.39,12.7,4 +7.4,0.2,0.33,1.9,0.035,39,138,0.991,3.17,0.44,11.7,4 +8.2,0.22,0.3,1.8,0.047,47,185,0.9933,3.13,0.5,10.2,3 +8.2,0.23,0.29,1.8,0.047,47,187,0.9933,3.13,0.5,10.2,3 +7.1,0.22,0.33,2.8,0.033,48,153,0.9899,3.15,0.38,12.7,4 +6.5,0.28,0.29,2.7,0.038,26,107,0.9912,3.32,0.41,11.6,4 +6,0.38,0.26,6,0.034,42,134,0.9912,3.38,0.38,12.3,4 +7.4,0.41,0.66,10.8,0.051,77,194,0.9976,3.05,0.46,8.7,2 +5.7,0.18,0.22,4.2,0.042,25,111,0.994,3.35,0.39,9.4,2 +7.3,0.3,0.22,6.4,0.056,44,168,0.9947,3.13,0.35,10.1,3 +7.4,0.24,0.22,10.7,0.042,26,81,0.9954,2.86,0.36,9.7,3 +6.6,0.25,0.3,1.6,0.046,32,134,0.993,3.42,0.51,10.1,4 +7.4,0.24,0.22,10.7,0.042,26,81,0.9954,2.86,0.36,9.7,3 +7.4,0.26,0.3,7.9,0.049,38,157,0.9963,3.13,0.48,8.9,3 +6.1,0.32,0.25,1.7,0.034,37,136,0.992,3.47,0.5,10.8,4 +6.9,0.28,0.27,2.1,0.036,42,121,0.9926,3.42,0.49,10.8,4 +7,0.23,0.33,5.8,0.04,25,136,0.995,3.19,0.58,9.5,3 +7.1,0.31,0.5,14.5,0.059,6,148,0.9983,2.94,0.44,9.1,2 +7.3,0.2,0.37,1.2,0.037,48,119,0.992,3.32,0.49,10.9,3 +6.9,0.41,0.33,10.1,0.043,28,152,0.9968,3.2,0.52,9.4,2 +6.4,0.45,0.07,1.1,0.03,10,131,0.9905,2.97,0.28,10.8,2 +6.4,0.475,0.06,1,0.03,9,131,0.9904,2.97,0.29,10.8,2 +6.3,0.27,0.38,0.9,0.051,7,140,0.9926,3.45,0.5,10.5,4 +6.9,0.41,0.33,10.1,0.043,28,152,0.9968,3.2,0.52,9.4,2 +7,0.29,0.37,4.9,0.034,26,127,0.9928,3.17,0.44,10.8,3 +5.9,0.27,0.29,11.4,0.036,31,115,0.9949,3.35,0.48,10.5,5 +6.9,0.19,0.4,1.4,0.036,14,55,0.9909,3.08,0.68,11.5,4 +6.7,0.3,0.35,1.4,0.18,36,160,0.9937,3.11,0.54,9.4,3 +7.2,0.24,0.4,1.4,0.045,31,106,0.9914,2.88,0.38,10.8,3 +6.4,0.45,0.07,1.1,0.03,10,131,0.9905,2.97,0.28,10.8,2 +6.4,0.475,0.06,1,0.03,9,131,0.9904,2.97,0.29,10.8,2 +6.3,0.26,0.49,1.5,0.052,34,134,0.9924,2.99,0.61,9.8,3 +6.3,0.26,0.49,1.5,0.052,34,134,0.9924,2.99,0.61,9.8,3 +7.3,0.25,0.29,7.5,0.049,38,158,0.9965,3.43,0.38,9.6,2 +7.3,0.25,0.29,7.5,0.049,38,158,0.9965,3.43,0.38,9.6,2 +6.1,0.28,0.25,17.75,0.044,48,161,0.9993,3.34,0.48,9.5,2 +7.4,0.37,0.35,5.7,0.061,12,94,0.9965,3.48,0.69,10.7,3 +6.5,0.36,0.28,3.2,0.037,29,119,0.9908,3.25,0.65,12.4,5 +7.4,0.24,0.4,4.3,0.032,9,95,0.992,3.09,0.39,11.1,3 +7.5,0.23,0.68,11,0.047,37,133,0.9978,2.99,0.38,8.8,2 +7.5,0.21,0.68,10.9,0.045,38,133,0.9978,3,0.36,8.7,2 +7.5,0.21,0.68,10.9,0.045,38,133,0.9978,3,0.36,8.7,2 +7.5,0.23,0.68,11,0.047,37,133,0.9978,2.99,0.38,8.8,2 +7.8,0.32,0.33,2.4,0.037,18,101,0.9912,3.21,0.65,11.7,4 +7.8,0.26,0.27,1.9,0.051,52,195,0.9928,3.23,0.5,10.9,3 +7.7,0.24,0.27,1.8,0.051,52,190,0.9928,3.23,0.5,10.8,3 +7.4,0.19,0.3,1.4,0.057,33,135,0.993,3.12,0.5,9.6,3 +6.5,0.46,0.41,16.8,0.084,59,222,0.9993,3.18,0.58,9,2 +6.5,0.26,0.43,8.9,0.083,50,171,0.9965,2.85,0.5,9,2 +5.3,0.32,0.12,6.6,0.043,22,141,0.9937,3.36,0.6,10.4,3 +7.2,0.24,0.34,1.1,0.045,3,64,0.9913,3.23,0.51,11.4,2 +6,0.36,0.06,1.4,0.066,27,128,0.9934,3.26,0.55,9.3,2 +6.2,0.24,0.29,13.3,0.039,49,130,0.9952,3.33,0.46,11,5 +7.6,0.56,0.12,10.4,0.096,22,177,0.9983,3.32,0.45,9.1,1 +7,0.32,0.24,6.2,0.048,31,228,0.9957,3.23,0.62,9.4,3 +7,0.32,0.24,6.2,0.048,31,228,0.9957,3.23,0.62,9.4,3 +5.8,0.31,0.33,1.2,0.036,23,99,0.9916,3.18,0.6,10.5,3 +7,0.23,0.42,18.05,0.05,35,144,0.9999,3.22,0.42,8.8,2 +7,0.23,0.42,18.05,0.05,35,144,0.9999,3.22,0.42,8.8,2 +6.9,0.24,0.33,4.8,0.04,16,131,0.9936,3.26,0.64,10.7,3 +6,0.29,0.2,12.6,0.045,45,187,0.9972,3.33,0.42,9.5,2 +6.1,0.17,0.28,4.5,0.033,46,150,0.9933,3.43,0.49,10.9,3 +5.9,0.14,0.25,4.5,0.027,34,140,0.9934,3.49,0.51,10.8,3 +6.2,0.17,0.28,4.7,0.037,39,133,0.9931,3.41,0.46,10.8,4 +7.4,0.28,0.25,11.9,0.053,25,148,0.9976,3.1,0.62,9.2,2 +5.6,0.35,0.14,5,0.046,48,198,0.9937,3.3,0.71,10.3,2 +5.8,0.335,0.14,5.8,0.046,49,197,0.9937,3.3,0.71,10.3,2 +5.6,0.235,0.29,1.2,0.047,33,127,0.991,3.34,0.5,11,4 +6.1,0.28,0.25,12.9,0.054,34,189,0.9979,3.25,0.43,9,1 +6.3,0.21,0.33,13.9,0.046,68,179,0.9971,3.36,0.5,10.4,3 +6.4,0.24,0.28,11.5,0.05,34,163,0.9969,3.31,0.45,9.5,2 +6.4,0.24,0.29,11.4,0.051,32,166,0.9968,3.31,0.45,9.5,2 +6.3,0.26,0.25,7.8,0.058,44,166,0.9961,3.24,0.41,9,2 +6.5,0.33,0.72,1.1,0.061,7,151,0.993,3.09,0.57,9.5,1 +7.4,0.105,0.34,12.2,0.05,57,146,0.9973,3.16,0.37,9,3 +6,0.32,0.12,5.9,0.041,34,190,0.9944,3.16,0.72,10,2 +7.1,0.26,0.34,14.4,0.067,35,189,0.9986,3.07,0.53,9.1,4 +7.1,0.26,0.34,14.4,0.067,35,189,0.9986,3.07,0.53,9.1,4 +7.1,0.26,0.34,14.4,0.067,35,189,0.9986,3.07,0.53,9.1,4 +7.1,0.26,0.34,14.4,0.067,35,189,0.9986,3.07,0.53,9.1,4 +5.9,0.24,0.26,12.3,0.053,34,134,0.9972,3.34,0.45,9.5,3 +6.5,0.21,0.37,2.5,0.048,70,138,0.9917,3.33,0.75,11.4,4 +7.7,0.27,0.35,5.3,0.03,30,117,0.992,3.11,0.42,12.2,3 +9,0.27,0.35,4.9,0.028,27,95,0.9932,3.04,0.4,11.3,3 +7.3,0.34,0.21,3.2,0.05,14,136,0.9936,3.25,0.44,10.2,2 +6.6,0.27,0.25,3.1,0.052,41,188,0.9915,3.24,0.4,11.3,2 +6.8,0.29,0.16,1.4,0.038,122.5,234.5,0.9922,3.15,0.47,10,1 +7.1,0.28,0.26,1.9,0.049,12,86,0.9934,3.15,0.38,9.4,2 +6.8,0.25,0.34,14,0.032,47,133,0.9952,3.37,0.5,12.2,4 +7,0.57,0.1,8.3,0.094,23,188,0.9972,3.4,0.47,9.2,1 +7.1,0.28,0.26,1.9,0.049,12,86,0.9934,3.15,0.38,9.4,2 +7.1,0.17,0.38,7.4,0.052,49,182,0.9958,3.35,0.52,9.6,3 +7.8,0.28,0.22,1.4,0.056,24,130,0.9944,3.28,0.48,9.5,2 +6.8,0.22,0.37,1.7,0.036,38,195,0.9908,3.35,0.72,12.5,3 +7.1,0.17,0.38,7.4,0.052,49,182,0.9958,3.35,0.52,9.6,3 +6.1,0.14,0.25,1.3,0.047,37,173,0.9925,3.35,0.46,10,3 +6.4,0.24,0.5,11.6,0.047,60,211,0.9966,3.18,0.57,9.3,2 +7.8,0.42,0.26,9.2,0.058,34,199,0.9972,3.14,0.55,9.3,3 +6.6,0.28,0.36,1.7,0.038,22,101,0.9912,3.29,0.57,11.6,3 +7.1,0.32,0.34,14.5,0.039,46,150,0.995,3.38,0.5,12.5,5 +6.7,0.31,0.3,2.1,0.038,18,130,0.9928,3.36,0.63,10.6,3 +6.4,0.32,0.5,10.7,0.047,57,206,0.9968,3.08,0.6,9.4,2 +6.1,0.28,0.25,6.9,0.056,44,201,0.9955,3.19,0.4,9.1,3 +5.9,0.29,0.25,12,0.057,48,224,0.9981,3.23,0.41,9,3 +5.8,0.32,0.38,4.75,0.033,23,94,0.991,3.42,0.42,11.8,4 +5.8,0.32,0.38,4.75,0.033,23,94,0.991,3.42,0.42,11.8,4 +5.7,0.32,0.38,4.75,0.033,23,94,0.991,3.42,0.42,11.8,4 +6.7,0.28,0.14,1.4,0.043,64,159,0.992,3.17,0.39,10,2 +6.8,0.34,0.69,1.3,0.058,12,171,0.9931,3.06,0.47,9.7,2 +5.9,0.25,0.25,11.3,0.052,30,165,0.997,3.24,0.44,9.5,3 +6.4,0.27,0.32,4.5,0.24,61,174,0.9948,3.12,0.48,9.4,2 +8.1,0.46,0.31,1.7,0.052,50,183,0.9923,3.03,0.42,11.2,2 +6.2,0.36,0.26,13.2,0.051,54,201,0.9976,3.25,0.46,9,2 +6.8,0.22,0.35,5.5,0.043,21,114,0.9938,3.3,0.53,10.7,4 +6.8,0.67,0.3,13,0.29,22,193,0.9984,3.08,0.67,9,1 +7.2,0.28,0.3,10.7,0.044,61,222,0.9972,3.14,0.5,9.1,3 +6.7,0.17,0.37,2,0.039,34,125,0.9922,3.26,0.6,10.8,4 +6.9,0.2,0.34,1.9,0.043,25,136,0.9935,3.31,0.6,10.1,1 +6.1,0.36,0.16,6.4,0.037,36,198,0.9944,3.17,0.62,9.9,3 +6,0.36,0.16,6.3,0.036,36,191,0.9942,3.17,0.62,9.8,2 +5.9,0.37,0.14,6.3,0.036,34,185,0.9944,3.17,0.63,9.8,2 +7.6,0.29,0.58,17.5,0.041,51,225,0.9997,3.16,0.66,9.5,3 +6.3,0.34,0.28,14.7,0.047,49,198,0.9977,3.23,0.46,9.5,2 +6.7,0.19,0.34,1,0.022,22,94,0.9912,3.23,0.57,11.1,3 +7.5,0.31,0.51,14.8,0.039,62,204,0.9982,3.06,0.6,9.5,2 +7.5,0.31,0.51,14.8,0.039,62,204,0.9982,3.06,0.6,9.5,2 +7.4,0.31,0.48,14.2,0.042,62,204,0.9983,3.06,0.59,9.4,2 +8.4,0.4,0.7,13.1,0.042,29,197,0.998,3.06,0.64,9.7,2 +5.9,0.34,0.22,2.4,0.03,19,135,0.9894,3.41,0.78,13.9,4 +6.6,0.38,0.18,1.2,0.042,20,84,0.9927,3.22,0.45,10.1,1 +6.4,0.33,0.28,1.1,0.038,30,110,0.9917,3.12,0.42,10.5,3 +5.6,0.25,0.26,3.6,0.037,18,115,0.9904,3.42,0.5,12.6,3 +8.6,0.27,0.46,6.1,0.032,13,41,0.993,2.89,0.34,10.9,2 +6.2,0.31,0.21,6.3,0.041,50,218,0.9941,3.15,0.6,10,2 +7.2,0.18,0.45,4.4,0.046,57,166,0.9943,3.13,0.62,11.2,3 +7.7,0.2,0.44,13.9,0.05,44,130,0.99855,3.11,0.48,10,3 +6.2,0.47,0.21,1,0.044,13,98,0.99345,3.14,0.46,9.2,2 +6.1,0.25,0.24,12.1,0.046,51,172,0.998,3.35,0.45,9.5,2 +8.2,0.27,0.43,1.6,0.035,31,128,0.9916,3.1,0.5,12.3,3 +8.2,0.27,0.43,1.6,0.035,31,128,0.9916,3.1,0.5,12.3,3 +6.4,0.31,0.39,7.5,0.04,57,213,0.99475,3.32,0.43,10,2 +6,0.39,0.26,2.7,0.038,39,187,0.99325,3.41,0.5,10.8,3 +6.2,0.21,0.27,1.7,0.038,41,150,0.9933,3.49,0.71,10.5,4 +7.7,0.42,0.31,9.2,0.048,22,221,0.9969,3.06,0.61,9.2,3 +7,0.27,0.41,18.75,0.042,34,157,1.0002,2.96,0.5,9.1,2 +6.2,0.21,0.27,1.7,0.038,41,150,0.9933,3.49,0.71,10.5,4 +7.4,0.29,0.5,1.8,0.042,35,127,0.9937,3.45,0.5,10.2,4 +6.6,0.29,0.44,9,0.053,62,178,0.99685,3.02,0.45,8.9,2 +6,0.3,0.44,1.5,0.046,15,182,0.99455,3.5,0.52,10.4,2 +6.9,0.31,0.34,1.6,0.032,23,128,0.9917,3.37,0.47,11.7,3 +6.6,0.33,0.31,1.3,0.02,29,89,0.99035,3.26,0.44,12.4,5 +7.8,0.3,0.4,1.8,0.028,23,122,0.9914,3.14,0.39,10.9,4 +6.4,0.39,0.21,1.2,0.041,35,136,0.99225,3.15,0.46,10.2,2 +6.4,0.24,0.31,2.8,0.038,41,114,0.99155,3.37,0.66,11.7,4 +7,0.21,0.34,8,0.057,19,101,0.9954,2.99,0.59,9.4,2 +6.4,0.16,0.31,5.3,0.043,42,157,0.99455,3.35,0.47,10.5,2 +6,0.33,0.27,0.8,0.185,12,188,0.9924,3.12,0.62,9.4,2 +6.5,0.23,0.33,13.8,0.042,25,139,0.99695,3.35,0.56,10.4,3 +6.2,0.25,0.48,10,0.044,78,240,0.99655,3.25,0.47,9.5,3 +8.8,0.28,0.45,6,0.022,14,49,0.9934,3.01,0.33,11.1,4 +6.6,0.25,0.3,14.4,0.052,40,183,0.998,3.02,0.5,9.1,3 +6.9,0.38,0.25,9.8,0.04,28,191,0.9971,3.28,0.61,9.2,2 +6.4,0.25,0.3,5.5,0.038,15,129,0.9948,3.14,0.49,9.6,3 +6.6,0.25,0.3,14.4,0.052,40,183,0.998,3.02,0.5,9.1,3 +6.9,0.38,0.25,9.8,0.04,28,191,0.9971,3.28,0.61,9.2,2 +7.1,0.21,0.31,3.8,0.021,40,142,0.99215,3.17,0.39,10.8,4 +6.4,0.25,0.3,5.5,0.038,15,129,0.9948,3.14,0.49,9.6,3 +6.9,0.39,0.4,4.6,0.022,5,19,0.9915,3.31,0.37,12.6,0 +5.8,0.2,0.3,1.5,0.031,21,57,0.99115,3.44,0.55,11,3 +7,0.2,0.37,2,0.03,26,136,0.9932,3.28,0.61,10.2,3 +5.9,0.26,0.25,12.5,0.034,38,152,0.9977,3.33,0.43,9.4,2 +7.4,0.38,0.27,7.5,0.041,24,160,0.99535,3.17,0.43,10,2 +7.4,0.2,1.66,2.1,0.022,34,113,0.99165,3.26,0.55,12.2,3 +7,0.21,0.34,8.5,0.033,31,253,0.9953,3.22,0.56,10.5,3 +7.2,0.29,0.4,7.6,0.024,56,177,0.9928,3.04,0.32,11.5,3 +6.9,0.18,0.38,8.1,0.049,44,176,0.9958,3.3,0.54,9.8,3 +7.3,0.3,0.42,7.35,0.025,51,175,0.9928,3.04,0.32,11.4,3 +7.2,0.29,0.4,7.6,0.024,56,177,0.9928,3.04,0.32,11.5,3 +6.9,0.2,0.5,10,0.036,78,167,0.9964,3.15,0.55,10.2,3 +6.7,0.2,0.42,14,0.038,83,160,0.9987,3.16,0.5,9.4,3 +7,0.21,0.34,8.5,0.033,31,253,0.9953,3.22,0.56,10.5,3 +5.9,0.35,0.47,2.2,0.11,14,138,0.9932,3.09,0.5,9.1,2 +7.1,0.28,0.44,1.8,0.032,32,107,0.9907,3.25,0.48,12.2,4 +5.8,0.25,0.28,11.1,0.056,45,175,0.99755,3.42,0.43,9.5,2 +6.8,0.22,0.37,15.2,0.051,68,178,0.99935,3.4,0.85,9.3,3 +7.1,0.14,0.4,1.2,0.051,55,136,0.9932,3.3,0.96,9.8,4 +7.1,0.13,0.4,1.2,0.047,54,134,0.9932,3.3,0.97,9.8,4 +6.9,0.18,0.38,8.1,0.049,44,176,0.9958,3.3,0.54,9.8,3 +7,0.2,0.38,8.1,0.05,42,173,0.99585,3.3,0.54,9.8,3 +6.8,0.24,0.49,19.3,0.057,55,247,1.00055,3,0.56,8.7,2 +5,0.44,0.04,18.6,0.039,38,128,0.9985,3.37,0.57,10.2,3 +6.3,0.3,0.28,5,0.042,36,168,0.99505,3.22,0.69,9.5,3 +7.2,0.27,0.42,1.6,0.05,35,135,0.992,2.94,0.46,11,3 +6.7,0.5,0.63,13.4,0.078,81,238,0.9988,3.08,0.44,9.2,2 +6.8,0.2,0.36,1.6,0.028,7,46,0.99175,3.21,0.6,10.9,3 +6.7,0.11,0.34,8.8,0.043,41,113,0.9962,3.42,0.4,9.3,4 +6.7,0.11,0.34,8.8,0.043,41,113,0.9962,3.42,0.4,9.3,4 +6.8,0.12,0.31,5.2,0.045,29,120,0.9942,3.41,0.46,9.8,4 +6.6,0.16,0.57,1.1,0.13,58,140,0.9927,3.12,0.39,9.3,4 +6.6,0.21,0.6,1.1,0.135,61,144,0.9927,3.12,0.39,9.3,4 +6.1,0.27,0.3,16.7,0.039,49,172,0.99985,3.4,0.45,9.4,2 +9.1,0.27,0.45,10.6,0.035,28,124,0.997,3.2,0.46,10.4,6 +6.4,0.225,0.48,2.2,0.115,29,104,0.9918,3.24,0.58,12.1,3 +8.3,0.14,0.45,1.5,0.039,18,98,0.99215,3.02,0.56,11,3 +7.2,0.23,0.19,13.7,0.052,47,197,0.99865,3.12,0.53,9,2 +6.9,0.22,0.37,15,0.053,59,178,0.9992,3.37,0.82,9.5,4 +8.1,0.17,0.44,14.1,0.053,43,145,1.0006,3.28,0.75,8.8,5 +6,0.395,0,1.4,0.042,7,55,0.99135,3.37,0.38,11.2,1 +7.8,0.29,0.22,9.5,0.056,44,213,0.99715,3.08,0.61,9.3,3 +6.9,0.22,0.37,15,0.053,59,178,0.9992,3.37,0.82,9.5,4 +8.1,0.17,0.44,14.1,0.053,43,145,1.0006,3.28,0.75,8.8,5 +7.2,0.23,0.19,13.7,0.052,47,197,0.99865,3.12,0.53,9,2 +7.6,0.3,0.27,10.6,0.039,31,119,0.99815,3.27,0.3,9.3,3 +7.7,0.34,0.28,11,0.04,31,117,0.99815,3.27,0.29,9.2,3 +7.7,0.34,0.28,11,0.04,31,117,0.99815,3.27,0.29,9.2,3 +5.8,0.34,0.16,7,0.037,26,116,0.9949,3.46,0.45,10,4 +7.6,0.3,0.27,10.6,0.039,31,119,0.99815,3.27,0.3,9.3,3 +7.7,0.34,0.28,11,0.04,31,117,0.99815,3.27,0.29,9.2,3 +5.9,0.24,0.3,2,0.033,28,92,0.99225,3.39,0.69,10.9,4 +6.4,0.46,0.08,4.9,0.046,34,144,0.99445,3.1,0.56,10,2 +5.9,0.24,0.3,2,0.033,28,92,0.99225,3.39,0.69,10.9,4 +7.4,0.32,0.27,1.4,0.049,38,173,0.99335,3.03,0.52,9.3,2 +7.2,0.31,0.26,7.3,0.05,37,157,0.99625,3.09,0.43,9,2 +7.8,0.42,0.23,8.8,0.054,42,215,0.9971,3.02,0.58,9.2,3 +6.9,0.24,0.33,12.5,0.046,47,153,0.9983,3.28,0.77,9.6,3 +5.4,0.18,0.24,4.8,0.041,30,113,0.99445,3.42,0.4,9.4,3 +6,0.18,0.31,1.4,0.036,14,75,0.99085,3.34,0.58,11.1,5 +7.8,0.27,0.58,11.2,0.036,44,161,0.9977,3.06,0.41,8.9,3 +6,0.28,0.49,6.8,0.048,61,222,0.9953,3.19,0.47,9.3,2 +6.8,0.39,0.35,11.6,0.044,57,220,0.99775,3.07,0.53,9.3,2 +6.6,0.21,0.31,11.4,0.039,46,165,0.99795,3.41,0.44,9.8,4 +7.3,0.32,0.34,6.6,0.032,24,112,0.99505,3.22,0.46,9.8,3 +7.8,0.27,0.58,11.2,0.036,44,161,0.9977,3.06,0.41,8.9,3 +6.4,0.31,0.26,13.2,0.046,57,205,0.9975,3.17,0.41,9.6,2 +6.2,0.29,0.26,13.1,0.046,55,204,0.99745,3.16,0.41,9.6,3 +6,0.39,0.17,12,0.046,65,246,0.9976,3.15,0.38,9,3 +6.2,0.3,0.26,13.4,0.046,57,206,0.99775,3.17,0.43,9.5,3 +6,0.28,0.49,6.8,0.048,61,222,0.9953,3.19,0.47,9.3,2 +6,0.41,0.05,1.5,0.063,17,120,0.9932,3.21,0.56,9.2,3 +6.4,0.35,0.28,1.1,0.055,9,160,0.99405,3.42,0.5,9.1,4 +6.5,0.26,0.32,16.5,0.045,44,166,1,3.38,0.46,9.5,3 +7.9,0.35,0.24,15.6,0.072,44,229,0.99785,3.03,0.59,10.5,3 +6.2,0.3,0.17,2.8,0.04,24,125,0.9939,3.01,0.46,9,2 +8.4,0.18,0.42,5.1,0.036,7,77,0.9939,3.16,0.52,11.7,2 +6.6,0.56,0.22,8.9,0.034,27,133,0.99675,3.2,0.51,9.1,2 +6.2,0.3,0.17,2.8,0.04,24,125,0.9939,3.01,0.46,9,2 +6.6,0.56,0.22,8.9,0.034,27,133,0.99675,3.2,0.51,9.1,2 +6.6,0.36,0.29,1.6,0.021,24,85,0.98965,3.41,0.61,12.4,6 +7.3,0.655,0.2,10.2,0.071,28,212,0.9971,2.96,0.58,9.2,3 +6.8,0.18,0.21,5.4,0.053,34,104,0.99445,3.3,0.43,9.4,2 +6.7,0.19,0.23,6.2,0.047,36,117,0.9945,3.34,0.43,9.6,3 +8.4,0.18,0.42,5.1,0.036,7,77,0.9939,3.16,0.52,11.7,2 +7,0.21,0.37,7.2,0.042,36,167,0.9958,3.26,0.56,9.8,3 +6.8,0.25,0.38,8.1,0.046,24,155,0.9956,3.33,0.59,10.2,3 +7.4,0.24,0.36,2,0.031,27,139,0.99055,3.28,0.48,12.5,6 +7.1,0.16,0.36,10.7,0.044,20,90,0.9959,3.16,0.44,10.9,4 +7.1,0.16,0.36,1.2,0.043,21,90,0.9925,3.16,0.42,11,4 +7.3,0.205,0.31,1.7,0.06,34,110,0.9963,3.72,0.69,10.5,3 +7.4,0.17,0.4,5.5,0.037,34,161,0.9935,3.05,0.62,11.5,1 +7.3,0.3,0.34,2.7,0.044,34,108,0.99105,3.36,0.53,12.8,5 +6.9,0.25,0.34,1.3,0.035,27,82,0.99045,3.18,0.44,12.2,3 +7.3,0.205,0.31,1.7,0.06,34,110,0.9963,3.72,0.69,10.5,3 +7.5,0.42,0.34,4.3,0.04,34,108,0.99155,3.14,0.45,12.8,5 +7.3,0.25,0.36,2.1,0.034,30,177,0.99085,3.25,0.4,11.9,5 +7.3,0.25,0.36,2.1,0.034,30,177,0.99085,3.25,0.4,11.9,5 +7.3,0.25,0.36,2.1,0.034,30,177,0.99085,3.25,0.4,11.9,5 +7.5,0.34,0.35,6,0.034,12,126,0.9924,3.16,0.39,12,4 +7.6,0.33,0.35,6.3,0.036,12,126,0.9924,3.16,0.39,12,4 +8.7,0.23,0.32,13.4,0.044,35,169,0.99975,3.12,0.47,8.8,4 +8.7,0.23,0.32,13.4,0.044,35,169,0.99975,3.12,0.47,8.8,4 +6.9,0.19,0.35,1.7,0.036,33,101,0.99315,3.21,0.54,10.8,4 +7.3,0.21,0.29,1.6,0.034,29,118,0.9917,3.3,0.5,11,5 +7.3,0.21,0.29,1.6,0.034,29,118,0.9917,3.3,0.5,11,5 +6.6,0.22,0.37,15.4,0.035,62,153,0.99845,3.02,0.4,9.3,2 +9.2,0.34,0.27,1.2,0.026,17,73,0.9921,3.08,0.39,10.8,2 +8.7,0.23,0.32,13.4,0.044,35,169,0.99975,3.12,0.47,8.8,4 +6,0.2,0.24,1.8,0.03,30,105,0.9909,3.31,0.47,11.5,3 +6.9,0.19,0.35,1.7,0.036,33,101,0.99315,3.21,0.54,10.8,4 +8.2,0.38,0.49,13.6,0.042,58,166,0.99855,3.1,0.54,9.4,2 +6.9,0.18,0.36,1.3,0.036,40,117,0.9934,3.27,0.95,9.5,4 +7.7,0.34,0.58,11.1,0.039,41,151,0.9978,3.06,0.49,8.6,2 +6.9,0.18,0.36,1.3,0.036,40,117,0.9934,3.27,0.95,9.5,4 +7.4,0.2,0.35,2.1,0.038,30,116,0.9949,3.49,0.77,10.3,4 +8.2,0.38,0.49,13.6,0.042,58,166,0.99855,3.1,0.54,9.4,2 +8.2,0.4,0.48,13.7,0.042,59,169,0.9986,3.1,0.52,9.4,2 +6.7,0.22,0.39,10.2,0.038,60,149,0.99725,3.17,0.54,10,4 +6.6,0.3,0.3,4.8,0.17,60,166,0.9946,3.18,0.47,9.4,2 +8.1,0.27,0.35,1.7,0.03,38,103,0.99255,3.22,0.63,10.4,5 +7.3,0.25,0.42,14.2,0.041,57,182,0.9996,3.29,0.75,9.1,4 +4.8,0.34,0,6.5,0.028,33,163,0.9939,3.36,0.61,9.9,3 +6.2,0.28,0.33,1.7,0.029,24,111,0.99,3.24,0.5,12.1,3 +4.8,0.33,0,6.5,0.028,34,163,0.9937,3.35,0.61,9.9,2 +6.1,0.27,0.33,2.2,0.021,26,117,0.9886,3.12,0.3,12.5,3 +6.9,0.18,0.36,1.3,0.036,40,117,0.9934,3.27,0.95,9.5,4 +7.8,0.18,0.46,12.6,0.042,41,143,1,3.24,0.76,8.5,5 +7.3,0.28,0.42,14.4,0.04,49,173,0.9994,3.28,0.82,9,4 +7.3,0.24,0.29,1.2,0.037,37,97,0.9926,3.19,0.7,10.1,3 +6,0.45,0.65,9.7,0.08,11,159,0.9956,3.04,0.48,9.4,2 +7.7,0.34,0.58,11.1,0.039,41,151,0.9978,3.06,0.49,8.6,2 +6.3,0.26,0.21,4,0.03,24,125,0.9915,3.06,0.34,10.7,3 +10.3,0.17,0.47,1.4,0.037,5,33,0.9939,2.89,0.28,9.6,0 +7.7,0.15,0.29,1.3,0.029,10,64,0.9932,3.35,0.39,10.1,2 +7.1,0.21,0.32,2.2,0.037,28,141,0.993,3.2,0.57,10,4 +6.9,0.36,0.34,4.2,0.018,57,119,0.9898,3.28,0.36,12.7,6 +6,0.28,0.34,1.6,0.119,33,104,0.9921,3.19,0.38,10.2,3 +6.2,0.16,0.54,1.4,0.126,37,110,0.9932,3.23,0.37,8.9,3 +6.9,0.12,0.36,2.2,0.037,18,111,0.9919,3.41,0.82,11.9,5 +7.1,0.21,0.32,2.2,0.037,28,141,0.993,3.2,0.57,10,4 +8.8,0.36,0.44,1.9,0.04,9,121,0.9953,3.19,0.48,9.9,3 +7.4,0.26,0.43,6,0.022,22,125,0.9928,3.13,0.55,11.5,3 +7.4,0.26,0.43,6,0.022,22,125,0.9928,3.13,0.55,11.5,3 +6.8,0.23,0.29,12.2,0.035,38,236,0.9976,3.35,0.52,9.8,3 +6.1,0.34,0.27,2.6,0.024,20,105,0.9906,3.4,0.67,12.2,4 +7.3,0.26,0.31,1.6,0.04,39,173,0.9918,3.19,0.51,11.4,3 +6.5,0.3,0.32,2,0.044,34,90,0.99185,3.37,0.68,11,4 +7.3,0.26,0.31,1.6,0.04,39,173,0.9918,3.19,0.51,11.4,3 +6.5,0.3,0.32,2,0.044,34,90,0.99185,3.37,0.68,11,4 +5,0.31,0,6.4,0.046,43,166,0.994,3.3,0.63,9.9,3 +5.8,0.26,0.18,1.2,0.031,40,114,0.9908,3.42,0.4,11,4 +5.9,0.26,0.3,1,0.036,38,114,0.9928,3.58,0.48,9.4,2 +7,0.31,0.29,1.4,0.037,33,128,0.9896,3.12,0.36,12.2,4 +5.8,0.26,0.18,1.2,0.031,40,114,0.9908,3.42,0.4,11,4 +5.6,0.19,0.39,1.1,0.043,17,67,0.9918,3.23,0.53,10.3,3 +6.8,0.18,0.28,8.7,0.047,52,242,0.9952,3.22,0.53,10.5,3 +7,0.29,0.26,1.6,0.044,12,87,0.9923,3.08,0.46,10.5,3 +6.6,0.26,0.29,1.4,0.039,13,67,0.9915,3.05,0.49,10.9,3 +6.8,0.18,0.28,8.5,0.047,52,242,0.9952,3.22,0.53,10.5,3 +6.6,0.2,0.38,7.9,0.052,30,145,0.9947,3.32,0.56,11,4 +8,0.29,0.29,13.2,0.046,26,113,0.9983,3.25,0.37,9.7,3 +6.1,0.28,0.35,12.8,0.048,63,229,0.9975,3.08,0.4,8.9,2 +5.9,0.31,0.3,7.7,0.047,60,206,0.995,3.2,0.39,9.6,3 +6.9,0.21,0.28,2.4,0.056,49,159,0.9944,3.02,0.47,8.8,5 +8.4,0.19,0.42,1.6,0.047,9,101,0.994,3.06,0.65,11.1,1 +8.3,0.27,0.45,1.3,0.048,8,72,0.9944,3.08,0.61,10.3,1 +7.1,0.25,0.39,2.1,0.036,30,124,0.9908,3.28,0.43,12.2,5 +8,0.23,0.37,9.6,0.054,23,159,0.99795,3.32,0.47,9.8,1 +7.5,0.24,0.31,13,0.049,46,217,0.9985,3.08,0.53,8.8,2 +6.3,0.33,0.2,5.8,0.04,24,144,0.99425,3.15,0.63,9.9,2 +6.2,0.33,0.19,5.6,0.042,22,143,0.99425,3.15,0.63,9.9,2 +6.3,0.34,0.19,5.8,0.041,22,145,0.9943,3.15,0.63,9.9,2 +5.8,0.29,0.05,0.8,0.038,11,30,0.9924,3.36,0.35,9.2,2 +8,0.32,0.26,1.2,0.05,11.5,88,0.9946,3.24,0.37,9.5,1 +5.6,0.29,0.05,0.8,0.038,11,30,0.9924,3.36,0.35,9.2,2 +7.4,0.13,0.39,4.7,0.042,36,137,0.995,3.36,0.56,10.3,4 +7.7,0.3,0.32,1.6,0.037,23,124,0.9919,2.93,0.33,11,3 +7,0.24,0.34,1.4,0.031,27,107,0.99,3.06,0.39,11.9,3 +8.6,0.18,0.4,1.1,0.04,20,107,0.9923,2.94,0.32,10.2,4 +7,0.11,0.32,4.6,0.057,59,144,0.9956,3.55,0.44,9.4,4 +7.7,0.32,0.62,10.6,0.036,56,153,0.9978,3.13,0.44,8.9,3 +7.7,0.32,0.62,10.6,0.036,56,153,0.9978,3.13,0.44,8.9,3 +6.5,0.26,0.27,12.9,0.044,69,215,0.9967,3.17,0.43,10,3 +7.9,0.28,0.41,2,0.044,50,152,0.9934,3.45,0.49,10.7,5 +6.3,0.27,0.23,2.9,0.047,13,100,0.9936,3.28,0.43,9.8,2 +5.4,0.595,0.1,2.8,0.042,26,80,0.9932,3.36,0.38,9.3,2 +6.7,0.25,0.33,2.9,0.057,52,173,0.9934,3.02,0.48,9.5,4 +6.5,0.25,0.35,12,0.055,47,179,0.998,3.58,0.47,10,2 +6.1,0.36,0.58,15,0.044,42,115,0.9978,3.15,0.51,9,2 +7.7,0.17,0.52,5.9,0.017,21,84,0.9929,3.14,0.4,11.9,4 +6.4,0.26,0.43,12.6,0.033,64,230,0.9974,3.08,0.38,8.9,2 +6.5,0.26,0.28,12.5,0.046,80,225,0.99685,3.18,0.41,10,3 +5.9,0.29,0.33,7.4,0.037,58,205,0.99495,3.26,0.41,9.6,2 +6.2,0.28,0.43,13,0.039,64,233,0.99745,3.08,0.38,8.9,2 +6.1,0.27,0.44,6.7,0.041,61,230,0.99505,3.12,0.4,8.9,2 +6.4,0.43,0.32,1.4,0.048,10,67,0.992,3.08,0.41,11.4,2 +6.1,0.36,0.58,15,0.044,42,115,0.9978,3.15,0.51,9,2 +6.2,0.35,0.29,7.3,0.044,56,244,0.9956,3.36,0.55,10,3 +7.7,0.24,0.29,15.3,0.044,39,194,0.9982,3.06,0.47,9.6,4 +6.2,0.34,0.28,7.5,0.034,40,197,0.99485,3.14,0.6,9.7,2 +6.3,0.27,0.46,11.75,0.037,61,212,0.9971,3.25,0.53,9.5,3 +5.4,0.415,0.19,1.6,0.039,27,88,0.99265,3.54,0.41,10,4 +6.9,0.48,0.36,3.5,0.03,31,135,0.9904,3.14,0.38,12.2,4 +6.5,0.18,0.33,8,0.051,16,131,0.9965,3.28,0.44,8.7,4 +6.7,0.15,0.29,5,0.058,28,105,0.9946,3.52,0.44,10.2,4 +8.2,0.345,1,18.2,0.047,55,205,0.99965,2.96,0.43,9.6,2 +8.5,0.16,0.35,1.6,0.039,24,147,0.9935,2.96,0.36,10,2 +6.8,0.705,0.25,3.2,0.048,10,57,0.996,3.36,0.52,9.5,1 +7.3,0.25,0.39,6.4,0.034,8,84,0.9942,3.18,0.46,11.5,2 +7.6,0.345,0.26,1.9,0.043,15,134,0.9936,3.08,0.38,9.5,2 +7.6,0.22,0.34,9.7,0.035,26,143,0.9965,3.08,0.49,9.8,3 +6.5,0.17,0.33,1.4,0.028,14,99,0.9928,3.23,0.55,10.1,3 +8.2,0.23,0.37,1.3,0.042,39,117,0.9928,2.99,0.36,10,2 +7.6,0.22,0.34,9.7,0.035,26,143,0.9965,3.08,0.49,9.8,3 +7.6,0.345,0.26,1.9,0.043,15,134,0.9936,3.08,0.38,9.5,2 +7.5,0.32,0.26,1.8,0.042,13,133,0.9938,3.07,0.38,9.5,2 +6.6,0.23,0.32,0.9,0.041,25,79,0.9926,3.39,0.54,10.2,4 +6.6,0.2,0.32,1.1,0.039,25,78,0.9926,3.39,0.54,10.2,4 +7.3,0.24,0.34,15.4,0.05,38,174,0.9983,3.03,0.42,9,3 +7.3,0.24,0.34,15.4,0.05,38,174,0.9983,3.03,0.42,9,3 +8,0.42,0.36,5,0.037,34,101,0.992,3.13,0.57,12.3,4 +7.3,0.24,0.34,15.4,0.05,38,174,0.9983,3.03,0.42,9,3 +6.1,0.19,0.25,4,0.023,23,112,0.9923,3.37,0.51,11.6,3 +5.9,0.26,0.21,12.5,0.034,36,152,0.9972,3.28,0.43,9.5,3 +8.3,0.23,0.43,3.2,0.035,14,101,0.9928,3.15,0.36,11.5,2 +6.5,0.34,0.28,1.8,0.041,43,188,0.9928,3.13,0.37,9.6,3 +6.8,0.22,0.35,17.5,0.039,38,153,0.9994,3.24,0.42,9,3 +6.5,0.08,0.33,1.9,0.028,23,93,0.991,3.34,0.7,12,4 +5.5,0.42,0.09,1.6,0.019,18,68,0.9906,3.33,0.51,11.4,4 +5.1,0.42,0.01,1.5,0.017,25,102,0.9894,3.38,0.36,12.3,4 +6,0.27,0.19,1.7,0.02,24,110,0.9898,3.32,0.47,12.6,4 +6.8,0.22,0.35,17.5,0.039,38,153,0.9994,3.24,0.42,9,3 +6.5,0.08,0.33,1.9,0.028,23,93,0.991,3.34,0.7,12,4 +7.1,0.13,0.38,1.8,0.046,14,114,0.9925,3.32,0.9,11.7,3 +7.6,0.3,0.25,4.3,0.054,22,111,0.9956,3.12,0.49,9.2,2 +6.6,0.13,0.3,4.9,0.058,47,131,0.9946,3.51,0.45,10.3,3 +6.5,0.14,0.33,7.6,0.05,53,189,0.9966,3.25,0.49,8.6,2 +7.7,0.28,0.33,6.7,0.037,32,155,0.9951,3.39,0.62,10.7,4 +6,0.2,0.71,1.6,0.15,10,54,0.9927,3.12,0.47,9.8,2 +6,0.19,0.71,1.5,0.152,9,55,0.9927,3.12,0.46,9.8,3 +7.7,0.28,0.33,6.7,0.037,32,155,0.9951,3.39,0.62,10.7,4 +5.1,0.39,0.21,1.7,0.027,15,72,0.9894,3.5,0.45,12.5,3 +5.7,0.36,0.34,4.2,0.026,21,77,0.9907,3.41,0.45,11.9,3 +6.9,0.19,0.33,1.6,0.043,63,149,0.9925,3.44,0.52,10.8,2 +6,0.41,0.21,1.9,0.05,29,122,0.9928,3.42,0.52,10.5,3 +7.4,0.28,0.3,5.3,0.054,44,161,0.9941,3.12,0.48,10.3,3 +7.4,0.3,0.3,5.2,0.053,45,163,0.9941,3.12,0.45,10.3,3 +6.9,0.19,0.33,1.6,0.043,63,149,0.9925,3.44,0.52,10.8,2 +7.7,0.28,0.39,8.9,0.036,8,117,0.9935,3.06,0.38,12,4 +8.6,0.16,0.38,3.4,0.04,41,143,0.9932,2.95,0.39,10.2,3 +8.2,0.26,0.44,1.3,0.046,7,69,0.9944,3.14,0.62,10.2,1 +6.5,0.25,0.27,15.2,0.049,75,217,0.9972,3.19,0.39,9.9,2 +7,0.24,0.18,1.3,0.046,9,62,0.994,3.38,0.47,10.1,1 +8.6,0.18,0.36,1.8,0.04,24,187,0.9956,3.25,0.55,9.5,3 +7.8,0.27,0.34,1.6,0.046,27,154,0.9927,3.05,0.45,10.5,3 +6,0.26,0.34,1.3,0.046,6,29,0.9924,3.29,0.63,10.4,2 +6.1,0.24,0.27,9.8,0.062,33,152,0.9966,3.31,0.47,9.5,3 +8,0.24,0.3,17.45,0.056,43,184,0.9997,3.05,0.5,9.2,3 +7.6,0.21,0.6,2.1,0.046,47,165,0.9936,3.05,0.54,10.1,4 +8,0.19,0.36,1.8,0.05,16,84,0.9936,3.15,0.45,9.8,4 +6.4,0.28,0.41,6.8,0.045,61,216,0.9952,3.09,0.46,9.4,2 +6.4,0.28,0.43,7.1,0.045,60,221,0.9952,3.09,0.45,9.4,3 +6.9,0.24,0.39,1.3,0.063,18,136,0.9928,3.31,0.48,10.4,4 +5.8,0.36,0.26,3.3,0.038,40,153,0.9911,3.34,0.55,11.3,3 +6.6,0.18,0.28,3.3,0.044,18,91,0.993,3.42,0.64,10.8,3 +5.8,0.36,0.26,3.3,0.038,40,153,0.9911,3.34,0.55,11.3,3 +5.1,0.52,0.06,2.7,0.052,30,79,0.9932,3.32,0.43,9.3,2 +6.6,0.22,0.37,1.2,0.059,45,199,0.993,3.37,0.55,10.3,4 +8.3,0.15,0.39,1.3,0.055,32,146,0.993,3.08,0.39,10.5,3 +7.6,0.16,0.44,1.4,0.043,25,109,0.9932,3.11,0.75,10.3,3 +7.7,0.16,0.41,1.7,0.048,60,173,0.9932,3.24,0.66,11.2,4 +8.3,0.16,0.48,1.7,0.057,31,98,0.9943,3.15,0.41,10.3,3 +6.2,0.25,0.47,11.6,0.048,62,210,0.9968,3.19,0.5,9.5,2 +6.1,0.16,0.27,12.6,0.064,63,162,0.9994,3.66,0.43,8.9,2 +7.6,0.39,0.22,2.8,0.036,19,113,0.9926,3.03,0.29,10.2,2 +6.8,0.37,0.47,11.2,0.071,44,136,0.9968,2.98,0.88,9.2,2 +7.6,0.16,0.44,1.4,0.043,25,109,0.9932,3.11,0.75,10.3,3 +7.1,0.18,0.42,1.4,0.045,47,157,0.9916,2.95,0.31,10.5,3 +8.3,0.14,0.26,1.5,0.049,56,189,0.9946,3.21,0.62,9.5,3 +8.6,0.2,0.42,1.5,0.041,35,125,0.9925,3.11,0.49,11.4,4 +8.6,0.2,0.42,1.5,0.041,35,125,0.9925,3.11,0.49,11.4,4 +6.8,0.19,0.32,7.05,0.019,54,188,0.9935,3.25,0.37,11.1,5 +7.6,0.19,0.38,10.6,0.06,48,174,0.9962,3.13,0.38,10.5,3 +6.8,0.34,0.74,2.8,0.088,23,185,0.9928,3.51,0.7,12,3 +6.2,0.15,0.46,1.6,0.039,38,123,0.993,3.38,0.51,9.7,3 +6.6,0.14,0.44,1.6,0.042,47,140,0.993,3.32,0.51,10.2,3 +8,0.55,0.17,8.2,0.04,13,60,0.9956,3.09,0.3,9.5,1 +7,0.24,0.35,1.5,0.052,51,128,0.9941,3.41,0.59,10.4,4 +6.3,0.6,0.44,11,0.05,50,245,0.9972,3.19,0.57,9.3,1 +7.1,0.2,0.41,2.1,0.054,24,166,0.9948,3.48,0.62,10.5,3 +6.2,0.34,0.29,7.6,0.047,45,232,0.9955,3.35,0.62,10,3 +7.1,0.3,0.36,6.8,0.055,44.5,234,0.9972,3.49,0.64,10.2,3 +7.1,0.3,0.36,6.8,0.055,44.5,234,0.9972,3.49,0.64,10.2,3 +7.9,0.64,0.46,10.6,0.244,33,227,0.9983,2.87,0.74,9.1,0 +8.8,0.17,0.38,1.8,0.04,39,148,0.9942,3.16,0.67,10.2,3 +7.5,0.17,0.37,1.5,0.06,18,75,0.9936,3.54,0.88,10.7,2 +7.1,0.47,0.24,6,0.044,11,77,0.9956,3.21,0.56,9.7,2 +7.1,0.15,0.34,5.3,0.034,33,104,0.9953,3.37,0.52,9.3,4 +7.5,0.17,0.34,1.4,0.035,13,102,0.9918,3.05,0.74,11,2 +8.2,0.68,0.3,2.1,0.047,17,138,0.995,3.22,0.71,10.8,1 +7.7,0.275,0.3,1,0.039,19,75,0.992,3.01,0.56,10.7,2 +7.3,0.49,0.32,5.2,0.043,18,104,0.9952,3.24,0.45,10.7,1 +7.5,0.33,0.48,19.45,0.048,55,243,1.001,2.95,0.4,8.8,2 +7.2,0.21,0.37,1.6,0.049,23,94,0.9924,3.16,0.48,10.9,4 +7.3,0.15,0.4,2,0.05,24,92,0.9932,3.14,0.45,10.5,2 +6.5,0.19,0.1,1.3,0.046,23,107,0.9937,3.29,0.45,10,2 +7,0.31,0.52,1.7,0.029,5,61,0.9918,3.07,0.43,10.4,2 +8.3,0.4,0.38,1.1,0.038,15,75,0.9934,3.03,0.43,9.2,2 +6.1,0.37,0.36,4.7,0.035,36,116,0.991,3.31,0.62,12.6,3 +7.3,0.24,0.34,7.5,0.048,29,152,0.9962,3.1,0.54,9,2 +6.9,0.21,0.81,1.1,0.137,52,123,0.9932,3.03,0.39,9.2,3 +7.6,0.29,0.42,1.3,0.035,18,86,0.9908,2.99,0.39,11.3,2 +9.4,0.29,0.55,2.2,0.05,17,119,0.9962,3.12,0.69,10.3,1 +7,0.31,0.52,1.7,0.029,5,61,0.9918,3.07,0.43,10.4,2 +8.6,0.26,0.41,2.2,0.049,29,111,0.9941,2.96,0.44,10,2 +7.5,0.21,0.34,1.2,0.06,26,111,0.9931,3.51,0.47,10.7,3 +7.2,0.51,0.24,10,0.093,35,197,0.9981,3.41,0.47,9,2 +7.5,0.21,0.34,1.2,0.06,26,111,0.9931,3.51,0.47,10.7,3 +5.3,0.3,0.2,1.1,0.077,48,166,0.9944,3.3,0.54,8.7,1 +8,0.26,0.36,2,0.054,30,121,0.992,3.09,0.72,11.6,4 +7,0.21,0.28,7.5,0.07,45,185,0.9966,3.34,0.55,9.4,2 +6.7,0.26,0.26,4,0.079,35.5,216,0.9956,3.31,0.68,9.5,2 +6.7,0.26,0.26,4.1,0.073,36,202,0.9956,3.3,0.67,9.5,2 +8.1,0.26,0.37,1.9,0.072,48,159,0.9949,3.37,0.7,10.9,3 +8.3,0.22,0.38,14.8,0.054,32,126,1.0002,3.22,0.5,9.7,2 +6.4,0.3,0.51,5.5,0.048,62,172,0.9942,3.08,0.45,9.1,3 +7.5,0.19,0.34,2.6,0.037,33,125,0.9923,3.1,0.49,11.1,4 +8.8,0.33,0.44,6.35,0.024,9,87,0.9917,2.96,0.4,12.6,4 +6.9,0.2,0.36,1.5,0.031,38,147,0.9931,3.35,0.56,11,3 +8,0.37,0.32,1.6,0.04,32,166,0.992,3,0.55,11.3,4 +8.3,0.22,0.38,14.8,0.054,32,126,1.0002,3.22,0.5,9.7,2 +8.2,0.29,0.33,9.1,0.036,28,118,0.9953,2.96,0.4,10.9,4 +7.7,0.34,0.3,8,0.048,25,192,0.9951,2.97,0.47,10.9,2 +6.2,0.55,0.45,12,0.049,27,186,0.9974,3.17,0.5,9.3,3 +6.4,0.4,0.19,3.2,0.033,28,124,0.9904,3.22,0.54,12.7,4 +7.5,0.28,0.33,7.7,0.048,42,180,0.9974,3.37,0.59,10.1,3 +7.8,0.26,0.44,1.3,0.037,43,132,0.9944,3.18,0.65,10,2 +6.5,0.26,0.34,16.3,0.051,56,197,1.0004,3.49,0.42,9.8,2 +6.3,0.34,0.29,6.2,0.046,29,227,0.9952,3.29,0.53,10.1,3 +6.8,0.15,0.33,4.7,0.059,31,118,0.9956,3.43,0.39,9,4 +6.3,0.27,0.25,5.8,0.038,52,155,0.995,3.28,0.38,9.4,3 +6.3,0.27,0.25,5.8,0.038,52,155,0.995,3.28,0.38,9.4,3 +7.4,0.2,0.37,16.95,0.048,43,190,0.9995,3.03,0.42,9.2,3 +6.3,0.23,0.21,5.1,0.035,29,142,0.9942,3.36,0.33,10.1,4 +7.3,0.31,0.69,10.2,0.041,58,160,0.9977,3.06,0.45,8.6,2 +5.2,0.24,0.45,3.8,0.027,21,128,0.992,3.55,0.49,11.2,5 +7,0.24,0.32,1.3,0.037,39,123,0.992,3.17,0.42,11.2,5 +7.4,0.2,0.37,16.95,0.048,43,190,0.9995,3.03,0.42,9.2,3 +7,0.17,0.33,4,0.034,17,127,0.9934,3.19,0.39,10.6,4 +8.3,0.21,0.58,17.1,0.049,62,213,1.0006,3.01,0.51,9.3,3 +7.2,0.21,0.35,14.5,0.048,35,178,0.9982,3.05,0.47,8.9,3 +7.1,0.21,0.4,1.2,0.069,24,156,0.9928,3.42,0.43,10.6,3 +8.4,0.17,0.31,6.7,0.038,29,132,0.9945,3.1,0.32,10.6,4 +7.4,0.24,0.31,8.4,0.045,52,183,0.9963,3.09,0.32,8.8,2 +5.3,0.24,0.33,1.3,0.033,25,97,0.9906,3.59,0.38,11,5 +6.5,0.28,0.26,8.8,0.04,44,139,0.9956,3.32,0.37,10.2,3 +6.3,0.23,0.21,5.1,0.035,29,142,0.9942,3.36,0.33,10.1,4 +6.5,0.29,0.25,10.6,0.039,32,120,0.9962,3.31,0.34,10.1,3 +5.8,0.29,0.21,2.6,0.025,12,120,0.9894,3.39,0.79,14,4 +6.3,0.27,0.25,5.8,0.038,52,155,0.995,3.28,0.38,9.4,3 +6.3,0.17,0.42,2.8,0.028,45,107,0.9908,3.27,0.43,11.8,3 +6.3,0.16,0.4,1.6,0.033,59,148,0.9914,3.44,0.53,11.4,2 +7.9,0.29,0.39,6.7,0.036,6,117,0.9938,3.12,0.42,10.7,2 +7.3,0.31,0.69,10.2,0.041,58,160,0.9977,3.06,0.45,8.6,2 +5.5,0.32,0.45,4.9,0.028,25,191,0.9922,3.51,0.49,11.5,4 +5.2,0.24,0.45,3.8,0.027,21,128,0.992,3.55,0.49,11.2,5 +7.2,0.37,0.15,2,0.029,27,87,0.9903,3.3,0.59,12.6,4 +6.1,0.29,0.27,1.7,0.024,13,76,0.9893,3.21,0.51,12.6,4 +9.2,0.22,0.4,2.4,0.054,18,151,0.9952,3.04,0.46,9.3,1 +7.2,0.37,0.15,2,0.029,27,87,0.9903,3.3,0.59,12.6,4 +8,0.18,0.37,1.3,0.04,15,96,0.9912,3.06,0.61,12.1,3 +6.5,0.22,0.34,12,0.053,55,177,0.9983,3.52,0.44,9.9,3 +7.4,0.18,0.4,1.6,0.047,22,102,0.9937,3.28,0.44,10.7,2 +6.5,0.52,0.17,1.4,0.047,5,26,0.9932,3.26,0.32,10,1 +7,0.15,0.38,2.2,0.047,33,96,0.9928,3.13,0.39,10.4,5 +5.9,0.415,0.13,1.4,0.04,11,64,0.9922,3.29,0.52,10.5,2 +8.1,0.45,0.34,8.3,0.037,33,216,0.9976,3.31,0.64,9.7,2 +5.8,0.415,0.13,1.4,0.04,11,64,0.9922,3.29,0.52,10.5,2 +6.4,0.5,0.16,12.9,0.042,26,138,0.9974,3.28,0.33,9,2 +6.7,0.105,0.32,12.4,0.051,34,106,0.998,3.54,0.45,9.2,3 +6,0.4,0.3,1.6,0.047,30,117,0.9931,3.17,0.48,10.1,3 +6.6,0.25,0.39,1.45,0.04,40,89,0.9911,3.35,0.4,11.4,4 +9.8,0.36,0.45,1.6,0.042,11,124,0.9944,2.93,0.46,10.8,2 +9.6,0.23,0.4,1.5,0.044,19,135,0.9937,2.96,0.49,10.9,2 +6.3,0.55,0.45,13,0.047,33,182,0.9974,3.2,0.46,9.2,3 +6.5,0.115,0.29,1.95,0.038,73,166,0.989,3.12,0.25,12.9,4 +6.4,0.125,0.29,5.85,0.042,24,99,0.992,3.23,0.32,12,4 +5.7,0.1,0.27,1.3,0.047,21,100,0.9928,3.27,0.46,9.5,2 +7.9,0.25,0.29,5.3,0.031,33,117,0.9918,3.06,0.32,11.8,4 +6.9,0.2,0.28,1.2,0.048,36,159,0.9936,3.19,0.43,9.1,3 +6.9,0.23,0.34,4,0.047,24,128,0.9944,3.2,0.52,9.7,3 +6.8,0.39,0.31,14.35,0.043,28,162,0.9988,3.17,0.54,9.1,2 +8.7,0.22,0.42,2.3,0.053,27,114,0.994,2.99,0.43,10,2 +7.4,0.41,0.34,4.7,0.042,19,127,0.9953,3.25,0.42,10.4,2 +6.7,0.25,0.34,12.85,0.048,30,161,0.9986,3.44,0.47,9.5,3 +6,0.26,0.42,5.2,0.027,70,178,0.9914,3.4,0.4,12.3,5 +6.1,0.31,0.37,8.4,0.031,70,170,0.9934,3.42,0.4,11.7,5 +9.2,0.28,0.46,3.2,0.058,39,133,0.996,3.14,0.58,9.5,2 +9,0.31,0.49,6.9,0.034,26,91,0.9937,2.99,0.34,11.5,2 +8.5,0.16,0.33,1,0.076,17,57,0.9921,3.14,0.46,10.6,3 +9.3,0.34,0.49,7.3,0.052,30,146,0.998,3.17,0.61,10.2,2 +9.2,0.28,0.46,3.2,0.058,39,133,0.996,3.14,0.58,9.5,2 +7.2,0.24,0.3,1.6,0.048,27,131,0.9933,3.25,0.45,10.5,2 +7.2,0.25,0.32,1.5,0.047,27,132,0.9933,3.26,0.44,10.5,2 +6.8,0.32,0.18,7.5,0.041,71,223,0.9959,3.14,0.41,8.9,2 +9.1,0.27,0.32,1.1,0.031,15,151,0.9936,3.03,0.41,10.6,2 +8.9,0.34,0.32,1.3,0.041,12,188,0.9953,3.17,0.49,9.5,2 +7,0.17,0.37,5.7,0.025,29,111,0.9938,3.2,0.49,10.8,3 +6.7,0.25,0.23,7.2,0.038,61,220,0.9952,3.14,0.35,9.5,2 +6.9,0.32,0.17,7.6,0.042,69,219,0.9959,3.13,0.4,8.9,2 +6.8,0.32,0.18,7.5,0.041,71,223,0.9959,3.14,0.41,8.9,2 +6.1,0.6,0,1.3,0.042,24,79,0.9937,3.31,0.38,9.4,1 +5.3,0.395,0.07,1.3,0.035,26,102,0.992,3.5,0.35,10.6,3 +7.9,0.16,0.3,4.8,0.037,37,171,0.9967,3.47,0.44,9,1 +7.6,0.33,0.36,2.1,0.034,26,172,0.9944,3.42,0.48,10.5,1 +7.8,0.3,0.29,16.85,0.054,23,135,0.9998,3.16,0.38,9,3 +7.8,0.3,0.29,16.85,0.054,23,135,0.9998,3.16,0.38,9,3 +5.7,0.26,0.27,4.1,0.201,73.5,189.5,0.9942,3.27,0.38,9.4,3 +7.8,0.3,0.29,16.85,0.054,23,135,0.9998,3.16,0.38,9,3 +7.5,0.14,0.34,1.3,0.055,50,153,0.9945,3.29,0.8,9.6,3 +7.8,0.3,0.29,16.85,0.054,23,135,0.9998,3.16,0.38,9,3 +6.6,0.25,0.41,7.4,0.043,29,151,0.9946,3.15,0.6,10.2,4 +5.7,0.26,0.27,4.1,0.201,73.5,189.5,0.9942,3.27,0.38,9.4,3 +8.2,0.23,0.49,0.9,0.057,15,73,0.9928,3.07,0.38,10.4,3 +6,0.24,0.32,6.3,0.03,34,129,0.9946,3.52,0.41,10.4,2 +6.1,0.45,0.27,0.8,0.039,13,82,0.9927,3.23,0.32,9.5,2 +7.4,0.23,0.43,1.4,0.044,22,113,0.9938,3.22,0.62,10.6,3 +7.2,0.2,0.38,1,0.037,21,74,0.9918,3.21,0.37,11,2 +7.5,0.14,0.34,1.3,0.055,50,153,0.9945,3.29,0.8,9.6,3 +7.7,0.25,0.43,4.5,0.062,20,115,0.9966,3.38,0.5,9.9,3 +8.2,0.61,0.45,5.4,0.03,15,118,0.9954,3.14,0.34,9.6,2 +7.6,0.21,0.44,1.9,0.036,10,119,0.9913,3.01,0.7,12.8,3 +7.4,0.22,0.33,2,0.045,31,101,0.9931,3.42,0.55,11.4,2 +7.2,0.26,0.26,12.7,0.036,49,214,0.9986,3.41,0.5,10,3 +6.4,0.25,0.41,8.6,0.042,57,173,0.9965,3,0.44,9.1,2 +6.3,0.32,0.35,11.1,0.039,29,198,0.9984,3.36,0.5,9.4,4 +6.8,0.25,0.29,2,0.042,19,189,0.9952,3.46,0.54,10.2,3 +9.8,0.44,0.4,2.8,0.036,35,167,0.9956,2.97,0.39,9.2,2 +7.2,0.2,0.25,4.5,0.044,31,109,0.9949,3.23,0.36,9.4,2 +8.2,0.61,0.45,5.4,0.03,15,118,0.9954,3.14,0.34,9.6,2 +7.5,0.42,0.45,9.1,0.029,20,125,0.996,3.12,0.36,10.1,3 +7.4,0.22,0.33,2,0.045,31,101,0.9931,3.42,0.55,11.4,2 +6.4,0.26,0.3,2.2,0.025,33,134,0.992,3.21,0.47,10.6,3 +7.9,0.46,0.32,4.1,0.033,40,138,0.9912,3.18,0.44,12.8,4 +6.5,0.41,0.64,11.8,0.065,65,225,0.9978,3.12,0.51,8.9,2 +7.5,0.32,0.37,1.2,0.048,22,184,0.9938,3.09,0.43,9.3,2 +6.6,0.21,0.38,2.2,0.026,40,104,0.9914,3.25,0.4,11.1,5 +7.1,0.21,0.3,1.4,0.037,45,143,0.9932,3.13,0.33,9.9,3 +7.6,0.26,0.47,1.6,0.068,5,55,0.9944,3.1,0.45,9.6,2 +7.6,0.21,0.44,1.9,0.036,10,119,0.9913,3.01,0.7,12.8,3 +6.9,0.25,0.26,5.2,0.024,36,135,0.9948,3.16,0.72,10.7,4 +7.1,0.26,0.32,14.45,0.074,29,107,0.998,2.96,0.42,9.2,3 +7.3,0.22,0.4,14.75,0.042,44.5,129.5,0.9998,3.36,0.41,9.1,4 +6.2,0.37,0.22,8.3,0.025,36,216,0.9964,3.33,0.6,9.6,3 +7.9,0.22,0.45,14.2,0.038,53,141,0.9992,3.03,0.46,9.2,3 +6.9,0.25,0.26,5.2,0.024,36,135,0.9948,3.16,0.72,10.7,4 +7.3,0.22,0.4,14.75,0.042,44.5,129.5,0.9998,3.36,0.41,9.1,4 +7.1,0.26,0.32,14.45,0.074,29,107,0.998,2.96,0.42,9.2,3 +7.4,0.25,0.37,6.9,0.02,14,93,0.9939,3,0.48,10.7,4 +6.8,0.18,0.37,1.5,0.027,37,93,0.992,3.3,0.45,10.8,3 +7,0.17,0.37,1.5,0.028,26,75,0.9922,3.3,0.46,10.8,4 +6.4,0.3,0.38,7.8,0.046,35,192,0.9955,3.1,0.37,9,2 +5,0.33,0.16,1.5,0.049,10,97,0.9917,3.48,0.44,10.7,3 +5,0.33,0.16,1.5,0.049,10,97,0.9917,3.48,0.44,10.7,3 +8.9,0.33,0.32,1.5,0.047,11,200,0.9954,3.19,0.46,9.4,2 +7,0.26,0.46,15.55,0.037,61,171,0.9986,2.94,0.35,8.8,3 +6.4,0.3,0.38,7.8,0.046,35,192,0.9955,3.1,0.37,9,2 +6.3,0.21,0.4,1.7,0.031,48,134,0.9917,3.42,0.49,11.5,3 +8,0.23,0.46,1.5,0.03,30,125,0.9907,3.23,0.47,12.5,3 +9.2,0.28,0.41,1,0.042,14,59,0.9922,2.96,0.25,10.5,3 +7.3,0.27,0.39,6.7,0.064,28,188,0.9958,3.29,0.3,9.7,2 +7.6,0.32,0.36,1.6,0.04,32,155,0.993,3.23,0.52,11.3,3 +5,0.33,0.16,1.5,0.049,10,97,0.9917,3.48,0.44,10.7,3 +9.7,0.24,0.45,1.2,0.033,11,59,0.9926,2.74,0.47,10.8,3 +8,0.28,0.42,7.1,0.045,41,169,0.9959,3.17,0.43,10.6,2 +8.2,0.37,0.36,1,0.034,17,93,0.9906,3.04,0.32,11.7,5 +8,0.61,0.38,12.1,0.301,24,220,0.9993,2.94,0.48,9.2,2 +7.2,0.26,0.44,7.1,0.027,25,126,0.993,3.02,0.34,11.1,5 +8.2,0.37,0.36,1,0.034,17,93,0.9906,3.04,0.32,11.7,5 +6.4,0.23,0.33,1.15,0.044,15.5,217.5,0.992,3.33,0.44,11,3 +5.9,0.4,0.32,6,0.034,50,127,0.992,3.51,0.58,12.5,4 +7.6,0.28,0.39,1.2,0.038,21,115,0.994,3.16,0.67,10,3 +8,0.28,0.42,7.1,0.045,41,169,0.9959,3.17,0.43,10.6,2 +7.2,0.23,0.39,2.3,0.033,29,102,0.9908,3.26,0.54,12.3,4 +6.8,0.32,0.37,3.4,0.023,19,87,0.9902,3.14,0.53,12.7,3 +7.2,0.23,0.39,2.3,0.033,29,102,0.9908,3.26,0.54,12.3,4 +6.9,0.18,0.38,6.5,0.039,20,110,0.9943,3.1,0.42,10.5,2 +9.4,0.26,0.53,1.2,0.047,25,109,0.9921,3.23,0.28,12.5,3 +8.3,0.33,0.42,1.15,0.033,18,96,0.9911,3.2,0.32,12.4,0 +7.3,0.29,0.3,13,0.043,46,238,0.9986,3.06,0.41,8.7,3 +7.9,0.41,0.37,4.5,0.03,40,114,0.992,3.17,0.54,12.4,4 +7.9,0.44,0.37,5.85,0.033,27,93,0.992,3.16,0.54,12.6,4 +7.7,0.39,0.3,5.2,0.037,29,131,0.9943,3.38,0.44,11,3 +7.7,0.26,0.31,1.3,0.043,47,155,0.9937,3.42,0.5,10.1,3 +7.8,0.32,0.31,1.7,0.036,46,195,0.993,3.03,0.48,10.5,2 +6.8,0.32,0.37,3.4,0.023,19,87,0.9902,3.14,0.53,12.7,3 +7.3,0.24,0.39,3.6,0.024,35,116,0.9928,3.17,0.51,10.9,2 +7.1,0.44,0.37,2.7,0.041,35,128,0.9896,3.07,0.43,13.5,4 +10.3,0.25,0.48,2.2,0.042,28,164,0.998,3.19,0.59,9.7,2 +7.9,0.14,0.28,1.8,0.041,44,178,0.9954,3.45,0.43,9.2,3 +7.4,0.18,0.42,2.1,0.036,33,187,0.9938,3.4,0.41,10.6,4 +8.1,0.43,0.42,6.6,0.033,36,141,0.9918,2.98,0.39,13.3,4 +7.1,0.44,0.37,2.7,0.041,35,128,0.9896,3.07,0.43,13.5,4 +6.4,0.26,0.22,5.1,0.037,23,131,0.9944,3.29,0.32,10.1,2 +8,0.66,0.72,17.55,0.042,62,233,0.9999,2.92,0.68,9.4,1 +8,0.2,0.4,5.2,0.055,41,167,0.9953,3.18,0.4,10.6,4 +7.2,0.21,0.34,1.1,0.046,25,80,0.992,3.25,0.4,11.3,3 +7.2,0.18,0.31,1.1,0.045,20,73,0.9925,3.32,0.4,10.8,4 +8.4,0.57,0.44,10.7,0.051,46,195,0.9981,3.15,0.51,10.4,2 +5.3,0.26,0.23,5.15,0.034,48,160,0.9952,3.82,0.51,10.5,4 +5.7,0.245,0.33,1.1,0.049,28,150,0.9927,3.13,0.42,9.3,2 +5.6,0.245,0.32,1.1,0.047,24,152,0.9927,3.12,0.42,9.3,3 +7.3,0.25,0.41,1.8,0.037,52,165,0.9911,3.29,0.39,12.2,4 +7,0.16,0.73,1,0.138,58,150,0.9936,3.08,0.3,9.2,2 +6.4,0.22,0.34,1.8,0.057,29,104,0.9959,3.81,0.57,10.3,3 +7.3,0.18,0.65,1.4,0.046,28,157,0.9946,3.33,0.62,9.4,3 +6.4,0.17,0.27,6.7,0.036,88,223,0.9948,3.28,0.35,10.2,3 +6.9,0.29,0.16,6.8,0.034,65,212,0.9955,3.08,0.39,9,3 +6.2,0.21,0.38,6.8,0.036,64,245,0.9951,3.06,0.36,9.3,3 +6.4,0.23,0.3,7.1,0.037,63,236,0.9952,3.06,0.34,9.2,3 +7.3,0.19,0.68,1.5,0.05,31,156,0.9946,3.32,0.64,9.4,3 +7.3,0.18,0.65,1.4,0.046,28,157,0.9946,3.33,0.62,9.4,3 +9.6,0.29,0.46,1.45,0.039,77.5,223,0.9944,2.92,0.46,9.5,3 +7.2,0.14,0.35,1.2,0.036,15,73,0.9938,3.46,0.39,9.9,2 +6.9,0.31,0.34,7.4,0.059,36,174,0.9963,3.46,0.62,11.1,4 +7.5,0.28,0.34,4.2,0.028,36,116,0.991,2.99,0.41,12.3,5 +8,0.22,0.42,14.6,0.044,45,163,1.0003,3.21,0.69,8.6,4 +7.6,0.31,0.29,10.5,0.04,21,145,0.9966,3.04,0.35,9.4,2 +8.4,0.35,0.56,13.8,0.048,55,190,0.9993,3.07,0.58,9.4,3 +8,0.22,0.42,14.6,0.044,45,163,1.0003,3.21,0.69,8.6,4 +8.1,0.5,0.47,1.1,0.037,23,126,0.9938,3.21,0.42,10.9,2 +7,0.39,0.31,5.3,0.169,32,162,0.9965,3.2,0.48,9.4,2 +8.1,0.5,0.47,1.1,0.037,23,126,0.9938,3.21,0.42,10.9,2 +8.4,0.35,0.56,13.8,0.048,55,190,0.9993,3.07,0.58,9.4,3 +6.2,0.22,0.27,1.5,0.064,20,132,0.9938,3.22,0.46,9.2,3 +8,0.22,0.42,14.6,0.044,45,163,1.0003,3.21,0.69,8.6,4 +7.6,0.31,0.29,10.5,0.04,21,145,0.9966,3.04,0.35,9.4,2 +7,0.24,0.36,4.9,0.083,10,133,0.9942,3.33,0.37,10.8,3 +6.6,0.27,0.3,1.9,0.025,14,153,0.9928,3.29,0.62,10.5,3 +7.8,0.16,0.41,1.7,0.026,29,140,0.991,3.02,0.78,12.5,3 +7.7,0.27,0.34,1.8,0.028,26,168,0.9911,2.99,0.48,12.1,4 +7.4,0.31,0.74,10.7,0.039,51,147,0.9977,3.02,0.43,8.7,2 +8,0.45,0.36,8.8,0.026,50,151,0.9927,3.07,0.25,12.7,5 +7.7,0.27,0.34,1.8,0.028,26,168,0.9911,2.99,0.48,12.1,4 +7.8,0.16,0.41,1.7,0.026,29,140,0.991,3.02,0.78,12.5,3 +6.6,0.16,0.29,1.8,0.05,40,147,0.9912,3.06,0.44,11.4,4 +8.3,0.21,0.4,1.6,0.032,35,110,0.9907,3.02,0.6,12.9,4 +7.2,0.32,0.33,1.4,0.029,29,109,0.9902,3.15,0.51,12.8,4 +6.6,0.16,0.3,1.6,0.034,15,78,0.992,3.38,0.44,11.2,3 +8.4,0.16,0.33,1.5,0.033,16,98,0.994,3.14,0.42,9.7,3 +7.5,0.23,0.32,9.2,0.038,54,191,0.9966,3.04,0.56,9.7,3 +6.2,0.17,0.3,1.1,0.037,14,79,0.993,3.5,0.54,10.3,3 +6.9,0.39,0.22,4.3,0.03,10,102,0.993,3,0.87,11.6,1 +6.9,0.41,0.22,4.2,0.031,10,102,0.993,3,0.86,11.6,1 +7.5,0.23,0.32,9.2,0.038,54,191,0.9966,3.04,0.56,9.7,3 +7.5,0.38,0.33,5,0.045,30,131,0.9942,3.32,0.44,10.9,3 +7.3,0.42,0.38,6.8,0.045,29,122,0.9925,3.19,0.37,12.6,4 +7.3,0.34,0.39,5.2,0.04,45,163,0.9925,3.3,0.47,12.4,3 +7.8,0.23,0.28,4.75,0.042,45,166,0.9928,2.96,0.4,11.5,2 +9,0.245,0.38,5.9,0.045,52,159,0.995,2.93,0.35,10.2,3 +6.9,0.2,0.4,7.7,0.032,51,176,0.9939,3.22,0.27,11.4,2 +7.4,0.19,0.42,6.4,0.067,39,212,0.9958,3.3,0.33,9.6,3 +8.2,0.2,0.36,8.1,0.035,60,163,0.9952,3.05,0.3,10.3,3 +8,0.59,0.71,17.35,0.038,61,228,1,2.95,0.75,9.3,2 +7.9,0.14,0.45,1.8,0.05,17,114,0.9948,3.33,0.49,10.7,4 +6.8,0.24,0.4,1.8,0.047,34,105,0.99,3.13,0.49,12.8,5 +9.7,0.14,0.59,1.5,0.049,23,142,0.9958,2.98,0.62,9.5,2 +9.2,0.15,0.68,1.6,0.046,22,130,0.9948,3.02,0.45,10.4,3 +9.4,0.17,0.55,1.6,0.049,14,94,0.9949,3.02,0.61,10.3,3 +5.2,0.365,0.08,13.5,0.041,37,142,0.997,3.46,0.39,9.9,3 +6.3,0.23,0.22,3.75,0.039,37,116,0.9927,3.23,0.5,10.7,3 +9.6,0.25,0.54,1.3,0.04,16,160,0.9938,2.94,0.43,10.5,2 +9.2,0.32,0.42,1.3,0.046,14,186,0.9949,3.08,0.48,9.6,2 +6.4,0.31,0.4,6.2,0.04,46,169,0.9953,3.15,0.46,9.3,3 +8.1,0.2,0.36,9.7,0.044,63,162,0.997,3.1,0.46,10,3 +7.9,0.255,0.26,2,0.026,40,190,0.9932,3.04,0.39,11.2,3 +7,0.15,0.34,1.4,0.039,21,177,0.9927,3.32,0.62,10.8,2 +6.4,0.15,0.31,1.1,0.044,25,96,0.9932,3.54,0.51,10.3,3 +6.4,0.25,0.53,6.6,0.038,59,234,0.9955,3.03,0.42,8.8,2 +7.6,0.19,0.42,1.5,0.044,6,114,0.9914,3.04,0.74,12.8,3 +7.3,0.43,0.37,4.6,0.028,17,114,0.991,3.23,0.43,13.2,3 +5.1,0.31,0.3,0.9,0.037,28,152,0.992,3.54,0.56,10.1,3 +6.2,0.2,0.26,1.7,0.093,40,161,0.9924,3.44,0.66,11,2 +6.9,0.16,0.35,1.3,0.043,21,182,0.9927,3.25,0.62,10.8,3 +7.7,0.32,0.48,2.3,0.04,28,114,0.9911,3.2,0.52,12.8,4 +6.5,0.22,0.72,6.8,0.042,33,168,0.9958,3.12,0.36,9.2,3 +6.8,0.26,0.33,1.5,0.047,44,167,0.9928,3.12,0.44,10.5,3 +5.2,0.37,0.33,1.2,0.028,13,81,0.9902,3.37,0.38,11.7,3 +8.4,0.19,0.43,2.1,0.052,20,104,0.994,2.85,0.46,9.5,2 +8.3,0.21,0.41,2.2,0.05,24,108,0.994,2.85,0.45,9.5,2 +6.8,0.15,0.32,8.8,0.058,24,110,0.9972,3.4,0.4,8.8,3 +7.9,0.16,0.64,17,0.05,69,210,1.0004,3.15,0.51,9.3,4 +7.8,0.21,0.39,1.8,0.034,62,180,0.991,3.09,0.75,12.6,5 +9,0.24,0.5,1.2,0.048,26,107,0.9918,3.21,0.34,12.4,3 +5.7,0.21,0.24,2.3,0.047,60,189,0.995,3.65,0.72,10.1,3 +7.8,0.29,0.36,7,0.042,38,161,0.9941,3.26,0.37,11.2,5 +6.7,0.18,0.3,6.4,0.048,40,251,0.9956,3.29,0.52,10,2 +6.7,0.18,0.3,6.4,0.048,40,251,0.9956,3.29,0.52,10,2 +8.4,0.58,0.27,12.15,0.033,37,116,0.9959,2.99,0.39,10.8,3 +7.2,0.16,0.32,0.8,0.04,50,121,0.9922,3.27,0.33,10,3 +7.6,0.54,0.23,2,0.029,13,151,0.9931,3.04,0.33,10.4,2 +8.4,0.58,0.27,12.15,0.033,37,116,0.9959,2.99,0.39,10.8,3 +6.6,0.25,0.31,12.4,0.059,52,181,0.9984,3.51,0.47,9.8,3 +7.3,0.23,0.37,1.9,0.041,51,165,0.9908,3.26,0.4,12.2,5 +7.3,0.39,0.37,1.1,0.043,36,113,0.991,3.39,0.48,12.7,5 +7,0.46,0.39,6.2,0.039,46,163,0.9928,3.21,0.35,12.2,4 +8.2,0.35,0.4,6.3,0.039,35,162,0.9936,3.15,0.34,11.9,4 +7.8,0.29,0.36,7,0.042,38,161,0.9941,3.26,0.37,11.2,5 +9.2,0.35,0.39,0.9,0.042,15,61,0.9924,2.96,0.28,10.4,1 +8,0.57,0.39,3.9,0.034,22,122,0.9917,3.29,0.67,12.8,4 +6.5,0.37,0.33,3.9,0.027,40,130,0.9906,3.28,0.39,12.7,4 +5.7,0.21,0.24,2.3,0.047,60,189,0.995,3.65,0.72,10.1,3 +6.7,0.18,0.3,6.4,0.048,40,251,0.9956,3.29,0.52,10,2 +7.8,0.13,0.3,1.8,0.04,43,179,0.9955,3.43,0.41,9,2 +7.6,0.19,0.41,1.1,0.04,38,143,0.9907,2.92,0.42,11.4,2 +7.3,0.22,0.41,15.4,0.05,55,191,1,3.32,0.59,8.9,3 +6.3,0.29,0.4,6.5,0.039,43,167,0.9953,3.15,0.44,9.3,3 +6.8,0.35,0.32,2.4,0.048,35,103,0.9911,3.28,0.46,12,5 +6.5,0.19,0.32,1.4,0.04,31,132,0.9922,3.36,0.54,10.8,4 +6.2,0.12,0.26,5.7,0.044,56,158,0.9951,3.52,0.37,10.5,3 +6,0.13,0.28,5.7,0.038,56,189.5,0.9948,3.59,0.43,10.6,4 +6.4,0.25,0.33,1.4,0.04,42,115,0.9906,3.19,0.48,11.3,4 +6.9,0.32,0.16,1.4,0.051,15,96,0.994,3.22,0.38,9.5,1 +7.6,0.19,0.41,1.1,0.04,38,143,0.9907,2.92,0.42,11.4,2 +6.7,0.13,0.28,1.2,0.046,35,140,0.9927,3.33,0.33,10.1,4 +7,0.14,0.41,0.9,0.037,22,95,0.9914,3.25,0.43,10.9,3 +7.6,0.27,0.24,3.8,0.058,19,115,0.9958,3.15,0.45,8.9,2 +7.3,0.22,0.41,15.4,0.05,55,191,1,3.32,0.59,8.9,3 +7.4,0.64,0.47,14.15,0.168,42,185,0.9984,2.9,0.49,9.3,2 +7.6,0.28,0.39,1.9,0.052,23,116,0.9941,3.25,0.4,10.4,3 +8.3,0.26,0.41,9.2,0.042,41,162,0.9944,3.1,0.38,12,4 +10.7,0.22,0.56,8.2,0.044,37,181,0.998,2.87,0.68,9.5,3 +10.7,0.22,0.56,8.2,0.044,37,181,0.998,2.87,0.68,9.5,3 +6.9,0.23,0.34,2.7,0.032,24,121,0.9902,3.14,0.38,12.4,4 +6.2,0.3,0.32,1.7,0.032,30,130,0.9911,3.28,0.41,11.2,4 +6.9,0.27,0.41,1.7,0.047,6,134,0.9929,3.15,0.69,11.4,3 +6.9,0.28,0.41,1.7,0.05,10,136,0.993,3.16,0.71,11.4,3 +6.9,0.28,0.3,1.6,0.047,46,132,0.9918,3.35,0.38,11.1,4 +6.9,0.46,0.2,0.9,0.054,5,126,0.992,3.1,0.42,10.4,3 +6.9,0.38,0.32,8.5,0.044,36,152,0.9932,3.38,0.35,12,4 +5.7,0.43,0.3,5.7,0.039,24,98,0.992,3.54,0.61,12.3,4 +6.6,0.56,0.16,3.1,0.045,28,92,0.994,3.12,0.35,9.1,3 +7.1,0.36,0.56,1.3,0.046,25,102,0.9923,3.24,0.33,10.5,3 +6.8,0.23,0.4,1.6,0.047,5,133,0.993,3.23,0.7,11.4,3 +6.2,0.33,0.29,1.3,0.042,26,138,0.9956,3.77,0.64,9.5,2 +5.6,0.49,0.13,4.5,0.039,17,116,0.9907,3.42,0.9,13.7,4 +6.6,0.42,0.33,2.8,0.034,15,85,0.99,3.28,0.51,13.4,3 +7.3,0.18,0.29,1.2,0.044,12,143,0.9918,3.2,0.48,11.3,4 +8.1,0.19,0.4,0.9,0.037,73,180,0.9926,3.06,0.34,10,3 +5.9,0.19,0.26,7.4,0.034,33,123,0.995,3.49,0.42,10.1,3 +6.2,0.16,0.47,1.4,0.029,23,81,0.99,3.26,0.42,12.2,3 +6.6,0.42,0.33,2.8,0.034,15,85,0.99,3.28,0.51,13.4,3 +5.7,0.135,0.3,4.6,0.042,19,101,0.9946,3.31,0.42,9.3,3 +5.6,0.49,0.13,4.5,0.039,17,116,0.9907,3.42,0.9,13.7,4 +6.9,0.19,0.33,1.6,0.039,27,98,0.9898,3.09,0.46,12.3,4 +7.3,0.18,0.29,1.2,0.044,12,143,0.9918,3.2,0.48,11.3,4 +7.3,0.25,0.36,13.1,0.05,35,200,0.9986,3.04,0.46,8.9,4 +7.3,0.25,0.36,13.1,0.05,35,200,0.9986,3.04,0.46,8.9,4 +7,0.2,0.34,5.7,0.035,32,83,0.9928,3.19,0.46,11.5,3 +7.3,0.25,0.36,13.1,0.05,35,200,0.9986,3.04,0.46,8.9,4 +6.3,0.67,0.48,12.6,0.052,57,222,0.9979,3.17,0.52,9.3,3 +7.4,0.4,0.29,5.4,0.044,31,122,0.994,3.3,0.5,11.1,5 +7.1,0.26,0.31,2.2,0.044,29,128,0.9937,3.34,0.64,10.9,5 +9,0.31,0.48,6.6,0.043,11,73,0.9938,2.9,0.38,11.6,2 +6.3,0.39,0.24,6.9,0.069,9,117,0.9942,3.15,0.35,10.2,1 +8.2,0.22,0.36,6.8,0.034,12,90,0.9944,3.01,0.38,10.5,5 +7.1,0.19,0.28,3.6,0.033,16,78,0.993,2.91,0.78,11.4,3 +7.3,0.25,0.36,13.1,0.05,35,200,0.9986,3.04,0.46,8.9,4 +7.9,0.2,0.34,1.2,0.04,29,118,0.9932,3.14,0.41,10.6,3 +7.1,0.26,0.32,5.9,0.037,39,97,0.9934,3.31,0.4,11.6,3 +7,0.2,0.34,5.7,0.035,32,83,0.9928,3.19,0.46,11.5,3 +6.9,0.3,0.33,4.1,0.035,26,155,0.9925,3.25,0.79,12.3,5 +8.1,0.29,0.49,7.1,0.042,22,124,0.9944,3.14,0.41,10.8,3 +5.8,0.17,0.3,1.4,0.037,55,130,0.9909,3.29,0.38,11.3,3 +5.9,0.415,0.02,0.8,0.038,22,63,0.9932,3.36,0.36,9.3,2 +6.6,0.23,0.26,1.3,0.045,16,128,0.9934,3.36,0.6,10,3 +8.6,0.55,0.35,15.55,0.057,35.5,366.5,1.0001,3.04,0.63,11,0 +6.9,0.35,0.74,1,0.044,18,132,0.992,3.13,0.55,10.2,2 +7.6,0.14,0.74,1.6,0.04,27,103,0.9916,3.07,0.4,10.8,4 +9.2,0.28,0.49,11.8,0.042,29,137,0.998,3.1,0.34,10.1,1 +6.2,0.18,0.49,4.5,0.047,17,90,0.9919,3.27,0.37,11.6,3 +5.3,0.165,0.24,1.1,0.051,25,105,0.9925,3.32,0.47,9.1,2 +9.8,0.25,0.74,10,0.056,36,225,0.9977,3.06,0.43,10,1 +8.1,0.29,0.49,7.1,0.042,22,124,0.9944,3.14,0.41,10.8,3 +6.8,0.22,0.49,0.9,0.052,26,128,0.991,3.25,0.35,11.4,3 +7.2,0.22,0.49,1,0.045,34,140,0.99,3.05,0.34,12.7,3 +7.4,0.25,0.49,1.1,0.042,35,156,0.9917,3.13,0.55,11.3,2 +8.2,0.18,0.49,1.1,0.033,28,81,0.9923,3,0.68,10.4,4 +6.1,0.22,0.49,1.5,0.051,18,87,0.9928,3.3,0.46,9.6,2 +7,0.39,0.24,1,0.048,8,119,0.9923,3,0.31,10.1,1 +6.1,0.22,0.49,1.5,0.051,18,87,0.9928,3.3,0.46,9.6,2 +6.5,0.36,0.49,2.9,0.03,16,94,0.9902,3.1,0.49,12.1,4 +7.1,0.29,0.49,1.2,0.031,32,99,0.9893,3.07,0.33,12.2,3 +7.4,0.25,0.49,1.1,0.042,35,156,0.9917,3.13,0.55,11.3,2 +6.9,0.23,0.24,14.2,0.053,19,94,0.9982,3.17,0.5,9.6,2 +8.5,0.56,0.74,17.85,0.051,51,243,1.0005,2.99,0.7,9.2,2 +8.2,0.18,0.49,1.1,0.033,28,81,0.9923,3,0.68,10.4,4 +6.3,0.23,0.49,7.1,0.05,67,210,0.9951,3.23,0.34,9.5,2 +6.1,0.25,0.49,7.6,0.052,67,226,0.9956,3.16,0.47,8.9,2 +7.2,0.26,0.74,13.6,0.05,56,162,0.998,3.03,0.44,8.8,2 +7.2,0.31,0.24,1.4,0.057,17,117,0.9928,3.16,0.35,10.5,2 +8,0.25,0.49,1.2,0.061,27,117,0.9938,3.08,0.34,9.4,2 +7,0.18,0.49,5.3,0.04,34,125,0.9914,3.24,0.4,12.2,3 +7.8,0.43,0.49,13,0.033,37,158,0.9955,3.14,0.35,11.3,3 +8.3,0.2,0.74,4.45,0.044,33,130,0.9924,3.25,0.42,12.2,3 +6.3,0.27,0.49,1.2,0.063,35,92,0.9911,3.38,0.42,12.2,3 +7.4,0.16,0.49,1.2,0.055,18,150,0.9917,3.23,0.47,11.2,3 +7.4,0.16,0.49,1.2,0.055,18,150,0.9917,3.23,0.47,11.2,3 +6.9,0.19,0.49,6.6,0.036,49,172,0.9932,3.2,0.27,11.5,3 +7.8,0.43,0.49,13,0.033,37,158,0.9955,3.14,0.35,11.3,3 +7.2,0.4,0.49,1.1,0.048,11,138,0.9929,3.01,0.42,9.3,2 +7.8,0.43,0.49,13,0.033,37,158,0.9955,3.14,0.35,11.3,3 +7.6,0.52,0.49,14,0.034,37,156,0.9958,3.14,0.38,11.8,4 +8.3,0.21,0.49,19.8,0.054,50,231,1.0012,2.99,0.54,9.2,2 +6.9,0.34,0.74,11.2,0.069,44,150,0.9968,3,0.81,9.2,2 +6.3,0.27,0.49,1.2,0.063,35,92,0.9911,3.38,0.42,12.2,3 +8.3,0.2,0.74,4.45,0.044,33,130,0.9924,3.25,0.42,12.2,3 +7.1,0.22,0.74,2.7,0.044,42,144,0.991,3.31,0.41,12.2,3 +7.9,0.11,0.49,4.5,0.048,27,133,0.9946,3.24,0.42,10.6,3 +8.5,0.17,0.74,3.6,0.05,29,128,0.9928,3.28,0.4,12.4,3 +6.4,0.145,0.49,5.4,0.048,54,164,0.9946,3.56,0.44,10.8,3 +7.4,0.16,0.49,1.2,0.055,18,150,0.9917,3.23,0.47,11.2,3 +8.3,0.19,0.49,1.2,0.051,11,137,0.9918,3.06,0.46,11,3 +8,0.44,0.49,9.1,0.031,46,151,0.9926,3.16,0.27,12.7,5 +7,0.2,0.74,0.8,0.044,19,163,0.9931,3.46,0.53,10.2,2 +6.9,0.19,0.49,6.6,0.036,49,172,0.9932,3.2,0.27,11.5,3 +7.1,0.25,0.49,3,0.03,30,96,0.9903,3.13,0.39,12.3,4 +6.5,0.24,0.24,1.6,0.046,15,60,0.9928,3.19,0.39,9.8,2 +7.2,0.4,0.49,1.1,0.048,11,138,0.9929,3.01,0.42,9.3,2 +7.6,0.52,0.49,14,0.034,37,156,0.9958,3.14,0.38,11.8,4 +7.8,0.43,0.49,13,0.033,37,158,0.9955,3.14,0.35,11.3,3 +7.8,0.21,0.49,1.35,0.052,6,48,0.9911,3.15,0.28,11.4,2 +7,0.2,0.49,5.9,0.038,39,128,0.9938,3.21,0.48,10.8,3 +6.9,0.25,0.24,3.6,0.057,13,85,0.9942,2.99,0.48,9.5,1 +7.2,0.08,0.49,1.3,0.05,18,148,0.9945,3.46,0.44,10.2,3 +7.1,0.85,0.49,8.7,0.028,40,184,0.9962,3.22,0.36,10.7,2 +7.6,0.51,0.24,1.2,0.04,10,104,0.992,3.05,0.29,10.8,3 +7.9,0.22,0.24,4.6,0.044,39,159,0.9927,2.99,0.28,11.5,3 +7.7,0.16,0.49,2,0.056,20,124,0.9948,3.32,0.49,10.7,3 +7.2,0.08,0.49,1.3,0.05,18,148,0.9945,3.46,0.44,10.2,3 +6.6,0.25,0.24,1.7,0.048,26,124,0.9942,3.37,0.6,10.1,3 +6.7,0.16,0.49,2.4,0.046,57,187,0.9952,3.62,0.81,10.4,3 +6.9,0.25,0.24,3.6,0.057,13,85,0.9942,2.99,0.48,9.5,1 +7.5,0.32,0.24,4.6,0.053,8,134,0.9958,3.14,0.5,9.1,0 +7.4,0.28,0.49,1.5,0.034,20,126,0.9918,2.98,0.39,10.6,3 +6.2,0.15,0.49,0.9,0.033,17,51,0.9932,3.3,0.7,9.4,3 +6.7,0.25,0.74,19.4,0.054,44,169,1.0004,3.51,0.45,9.8,3 +6.5,0.26,0.74,13.3,0.044,68,224,0.9972,3.18,0.54,9.5,3 +7.9,0.16,0.74,17.85,0.037,52,187,0.9998,2.99,0.41,9.3,2 +5.6,0.185,0.49,1.1,0.03,28,117,0.9918,3.55,0.45,10.3,3 +7.5,0.2,0.49,1.3,0.031,8,97,0.9918,3.06,0.62,11.1,2 +8,0.3,0.49,9.4,0.046,47,188,0.9964,3.14,0.48,10,2 +8,0.34,0.49,9,0.033,39,180,0.9936,3.13,0.38,12.3,5 +7.7,0.35,0.49,8.65,0.033,42,186,0.9931,3.14,0.38,12.4,5 +7.6,0.29,0.49,9.6,0.03,45,197,0.9938,3.13,0.38,12.3,4 +6.7,0.62,0.24,1.1,0.039,6,62,0.9934,3.41,0.32,10.4,2 +6.8,0.27,0.49,1.2,0.044,35,126,0.99,3.13,0.48,12.1,4 +7.7,0.27,0.49,1.8,0.041,23,86,0.9914,3.16,0.42,12.5,3 +6.7,0.51,0.24,2.1,0.043,14,155,0.9904,3.22,0.6,13,3 +7.4,0.19,0.49,9.3,0.03,26,132,0.994,2.99,0.32,11,4 +8.3,0.2,0.49,1.7,0.04,34,169,0.9938,3.05,0.37,10.1,2 +6.6,0.3,0.24,1.2,0.034,17,121,0.9933,3.13,0.36,9.2,2 +6.8,0.36,0.24,4.6,0.039,24,124,0.9909,3.27,0.34,12.6,4 +7,0.17,0.74,12.8,0.045,24,126,0.9942,3.26,0.38,12.2,5 +9.2,0.18,0.49,1.5,0.041,39,130,0.9945,3.04,0.49,9.8,4 +8.1,0.2,0.49,8.1,0.051,51,205,0.9954,3.1,0.52,11,3 +7.8,0.26,0.74,7.5,0.044,59,160,0.996,3.22,0.64,10,3 +6.8,0.21,0.49,14.5,0.06,50,170,0.9991,3.55,0.44,9.8,3 +7.9,0.2,0.49,1.6,0.053,15,144,0.993,3.16,0.47,10.5,2 +8,0.18,0.49,1.8,0.061,10,145,0.9942,3.23,0.48,10,2 +8.8,0.23,0.74,3.2,0.042,15,126,0.9934,3.02,0.51,11.2,3 +7.3,0.22,0.49,9.4,0.034,29,134,0.9939,2.99,0.32,11,4 +7.3,0.22,0.49,9.9,0.031,48,161,0.9937,3.01,0.28,11.2,3 +7.4,0.19,0.49,9.3,0.03,26,132,0.994,2.99,0.32,11,4 +7.3,0.155,0.49,1.3,0.039,34,136,0.9926,3.14,0.77,10.5,3 +8.2,0.22,0.49,9.6,0.037,53,154,0.9951,3.02,0.33,10.6,3 +8.2,0.24,0.49,9.3,0.038,52,163,0.9952,3.02,0.33,10.6,3 +8.4,0.23,0.49,7.8,0.035,22,95,0.9935,3.04,0.34,12,3 +8.3,0.2,0.49,1.7,0.04,34,169,0.9938,3.05,0.37,10.1,2 +8.3,0.2,0.49,1.7,0.038,38,167,0.9939,3.05,0.37,10.1,3 +6.6,0.3,0.24,1.2,0.034,17,121,0.9933,3.13,0.36,9.2,2 +6.9,0.21,0.49,1.4,0.041,15,164,0.9927,3.25,0.63,11,2 +8,0.25,0.49,9,0.044,31,185,0.998,3.34,0.49,10,3 +6.6,0.21,0.49,18.15,0.042,41,158,0.9997,3.28,0.39,8.7,3 +7.2,0.27,0.74,12.5,0.037,47,156,0.9981,3.04,0.44,8.7,2 +14.2,0.27,0.49,1.1,0.037,33,156,0.992,3.15,0.54,11.1,3 +7.9,0.28,0.49,7.7,0.045,48,195,0.9954,3.04,0.55,11,3 +7.4,0.27,0.49,1.1,0.037,33,156,0.992,3.15,0.54,11.1,3 +6.6,0.21,0.49,18.15,0.042,41,158,0.9997,3.28,0.39,8.7,3 +7.2,0.27,0.74,12.5,0.037,47,156,0.9981,3.04,0.44,8.7,2 +8.1,0.3,0.49,8.1,0.037,26,174,0.9943,3.1,0.3,11.2,4 +7.5,0.23,0.49,7.7,0.049,61,209,0.9941,3.14,0.3,11.1,4 +7.3,0.26,0.49,5,0.028,32,107,0.9936,3.24,0.54,10.8,3 +7.1,0.18,0.74,15.6,0.044,44,176,0.9996,3.38,0.67,9,3 +8.5,0.15,0.49,1.5,0.031,17,122,0.9932,3.03,0.4,10.3,3 +8.9,0.13,0.49,1,0.028,6,24,0.9926,2.91,0.32,9.9,2 +8.1,0.28,0.49,1,0.04,32,148,0.9936,3.13,0.41,10,3 +6,0.17,0.49,1,0.034,26,106,0.992,3.21,0.42,9.8,3 +7.3,0.26,0.49,5,0.028,32,107,0.9936,3.24,0.54,10.8,3 +7.1,0.18,0.74,15.6,0.044,44,176,0.9996,3.38,0.67,9,3 +7.1,0.53,0.24,0.8,0.029,29,86,0.993,3.16,0.32,9.1,1 +7.2,0.16,0.49,1.3,0.037,27,104,0.9924,3.23,0.57,10.6,3 +7.3,0.14,0.49,1.1,0.038,28,99,0.9928,3.2,0.72,10.6,3 +8.9,0.13,0.49,1,0.028,6,24,0.9926,2.91,0.32,9.9,2 +7.9,0.12,0.49,5.2,0.049,33,152,0.9952,3.18,0.47,10.6,3 +6.7,0.29,0.49,4.7,0.034,35,156,0.9945,3.13,0.45,9.9,3 +6.7,0.3,0.49,4.8,0.034,36,158,0.9945,3.12,0.45,9.9,3 +7.1,0.36,0.24,1.8,0.025,32,102,0.9903,3.34,0.59,12.8,3 +8.5,0.15,0.49,1.5,0.031,17,122,0.9932,3.03,0.4,10.3,3 +7.9,0.18,0.49,5.2,0.051,36,157,0.9953,3.18,0.48,10.6,3 +6.6,0.19,0.99,1.2,0.122,45,129,0.9936,3.09,0.31,8.7,3 +7.3,0.21,0.49,1.8,0.038,44,152,0.9912,3.32,0.44,12.6,4 +6.9,0.3,0.49,7.6,0.057,25,156,0.9962,3.43,0.63,11,4 +7.9,0.42,0.49,8.2,0.056,32,164,0.9965,3.29,0.6,11.2,4 +6.9,0.24,0.49,1.3,0.032,35,148,0.9932,3.45,0.57,10.7,4 +7.6,0.23,0.49,10,0.036,45,182,0.9967,3.08,0.58,9.6,3 +7.9,0.18,0.49,5.2,0.051,36,157,0.9953,3.18,0.48,10.6,3 +6.2,0.43,0.49,6.4,0.045,12,115,0.9963,3.27,0.57,9,1 +8.8,0.35,0.49,1,0.036,14,56,0.992,2.96,0.33,10.5,1 +7.8,0.3,0.74,1.8,0.033,33,156,0.991,3.29,0.52,12.8,3 +9.1,0.28,0.49,2,0.059,10,112,0.9958,3.15,0.46,10.1,2 +7.1,0.34,0.49,1.5,0.027,26,126,0.99,3.3,0.33,12.2,4 +7.8,0.3,0.74,1.8,0.033,33,156,0.991,3.29,0.52,12.8,3 +9.1,0.28,0.49,2,0.059,10,112,0.9958,3.15,0.46,10.1,2 +8.5,0.19,0.49,3.5,0.044,29,117,0.9938,3.14,0.51,10.1,3 +7.6,0.18,0.49,18.05,0.046,36,158,0.9996,3.06,0.41,9.2,2 +7.5,0.19,0.49,1.8,0.055,19,110,0.9946,3.33,0.44,9.9,2 +7.4,0.3,0.49,8.2,0.055,49,188,0.9974,3.52,0.58,9.7,3 +6.7,0.3,0.74,5,0.038,35,157,0.9945,3.21,0.46,9.9,2 +6.6,0.3,0.74,4.6,0.041,36,159,0.9946,3.21,0.45,9.9,2 +7.4,0.3,0.49,8.2,0.055,49,188,0.9974,3.52,0.58,9.7,3 +6.9,0.22,0.49,7,0.063,50,168,0.9957,3.54,0.5,10.3,3 +7.8,0.26,0.49,3.1,0.045,21,116,0.9931,3.16,0.35,10.3,2 +8.5,0.17,0.49,8.8,0.048,23,108,0.9947,2.88,0.34,10.5,1 +6.8,0.17,0.74,2.4,0.053,61,182,0.9953,3.63,0.76,10.5,3 +6.2,0.27,0.49,1.4,0.05,20,74,0.9931,3.32,0.44,9.8,3 +7.1,0.64,0.49,1.8,0.05,17,128,0.9946,3.31,0.58,10.6,1 +6.4,0.18,0.74,11.9,0.046,54,168,0.9978,3.58,0.68,10.1,2 +7.6,0.31,0.49,13.4,0.062,50,191,0.9989,3.22,0.53,9,1 +9.8,0.31,0.49,15.4,0.046,13,119,1.0004,3.18,0.45,9.5,2 +9,0.3,0.49,7.2,0.039,32,84,0.9938,2.94,0.32,11.5,3 +8.4,0.24,0.49,7.4,0.039,46,108,0.9934,3.03,0.33,11.9,4 +6.4,0.18,0.74,11.9,0.046,54,168,0.9978,3.58,0.68,10.1,2 +6.4,0.25,0.74,7.8,0.045,52,209,0.9956,3.21,0.42,9.2,3 +7.3,0.3,0.74,13.5,0.039,46,165,0.9982,3.02,0.4,8.7,2 +9.3,0.31,0.49,1.3,0.042,34,147,0.9948,3.11,0.46,9.8,2 +6.4,0.25,0.74,7.8,0.045,52,209,0.9956,3.21,0.42,9.2,3 +7.3,0.3,0.74,13.5,0.039,46,165,0.9982,3.02,0.4,8.7,2 +7,0.27,0.74,1.5,0.036,27,122,0.9926,3.35,0.48,11.2,3 +7.9,0.14,0.74,1.2,0.028,30,165,0.991,3.08,0.82,12.3,3 +6.4,0.12,0.49,6.4,0.042,49,161,0.9945,3.34,0.44,10.4,3 +6.8,0.21,0.74,1.2,0.047,25,111,0.9916,3.13,0.41,10.7,3 +8.6,0.16,0.49,7.3,0.043,9,63,0.9953,3.13,0.59,10.5,3 +7,0.29,0.49,3.8,0.047,37,136,0.9938,2.95,0.4,9.4,3 +6.4,0.27,0.49,7.3,0.046,53,206,0.9956,3.24,0.43,9.2,3 +6.6,0.55,0.01,2.7,0.034,56,122,0.9906,3.15,0.3,11.9,2 +6.4,0.27,0.49,7.3,0.046,53,206,0.9956,3.24,0.43,9.2,3 +6.3,0.24,0.74,1.4,0.172,24,108,0.9932,3.27,0.39,9.9,3 +6.7,0.33,0.49,1.6,0.167,20,94,0.9914,3.11,0.5,11.4,3 +7,0.29,0.49,3.8,0.047,37,136,0.9938,2.95,0.4,9.4,3 +8.2,0.34,0.49,8,0.046,55,223,0.996,3.08,0.52,10.7,3 +5.6,0.39,0.24,4.7,0.034,27,77,0.9906,3.28,0.36,12.7,2 +5.6,0.41,0.24,1.9,0.034,10,53,0.98815,3.32,0.5,13.5,4 +6.7,0.41,0.01,2.8,0.048,39,137,0.9942,3.24,0.35,9.5,2 +7.1,0.26,0.49,2.2,0.032,31,113,0.9903,3.37,0.42,12.9,6 +7.5,0.32,0.49,1.7,0.031,44,109,0.9906,3.07,0.46,12.5,3 +5.8,0.19,0.49,4.9,0.04,44,118,0.9935,3.34,0.38,9.5,4 +6.9,0.27,0.49,23.5,0.057,59,235,1.0024,2.98,0.47,8.6,2 +8.1,0.2,0.49,11.8,0.048,46,212,0.9968,3.09,0.46,10,4 +7.5,0.32,0.49,1.7,0.031,44,109,0.9906,3.07,0.46,12.5,3 +8.2,0.26,0.49,5.2,0.04,19,100,0.9941,3.12,0.34,10.1,3 +7.8,0.26,0.49,3.2,0.027,28,87,0.9919,3.03,0.32,11.3,4 +8,0.14,0.49,1.5,0.035,42,120,0.9928,3.26,0.4,10.6,4 +8,0.29,0.49,11.7,0.035,40,131,0.9958,3.14,0.34,10.8,2 +7.5,0.19,0.49,1.6,0.047,42,140,0.9932,3.4,0.47,10.7,3 +6.9,0.34,0.49,7.3,0.045,61,206,0.9957,3.09,0.4,9,3 +6.2,0.2,0.49,1.6,0.065,17,143,0.9937,3.22,0.52,9.2,3 +6.4,0.37,0.49,13.3,0.045,53,243,0.9982,3.14,0.48,8.5,3 +6.2,0.22,0.49,6,0.029,31,128,0.9928,3.41,0.36,11.3,5 +7.8,0.26,0.49,3.2,0.027,28,87,0.9919,3.03,0.32,11.3,4 +8.9,0.32,0.49,1.6,0.05,17,131,0.9956,3.13,0.34,9.4,2 +6.5,0.44,0.49,7.7,0.045,16,169,0.9957,3.11,0.37,8.7,3 +7,0.14,0.49,5.9,0.053,22,118,0.9954,3.36,0.36,9.4,3 +9,0.17,0.49,1,0.039,46,131,0.993,3.09,0.51,10.5,4 +6.4,0.26,0.49,6.4,0.037,37,161,0.9954,3.38,0.53,9.7,3 +9,0.22,0.49,10.4,0.048,52,195,0.9987,3.31,0.44,10.2,3 +8.9,0.32,0.49,1.6,0.05,17,131,0.9956,3.13,0.34,9.4,2 +8.2,0.2,0.49,3.5,0.057,14,108,0.9928,3.19,0.35,11.5,3 +7.8,0.15,0.24,7.7,0.047,21,98,0.9951,2.94,0.31,9.6,3 +6.9,0.25,0.24,1.8,0.053,6,121,0.993,3.23,0.7,11.4,2 +8.2,0.2,0.49,3.5,0.057,14,108,0.9928,3.19,0.35,11.5,3 +7.1,0.28,0.49,6.5,0.041,28,111,0.9926,3.41,0.58,12.2,5 +7.4,0.19,0.49,6.7,0.037,15,110,0.9938,3.2,0.38,11,4 +8.3,0.25,0.49,16.8,0.048,50,228,1.0001,3.03,0.52,9.2,3 +7.5,0.14,0.74,1.6,0.035,21,126,0.9933,3.26,0.45,10.2,3 +7.8,0.49,0.49,7,0.043,29,149,0.9952,3.21,0.33,10,2 +8.1,0.12,0.49,1.2,0.042,43,160,0.9934,3.13,0.48,9.7,3 +7.6,0.47,0.49,13,0.239,42,220,0.9988,2.96,0.51,9.2,2 +7.9,0.22,0.49,3.8,0.042,26,105,0.993,3.1,0.39,10.5,2 +7.8,0.49,0.49,7,0.043,29,149,0.9952,3.21,0.33,10,2 +6.4,0.22,0.49,7.5,0.054,42,151,0.9948,3.27,0.52,10.1,3 +7.3,0.19,0.49,15.55,0.058,50,134,0.9998,3.42,0.36,9.1,4 +8.1,0.3,0.49,12.3,0.049,50,144,0.9971,3.09,0.57,10.2,4 +7.3,0.19,0.49,15.55,0.058,50,134,0.9998,3.42,0.36,9.1,4 +7.5,0.24,0.49,9.4,0.048,50,149,0.9962,3.17,0.59,10.5,4 +6.4,0.22,0.49,7.5,0.054,42,151,0.9948,3.27,0.52,10.1,3 +7.8,0.21,0.49,1.2,0.036,20,99,0.99,3.05,0.28,12.1,4 +7.1,0.3,0.49,1.6,0.045,31,100,0.9942,3.4,0.59,10.2,2 +6.9,0.26,0.49,1.6,0.058,39,166,0.9965,3.65,0.52,9.4,1 +7.6,0.31,0.49,3.95,0.044,27,131,0.9912,3.08,0.67,12.8,4 +6.4,0.42,0.74,12.8,0.076,48,209,0.9978,3.12,0.58,9,3 +8.2,0.29,0.49,1,0.044,29,118,0.9928,3.24,0.36,10.9,1 +7.9,0.33,0.28,31.6,0.053,35,176,1.0103,3.15,0.38,8.8,3 +6.6,0.46,0.49,7.4,0.052,19,184,0.9956,3.11,0.38,9,2 +7.8,0.28,0.49,1.3,0.046,27,142,0.9936,3.09,0.59,10.2,2 +5.8,0.15,0.49,1.1,0.048,21,98,0.9929,3.19,0.48,9.2,2 +7.8,0.4,0.49,7.8,0.06,34,162,0.9966,3.26,0.58,11.3,3 +6.6,0.31,0.49,7.7,0.05,52,220,0.9964,3.12,0.45,8.8,2 +6.6,0.325,0.49,7.7,0.049,53,217,0.996,3.16,0.4,9.3,2 +6.6,0.27,0.49,7.8,0.049,62,217,0.9959,3.17,0.45,9.4,3 +6.7,0.26,0.49,8.3,0.047,54,191,0.9954,3.23,0.4,10.3,3 +6.7,0.21,0.49,1.4,0.047,30,114,0.9914,2.92,0.42,10.8,4 +7.9,0.33,0.28,31.6,0.053,35,176,1.0103,3.15,0.38,8.8,3 +8.1,0.28,0.46,15.4,0.059,32,177,1.0004,3.27,0.58,9,1 +6.5,0.13,0.37,1,0.036,48,114,0.9911,3.41,0.51,11.5,5 +7.8,0.445,0.56,1,0.04,8,84,0.9938,3.25,0.43,10.8,2 +8.8,0.39,0.34,5.9,0.055,33,128,0.9927,2.95,0.51,11.8,3 +7.9,0.18,0.33,1.2,0.033,20,72,0.9922,3.12,0.38,10.5,4 +7.1,0.31,0.38,1.2,0.036,10,124,0.9924,3.14,0.44,9.9,3 +7.8,0.24,0.18,6.7,0.046,33,160,0.9963,3.2,0.56,9.8,3 +7,0.35,0.3,6.5,0.028,27,87,0.9936,3.4,0.42,11.4,4 +6.6,0.26,0.31,4.8,0.138,41,168,0.9951,3.2,0.38,9.3,2 +6.6,0.27,0.31,5.3,0.137,35,163,0.9951,3.2,0.38,9.3,2 +6.8,0.22,0.29,8.9,0.046,82,188,0.9955,3.3,0.44,10.3,3 +6.2,0.27,0.32,8.8,0.047,65,224,0.9961,3.17,0.47,8.9,2 +7,0.35,0.3,6.5,0.028,27,87,0.9936,3.4,0.42,11.4,4 +7.3,0.23,0.37,1.8,0.032,60,156,0.992,3.11,0.35,11.1,3 +6.2,0.3,0.2,6.6,0.045,42,170,0.9944,3.36,0.45,10.4,3 +6.4,0.35,0.2,5.7,0.034,18,117,0.9944,3.33,0.43,10.1,2 +7.6,0.32,0.34,18.35,0.054,44,197,1.0008,3.22,0.55,9,2 +6.3,0.31,0.3,10,0.046,49,212,0.9962,3.74,0.55,11.9,3 +7.2,0.25,0.28,14.4,0.055,55,205,0.9986,3.12,0.38,9,4 +7.2,0.25,0.28,14.4,0.055,55,205,0.9986,3.12,0.38,9,4 +7.3,0.26,0.33,17.85,0.049,41.5,195,1,3.06,0.44,9.1,4 +7.2,0.25,0.28,14.4,0.055,55,205,0.9986,3.12,0.38,9,4 +7.4,0.26,0.37,9.4,0.047,42,147,0.9982,3.46,0.72,10,2 +7.3,0.26,0.33,17.85,0.049,41.5,195,1,3.06,0.44,9.1,4 +6.7,0.25,0.26,1.55,0.041,118.5,216,0.9949,3.55,0.63,9.4,0 +7.1,0.16,0.25,1.3,0.034,28,123,0.9915,3.27,0.55,11.4,3 +9,0.43,0.3,1.5,0.05,7,175,0.9951,3.11,0.45,9.7,1 +7.2,0.25,0.28,14.4,0.055,55,205,0.9986,3.12,0.38,9,4 +7,0.24,0.3,4.2,0.04,41,213,0.9927,3.28,0.49,11.8,3 +6.7,0.265,0.22,8.6,0.048,54,198,0.9955,3.25,0.41,10.2,2 +7.7,0.12,0.32,1.4,0.06,47,150,0.9952,3.37,0.42,9.2,3 +7.2,0.21,0.33,3,0.036,35,132,0.9928,3.25,0.4,11,3 +8.5,0.32,0.36,14.9,0.041,47,190,0.9982,3.08,0.31,10,3 +6.9,0.18,0.3,2,0.038,39,190,0.9914,3.32,0.37,12.2,3 +7,0.24,0.3,4.2,0.04,41,213,0.9927,3.28,0.49,11.8,3 +6.3,0.26,0.29,2.2,0.043,35,175,0.9918,3.38,0.43,11.6,3 +6.7,0.26,0.3,1.8,0.043,25,121,0.9944,3.44,0.61,10.2,3 +7.9,0.29,0.36,11.1,0.033,43,208,0.9969,3.14,0.46,10.3,2 +6.5,0.27,0.19,4.2,0.046,6,114,0.9955,3.25,0.35,8.6,1 +6.7,0.33,0.42,6.4,0.058,27,151,0.9954,3.16,0.44,9.6,2 +6.7,0.31,0.42,6.4,0.057,25,148,0.9955,3.16,0.45,9.6,2 +6.6,0.25,0.31,1.5,0.035,32,127,0.9921,3.41,0.47,11.3,3 +6.4,0.24,0.22,1.5,0.038,38,157,0.9934,3.41,0.55,9.9,3 +6.8,0.26,0.29,16.95,0.056,48,179,0.9998,3.45,0.4,9.6,2 +7,0.61,0.26,1.7,0.051,25,161,0.9946,3.36,0.6,10.6,1 +6.8,0.22,0.3,13.6,0.055,50,180,0.9984,3.44,0.39,9.8,2 +8.1,0.31,0.24,1.6,0.032,10,67,0.9924,3.08,0.47,10.5,2 +7,0.2,0.3,6.1,0.037,31,120,0.9939,3.24,0.51,10.8,2 +7.9,0.18,0.37,3,0.061,25,178,0.995,3.22,0.51,10,3 +6.6,0.34,0.27,6.2,0.059,23,136,0.9957,3.3,0.49,10.1,3 +6.8,0.3,0.24,6.6,0.123,35,116,0.9953,3.07,0.48,9.4,2 +6.5,0.18,0.34,1.6,0.04,43,148,0.9912,3.32,0.59,11.5,5 +7,0.21,0.31,6,0.046,29,108,0.9939,3.26,0.5,10.8,3 +6.8,0.27,0.32,1.5,0.044,19,142,0.9921,3.1,0.43,9.9,3 +9.3,0.2,0.33,1.7,0.05,28,178,0.9954,3.16,0.43,9,1 +5.8,0.23,0.27,1.8,0.043,24,69,0.9933,3.38,0.31,9.4,3 +7.6,0.2,0.39,2.6,0.044,30,180,0.9941,3.46,0.44,10.8,4 +8.2,0.15,0.48,2.7,0.052,24,190,0.995,3.5,0.45,10.9,4 +7.5,0.4,1,19.5,0.041,33,148,0.9977,3.24,0.38,12,3 +6.5,0.18,0.34,1.6,0.04,43,148,0.9912,3.32,0.59,11.5,5 +7,0.13,0.3,5,0.056,31,122,0.9945,3.47,0.42,10.5,3 +6.9,0.17,0.22,4.6,0.064,55,152,0.9952,3.29,0.37,9.3,3 +7,0.3,0.32,6.4,0.034,28,97,0.9924,3.23,0.44,11.8,3 +7.6,0.445,0.44,14.5,0.045,68,212,0.9986,3.48,0.36,10,3 +6.8,0.3,0.24,6.6,0.123,35,116,0.9953,3.07,0.48,9.4,2 +7.5,0.22,0.33,6.7,0.036,45,138,0.9939,3.2,0.68,11.4,3 +9.2,0.23,0.3,1.1,0.031,40,99,0.9929,2.94,0.3,10.4,3 +8.7,0.34,0.46,13.8,0.055,68,198,0.9988,3.36,0.37,9.5,3 +6.6,0.545,0.04,2.5,0.031,48,111,0.9906,3.14,0.32,11.9,2 +8.1,0.3,0.31,1.1,0.041,49,123,0.9914,2.99,0.45,11.1,3 +6.9,0.16,0.3,9.6,0.057,50,185,0.9978,3.39,0.38,9.6,3 +8,0.32,0.36,4.6,0.042,56,178,0.9928,3.29,0.47,12,3 +6.1,0.22,0.23,3.1,0.052,15,104,0.9948,3.14,0.42,8.7,2 +6.9,0.16,0.3,9.6,0.057,50,185,0.9978,3.39,0.38,9.6,3 +7.5,0.15,0.38,1.8,0.054,19,101,0.9946,3.24,0.44,10,2 +8.4,0.29,0.29,1.05,0.032,4,55,0.9908,2.91,0.32,11.4,1 +6.6,0.37,0.47,6.5,0.061,23,150,0.9954,3.14,0.45,9.6,3 +7.7,0.38,0.4,2,0.038,28,152,0.9906,3.18,0.32,12.9,3 +6.3,0.25,0.23,14.9,0.039,47,142,0.99705,3.14,0.35,9.7,3 +8.3,0.3,0.36,10,0.042,33,169,0.9982,3.23,0.51,9.3,3 +6.6,0.22,0.58,1.1,0.133,52,136,0.9932,3.1,0.3,9.1,2 +6.1,0.34,0.31,12,0.053,46,238,0.9977,3.16,0.48,8.6,2 +7.5,0.22,0.29,4.8,0.05,33,87,0.994,3.14,0.42,9.9,2 +8.3,0.3,0.36,10,0.042,33,169,0.9982,3.23,0.51,9.3,3 +8,0.27,0.24,1.2,0.044,20,102,0.9929,3.28,0.42,10.9,2 +6.1,0.17,0.27,1.5,0.056,45,135,0.9924,3.2,0.43,10.2,3 +7.4,0.18,0.3,10.4,0.045,44,174,0.9966,3.11,0.57,9.7,3 +6.7,0.16,0.28,2.5,0.046,40,153,0.9921,3.38,0.51,11.4,4 +6.1,0.255,0.44,12.3,0.045,53,197,0.9967,3.24,0.54,9.5,3 +7.4,0.23,0.25,1.4,0.049,43,141,0.9934,3.42,0.54,10.2,4 +6.4,0.16,0.28,2.2,0.042,33,93,0.9914,3.31,0.43,11.1,3 +6.3,0.25,0.23,14.9,0.039,47,142,0.99705,3.14,0.35,9.7,3 +6.7,0.27,0.25,8,0.053,54,202,0.9961,3.22,0.43,9.3,2 +6.9,0.29,0.23,8.6,0.056,56,215,0.9967,3.17,0.44,8.8,2 +9.6,0.21,0.28,1.2,0.038,12,53,0.9926,2.8,0.46,10.6,2 +6.6,0.62,0.2,8.7,0.046,81,224,0.99605,3.17,0.44,9.3,2 +6.4,0.28,0.19,5.4,0.042,67,181,0.99435,3.31,0.35,10.2,3 +8,0.3,0.28,5.7,0.044,31,124,0.9948,3.16,0.51,10.2,3 +6.4,0.17,0.27,1.5,0.037,20,98,0.9916,3.46,0.42,11,4 +7.3,0.21,0.3,10.9,0.037,18,112,0.997,3.4,0.5,9.6,3 +6.7,0.27,0.25,8,0.053,54,202,0.9961,3.22,0.43,9.3,2 +6.9,0.29,0.23,8.6,0.056,56,215,0.9967,3.17,0.44,8.8,2 +6.6,0.32,0.26,7.7,0.054,56,209,0.9961,3.17,0.45,8.8,2 +7.4,0.32,0.22,1.7,0.051,50,179,0.9955,3.28,0.69,8.9,2 +6.6,0.37,0.07,1.4,0.048,58,144,0.9922,3.17,0.38,10,2 +7.7,0.43,0.28,4.5,0.046,33,102,0.9918,3.16,0.56,12.2,4 +7.8,0.39,0.26,9.9,0.059,33,181,0.9955,3.04,0.42,10.9,3 +6.5,0.18,0.26,1.4,0.041,40,141,0.9941,3.34,0.72,9.5,3 +7.8,0.4,0.26,9.5,0.059,32,178,0.9955,3.04,0.43,10.9,3 +7.8,0.39,0.26,9.9,0.059,33,181,0.9955,3.04,0.42,10.9,3 +6.9,0.19,0.28,3,0.054,33,99,0.9924,3.16,0.4,10.8,3 +7.7,0.49,1,19.6,0.03,28,135,0.9973,3.24,0.4,12,3 +6.6,0.25,0.35,14,0.069,42,163,0.999,3.56,0.47,9.8,2 +6.5,0.18,0.26,1.4,0.041,40,141,0.9941,3.34,0.72,9.5,3 +6.4,0.15,0.36,1.8,0.034,43,150,0.9922,3.42,0.69,11,5 +6.4,0.15,0.36,1.8,0.034,43,150,0.9922,3.42,0.69,11,5 +8.4,0.17,0.31,5.4,0.052,47,150,0.9953,3.24,0.38,9.8,2 +6.1,0.32,0.37,1.8,0.051,13,200,0.9945,3.49,0.44,10.5,1 +8.5,0.21,0.26,9.25,0.034,73,142,0.9945,3.05,0.37,11.4,3 +8.7,0.45,0.4,1.5,0.067,17,100,0.9957,3.27,0.57,10.1,3 +6.7,0.24,0.29,6.8,0.038,54,127,0.9932,3.33,0.46,11.6,4 +8.5,0.21,0.26,9.25,0.034,73,142,0.9945,3.05,0.37,11.4,3 +7.4,0.33,0.26,2.6,0.04,29,115,0.9913,3.07,0.52,11.8,4 +7.2,0.26,0.3,2.1,0.033,50,158,0.9909,3.33,0.43,12.1,4 +8.2,0.36,0.29,7.6,0.035,37,122,0.9939,3.16,0.34,12,2 +7.8,0.2,0.24,1.6,0.026,26,189,0.991,3.08,0.74,12.1,4 +9.4,0.16,0.3,1.4,0.042,26,176,0.9954,3.15,0.46,9.1,2 +6.4,0.33,0.24,1.6,0.054,25,117,0.9943,3.36,0.5,9.3,2 +7.8,0.22,0.36,1.4,0.056,21,153,0.993,3.2,0.53,10.4,3 +7.4,0.35,0.31,17.95,0.062,42,187,1.0002,3.27,0.64,9.1,2 +6.6,0.37,0.24,2,0.064,23,120,0.9946,3.32,0.54,9.4,2 +6.7,0.37,0.41,6.3,0.061,22,149,0.9953,3.16,0.47,9.6,3 +7.1,0.37,0.32,1.4,0.037,27,126,0.9918,3.19,0.62,12,2 +6.9,0.25,0.27,9.05,0.039,37,128,0.9936,3.27,0.34,11.3,5 +6.8,0.23,0.29,15.4,0.073,56,173,0.9984,3.06,0.41,8.7,3 +6.4,0.26,0.21,7.1,0.04,35,162,0.9956,3.39,0.58,9.9,3 +7.6,0.3,0.22,10.2,0.049,57,191,0.9966,3.08,0.4,9.3,3 +9.4,0.16,0.23,1.6,0.042,14,67,0.9942,3.07,0.32,9.5,2 +6.8,0.23,0.29,15.4,0.073,56,173,0.9984,3.06,0.41,8.7,3 +6.4,0.26,0.21,7.1,0.04,35,162,0.9956,3.39,0.58,9.9,3 +7.6,0.3,0.22,10.2,0.049,57,191,0.9966,3.08,0.4,9.3,3 +7.5,0.33,0.39,12.4,0.065,29,119,0.9974,3.16,0.39,9.4,2 +7.6,0.38,0.2,3.4,0.046,9,116,0.9944,3.15,0.41,9.4,2 +8.8,0.2,0.43,15,0.053,60,184,1.0008,3.28,0.79,8.8,3 +7.5,0.33,0.39,12.4,0.065,29,119,0.9974,3.16,0.39,9.4,2 +8.8,0.2,0.43,15,0.053,60,184,1.0008,3.28,0.79,8.8,3 +6.6,0.36,0.21,1.5,0.049,39,184,0.9928,3.18,0.41,9.9,3 +7.6,0.38,0.2,3.4,0.046,9,116,0.9944,3.15,0.41,9.4,2 +5.6,0.46,0.24,4.8,0.042,24,72,0.9908,3.29,0.37,12.6,3 +7.2,0.15,0.38,1.2,0.038,18,110,0.9917,3.19,0.43,11.1,3 +8.2,0.42,0.29,4.1,0.03,31,100,0.9911,3,0.32,12.8,4 +6.8,0.3,0.35,2.8,0.038,10,164,0.9912,3.09,0.53,12,3 +6.7,0.27,0.3,13.9,0.029,34,131,0.9953,3.36,0.5,12,4 +7.2,0.5,0,0.8,0.034,46,114,0.9932,3.19,0.34,9.2,1 +6,0.26,0.29,1,0.032,27,96,0.9896,3.38,0.44,12.3,3 +6.8,0.33,0.28,1.2,0.032,38,131,0.9889,3.19,0.41,13,3 +6.8,0.3,0.35,2.8,0.038,10,164,0.9912,3.09,0.53,12,3 +7.4,0.29,0.31,1.7,0.035,23,110,0.9926,3.07,0.38,10.9,2 +8.2,0.42,0.29,4.1,0.03,31,100,0.9911,3,0.32,12.8,4 +7.3,0.19,0.24,6.3,0.054,34,231,0.9964,3.36,0.54,10,3 +6.5,0.32,0.12,11.5,0.033,35,165,0.9974,3.22,0.32,9,2 +7.1,0.32,0.4,1.5,0.034,13,84,0.9944,3.42,0.6,10.4,2 +6.5,0.32,0.12,11.5,0.033,35,165,0.9974,3.22,0.32,9,2 +7.3,0.19,0.24,6.3,0.054,34,231,0.9964,3.36,0.54,10,3 +7.3,0.17,0.23,6.3,0.051,35,240,0.9963,3.36,0.54,10,3 +7.7,0.44,0.24,11.2,0.031,41,167,0.9948,3.12,0.43,11.3,4 +7.7,0.44,0.24,11.2,0.031,41,167,0.9948,3.12,0.43,11.3,4 +7.4,0.49,0.24,15.1,0.03,34,153,0.9953,3.13,0.51,12,4 +7.7,0.44,0.24,11.2,0.031,41,167,0.9948,3.12,0.43,11.3,4 +7.4,0.49,0.24,15.1,0.03,34,153,0.9953,3.13,0.51,12,4 +6.4,0.21,0.3,5.6,0.044,43,160,0.9949,3.6,0.41,10.6,3 +8,0.55,0.42,12.6,0.211,37,213,0.9988,2.99,0.56,9.3,2 +7,0.19,0.23,5.7,0.123,27,104,0.9954,3.04,0.54,9.4,3 +7.2,0.24,0.29,2.2,0.037,37,102,0.992,3.27,0.64,11,4 +6.5,0.34,0.36,11,0.052,53,247,0.9984,3.44,0.55,9.3,3 +7,0.19,0.23,5.7,0.123,27,104,0.9954,3.04,0.54,9.4,3 +6.9,0.18,0.33,1,0.054,24,164,0.9926,3.42,0.51,10.5,2 +7.2,0.24,0.29,2.2,0.037,37,102,0.992,3.27,0.64,11,4 +8.2,0.18,0.31,11.8,0.039,96,249,0.9976,3.07,0.52,9.5,3 +8.3,0.28,0.45,7.8,0.059,32,139,0.9972,3.33,0.77,11.2,3 +6.1,0.34,0.46,4.7,0.029,21,94,0.991,3.29,0.62,12.3,3 +7.4,0.44,0.2,11.5,0.049,44,157,0.998,3.27,0.44,9,2 +7.6,0.26,0.58,7.9,0.041,62,180,0.9966,3.07,0.38,9,2 +7.4,0.44,0.2,11.5,0.049,44,157,0.998,3.27,0.44,9,2 +8.7,0.49,0.57,17.8,0.052,34,243,1.0007,2.98,0.82,9,2 +7,0.24,0.25,1.7,0.042,48,189,0.992,3.25,0.42,11.4,3 +7.1,0.25,0.25,1.6,0.046,50,181,0.9925,3.2,0.42,11,4 +6.1,0.34,0.46,4.7,0.029,21,94,0.991,3.29,0.62,12.3,3 +6.4,0.18,0.31,1.6,0.049,36,127,0.9934,3.6,0.67,10.4,4 +8.3,0.27,0.39,2.4,0.058,16,107,0.9955,3.28,0.59,10.3,2 +6.8,0.24,0.35,6.4,0.048,44,172,0.9944,3.29,0.55,10.5,4 +8,0.22,0.28,14,0.053,83,197,0.9981,3.14,0.45,9.8,3 +10,0.91,0.42,1.6,0.056,34,181,0.9968,3.11,0.46,10,1 +8.9,0.34,0.34,1.6,0.056,13,176,0.9946,3.14,0.47,9.7,2 +8.9,0.33,0.34,1.4,0.056,14,171,0.9946,3.13,0.47,9.7,2 +8,0.22,0.28,14,0.053,83,197,0.9981,3.14,0.45,9.8,3 +6.7,0.18,0.19,4.7,0.046,57,161,0.9946,3.32,0.66,10.5,3 +7.8,0.2,0.28,10.2,0.054,78,186,0.997,3.14,0.46,10,3 +7.3,0.13,0.31,2.3,0.054,22,104,0.9924,3.24,0.92,11.5,4 +6.6,0.28,0.3,7.8,0.049,57,202,0.9958,3.24,0.39,9.5,2 +7.1,0.25,0.3,2.4,0.042,25,122,0.994,3.43,0.61,10.5,3 +7.6,0.36,0.44,8.3,0.255,28,142,0.9958,3.12,0.43,10.2,3 +7.6,0.27,0.25,13.9,0.05,45,199,0.9984,3.34,0.5,9.8,3 +6.9,0.37,0.28,13.8,0.031,34,137,0.9948,3.1,0.37,11.6,3 +7.4,0.21,0.27,7.3,0.031,41,144,0.9932,3.15,0.38,11.8,4 +8.2,0.18,0.28,8.5,0.035,41,140,0.9952,3.04,0.37,10.1,4 +6.3,0.19,0.21,1.8,0.049,35,163,0.9924,3.31,0.5,10.3,3 +7,0.21,0.22,5.1,0.048,38,168,0.9945,3.34,0.49,10.4,3 +5.8,0.33,0.2,16.05,0.047,26,166,0.9976,3.09,0.46,8.9,2 +5.8,0.33,0.2,16.05,0.047,26,166,0.9976,3.09,0.46,8.9,2 +7.9,0.29,0.31,7.35,0.034,37,154,0.9938,3.06,0.31,10.8,2 +6.6,0.31,0.38,16.05,0.058,16,165,0.9997,3.38,0.6,9.2,2 +8,0.19,0.3,2,0.053,48,140,0.994,3.18,0.49,9.6,3 +8,0.2,0.36,1.2,0.032,21,78,0.9921,3.08,0.37,10.4,3 +8,0.25,0.26,14,0.043,41,248,0.9986,3.03,0.57,8.7,3 +7.2,0.2,0.61,16.2,0.043,14,103,0.9987,3.06,0.36,9.2,3 +7.7,0.3,0.42,14.3,0.045,45,213,0.9991,3.18,0.63,9.2,2 +7.2,0.2,0.61,16.2,0.043,14,103,0.9987,3.06,0.36,9.2,3 +7.7,0.3,0.42,14.3,0.045,45,213,0.9991,3.18,0.63,9.2,2 +7.7,0.3,0.42,14.3,0.045,45,213,0.9991,3.18,0.63,9.2,2 +6.4,0.22,0.32,7.9,0.029,34,124,0.9948,3.4,0.39,10.2,2 +7.2,0.2,0.61,16.2,0.043,14,103,0.9987,3.06,0.36,9.2,3 +7,0.53,0.02,1,0.036,39,107,0.993,3.2,0.32,9,2 +7.3,0.24,0.41,13.6,0.05,41,178,0.9988,3.37,0.43,9.7,2 +7.2,0.24,0.4,17.85,0.049,50,185,1,3.34,0.42,9.6,2 +7.6,0.15,0.4,1.3,0.036,24,112,0.9932,3.14,0.76,10,2 +7.7,0.3,0.42,14.3,0.045,45,213,0.9991,3.18,0.63,9.2,2 +7.6,0.33,0.41,13.7,0.045,44,197,0.9989,3.18,0.64,9.1,2 +6.8,0.24,0.31,18.3,0.046,40,142,1,3.3,0.41,8.7,2 +6.8,0.24,0.31,18.3,0.046,40,142,1,3.3,0.41,8.7,2 +6.8,0.35,0.44,6.5,0.056,31,161,0.9952,3.14,0.44,9.5,2 +7.9,0.26,0.33,10.3,0.039,73,212,0.9969,2.93,0.49,9.5,3 +7.5,0.29,0.67,8.1,0.037,53,166,0.9966,2.9,0.41,8.9,3 +7.5,0.29,0.67,8.1,0.037,53,166,0.9966,2.9,0.41,8.9,3 +7.2,0.31,0.41,8.6,0.053,15,89,0.9976,3.29,0.64,9.9,3 +6.7,0.44,0.31,1.9,0.03,41,104,0.99,3.29,0.62,12.6,4 +10,0.23,0.27,14.1,0.033,45,166,0.9988,2.72,0.43,9.7,3 +7.4,0.21,0.3,7.9,0.039,14,118,0.9942,2.96,0.34,10.4,2 +8.8,0.23,0.35,10.7,0.04,26,183,0.9984,2.93,0.49,9.1,3 +7.8,0.34,0.27,1.2,0.04,25,106,0.9932,3.01,0.55,10.4,2 +7.9,0.26,0.33,10.3,0.039,73,212,0.9969,2.93,0.49,9.5,3 +7.5,0.29,0.67,8.1,0.037,53,166,0.9966,2.9,0.41,8.9,3 +6,0.28,0.35,1.9,0.037,16,120,0.9933,3.16,0.69,10.6,2 +7.9,0.37,0.3,2.7,0.029,64,158,0.9916,3.12,0.59,12,4 +7.2,0.36,0.36,5.7,0.038,26,98,0.9914,2.93,0.59,12.5,4 +7.6,0.13,0.34,9.3,0.062,40,126,0.9966,3.21,0.39,9.6,2 +6.6,0.25,0.36,8.1,0.045,54,180,0.9958,3.08,0.42,9.2,2 +7.1,0.18,0.26,1.3,0.041,20,71,0.9926,3.04,0.74,9.9,3 +7.9,0.3,0.27,8.5,0.036,20,112,0.9939,2.96,0.46,11.7,3 +8.3,0.23,0.3,2.1,0.049,21,153,0.9953,3.09,0.5,9.6,3 +6.8,0.43,0.3,3.5,0.033,27,135,0.9906,3,0.37,12,3 +7.2,0.36,0.36,5.7,0.038,26,98,0.9914,2.93,0.59,12.5,4 +6.6,0.25,0.36,8.1,0.045,54,180,0.9958,3.08,0.42,9.2,2 +7.1,0.18,0.26,1.3,0.041,20,71,0.9926,3.04,0.74,9.9,3 +6.6,0.35,0.29,14.4,0.044,54,177,0.9991,3.17,0.58,8.9,3 +7.3,0.22,0.5,13.7,0.049,56,189,0.9994,3.24,0.66,9,3 +8.1,0.26,0.33,11.1,0.052,52.5,158,0.9976,3.03,0.49,10.2,4 +7.6,0.13,0.34,9.3,0.062,40,126,0.9966,3.21,0.39,9.6,2 +7,0.12,0.19,4.9,0.055,27,127,0.9953,3.29,0.41,9.4,2 +8.2,0.37,0.27,1.7,0.028,10,59,0.9923,2.97,0.48,10.4,2 +7.6,0.26,0.36,1.6,0.032,6,106,0.993,3.15,0.4,10.4,1 +6.3,0.2,0.58,1.4,0.204,15,97,0.9931,3.16,0.43,10,3 +6.3,0.22,0.57,1.4,0.208,14,96,0.9932,3.16,0.43,10,3 +7.1,0.25,0.28,1.6,0.052,46,169,0.9926,3.05,0.41,10.5,2 +7,0.27,0.32,6.8,0.047,47,193,0.9938,3.23,0.39,11.4,3 +8.8,0.34,0.33,9.7,0.036,46,172,0.9966,3.08,0.4,10.2,2 +9.2,0.27,0.34,10.5,0.043,49,228,0.9974,3.04,0.41,10.4,3 +7.1,0.49,0.22,2,0.047,146.5,307.5,0.9924,3.24,0.37,11,0 +9.2,0.71,0.23,6.2,0.042,15,93,0.9948,2.89,0.34,10.1,3 +7.2,0.47,0.65,8.3,0.083,27,182,0.9964,3,0.35,9.2,2 +6.8,0.28,0.36,1.6,0.04,25,87,0.9924,3.23,0.66,10.3,3 +8.8,0.34,0.33,9.7,0.036,46,172,0.9966,3.08,0.4,10.2,2 +9.2,0.27,0.34,10.5,0.043,49,228,0.9974,3.04,0.41,10.4,3 +7.3,0.13,0.27,4.6,0.08,34,172,0.9938,3.23,0.39,11.1,4 +7.2,0.16,0.35,1.2,0.031,27,84,0.9928,3.33,0.34,9.9,2 +6.8,0.31,0.32,7.6,0.052,35,143,0.9959,3.14,0.38,9,2 +8.3,0.36,0.57,15,0.052,35,256,1.0001,2.93,0.64,8.6,2 +6.8,0.31,0.32,7.6,0.052,35,143,0.9959,3.14,0.38,9,2 +8.3,0.36,0.57,15,0.052,35,256,1.0001,2.93,0.64,8.6,2 +6.3,0.25,0.44,11.6,0.041,48,195,0.9968,3.18,0.52,9.5,2 +6,0.45,0.42,1.1,0.051,61,197,0.9932,3.02,0.4,9,2 +8.1,0.26,0.3,7.8,0.049,39,152,0.9954,2.99,0.58,10,3 +6.4,0.22,0.32,12,0.066,57,158,0.9992,3.6,0.43,9,3 +5.7,0.45,0.42,1.1,0.051,61,197,0.9932,3.02,0.4,9,2 +7.2,0.19,0.31,1.4,0.046,37,135,0.9939,3.34,0.57,10.2,4 +6.7,0.31,0.44,6.7,0.054,29,160,0.9952,3.04,0.44,9.6,2 +8,0.25,0.13,17.2,0.036,49,219,0.9996,2.96,0.46,9.7,2 +9.9,1.005,0.46,1.4,0.046,34,185,0.9966,3.02,0.49,10.2,1 +8.1,0.31,0.36,8.2,0.028,29,142,0.9925,3.01,0.34,13,4 +8.1,0.24,0.38,4.3,0.044,49,172,0.996,3.37,0.74,10.8,3 +8,0.25,0.13,17.2,0.036,49,219,0.9996,2.96,0.46,9.7,2 +6.4,0.29,0.28,11.1,0.063,66,169,0.9973,2.89,0.57,9,2 +7.2,0.15,0.33,1.1,0.027,16,63,0.9937,3.37,0.4,9.9,2 +7,0.12,0.32,7.2,0.058,22,89,0.9966,3.29,0.38,9.2,3 +7.4,0.32,0.55,16.6,0.056,53,238,1.0017,2.96,0.58,8.7,3 +8.5,0.17,0.31,1,0.024,13,91,0.993,2.79,0.37,10.1,2 +8.5,0.17,0.31,1,0.024,13,91,0.993,2.79,0.37,10.1,2 +9.5,0.21,0.47,1.3,0.039,21,123,0.9959,2.9,0.64,9.5,2 +8.2,0.21,0.48,1.4,0.041,11,99,0.9958,3.17,0.57,9.9,2 +7.4,0.32,0.55,16.6,0.056,53,238,1.0017,2.96,0.58,8.7,3 +6.8,0.31,0.42,6.9,0.046,50,173,0.9958,3.19,0.46,9,2 +6.8,0.27,0.28,13.3,0.076,50,163,0.9979,3.03,0.38,8.6,3 +7.4,0.21,0.3,8.1,0.047,13,114,0.9941,3.12,0.35,10.5,3 +8,0.23,0.35,9.2,0.044,53,186,0.997,3.09,0.56,9.5,4 +7.6,0.2,0.31,1.4,0.047,41,142,0.9934,3.43,0.53,10.1,3 +6.3,0.41,0.3,3.2,0.03,49,164,0.9927,3.53,0.79,11.7,4 +8.3,0.49,0.43,2.5,0.036,32,116,0.9944,3.23,0.47,10.7,3 +6.3,0.41,0.3,3.2,0.03,49,164,0.9927,3.53,0.79,11.7,4 +7.6,0.2,0.26,4.5,0.086,37,133,0.9963,3.15,0.42,9.2,2 +7.5,0.26,0.26,18.35,0.084,33,139,1.0011,3.17,0.39,8.8,2 +7.5,0.26,0.26,18.35,0.084,33,139,1.0011,3.17,0.39,8.8,2 +6.8,0.27,0.35,7.8,0.048,76,197,0.9959,3.24,0.43,9.5,3 +6.8,0.28,0.37,7,0.057,35,208,0.9973,3.57,0.55,10.2,2 +8.4,0.2,0.27,6.3,0.048,30,143,0.9966,3.25,0.5,9.1,3 +7.9,0.33,0.26,1.2,0.044,23,103,0.9932,3.19,0.54,10.5,3 +7.5,0.38,0.5,12.8,0.042,57,184,0.9984,3.09,0.46,9,3 +7.6,0.2,0.3,14.2,0.056,53,212.5,0.999,3.14,0.46,8.9,5 +7.6,0.2,0.3,14.2,0.056,53,212.5,0.999,3.14,0.46,8.9,5 +7.6,0.2,0.3,14.2,0.056,53,212.5,0.999,3.14,0.46,8.9,5 +7.6,0.2,0.3,14.2,0.056,53,212.5,0.999,3.14,0.46,8.9,5 +7.6,0.2,0.3,14.2,0.056,53,212.5,0.999,3.14,0.46,8.9,5 +8.1,0.19,0.58,16.65,0.049,48,181,1.0006,3.2,0.62,9.1,3 +7.6,0.16,0.41,1.9,0.047,27,151,0.9937,3.2,0.53,10.1,3 +8.1,0.22,0.28,7.7,0.043,57,176,0.9954,3.12,0.55,10,2 +8,0.22,0.32,10.4,0.043,63,201,0.997,3.11,0.53,9.5,3 +7.1,0.33,0.3,3.3,0.034,30,102,0.9912,3.08,0.31,12.3,4 +6.4,0.43,0.27,1.1,0.054,5,110,0.9939,3.24,0.52,9.1,1 +7.6,0.2,0.3,14.2,0.056,53,212.5,0.999,3.14,0.46,8.9,5 +7,0.12,0.28,6.3,0.057,17,103,0.9957,3.5,0.44,9.6,2 +7.4,0.3,0.22,5.25,0.053,33,180,0.9926,3.13,0.45,11.6,3 +7,0.28,0.33,14.6,0.043,47,168,0.9994,3.34,0.67,8.8,3 +8.4,0.2,0.38,11.8,0.055,51,170,1.0004,3.34,0.82,8.9,3 +7,0.28,0.33,14.6,0.043,47,168,0.9994,3.34,0.67,8.8,3 +8.4,0.2,0.38,11.8,0.055,51,170,1.0004,3.34,0.82,8.9,3 +8.4,0.2,0.38,11.8,0.055,51,170,1.0004,3.34,0.82,8.9,3 +7.3,0.18,0.31,17.3,0.055,32,197,1.0002,3.13,0.46,9,3 +6.8,0.31,0.09,1.4,0.04,56,145,0.9922,3.19,0.46,10,2 +6.7,0.31,0.08,1.3,0.038,58,147,0.9922,3.18,0.46,10,2 +7.6,0.17,0.35,1.6,0.047,43,154,0.9934,3.36,0.69,11.1,3 +7.4,0.3,0.22,5.25,0.053,33,180,0.9926,3.13,0.45,11.6,3 +7.4,0.26,0.31,2.4,0.043,58,178,0.9941,3.42,0.68,10.6,3 +7,0.28,0.33,14.6,0.043,47,168,0.9994,3.34,0.67,8.8,3 +8.4,0.2,0.38,11.8,0.055,51,170,1.0004,3.34,0.82,8.9,3 +5.6,0.18,0.31,1.5,0.038,16,84,0.9924,3.34,0.58,10.1,3 +7.2,0.15,0.39,1.8,0.043,21,159,0.9948,3.52,0.47,10,2 +8,0.4,0.33,7.7,0.034,27,98,0.9935,3.18,0.41,12.2,4 +7,0.25,0.56,2,0.035,20,95,0.9918,3.23,0.53,11,3 +7.2,0.15,0.39,1.8,0.043,21,159,0.9948,3.52,0.47,10,2 +6.8,0.18,0.46,1.4,0.064,37,160,0.9924,3.37,0.45,11.1,2 +6.6,0.32,0.22,16.7,0.046,38,133,0.9979,3.22,0.67,10.4,3 +9,0.55,0.3,8.1,0.026,14,71,0.993,2.94,0.36,11.8,2 +6.9,0.19,0.39,8,0.028,22,84,0.994,3.11,0.66,10.8,3 +6.3,0.41,0.33,4.7,0.023,28,110,0.991,3.3,0.38,12.5,4 +9,0.55,0.3,8.1,0.026,14,71,0.993,2.94,0.36,11.8,2 +7,0.2,0.34,2.1,0.049,12,136,0.9922,3.25,0.46,11.6,4 +6.6,0.32,0.22,16.7,0.046,38,133,0.9979,3.22,0.67,10.4,3 +7.7,0.26,0.34,6.4,0.05,36,163,0.9937,3.19,0.7,11.5,3 +6.3,0.21,0.28,1.5,0.051,46,142,0.9928,3.23,0.42,10.1,3 +7.6,0.34,0.39,7.6,0.04,45,215,0.9965,3.11,0.53,9.2,3 +6.3,0.21,0.28,1.5,0.051,46,142,0.9928,3.23,0.42,10.1,3 +8,0.43,0.4,12.4,0.168,29,190,0.9991,3.07,0.64,9.2,2 +7.5,0.3,0.71,1.3,0.16,44,149,0.9948,3.08,0.42,8.9,2 +6.4,0.26,0.4,1.7,0.179,5,60,0.9925,3.09,0.54,10.1,2 +6.9,0.32,0.15,8.1,0.046,51,180,0.9958,3.13,0.45,8.9,2 +8.9,0.21,0.34,7.1,0.037,33,150,0.9962,3.1,0.45,9.7,3 +7.6,0.34,0.39,7.6,0.04,45,215,0.9965,3.11,0.53,9.2,3 +9.5,0.42,0.41,2.3,0.034,22,145,0.9951,3.06,0.52,11,3 +7.6,0.29,0.26,6.5,0.042,32,160,0.9944,3.14,0.47,10.7,2 +6.5,0.25,0.2,1.4,0.024,29,101,0.9916,3.24,0.54,10.8,3 +7.2,0.23,0.33,12.7,0.049,50,183,0.9987,3.41,0.4,9.8,2 +7.9,0.35,0.36,1.6,0.038,11,124,0.9928,3.25,0.48,11,2 +8.8,0.2,0.28,1.1,0.018,18,72,0.9926,2.97,0.35,10.4,2 +5.7,0.27,0.32,1.2,0.046,20,155,0.9934,3.8,0.41,10.2,3 +7.6,0.29,0.26,6.5,0.042,32,160,0.9944,3.14,0.47,10.7,2 +5.5,0.14,0.27,4.6,0.029,22,104,0.9949,3.34,0.44,9,2 +8.7,0.24,0.35,0.6,0.042,11,71,0.9926,3.08,0.38,10.6,2 +6.7,0.3,0.45,10.6,0.032,56,212,0.997,3.22,0.59,9.5,3 +5.5,0.14,0.27,4.6,0.029,22,104,0.9949,3.34,0.44,9,2 +5.6,0.13,0.27,4.8,0.028,22,104,0.9948,3.34,0.45,9.2,3 +7.4,0.18,0.34,2.7,0.03,30,107,0.992,2.97,0.53,11,3 +5.7,0.385,0.04,12.6,0.034,22,115,0.9964,3.28,0.63,9.9,3 +8.7,0.24,0.35,0.6,0.042,11,71,0.9926,3.08,0.38,10.6,2 +8.3,0.33,0.43,9.2,0.046,22,126,0.9982,3.38,0.47,9.3,2 +6.8,0.34,0.44,6.6,0.052,28,156,0.9955,3.14,0.41,9.6,2 +6.8,0.33,0.44,7,0.05,29,155,0.9955,3.14,0.42,9.5,2 +6.3,0.28,0.24,8.45,0.031,32,172,0.9958,3.39,0.57,9.7,4 +11.8,0.23,0.38,11.1,0.034,15,123,0.9997,2.93,0.55,9.7,0 +6.8,0.21,0.27,18.15,0.042,41,146,1.0001,3.3,0.36,8.7,2 +6.8,0.21,0.27,18.15,0.042,41,146,1.0001,3.3,0.36,8.7,2 +8.6,0.485,0.29,4.1,0.026,19,101,0.9918,3.01,0.38,12.4,2 +8.6,0.485,0.29,4.1,0.026,19,101,0.9918,3.01,0.38,12.4,2 +7.3,0.29,0.29,4.6,0.029,27,155,0.9931,3.07,0.26,10.6,3 +6.8,0.21,0.27,18.15,0.042,41,146,1.0001,3.3,0.36,8.7,2 +6.7,0.31,0.31,4.9,0.031,20,151,0.9926,3.36,0.82,12,4 +7.3,0.29,0.37,8.3,0.044,45,227,0.9966,3.12,0.47,9,2 +5.7,0.46,0.46,1.4,0.04,31,169,0.9932,3.13,0.47,8.8,2 +6.8,0.28,0.44,11.5,0.04,58,223,0.9969,3.22,0.56,9.5,2 +6.7,0.23,0.33,1.8,0.036,23,96,0.9925,3.32,0.4,10.8,3 +6.9,0.17,0.25,1.6,0.047,34,132,0.9914,3.16,0.48,11.4,2 +7.6,0.18,0.36,2.4,0.049,38,123,0.996,3.6,0.46,10.3,2 +6.6,0.22,0.28,4.9,0.042,51,180,0.9952,3.3,0.75,9.5,3 +7.8,0.27,0.28,1.8,0.05,21,127,0.9934,3.15,0.44,9.9,2 +7.7,0.28,0.29,4.3,0.051,25,142,0.9939,3.16,0.39,10.2,2 +7.6,0.29,0.29,4.4,0.051,26,146,0.9939,3.16,0.39,10.2,2 +5.7,0.32,0.18,1.4,0.029,26,104,0.9906,3.44,0.37,11,3 +7.1,0.33,0.25,1.6,0.03,25,126,0.9901,3.22,0.34,12.1,4 +7.3,0.34,0.3,1.3,0.057,25,173,0.9948,3.26,0.51,9.1,3 +6.5,0.19,0.26,5.2,0.04,31,140,0.995,3.26,0.68,9.5,3 +6.6,0.23,0.27,5.6,0.043,43,164,0.9953,3.27,0.76,9.5,2 +6.6,0.27,0.29,5.3,0.045,57,189,0.9953,3.31,0.79,9.8,2 +6.6,0.22,0.28,4.9,0.042,51,180,0.9952,3.3,0.75,9.5,3 +7.6,0.18,0.36,2.4,0.049,38,123,0.996,3.6,0.46,10.3,2 +6.8,0.36,0.32,1.6,0.039,10,124,0.9948,3.3,0.67,9.6,2 +7,0.22,0.39,2.1,0.055,39,198,0.9951,3.52,0.54,10.2,3 +5.9,0.17,0.3,1.4,0.042,25,119,0.9931,3.68,0.72,10.5,3 +7.4,0.45,0.32,7.1,0.044,17,117,0.9962,3.32,0.41,10.4,1 +6.8,0.36,0.32,1.6,0.039,10,124,0.9948,3.3,0.67,9.6,2 +7.5,0.42,0.14,10.7,0.046,18,95,0.9959,3.22,0.33,10.7,2 +7.5,0.33,0.32,11.1,0.036,25,119,0.9962,3.15,0.34,10.5,3 +9.4,0.3,0.32,10.7,0.029,14,111,0.9958,2.85,0.42,10.6,2 +7.9,0.17,0.32,1.6,0.053,47,150,0.9948,3.29,0.76,9.6,3 +7.9,0.17,0.32,1.6,0.053,47,150,0.9948,3.29,0.76,9.6,3 +8.2,0.17,0.32,1.5,0.05,17,101,0.994,3.14,0.58,9.5,2 +8.3,0.17,0.31,1.5,0.049,48,153,0.9942,3.12,0.58,9.4,3 +8.7,0.15,0.3,1.6,0.046,29,130,0.9942,3.22,0.38,9.8,3 +7.9,0.17,0.32,1.6,0.053,47,150,0.9948,3.29,0.76,9.6,3 +7.2,0.25,0.19,8,0.044,51,172,0.9964,3.16,0.44,9.2,2 +7.2,0.24,0.19,7.7,0.045,53,176,0.9958,3.17,0.38,9.5,2 +5.3,0.76,0.03,2.7,0.043,27,93,0.9932,3.34,0.38,9.2,2 +6.6,0.22,0.53,15.1,0.052,22,136,0.9986,2.94,0.35,9.4,2 +6.6,0.22,0.53,15.1,0.052,22,136,0.9986,2.94,0.35,9.4,2 +8.4,0.28,0.4,8.9,0.048,33,146,0.9988,3.4,0.46,9.3,2 +6.8,0.32,0.34,6,0.05,5,129,0.9953,3.19,0.4,9.1,2 +6.7,0.24,0.33,12.3,0.046,31,145,0.9983,3.36,0.4,9.5,2 +7.4,0.18,0.36,13.1,0.056,72,163,1,3.42,0.35,9.1,3 +6,0.16,0.3,6.7,0.043,43,153,0.9951,3.63,0.46,10.6,2 +6.7,0.24,0.33,12.3,0.046,31,145,0.9983,3.36,0.4,9.5,2 +6.8,0.28,0.35,2.3,0.042,16,85,0.9906,3.19,0.56,12.4,3 +6.2,0.34,0.3,11.1,0.047,28,237,0.9981,3.18,0.49,8.7,2 +6,0.27,0.15,1.5,0.056,35,128,0.9936,3.12,0.45,8.8,2 +6,0.16,0.3,6.7,0.043,43,153,0.9951,3.63,0.46,10.6,2 +6.8,0.32,0.34,6,0.05,5,129,0.9953,3.19,0.4,9.1,2 +8.5,0.24,0.47,15.2,0.057,40,234,1.0005,3.02,0.66,9,2 +8.1,0.24,0.33,10.2,0.048,46,141,0.9972,3.16,0.48,10.3,3 +7.4,0.18,0.36,13.1,0.056,72,163,1,3.42,0.35,9.1,3 +7.7,0.23,0.31,10.7,0.038,59,186,0.9969,3.12,0.55,9.5,3 +6.5,0.22,0.25,17.1,0.05,44,138,1.0001,3.3,0.37,8.8,2 +6.5,0.22,0.25,17.1,0.05,44,138,1.0001,3.3,0.37,8.8,2 +6.5,0.22,0.25,17.1,0.05,44,138,1.0001,3.3,0.37,8.8,2 +5.7,0.33,0.15,1.9,0.05,20,93,0.9934,3.38,0.62,9.9,2 +7.7,0.23,0.31,10.7,0.038,59,186,0.9969,3.12,0.55,9.5,3 +6.5,0.22,0.25,17.1,0.05,44,138,1.0001,3.3,0.37,8.8,2 +6.8,0.2,0.27,1.2,0.034,19,68,0.9902,3.14,0.37,11.7,1 +7.7,0.26,0.32,1.2,0.04,26,117,0.993,3.21,0.56,10.8,2 +6.4,0.2,0.32,3.1,0.041,18,126,0.9914,3.43,0.42,12,3 +8,0.16,0.36,1.5,0.033,14,122,0.9941,3.2,0.39,10.3,1 +6.8,0.25,0.27,10.7,0.076,47,154,0.9967,3.05,0.38,9,2 +7.7,0.39,0.28,4.9,0.035,36,109,0.9918,3.19,0.58,12.2,4 +6.9,0.26,0.33,12.6,0.051,59,173,0.998,3.39,0.38,9.9,2 +6.8,0.25,0.27,10.7,0.076,47,154,0.9967,3.05,0.38,9,2 +7.7,0.39,0.28,4.9,0.035,36,109,0.9918,3.19,0.58,12.2,4 +6,0.28,0.22,12.15,0.048,42,163,0.9957,3.2,0.46,10.1,2 +6.5,0.43,0.28,12,0.056,23,174,0.9986,3.31,0.55,9.3,2 +9.1,0.33,0.38,1.7,0.062,50.5,344,0.9958,3.1,0.7,9.5,2 +5.9,0.5,0.05,2.6,0.054,36,146,0.9948,3.43,0.5,9.2,3 +6.8,0.28,0.39,1.4,0.036,15,115,0.9918,3.27,0.72,11.7,2 +7,0.35,0.24,1.9,0.04,21,144,0.9923,3.35,0.38,11,2 +7.1,0.22,0.32,16.9,0.056,49,158,0.9998,3.37,0.38,9.6,3 +7.1,0.22,0.32,16.9,0.056,49,158,0.9998,3.37,0.38,9.6,3 +8.3,0.24,0.27,2.1,0.03,22,162,0.9914,2.99,0.68,11.9,3 +6.8,0.26,0.32,7,0.041,38,118,0.9939,3.25,0.52,10.8,3 +7.2,0.16,0.26,7.1,0.054,41,224,0.9966,3.38,0.55,10.1,2 +7.9,0.18,0.36,5.9,0.058,31,132,0.995,3.25,0.52,10.9,3 +7.2,0.16,0.26,7.1,0.054,41,224,0.9966,3.38,0.55,10.1,2 +5.5,0.24,0.32,8.7,0.06,19,102,0.994,3.27,0.31,10.4,2 +7.1,0.33,0.64,13.2,0.056,12,105,0.9972,3.05,0.39,9.2,2 +7.7,0.28,0.35,15.3,0.056,31,117,0.9998,3.27,0.5,9.6,2 +7.7,0.28,0.35,15.3,0.056,31,117,0.9998,3.27,0.5,9.6,2 +7.5,0.26,0.52,13.2,0.047,64,179,0.9982,3.1,0.46,9,2 +6.5,0.14,0.32,2.7,0.037,18,89,0.9924,3.4,0.74,11.5,4 +8.2,0.21,0.32,10.65,0.053,53,145,0.9972,3.17,0.48,10.2,3 +7.2,0.2,0.31,10,0.054,49,165,0.997,3.4,0.42,9.9,3 +7.2,0.115,0.3,6.8,0.056,26,105,0.9954,3.44,0.4,9.6,3 +6.4,0.29,0.2,15.6,0.04,20,142,0.9962,3.1,0.54,10.6,2 +7.1,0.33,0.64,13.2,0.056,12,105,0.9972,3.05,0.39,9.2,2 +6.8,0.24,0.34,5.1,0.038,31,99,0.9921,3.24,0.46,11.8,3 +7,0.24,0.34,3,0.035,36,102,0.9905,3.18,0.43,12.2,3 +7.7,0.28,0.35,15.3,0.056,31,117,0.9998,3.27,0.5,9.6,2 +7,0.22,0.33,2.1,0.052,15,76,0.993,3.2,0.41,10.6,3 +7.5,0.18,0.39,1.9,0.054,23,91,0.9941,3.27,0.45,10.3,3 +9.8,0.93,0.45,8.6,0.052,34,187,0.9994,3.12,0.59,10.2,1 +7.8,0.29,0.33,8.75,0.035,33,181,0.9962,3.11,0.46,10.7,2 +7.9,0.28,0.32,3.6,0.038,9,76,0.992,3.05,0.31,11.7,1 +8.5,0.25,0.27,4.7,0.031,31,92,0.9922,3.01,0.33,12,3 +7.4,0.18,0.27,1.3,0.048,26,105,0.994,3.52,0.66,10.6,3 +6.3,0.24,0.37,1.8,0.031,6,61,0.9897,3.3,0.34,12.2,1 +6,0.33,0.38,9.7,0.04,29,124,0.9954,3.47,0.48,11,3 +6.8,0.37,0.28,4,0.03,29,79,0.99,3.23,0.46,12.4,4 +9.9,0.49,0.23,2.4,0.087,19,115,0.9948,2.77,0.44,9.4,3 +8.5,0.25,0.27,4.7,0.031,31,92,0.9922,3.01,0.33,12,3 +8.4,0.22,0.28,18.8,0.028,55,130,0.998,2.96,0.35,11.6,2 +7,0.35,0.31,1.8,0.069,15,162,0.9944,3.18,0.47,9.4,2 +7,0.35,0.31,1.8,0.069,15,162,0.9944,3.18,0.47,9.4,2 +7.4,0.19,0.3,12.8,0.053,48.5,229,0.9986,3.14,0.49,9.1,4 +7.4,0.19,0.3,12.8,0.053,48.5,229,0.9986,3.14,0.49,9.1,4 +7.4,0.19,0.3,12.8,0.053,48.5,229,0.9986,3.14,0.49,9.1,4 +7.4,0.19,0.3,12.8,0.053,48.5,229,0.9986,3.14,0.49,9.1,4 +7.4,0.19,0.3,12.8,0.053,48.5,229,0.9986,3.14,0.49,9.1,4 +6.9,0.32,0.13,7.8,0.042,11,117,0.996,3.23,0.37,9.2,2 +7.6,0.32,0.58,16.75,0.05,43,163,0.9999,3.15,0.54,9.2,2 +7.4,0.19,0.3,12.8,0.053,48.5,229,0.9986,3.14,0.49,9.1,4 +7.4,0.19,0.3,12.8,0.053,48.5,212,0.9986,3.14,0.49,9.1,4 +6.9,0.32,0.13,7.8,0.042,11,117,0.996,3.23,0.37,9.2,2 +6,0.34,0.24,5.4,0.06,23,126,0.9951,3.25,0.44,9,4 +7.6,0.32,0.58,16.75,0.05,43,163,0.9999,3.15,0.54,9.2,2 +7.7,0.24,0.31,1.3,0.047,33,106,0.993,3.22,0.55,10.8,3 +8,0.36,0.43,10.1,0.053,29,146,0.9982,3.4,0.46,9.5,3 +7.4,0.29,0.25,3.8,0.044,30,114,0.992,3.11,0.4,11,3 +6.6,0.32,0.27,10.9,0.041,37,146,0.9963,3.24,0.47,10,2 +6.3,0.3,0.24,6.6,0.04,38,141,0.995,3.22,0.47,9.5,2 +6.4,0.33,0.24,9.8,0.041,29,109,0.9956,3.29,0.47,10.1,3 +7.5,0.18,0.31,11.7,0.051,24,94,0.997,3.19,0.44,9.5,4 +6.5,0.39,0.81,1.2,0.217,14,74,0.9936,3.08,0.53,9.5,2 +6.8,0.25,0.18,1.4,0.056,13,137,0.9935,3.11,0.42,9.5,2 +6.4,0.18,0.32,9.6,0.052,24,90,0.9963,3.35,0.49,9.4,3 +7.1,0.18,0.32,12.2,0.048,36,125,0.9967,2.92,0.54,9.4,3 +7.6,0.27,0.42,2.6,0.044,29,110,0.9912,3.31,0.51,12.7,3 +9.2,0.23,0.35,10.7,0.037,34,145,0.9981,3.09,0.32,9.7,2 +7.9,0.28,0.41,4.9,0.058,31,153,0.9966,3.27,0.51,9.7,3 +7.1,0.18,0.32,12.2,0.048,36,125,0.9967,2.92,0.54,9.4,3 +6.4,0.18,0.32,9.6,0.052,24,90,0.9963,3.35,0.49,9.4,3 +6.8,0.25,0.18,1.4,0.056,13,137,0.9935,3.11,0.42,9.5,2 +7,0.22,0.26,1.1,0.037,20,71,0.9902,3.1,0.38,11.7,3 +7.3,0.18,0.29,1,0.036,26,101,0.99,3.09,0.37,11.7,3 +7.1,0.26,0.19,8.2,0.051,53,187,0.996,3.16,0.52,9.7,2 +6.6,0.25,0.42,11.3,0.049,77,231,0.9966,3.24,0.52,9.5,3 +6.4,0.24,0.23,7.3,0.069,31,157,0.9962,3.25,0.53,9.1,2 +6,0.28,0.27,2.3,0.051,23,147,0.994,3.23,0.67,10.3,3 +7.1,0.26,0.19,8.2,0.051,53,187,0.996,3.16,0.52,9.7,2 +7.8,0.24,0.38,2.1,0.058,14,167,0.994,3.21,0.55,9.9,2 +7.6,0.27,0.33,2,0.059,19,175,0.9944,3.22,0.56,9.9,2 +7.7,0.39,0.34,10,0.056,35,178,0.9974,3.26,0.6,10.2,2 +8.9,0.24,0.33,15.75,0.035,16,132,0.996,3,0.37,12.1,3 +6.6,0.23,0.24,3.9,0.045,36,138,0.9922,3.15,0.64,11.3,4 +7.1,0.26,0.3,2,0.031,13,128,0.9917,3.19,0.49,11.4,2 +7,0.32,0.35,1.5,0.039,24,125,0.9918,3.17,0.64,12.2,3 +7.4,0.24,0.26,1.6,0.058,53,150,0.9936,3.18,0.5,9.9,4 +6.9,0.21,0.33,1.4,0.056,35,136,0.9938,3.63,0.78,10.3,3 +7,0.32,0.35,1.5,0.039,24,125,0.9918,3.17,0.64,12.2,3 +7.4,0.17,0.29,1.4,0.047,23,107,0.9939,3.52,0.65,10.4,3 +7.1,0.26,0.3,2,0.031,13,128,0.9917,3.19,0.49,11.4,2 +8.5,0.28,0.34,13.8,0.041,32,161,0.9981,3.13,0.4,9.9,3 +7.8,0.3,0.37,1.3,0.051,16,96,0.9941,3.32,0.62,10,2 +8.1,0.25,0.38,3.8,0.051,18,129,0.9928,3.21,0.38,11.5,3 +7.7,0.28,0.29,6.9,0.041,29,163,0.9952,3.44,0.6,10.5,3 +6.5,0.24,0.36,2.2,0.027,36,134,0.9898,3.28,0.36,12.5,4 +7,0.22,0.32,1.6,0.045,40,120,0.9914,2.98,0.44,10.5,3 +8.5,0.28,0.34,13.8,0.041,32,161,0.9981,3.13,0.4,9.9,3 +8,0.45,0.28,10.8,0.051,25,157,0.9957,3.06,0.47,11.4,4 +6.9,0.23,0.33,12.8,0.056,44,169,0.998,3.42,0.42,9.8,3 +8,0.45,0.28,10.8,0.051,25,157,0.9957,3.06,0.47,11.4,4 +7.6,0.23,0.26,15.3,0.067,32,166,0.9986,3.03,0.44,9.2,1 +7.7,0.28,0.58,12.1,0.046,60,177,0.9983,3.08,0.46,8.9,2 +7.7,0.27,0.61,12,0.046,64,179,0.9982,3.07,0.46,8.9,2 +7.1,0.2,0.36,11.6,0.042,45,124,0.997,2.92,0.59,9.5,4 +6.9,0.25,0.35,9.2,0.034,42,150,0.9947,3.21,0.36,11.5,3 +7.1,0.2,0.36,11.6,0.042,45,124,0.997,2.92,0.59,9.5,4 +6.9,0.25,0.35,9.2,0.034,42,150,0.9947,3.21,0.36,11.5,3 +8.4,0.2,0.31,2.8,0.054,16,89,0.99416,2.96,0.45,9.5,3 +6.5,0.39,0.35,1.6,0.049,10,164,0.99516,3.35,0.51,9.7,2 +7.2,0.23,0.38,6.1,0.067,20,90,0.99496,3.17,0.79,9.7,2 +6.9,0.44,0.42,8.5,0.048,10,147,0.9974,3.32,0.46,9.5,3 +7.1,0.28,0.19,7.8,0.04,48,184,0.99579,3.16,0.5,9.4,2 +6.4,0.34,0.2,14.9,0.06,37,162,0.9983,3.13,0.45,9,1 +6.1,0.15,0.29,6.2,0.046,39,151,0.99471,3.6,0.44,10.6,3 +6.9,0.44,0.42,8.5,0.048,10,147,0.9974,3.32,0.46,9.5,3 +7.2,0.29,0.18,8.2,0.042,41,180,0.99644,3.16,0.49,9.1,2 +7.1,0.28,0.19,7.8,0.04,48,184,0.99579,3.16,0.5,9.4,2 +6.1,0.23,0.45,10.6,0.094,49,169,0.99699,3.05,0.54,8.8,2 +6.7,0.23,0.42,11.2,0.047,52,171,0.99758,3.54,0.74,10.4,2 +7,0.36,0.14,11.6,0.043,35,228,0.9977,3.13,0.51,8.9,2 +7.5,0.31,0.24,7.1,0.031,28,141,0.99397,3.16,0.38,10.6,4 +6.4,0.34,0.2,14.9,0.06,37,162,0.9983,3.13,0.45,9,1 +6.1,0.15,0.29,6.2,0.046,39,151,0.99471,3.6,0.44,10.6,3 +7.4,0.2,0.29,1.7,0.047,16,100,0.99243,3.28,0.45,10.6,3 +6.3,0.27,0.18,7.7,0.048,45,186,0.9962,3.23,0.47,9,2 +9.2,0.34,0.54,17.3,0.06,46,235,1.00182,3.08,0.61,8.8,3 +7.4,0.18,0.29,1.4,0.042,34,101,0.99384,3.54,0.6,10.5,4 +7.2,0.29,0.2,7.7,0.046,51,174,0.99582,3.16,0.52,9.5,2 +6.3,0.27,0.18,7.7,0.048,45,186,0.9962,3.23,0.47,9,2 +6.2,0.26,0.19,3.4,0.049,47,172,0.9924,3.14,0.43,10.4,3 +7.3,0.21,0.21,1.6,0.046,35,133,0.99466,3.38,0.46,10,3 +7.1,0.14,0.35,1.4,0.039,24,128,0.99212,2.97,0.68,10.4,2 +7.2,0.39,0.54,1.4,0.157,34,132,0.99449,3.11,0.53,9,3 +7.6,0.48,0.28,10.4,0.049,57,205,0.99748,3.24,0.45,9.3,2 +7.2,0.39,0.54,1.4,0.157,34,132,0.99449,3.11,0.53,9,3 +7.6,0.48,0.28,10.4,0.049,57,205,0.99748,3.24,0.45,9.3,2 +6.5,0.36,0.31,4.1,0.061,20,134,0.99475,3.18,0.45,9,3 +8.5,0.25,0.31,2.8,0.032,11,61,0.99189,3.06,0.44,11.5,3 +6.9,0.3,0.21,15.7,0.056,49,159,0.99827,3.11,0.48,9,2 +6.6,0.19,0.43,10.9,0.045,53,154,0.99752,3.52,0.77,10.4,3 +6.9,0.3,0.21,15.7,0.056,49,159,0.99827,3.11,0.48,9,2 +9.4,0.42,0.32,6.5,0.027,20,167,0.99479,3.08,0.43,10.6,2 +6.6,0.19,0.43,10.9,0.045,53,154,0.99752,3.52,0.77,10.4,3 +6.3,0.2,0.3,5.9,0.034,35,152,0.99642,3.47,0.4,8.5,3 +8.5,0.19,0.56,17.3,0.055,47,169,1.00047,3.07,0.67,9.3,3 +7.3,0.19,0.25,1.4,0.051,41,107,0.99382,3.53,0.66,10.5,4 +6.7,0.25,0.26,13.5,0.06,50,156,0.99784,3.39,0.46,9.9,3 +6.2,0.25,0.28,8.5,0.035,28,108,0.99486,3.4,0.42,10.4,3 +6.1,0.46,0.32,6.2,0.053,10,94,0.99537,3.35,0.47,10.1,2 +7.3,0.19,0.25,1.4,0.051,41,107,0.99382,3.53,0.66,10.5,4 +7.5,0.29,0.26,14.95,0.067,47,178,0.99838,3.04,0.49,9.2,1 +6.7,0.31,0.18,7.7,0.043,57,200,0.99566,3.17,0.44,9.4,3 +7.4,0.14,0.3,1.3,0.033,25,91,0.99268,3.53,0.39,10.6,3 +6.7,0.31,0.18,7.7,0.043,57,200,0.99566,3.17,0.44,9.4,3 +7.1,0.4,0.52,1.3,0.148,45,149,0.99468,3.08,0.56,8.7,2 +6.4,0.16,0.25,1.3,0.047,20,77,0.9933,3.61,0.54,10.2,3 +6.3,0.16,0.22,1.3,0.046,18,66,0.99307,3.61,0.55,10.3,3 +7.4,0.33,0.26,15.6,0.049,67,210,0.99907,3.06,0.68,9.5,2 +7.4,0.33,0.26,15.6,0.049,67,210,0.99907,3.06,0.68,9.5,2 +7.4,0.33,0.26,15.6,0.049,67,210,0.99907,3.06,0.68,9.5,2 +7.4,0.33,0.26,15.6,0.049,67,210,0.99907,3.06,0.68,9.5,2 +6.6,0.41,0.24,4.9,0.158,47,144,0.99471,3.17,0.49,9.4,2 +6.7,0.43,0.23,5,0.157,49,145,0.99471,3.17,0.49,9.4,2 +7.4,0.33,0.26,15.6,0.049,67,210,0.99907,3.06,0.68,9.5,2 +7.3,0.4,0.28,6.5,0.037,26,97,0.99148,3.16,0.58,12.6,4 +7.4,0.18,0.24,1.4,0.047,21,106,0.99383,3.52,0.64,10.5,4 +8.6,0.17,0.28,2.7,0.047,38,150,0.99365,3.1,0.56,10.8,3 +6.5,0.32,0.23,1.2,0.054,39,208,0.99272,3.18,0.46,9.9,3 +7.3,0.4,0.28,6.5,0.037,26,97,0.99148,3.16,0.58,12.6,4 +7,0.32,0.31,6.4,0.031,38,115,0.99235,3.38,0.58,12.2,4 +7.5,0.42,0.19,6.9,0.041,62,150,0.99508,3.23,0.37,10,3 +6.9,0.28,0.31,7.2,0.04,47,168,0.9946,3.29,0.57,10.6,4 +6.5,0.29,0.42,10.6,0.042,66,202,0.99674,3.24,0.53,9.5,3 +6.3,0.41,0.18,3.5,0.027,23,109,0.99018,3.34,0.54,12.8,5 +7,0.32,0.31,6.4,0.031,38,115,0.99235,3.38,0.58,12.2,4 +7.3,0.3,0.33,2.3,0.043,28,125,0.99084,3.34,0.44,12.6,4 +6.6,0.22,0.28,12.05,0.058,25,125,0.99856,3.45,0.45,9.4,2 +6,0.26,0.18,7,0.055,50,194,0.99591,3.21,0.43,9,2 +6.9,0.44,0.18,11.8,0.051,26,126,0.9975,3.23,0.48,9.1,2 +7.5,0.42,0.2,1.4,0.06,15,168,0.9944,3.06,0.4,9.4,3 +7,0.36,0.3,5,0.04,40,143,0.99173,3.33,0.42,12.2,4 +5.6,0.295,0.2,2.2,0.049,18,134,0.99378,3.21,0.68,10,2 +6.8,0.21,0.55,14.6,0.053,34,159,0.99805,2.93,0.44,9.2,2 +9.4,0.28,0.3,1.6,0.045,36,139,0.99534,3.11,0.49,9.3,2 +8.1,0.28,0.34,1.3,0.035,11,126,0.99232,3.14,0.5,9.8,3 +6.8,0.21,0.55,14.6,0.053,34,159,0.99805,2.93,0.44,9.2,2 +7,0.22,0.26,2.8,0.036,44,132,0.99078,3.34,0.41,12,4 +9.4,0.28,0.3,1.6,0.045,36,139,0.99534,3.11,0.49,9.3,2 +6.8,0.32,0.3,3.3,0.029,15,80,0.99061,3.33,0.63,12.6,4 +7,0.19,0.33,6.3,0.032,42,127,0.99182,3.31,0.38,12.2,3 +7.7,0.42,0.38,8.1,0.061,49,144,0.9966,3.4,0.58,11,3 +7.4,0.2,0.31,1.6,0.038,34,116,0.9912,3.25,0.39,12,4 +7.5,0.24,0.62,10.6,0.045,51,153,0.99779,3.16,0.44,8.8,2 +7.5,0.26,0.59,11.8,0.046,58,164,0.99814,3.17,0.46,8.9,1 +6.6,0.4,0.32,1.7,0.035,39,84,0.99096,3.59,0.48,12.7,4 +8,0.2,0.3,8.1,0.037,42,130,0.99379,3.1,0.67,11.8,3 +4.6,0.445,0,1.4,0.053,11,178,0.99426,3.79,0.55,10.2,2 +6.1,0.41,0.04,1.3,0.036,23,121,0.99228,3.24,0.61,9.9,3 +7.6,0.2,0.34,1.8,0.041,42,148,0.99335,3.35,0.66,11.1,3 +6.9,0.3,0.21,7.2,0.045,54,190,0.99595,3.22,0.48,9.4,2 +7,0.35,0.17,1.1,0.049,7,119,0.99297,3.13,0.36,9.7,3 +6.9,0.35,0.55,11.95,0.038,22,111,0.99687,3.11,0.29,9.7,2 +7,0.35,0.17,1.1,0.049,7,119,0.99297,3.13,0.36,9.7,3 +6.9,0.35,0.55,11.95,0.038,22,111,0.99687,3.11,0.29,9.7,2 +7.6,0.3,0.4,2.2,0.054,29,175,0.99445,3.19,0.53,9.8,2 +7.5,0.38,0.29,12.7,0.05,25,209,0.9986,3.25,0.59,9.3,3 +7.5,0.3,0.32,1.4,0.032,31,161,0.99154,2.95,0.42,10.5,2 +6.3,0.4,0.32,10.6,0.049,38,209,0.9981,3.47,0.59,9.3,3 +6.8,0.37,0.28,1.9,0.024,64,106,0.98993,3.45,0.6,12.6,5 +7.5,0.23,0.35,17.8,0.058,128,212,1.00241,3.44,0.43,8.9,2 +8.3,0.27,0.34,10.2,0.048,50,118,0.99716,3.18,0.51,10.3,2 +6.8,0.26,0.22,4.8,0.041,110,198,0.99437,3.29,0.67,10.6,2 +6.5,0.28,0.35,9.8,0.067,61,180,0.9972,3.15,0.57,9,1 +7.2,0.34,0.3,8.4,0.051,40,167,0.99756,3.48,0.62,9.7,2 +7,0.23,0.26,7.2,0.041,21,90,0.99509,3.22,0.55,9.5,3 +7.7,0.29,0.29,4.8,0.06,27,156,0.99572,3.49,0.59,10.3,3 +7.2,0.34,0.3,8.4,0.051,40,167,0.99756,3.48,0.62,9.7,2 +7.7,0.4,0.27,4.5,0.034,27,95,0.99175,3.21,0.59,12.3,5 +6.7,0.17,0.27,1.4,0.032,39,149,0.99254,3.4,0.52,10.5,2 +7,0.23,0.26,7.2,0.041,21,90,0.99509,3.22,0.55,9.5,3 +8.1,0.24,0.26,11,0.043,41,211,0.99676,3.11,0.49,10,3 +7.7,0.28,0.63,11.1,0.039,58,179,0.9979,3.08,0.44,8.8,1 +7.5,0.23,0.29,2.6,0.031,24,98,0.99194,3,0.54,10.9,3 +8.3,0.26,0.31,2,0.029,14,141,0.99077,2.95,0.77,12.2,3 +7.9,0.46,0.4,10.1,0.168,19,184,0.99782,3.06,0.62,9.5,2 +7.9,0.31,0.22,13.3,0.048,46,212,0.99942,3.47,0.59,10,2 +7.9,0.25,0.34,11.4,0.04,53,202,0.99708,3.11,0.57,9.6,3 +6.1,0.28,0.16,1.3,0.06,36,126,0.99353,3.13,0.46,8.7,3 +7,0.18,0.26,1.4,0.044,46,89,0.99256,3.39,0.48,10.7,4 +6.5,0.21,0.28,1.4,0.046,26,66,0.99199,3.43,0.48,11.1,3 +7.6,0.48,0.33,7,0.024,14,130,0.9918,3.25,0.45,12.5,4 +7.1,0.34,0.32,2,0.051,29,130,0.99354,3.3,0.5,10.4,3 +8.9,0.21,0.37,1.2,0.028,20,93,0.99244,3.2,0.37,11.5,2 +7.4,0.32,0.27,12.9,0.04,60,221,0.99831,3.05,0.66,9.4,2 +6,0.495,0.27,5,0.157,17,129,0.99396,3.03,0.36,9.3,2 +8.1,0.25,0.34,10.1,0.05,30,121,0.99724,3.17,0.49,10.1,3 +8.2,0.25,0.46,3.75,0.05,14,102,0.99524,3.28,0.58,9.7,2 +6.5,0.18,0.29,1.7,0.035,39,144,0.9927,3.49,0.5,10.5,3 +6.7,0.24,0.26,12.6,0.053,44,182,0.99802,3.42,0.42,9.7,2 +6.6,0.32,0.24,1.3,0.06,42.5,204,0.99512,3.59,0.51,9.2,2 +7.6,0.32,0.35,1.6,0.092,24,138,0.99438,3.19,0.44,9.8,2 +7.4,0.33,0.44,7.6,0.05,40,227,0.99679,3.12,0.52,9,2 +7.2,0.3,0.3,8.1,0.05,40,188,0.99652,3.15,0.49,9.1,3 +7.4,0.34,0.3,14.9,0.037,70,169,0.99698,3.25,0.37,10.4,3 +6.1,0.16,0.29,6,0.03,29,144,0.99474,3.68,0.46,10.7,3 +6.3,0.1,0.24,6,0.039,25,107,0.99511,3.59,0.49,10.5,4 +6.2,0.45,0.73,7.2,0.099,47,202,0.99582,3.21,0.43,9.2,2 +6,0.33,0.18,3,0.036,5,85,0.99125,3.28,0.4,11.5,1 +7.6,0.48,0.37,1.2,0.034,5,57,0.99256,3.05,0.54,10.4,0 +7.2,0.2,0.3,2,0.039,43,188,0.9911,3.3,0.41,12,3 +7,0.32,0.29,4.9,0.036,41,150,0.99168,3.38,0.43,12.2,3 +7.2,0.2,0.3,2,0.039,43,188,0.9911,3.3,0.41,12,3 +7,0.22,0.29,8.9,0.05,24,90,0.99556,3.29,0.46,9.8,3 +9.4,0.23,0.56,16.45,0.063,52.5,282,1.00098,3.1,0.51,9.3,2 +6.4,0.27,0.19,2,0.084,21,191,0.99516,3.49,0.63,9.6,1 +6.4,0.27,0.19,1.9,0.085,21,196,0.99516,3.49,0.64,9.5,1 +7,0.23,0.42,5.1,0.042,37,144,0.99518,3.5,0.59,10.2,3 +6.9,0.15,0.28,4.4,0.029,14,107,0.99347,3.24,0.46,10.4,5 +6.7,0.26,0.29,5.8,0.025,26,74,0.9929,3.28,0.53,11,3 +6.9,0.15,0.28,4.4,0.029,14,107,0.99347,3.24,0.46,10.4,5 +7.6,0.2,0.68,12.9,0.042,56,160,0.99841,3.05,0.41,8.7,2 +6.9,0.3,0.29,1.3,0.053,24,189,0.99362,3.29,0.54,9.9,1 +6.9,0.3,0.3,1.3,0.053,24,186,0.99361,3.29,0.54,9.9,1 +7.6,0.21,0.35,1.2,0.041,7,106,0.9914,3.06,0.45,11.3,1 +6.8,0.46,0.26,2.7,0.042,28,83,0.99114,3.38,0.51,12,5 +7,0.28,0.26,1.7,0.042,34,130,0.9925,3.43,0.5,10.7,5 +6.5,0.24,0.29,8.2,0.043,32,156,0.99453,3.13,0.7,10.1,3 +6.4,0.17,0.34,1.5,0.091,42,135,0.9938,3.25,0.49,9.6,4 +6.4,0.17,0.34,1.5,0.093,43,136,0.9938,3.25,0.49,9.6,3 +6.3,0.695,0.55,12.9,0.056,58,252,0.99806,3.29,0.49,8.7,2 +7,0.27,0.29,3.9,0.059,28,199,0.9961,3.54,0.59,10.3,2 +8.4,0.3,0.25,17.75,0.047,25,218,1.00016,2.98,0.66,9.1,2 +6.5,0.19,0.27,4.9,0.037,13,101,0.9916,3.17,0.41,11.8,3 +8,0.36,0.39,1.6,0.024,26,93,0.99116,3.15,0.49,11.9,3 +6.1,0.16,0.24,1.4,0.046,17,77,0.99319,3.66,0.57,10.3,3 +9.2,0.19,0.42,2,0.047,16,104,0.99517,3.09,0.66,10,1 +9.2,0.16,0.49,2,0.044,18,107,0.99514,3.1,0.53,10.2,1 +8,0.26,0.28,8.2,0.038,72,202,0.99566,3.12,0.56,10,3 +8.8,0.33,0.36,2.1,0.034,19,125,0.99166,2.96,0.98,12.7,3 +9.8,0.16,0.46,1.8,0.046,23,130,0.99587,3.04,0.67,9.6,2 +6.6,0.23,0.18,8.5,0.044,59,188,0.99558,3.16,0.49,9.5,2 +7.9,0.44,0.26,4.45,0.033,23,100,0.99117,3.17,0.52,12.7,3 +7.6,0.31,0.27,5.8,0.036,23,109,0.99399,3.34,0.54,11,3 +7.5,0.705,0.1,13,0.044,44,214,0.99741,3.1,0.5,9.1,2 +7.1,0.21,0.28,2.7,0.034,23,111,0.99405,3.35,0.64,10.2,1 +7,0.16,0.26,7.3,0.047,30,220,0.99622,3.38,0.58,10.1,3 +8,0.27,0.25,19.1,0.045,50,208,1.00051,3.05,0.5,9.2,3 +6.3,0.38,0.17,8.8,0.08,50,212,0.99803,3.47,0.66,9.4,1 +7.1,0.21,0.28,2.7,0.034,23,111,0.99405,3.35,0.64,10.2,1 +6.2,0.38,0.18,7.4,0.095,28,195,0.99773,3.53,0.71,9.2,1 +8.2,0.24,0.3,2.3,0.05,23,106,0.99397,2.98,0.5,10,2 +7,0.16,0.26,6.85,0.047,30,220,0.99622,3.38,0.58,10.1,3 +7.3,0.815,0.09,11.4,0.044,45,204,0.99713,3.15,0.46,9,2 +6.3,0.41,0.16,0.9,0.032,25,98,0.99274,3.16,0.42,9.5,2 +6.1,0.36,0.41,19.35,0.07,67,207,1.00118,3.39,0.53,9.1,2 +8.1,0.4,0.32,7.9,0.031,23,118,0.99176,3.05,0.46,13.3,4 +6.8,0.26,0.43,11.75,0.045,53,198,0.9969,3.26,0.55,9.5,2 +6.2,0.44,0.18,7.7,0.096,28,210,0.99771,3.56,0.72,9.2,2 +7.2,0.24,0.29,3,0.036,17,117,0.99411,3.36,0.68,10.1,3 +6.2,0.44,0.18,7.7,0.096,28,210,0.99771,3.56,0.72,9.2,2 +7.2,0.24,0.29,3,0.036,17,117,0.99411,3.36,0.68,10.1,3 +7.3,0.22,0.26,1.5,0.04,32,172,0.99194,3.27,0.48,11.2,3 +8.1,0.34,0.28,7.5,0.04,70,230,0.99558,3.14,0.55,9.8,3 +7.3,0.22,0.26,1.5,0.04,32,172,0.99194,3.27,0.48,11.2,3 +8.1,0.34,0.28,7.5,0.04,70,230,0.99558,3.14,0.55,9.8,3 +6.4,0.28,0.17,8.3,0.042,61,195,0.99577,3.22,0.46,9.4,2 +6.3,0.29,0.14,7.05,0.045,50,177,0.99564,3.23,0.42,9,2 +6.4,0.27,0.17,8.4,0.044,60,198,0.99578,3.21,0.47,9.4,2 +7.4,0.35,0.2,13.9,0.054,63,229,0.99888,3.11,0.5,8.9,3 +8.3,0.28,0.27,17.5,0.045,48,253,1.00014,3.02,0.56,9.1,3 +6.4,0.35,0.35,5.6,0.034,9,148,0.99441,3.17,0.5,9.8,1 +6.9,0.43,0.28,9.4,0.056,29,183,0.99594,3.17,0.43,9.4,2 +8,0.26,0.28,4.8,0.05,34,150,0.99437,3.13,0.5,10,3 +6.9,0.43,0.28,9.4,0.056,29,183,0.99594,3.17,0.43,9.4,2 +7.3,0.27,0.37,9.7,0.042,36,130,0.9979,3.48,0.75,9.9,3 +6.8,0.46,0.26,6.3,0.147,49,159,0.99434,3.14,0.47,10,2 +7.2,0.2,0.28,1.6,0.028,13,168,0.99203,3.17,1.06,11.5,3 +7.6,0.285,0.32,14.6,0.063,32,201,0.998,3,0.45,9.2,2 +6.6,0.32,0.33,2.5,0.052,40,219.5,0.99316,3.15,0.6,10,2 +7.6,0.285,0.32,14.6,0.063,32,201,0.998,3,0.45,9.2,2 +6.6,0.34,0.34,2.6,0.051,40.5,210,0.99314,3.15,0.61,10,2 +6.6,0.32,0.33,2.5,0.052,40,210,0.99316,3.15,0.6,10,2 +6.5,0.27,0.26,8.2,0.042,21,133,0.99612,3.43,0.64,9.8,3 +6.6,0.26,0.27,1.5,0.04,19,114,0.99295,3.36,0.62,10.5,3 +6.7,0.27,0.26,2.3,0.043,61,181,0.99394,3.45,0.63,10.6,3 +6.6,0.56,0.15,10,0.037,38,157,0.99642,3.28,0.52,9.4,2 +6.6,0.56,0.15,10,0.037,38,157,0.99642,3.28,0.52,9.4,2 +7.3,0.19,0.27,1.6,0.027,35,136,0.99248,3.38,0.54,11,4 +6.3,0.2,0.26,1.6,0.027,36,141,0.99268,3.53,0.56,10.8,3 +7.1,0.29,0.3,16,0.036,58,201,0.99954,3.3,0.67,9,2 +7.8,0.32,0.33,10.4,0.031,47,194,0.99692,3.07,0.58,9.6,3 +8.1,0.33,0.36,7.4,0.037,36,156,0.99592,3.19,0.54,10.6,3 +8.1,0.33,0.36,7.4,0.037,36,156,0.99592,3.19,0.54,10.6,3 +7.8,0.32,0.33,10.4,0.031,47,194,0.99692,3.07,0.58,9.6,3 +6.6,0.33,0.24,16.05,0.045,31,147,0.99822,3.08,0.52,9.2,2 +6.6,0.33,0.24,16.05,0.045,31,147,0.99822,3.08,0.52,9.2,2 +8.2,0.26,0.33,2.6,0.053,11,71,0.99402,2.89,0.49,9.5,2 +8.3,0.25,0.33,2.5,0.053,12,72,0.99404,2.89,0.48,9.5,2 +7,0.26,0.26,10.8,0.039,37,184,0.99787,3.47,0.58,10.3,4 +6,0.26,0.15,1.2,0.053,35,124,0.99347,3.08,0.46,8.8,2 +7.5,0.28,0.78,12.1,0.041,53,161,0.99838,2.98,0.44,8.7,2 +7.5,0.27,0.79,11.95,0.04,51,159,0.99839,2.98,0.44,8.7,2 +7,0.28,0.32,1.7,0.038,27,128,0.99375,3.2,0.62,10.2,3 +5.2,0.16,0.34,0.8,0.029,26,77,0.99155,3.25,0.51,10.1,3 +6.8,0.34,0.1,1.4,0.049,29,118,0.9936,3.21,0.41,9.5,2 +7.6,0.25,0.34,1.3,0.056,34,176,0.99434,3.1,0.51,9.5,2 +5.6,0.35,0.4,6.3,0.022,23,174,0.9922,3.54,0.5,11.6,4 +8.8,0.24,0.23,10.3,0.032,12,97,0.99571,3.13,0.4,10.7,3 +6,0.29,0.21,15.55,0.043,20,142,0.99658,3.11,0.54,10.1,3 +6.1,0.27,0.31,1.5,0.035,17,83,0.99076,3.32,0.44,11.1,4 +7.4,0.56,0.09,1.5,0.071,19,117,0.99496,3.22,0.53,9.8,2 +6.8,0.29,0.49,1.4,0.142,52,148,0.9937,3.08,0.49,9,3 +6.1,0.27,0.31,1.5,0.035,17,83,0.99076,3.32,0.44,11.1,4 +6.3,0.27,0.37,7.9,0.047,58,215,0.99542,3.19,0.48,9.5,3 +6.6,0.24,0.3,13,0.052,18,143,0.99825,3.37,0.49,9.4,3 +6.8,0.32,0.3,1,0.049,22,113,0.99289,3.24,0.61,10.2,2 +6.4,0.37,0.37,4.85,0.041,39.5,216.5,0.99432,3.1,0.5,9.8,3 +6.2,0.26,0.37,7.1,0.047,54,201,0.99523,3.19,0.48,9.5,3 +6.3,0.27,0.37,7.9,0.047,58,215,0.99542,3.19,0.48,9.5,3 +6.4,0.3,0.16,7.5,0.05,55,191,0.9959,3.17,0.49,9,2 +8,0.28,0.32,7.6,0.045,61,204,0.99543,3.1,0.55,10.1,3 +6.7,0.24,0.32,10.3,0.079,37,122,0.99662,3.02,0.45,8.8,2 +7.9,0.27,0.27,1.7,0.034,25,122,0.99088,2.97,0.51,11.9,3 +7.9,0.27,0.27,1.7,0.034,25,122,0.99088,2.97,0.51,11.9,3 +6.1,0.28,0.24,19.95,0.074,32,174,0.99922,3.19,0.44,9.3,3 +7.7,0.39,0.49,7.7,0.036,11,110,0.9966,3.33,0.76,10,3 +6,0.2,0.24,5.3,0.075,49,201,0.99466,3.21,0.43,9.5,2 +6.1,0.28,0.24,19.95,0.074,32,174,0.99922,3.19,0.44,9.3,3 +7.6,0.31,0.23,12.7,0.054,20,139,0.99836,3.16,0.5,9.7,1 +7.6,0.31,0.23,12.7,0.054,20,139,0.99836,3.16,0.5,9.7,1 +6.3,0.18,0.22,1.5,0.043,45,155,0.99238,3.19,0.48,10.2,2 +8.6,0.23,0.25,11.3,0.031,13,96,0.99645,3.11,0.4,10.8,2 +6.8,0.21,0.36,18.1,0.046,32,133,1,3.27,0.48,8.8,2 +6.8,0.21,0.36,18.1,0.046,32,133,1,3.27,0.48,8.8,2 +6.9,0.26,0.31,7,0.039,37,175,0.99376,3.32,0.49,11.4,3 +6.8,0.21,0.36,18.1,0.046,32,133,1,3.27,0.48,8.8,2 +6.4,0.31,0.4,6.4,0.039,39,191,0.99513,3.14,0.52,9.8,2 +8.6,0.34,0.36,1.4,0.045,11,119,0.99556,3.17,0.47,9.4,1 +8.6,0.34,0.36,1.4,0.045,11,119,0.99556,3.17,0.47,9.4,1 +8.5,0.3,0.28,3.1,0.054,54,174,0.99543,3.21,0.43,9.4,3 +7.4,0.4,0.41,14.1,0.053,37,194,0.99886,3.2,0.63,9.4,3 +6.6,0.32,0.34,7.7,0.044,63,212,0.99526,3.22,0.48,9.7,3 +7.1,0.34,0.31,5.2,0.032,36,140,0.99166,3.35,0.47,12.3,4 +6.6,0.26,0.25,11.6,0.045,45,178,0.99691,3.33,0.43,9.8,3 +8,0.27,0.57,10.4,0.053,18,134,0.99732,3.12,0.68,9,2 +6.2,0.28,0.45,7.5,0.045,46,203,0.99573,3.26,0.46,9.2,3 +6.2,0.3,0.49,11.2,0.058,68,215,0.99656,3.19,0.6,9.4,3 +5.6,0.175,0.29,0.8,0.043,20,67,0.99112,3.28,0.48,9.9,3 +6.9,0.34,0.36,1.4,0.032,13,145,0.99214,3.07,0.52,9.8,2 +6.9,0.34,0.3,4.7,0.029,34,148,0.99165,3.36,0.49,12.3,4 +7.1,0.12,0.3,3.1,0.018,15,37,0.99004,3.02,0.52,11.9,4 +7.1,0.32,0.29,4,0.038,33,170,0.99463,3.27,0.64,10.2,3 +7.3,0.51,0.29,11.3,0.034,61,224,0.99683,3.14,0.56,9.5,3 +7.1,0.12,0.3,3.1,0.018,15,37,0.99004,3.02,0.52,11.9,4 +6.3,0.24,0.55,8.1,0.04,67,216,0.99596,3.24,0.5,9.2,2 +7.5,0.41,0.23,14.8,0.054,28,174,0.99898,3.18,0.49,9.7,2 +6.5,0.18,0.33,1.4,0.029,35,138,0.99114,3.36,0.6,11.5,4 +7.3,0.17,0.24,8.1,0.121,32,162,0.99508,3.17,0.38,10.4,5 +8.2,0.2,0.38,3.5,0.053,41,174,0.99306,3.22,0.41,11.6,2 +7.5,0.41,0.23,14.8,0.054,28,174,0.99898,3.18,0.49,9.7,2 +7.3,0.17,0.24,8.1,0.121,32,162,0.99508,3.17,0.38,10.4,5 +6.5,0.18,0.33,1.4,0.029,35,138,0.99114,3.36,0.6,11.5,4 +7.3,0.16,0.35,1.5,0.036,29,108,0.99342,3.27,0.51,10.2,3 +6.4,0.16,0.37,1.5,0.037,27,109,0.99345,3.38,0.5,9.8,3 +6.6,0.42,0.13,12.8,0.044,26,158,0.99772,3.24,0.47,9,2 +5.8,0.3,0.12,1.6,0.036,57,163,0.99239,3.38,0.59,10.5,3 +6.7,0.54,0.27,7.1,0.049,8,178,0.99502,3.16,0.38,9.4,1 +6.7,0.54,0.27,7.1,0.049,8,178,0.99502,3.16,0.38,9.4,1 +6.4,0.22,0.3,11.2,0.046,53,149,0.99479,3.21,0.34,10.8,2 +6.8,0.23,0.3,1.7,0.043,19,95,0.99207,3.17,0.46,10.7,4 +9,0.26,0.34,6.7,0.029,21,162,0.99497,3.08,0.5,10.6,3 +6.5,0.23,0.25,17.3,0.046,15,110,0.99828,3.15,0.42,9.2,3 +5.9,0.28,0.14,8.6,0.032,30,142,0.99542,3.28,0.44,9.5,3 +5.9,0.28,0.14,8.6,0.032,30,142,0.99542,3.28,0.44,9.5,3 +6.2,0.27,0.18,1.5,0.028,20,111,0.99228,3.41,0.5,10,2 +9,0.29,0.34,12.1,0.03,34,177,0.99706,3.13,0.47,10.6,2 +9,0.26,0.34,6.7,0.029,21,162,0.99497,3.08,0.5,10.6,3 +8.9,0.27,0.34,10.7,0.029,19.5,166,0.99669,3.13,0.48,10.6,2 +6.5,0.23,0.25,17.3,0.046,15,110,0.99828,3.15,0.42,9.2,3 +6.9,0.32,0.3,1.8,0.036,28,117,0.99269,3.24,0.48,11,3 +7.2,0.22,0.24,1.4,0.041,17,159,0.99196,3.25,0.53,11.2,3 +6.7,0.5,0.38,7.5,0.046,26,175,0.99662,3.32,0.54,9.6,2 +6.2,0.33,0.14,4.8,0.052,27,128,0.99475,3.21,0.48,9.4,2 +6.3,0.26,0.42,7.1,0.045,62,209,0.99544,3.2,0.53,9.5,3 +7.5,0.2,0.47,16.9,0.052,51,188,0.99944,3.09,0.62,9.3,2 +6.2,0.33,0.14,4.8,0.052,27,128,0.99475,3.21,0.48,9.4,2 +6.3,0.26,0.42,7.1,0.045,62,209,0.99544,3.2,0.53,9.5,3 +6.6,0.36,0.52,11.3,0.046,8,110,0.9966,3.07,0.46,9.4,2 +6.3,0.13,0.42,1.1,0.043,63,146,0.99066,3.13,0.72,11.2,4 +6.4,0.15,0.44,1.2,0.043,67,150,0.9907,3.14,0.73,11.2,4 +6.3,0.13,0.42,1.1,0.043,63,146,0.99066,3.13,0.72,11.2,4 +7.6,0.23,0.64,12.9,0.033,54,170,0.998,3,0.53,8.8,2 +6.4,0.15,0.44,1.2,0.043,67,150,0.9907,3.14,0.73,11.2,4 +6.3,0.13,0.42,1.1,0.043,63,146,0.99066,3.13,0.72,11.2,4 +5.7,0.255,0.65,1.2,0.079,17,137,0.99307,3.2,0.42,9.4,2 +6.9,0.32,0.26,2.3,0.03,11,103,0.99106,3.06,0.42,11.1,3 +6.9,0.28,0.22,10,0.052,36,131,0.99696,3.08,0.46,9.6,2 +6.9,0.32,0.26,2.3,0.03,11,103,0.99106,3.06,0.42,11.1,3 +5.7,0.255,0.65,1.2,0.079,17,137,0.99307,3.2,0.42,9.4,2 +6.6,0.41,0.16,1.4,0.037,28,160,0.99167,2.95,0.45,10.6,3 +7.3,0.37,0.16,14.9,0.048,59,240,0.99902,3.13,0.45,8.9,2 +6.9,0.21,0.24,1.8,0.021,17,80,0.98992,3.15,0.46,12.3,4 +6.6,0.24,0.28,1.8,0.028,39,132,0.99182,3.34,0.46,11.4,2 +6.8,0.28,0.36,7,0.043,60,207,0.99556,3.16,0.49,9.6,3 +6.6,0.24,0.24,8.6,0.034,25,135,0.99582,3.33,0.59,10.3,3 +6.6,0.24,0.28,1.8,0.028,39,132,0.99182,3.34,0.46,11.4,2 +7,0.16,0.32,1.1,0.032,29,80,0.98972,3.23,0.36,12.1,3 +7,0.14,0.28,1.3,0.026,10,56,0.99352,3.46,0.45,9.9,2 +6.3,0.34,0.36,4.9,0.035,31,185,0.9946,3.15,0.49,9.7,2 +6.8,0.26,0.24,1.9,0.043,70,154,0.99273,3.18,0.52,10.5,2 +6.7,0.17,0.42,10.4,0.038,85,182,0.99628,3.04,0.44,8.9,3 +6.5,0.27,0.4,10,0.039,74,227,0.99582,3.18,0.5,9.4,2 +6.7,0.25,0.36,8.6,0.037,63,206,0.99553,3.18,0.5,9.6,2 +5.8,0.3,0.27,1.7,0.014,45,104,0.98914,3.4,0.56,12.6,4 +6.4,0.28,0.56,1.7,0.156,49,106,0.99354,3.1,0.37,9.2,3 +7.7,0.3,0.26,18.95,0.053,36,174,0.99976,3.2,0.5,10.4,2 +6.8,0.18,0.3,12.8,0.062,19,171,0.99808,3,0.52,9,4 +6.8,0.18,0.3,12.8,0.062,19,171,0.99808,3,0.52,9,4 +6.8,0.18,0.3,12.8,0.062,19,171,0.99808,3,0.52,9,4 +6.8,0.18,0.3,12.8,0.062,19,171,0.99808,3,0.52,9,4 +6.8,0.18,0.3,12.8,0.062,19,171,0.99808,3,0.52,9,4 +6.8,0.18,0.3,12.8,0.062,19,171,0.99808,3,0.52,9,4 +5.1,0.14,0.25,0.7,0.039,15,89,0.9919,3.22,0.43,9.2,3 +6.8,0.18,0.3,12.8,0.062,19,171,0.99808,3,0.52,9,4 +7.2,0.615,0.1,1.4,0.068,25,154,0.99499,3.2,0.48,9.7,1 +6.9,0.13,0.28,13.3,0.05,47,132,0.99655,3.34,0.42,10.1,3 +6.7,0.34,0.3,8.5,0.059,24,152,0.99615,3.46,0.64,11,4 +7.3,0.32,0.29,1.5,0.038,32,144,0.99296,3.2,0.55,10.8,2 +6.3,0.21,0.29,11.7,0.048,49,147,0.99482,3.22,0.38,10.8,2 +5.4,0.5,0.13,5,0.028,12,107,0.99079,3.48,0.88,13.5,4 +8.2,0.52,0.34,1.2,0.042,18,167,0.99366,3.24,0.39,10.6,2 +7.8,0.28,0.31,2.1,0.046,28,208,0.99434,3.23,0.64,9.8,2 +6.4,0.22,0.34,1.4,0.023,56,115,0.98958,3.18,0.7,11.7,3 +7.8,0.28,0.31,2.1,0.046,28,208,0.99434,3.23,0.64,9.8,2 +6.9,0.32,0.27,16,0.034,58,185,0.99938,3.34,0.6,9,3 +6.8,0.11,0.42,1.1,0.042,51,132,0.99059,3.18,0.74,11.3,4 +6.2,0.26,0.32,15.3,0.031,64,185,0.99835,3.31,0.61,9.4,2 +6.4,0.22,0.34,1.4,0.023,56,115,0.98958,3.18,0.7,11.7,3 +6.7,0.3,0.29,2.8,0.025,37,107,0.99159,3.31,0.63,11.3,4 +6.7,0.3,0.29,2.8,0.025,37,107,0.99159,3.31,0.63,11.3,4 +7.1,0.2,0.3,0.9,0.019,4,28,0.98931,3.2,0.36,12,3 +7.2,0.2,0.36,2.5,0.028,22,157,0.9938,3.48,0.49,10.6,3 +8.9,0.26,0.33,8.1,0.024,47,202,0.99558,3.13,0.46,10.8,3 +7.5,0.25,0.32,8.2,0.024,53,209,0.99563,3.12,0.46,10.8,3 +7.1,0.2,0.3,0.9,0.019,4,28,0.98931,3.2,0.36,12,3 +6.3,0.27,0.46,11.1,0.053,44,177,0.99691,3.18,0.67,9.4,2 +6.5,0.3,0.39,7.8,0.038,61,219,0.9959,3.19,0.5,9.4,2 +6.7,0.3,0.29,2.8,0.025,37,107,0.99159,3.31,0.63,11.3,4 +6.6,0.36,0.52,10.1,0.05,29,140,0.99628,3.07,0.4,9.4,2 +6.15,0.21,0.37,3.2,0.021,20,80,0.99076,3.39,0.47,12,2 +6.5,0.18,0.41,14.2,0.039,47,129,0.99678,3.28,0.72,10.3,4 +6.5,0.18,0.41,14.2,0.039,47,129,0.99678,3.28,0.72,10.3,4 +6.5,0.18,0.41,14.2,0.039,47,129,0.99678,3.28,0.72,10.3,4 +6.6,0.26,0.21,2.9,0.026,48,126,0.99089,3.22,0.38,11.3,4 +6.6,0.35,0.35,6,0.063,31,150,0.99537,3.1,0.47,9.4,3 +6.5,0.28,0.28,20.4,0.041,40,144,1.0002,3.14,0.38,8.7,2 +6.6,0.36,0.52,10.1,0.05,29,140,0.99628,3.07,0.4,9.4,2 +6.6,0.26,0.21,2.9,0.026,48,126,0.99089,3.22,0.38,11.3,4 +6.5,0.18,0.41,14.2,0.039,47,129,0.99678,3.28,0.72,10.3,4 +6.15,0.21,0.37,3.2,0.021,20,80,0.99076,3.39,0.47,12,2 +4.5,0.19,0.21,0.95,0.033,89,159,0.99332,3.34,0.42,8,2 +8,0.24,0.26,1.7,0.033,36,136,0.99316,3.44,0.51,10.4,4 +7.8,0.17,0.23,1.7,0.029,39,128,0.99272,3.37,0.41,10.7,4 +7,0.24,0.24,9,0.03,42,219,0.99636,3.47,0.46,10.2,3 +5.8,0.6,0,1.3,0.044,72,197,0.99202,3.56,0.43,10.9,2 +5.9,0.445,0.26,1.4,0.027,23,109,0.99148,3.3,0.36,10.5,3 +6.7,0.28,0.28,2.4,0.012,36,100,0.99064,3.26,0.39,11.7,4 +6.8,0.44,0.2,16,0.065,61,186,0.99884,3.13,0.45,8.6,2 +7.2,0.24,0.27,11.4,0.034,40,174,0.99773,3.2,0.44,9,2 +8.7,0.31,0.73,14.35,0.044,27,191,1.00013,2.96,0.88,8.7,2 +8.2,0.32,0.26,2.1,0.062,26,87,0.98974,3.1,0.47,12.8,3 +7.2,0.24,0.27,11.4,0.034,40,174,0.99773,3.2,0.44,9,2 +8.7,0.31,0.73,14.35,0.044,27,191,1.00013,2.96,0.88,8.7,2 +7.5,0.13,0.38,1.1,0.023,42,104,0.99112,3.28,0.53,11.8,3 +9.2,0.14,0.37,1.1,0.034,36,84,0.99136,3.05,0.55,11.6,3 +7.4,0.2,0.37,1.2,0.028,28,89,0.99132,3.14,0.61,11.8,3 +6.1,0.15,0.35,15.8,0.042,55,158,0.99642,3.24,0.37,10.6,2 +7.6,0.23,0.4,5.2,0.066,14,91,0.99488,3.17,0.8,9.7,2 +8.1,0.33,0.22,5.2,0.047,24,151,0.99527,3.22,0.47,10.3,2 +7.15,0.17,0.24,9.6,0.119,56,178,0.99578,3.15,0.44,10.2,3 +6.7,0.12,0.3,5.2,0.048,38,113,0.99352,3.33,0.44,10.1,4 +5.7,0.18,0.36,1.2,0.046,9,71,0.99199,3.7,0.68,10.9,4 +5.8,0.15,0.28,0.8,0.037,43,127,0.99198,3.24,0.51,9.3,2 +6.6,0.23,0.29,14.45,0.057,29,144,0.99756,3.33,0.54,10.2,3 +7.15,0.17,0.24,9.6,0.119,56,178,0.99578,3.15,0.44,10.2,3 +7,0.34,0.39,6.9,0.066,43,162,0.99561,3.11,0.53,9.5,2 +6.4,0.68,0.26,3.4,0.069,25,146,0.99347,3.18,0.4,9.3,2 +7.3,0.22,0.31,2.3,0.018,45,80,0.98936,3.06,0.34,12.9,4 +6.4,0.28,0.27,11,0.042,45,148,0.99786,3.14,0.46,8.7,2 +6.9,0.4,0.22,5.95,0.081,76,303,0.99705,3.4,0.57,9.4,2 +6.8,0.19,0.23,5.1,0.034,71,204,0.9942,3.23,0.69,10.1,2 +7.1,0.23,0.24,5.4,0.039,60,196,0.9948,3.19,0.78,10,1 +6.45,0.14,0.42,1.2,0.05,51,129,0.99116,3.27,0.69,11.1,4 +6.5,0.15,0.44,12.6,0.052,65,158,0.99688,3.26,0.7,10.3,4 +7.1,0.15,0.34,1,0.033,27,73,0.98974,3.24,0.41,12.2,3 +6.7,0.33,0.34,6.6,0.067,35,156,0.99542,3.11,0.48,9.3,3 +7.2,0.3,0.26,1.5,0.041,46,178,0.99154,3.19,0.56,11.3,3 +7,0.23,0.33,1,0.043,46,110,0.99118,3.04,0.65,10.8,3 +8,0.13,0.25,1.1,0.033,15,86,0.99044,2.98,0.39,11.2,5 +6.2,0.21,0.34,6.6,0.03,36,91,0.9914,3.32,0.45,12.5,4 +8.3,0.4,0.41,8.2,0.05,15,122,0.9979,3.39,0.49,9.3,2 +5.9,0.34,0.31,2,0.03,38,142,0.98892,3.4,0.41,12.9,4 +6.6,0.12,0.25,1.4,0.039,21,131,0.99114,3.2,0.45,11.2,4 +9.6,0.655,0.21,2,0.039,21,120,0.99188,3,1,12.6,3 +6.8,0.26,0.4,7.5,0.046,45,179,0.99583,3.2,0.49,9.3,2 +5.9,0.34,0.31,2,0.03,38,142,0.98892,3.4,0.41,12.9,4 +5.9,0.3,0.3,2,0.03,38,142,0.98892,3.41,0.41,12.9,4 +7,0.15,0.3,13.3,0.049,46,120,0.99704,3.2,0.36,9.5,4 +7.9,0.37,0.31,2.85,0.037,5,24,0.9911,3.19,0.36,11.9,3 +7.2,0.35,0.25,5.6,0.032,23,120,0.99334,2.93,0.66,10.3,4 +7.2,0.32,0.24,5.6,0.033,23,120,0.99334,2.92,0.66,10.3,4 +7.6,0.1,0.33,1,0.031,33,93,0.99094,3.06,0.68,11.2,3 +6.2,0.25,0.31,3.2,0.03,32,150,0.99014,3.18,0.31,12,3 +7.1,0.31,0.17,1,0.042,21,144,0.99304,3.13,0.4,9.6,2 +7.6,0.18,0.28,7.1,0.041,29,110,0.99652,3.2,0.42,9.2,3 +8,0.17,0.29,2.4,0.029,52,119,0.98944,3.03,0.33,12.9,3 +7.2,0.19,0.27,11.2,0.061,46,149,0.99772,2.99,0.59,9.3,3 +7.6,0.32,0.25,9.5,0.03,15,136,0.99367,3.1,0.44,12.1,3 +7.1,0.31,0.17,1,0.042,21,144,0.99304,3.13,0.4,9.6,2 +6.6,0.21,0.29,1.8,0.026,35,128,0.99183,3.37,0.48,11.2,3 +7,0.16,0.36,2.6,0.029,28,98,0.99126,3.11,0.37,11.2,4 +8,0.17,0.29,2.4,0.029,52,119,0.98944,3.03,0.33,12.9,3 +6.6,0.24,0.38,8,0.042,56,187,0.99577,3.21,0.46,9.2,2 +7.2,0.19,0.27,11.2,0.061,46,149,0.99772,2.99,0.59,9.3,3 +7.6,0.18,0.28,7.1,0.041,29,110,0.99652,3.2,0.42,9.2,3 +6.9,0.3,0.25,3.3,0.041,26,124,0.99428,3.18,0.5,9.3,3 +6.2,0.28,0.27,10.3,0.03,26,108,0.99388,3.2,0.36,10.7,3 +6.9,0.31,0.32,1.2,0.024,20,166,0.99208,3.05,0.54,9.8,3 +6.7,0.23,0.25,1.6,0.036,28,143,0.99256,3.3,0.54,10.3,3 +6.2,0.28,0.27,10.3,0.03,26,108,0.99388,3.2,0.36,10.7,3 +5.7,0.23,0.28,9.65,0.025,26,121,0.9925,3.28,0.38,11.3,3 +6.5,0.22,0.5,16.4,0.048,36,182,0.99904,3.02,0.49,8.8,3 +7,0.18,0.37,1.5,0.043,16,104,0.99216,3.18,0.5,10.8,2 +6.9,0.31,0.32,1.2,0.024,20,166,0.99208,3.05,0.54,9.8,3 +6.9,0.3,0.25,3.3,0.041,26,124,0.99428,3.18,0.5,9.3,3 +6.5,0.46,0.31,5,0.027,15,72,0.99165,3.26,0.6,11.5,4 +6.5,0.23,0.36,16.3,0.038,43,133,0.99924,3.26,0.41,8.8,2 +6.5,0.23,0.36,16.3,0.038,43,133,0.99924,3.26,0.41,8.8,2 +6.5,0.23,0.36,16.3,0.038,43,133,0.99924,3.26,0.41,8.8,2 +6.6,0.26,0.38,6.5,0.17,68,201,0.9956,3.19,0.38,9.4,3 +6.7,0.26,0.39,6.4,0.171,64,200,0.99562,3.19,0.38,9.4,3 +7.5,0.28,0.39,10.2,0.045,59,209,0.9972,3.16,0.63,9.6,3 +6.5,0.23,0.36,16.3,0.038,43,133,0.99924,3.26,0.41,8.8,2 +6.8,0.23,0.42,7.4,0.044,56,189,0.9958,3.22,0.48,9.3,3 +7.8,0.25,0.34,13.7,0.044,66,184,0.99976,3.22,0.75,8.9,2 +7.8,0.25,0.34,13.7,0.044,66,184,0.99976,3.22,0.75,8.9,2 +5.6,0.2,0.22,1.3,0.049,25,155,0.99296,3.74,0.43,10,2 +6.4,0.21,0.44,7.4,0.045,47,182,0.9957,3.24,0.46,9.1,2 +6.8,0.23,0.42,7.4,0.044,56,189,0.9958,3.22,0.48,9.3,3 +6.8,0.24,0.37,7.45,0.043,59,188,0.99579,3.2,0.5,9.4,3 +7.8,0.25,0.28,7.2,0.04,46,179,0.99541,3.14,0.6,10.1,3 +7.8,0.25,0.34,13.7,0.044,66,184,0.99976,3.22,0.75,8.9,2 +6.8,0.16,0.29,10.4,0.046,59,143,0.99518,3.2,0.4,10.8,3 +5.2,0.28,0.29,1.1,0.028,18,69,0.99168,3.24,0.54,10,3 +7.5,0.18,0.31,6.5,0.029,53,160,0.99276,3.03,0.38,10.9,3 +7.5,0.26,0.3,4.6,0.027,29,92,0.99085,3.15,0.38,12,4 +8.2,0.37,0.64,13.9,0.043,22,171,0.99873,2.99,0.8,9.3,2 +7.6,0.4,0.27,5.2,0.03,32,101,0.99172,3.22,0.62,12.3,4 +7.5,0.26,0.25,1.7,0.038,29,129,0.99312,3.45,0.56,10.4,3 +7.5,0.18,0.31,6.5,0.029,53,160,0.99276,3.03,0.38,10.9,3 +6.9,0.23,0.32,16.4,0.045,62,153,0.9972,3.22,0.42,10.5,2 +5.3,0.2,0.31,3.6,0.036,22,91,0.99278,3.41,0.5,9.8,3 +6.5,0.17,0.31,1.5,0.041,34,121,0.99092,3.06,0.46,10.5,3 +6.5,0.35,0.28,12.4,0.051,86,213,0.9962,3.16,0.51,9.9,3 +6.5,0.29,0.31,1.7,0.035,24,79,0.99053,3.27,0.69,11.4,4 +6.8,0.3,0.22,6.2,0.06,41,190,0.99858,3.18,0.51,9.2,2 +7.9,0.51,0.36,6.2,0.051,30,173,0.9984,3.09,0.53,9.7,2 +7.9,0.51,0.34,2.6,0.049,13,135,0.99335,3.09,0.51,10,2 +6.5,0.29,0.31,1.7,0.035,24,79,0.99053,3.27,0.69,11.4,4 +7.1,0.29,0.28,9.3,0.048,50,141,0.9949,3.13,0.49,10.3,3 +6.5,0.35,0.28,12.4,0.051,86,213,0.9962,3.16,0.51,9.9,3 +6.5,0.17,0.31,1.5,0.041,34,121,0.99092,3.06,0.46,10.5,3 +7.4,0.2,0.28,9.1,0.047,29,95,0.99532,3.16,0.47,9.8,4 +6.9,0.615,0.42,12,0.067,24,131,0.99727,3.19,0.34,9.3,2 +6.8,0.32,0.28,4.8,0.034,25,100,0.99026,3.08,0.47,12.4,4 +6.3,0.2,0.19,12.3,0.048,54,145,0.99668,3.16,0.42,9.3,3 +6.9,0.615,0.42,12,0.067,24,131,0.99727,3.19,0.34,9.3,2 +8,0.23,0.28,2.7,0.048,49,165,0.9952,3.26,0.72,9.5,3 +6.7,0.27,0.33,3.6,0.034,9,45,0.99144,3.08,0.4,10.5,3 +6.7,0.27,0.33,3.6,0.034,9,45,0.99144,3.08,0.4,10.5,3 +6.7,0.44,0.22,4.3,0.032,19,99,0.99015,3.26,0.53,12.8,4 +7,0.34,0.3,1.8,0.045,44,142,0.9914,2.99,0.45,10.8,3 +7.3,0.26,0.33,11.8,0.057,48,127,0.99693,3.1,0.55,10,3 +5.8,0.17,0.34,1.8,0.045,96,170,0.99035,3.38,0.9,11.8,5 +7.3,0.26,0.33,11.8,0.057,48,127,0.99693,3.1,0.55,10,3 +5.8,0.17,0.34,1.8,0.045,96,170,0.99035,3.38,0.9,11.8,5 +6.8,0.17,0.36,1.4,0.036,38,108,0.99006,3.19,0.66,12,3 +7.1,0.43,0.3,6.6,0.025,15,138,0.99126,3.18,0.46,12.6,3 +5.8,0.315,0.27,1.55,0.026,15,70,0.98994,3.37,0.4,11.9,5 +5.9,0.17,0.28,0.7,0.027,5,28,0.98985,3.13,0.32,10.6,2 +6.6,0.34,0.18,6.4,0.082,47,240,0.9971,3.42,0.48,9.2,2 +8.6,0.33,0.34,11.8,0.059,42,240,0.99882,3.17,0.52,10,3 +5.6,0.12,0.26,4.3,0.038,18,97,0.99477,3.36,0.46,9.2,2 +5.8,0.13,0.26,5.1,0.039,19,103,0.99478,3.36,0.47,9.3,3 +7.7,0.18,0.35,5.8,0.055,25,144,0.99576,3.24,0.54,10.2,3 +7.7,0.16,0.36,5.9,0.054,25,148,0.99578,3.25,0.54,10.2,3 +6,0.26,0.15,1.3,0.06,51,154,0.99354,3.14,0.51,8.7,2 +7.3,0.32,0.35,1.4,0.05,8,163,0.99244,3.24,0.42,10.7,2 +7.7,0.3,0.34,1.2,0.048,4,119,0.99084,3.18,0.34,12.1,3 +7.9,0.16,0.3,7.4,0.05,58,152,0.99612,3.12,0.37,9.5,3 +6.4,0.27,0.29,10.8,0.028,17,118,0.99356,3.18,0.37,11.2,3 +6.9,0.16,0.37,1.8,0.034,36,95,0.98952,2.93,0.59,12,3 +7.9,0.16,0.3,7.4,0.05,58,152,0.99612,3.12,0.37,9.5,3 +7.7,0.3,0.34,1.2,0.048,4,119,0.99084,3.18,0.34,12.1,3 +7.3,0.32,0.35,1.4,0.05,8,163,0.99244,3.24,0.42,10.7,2 +6.4,0.44,0.44,14.4,0.048,29,228,0.99955,3.26,0.54,8.8,4 +6.3,0.2,0.24,1.7,0.052,36,135,0.99374,3.8,0.66,10.8,3 +6.2,0.29,0.32,3.6,0.026,39,138,0.9892,3.31,0.37,13.1,4 +7.6,0.39,0.32,3.6,0.035,22,93,0.99144,3.08,0.6,12.5,4 +7,0.36,0.32,10.05,0.045,37,131,0.99352,3.09,0.33,11.7,5 +7,0.36,0.32,10.05,0.045,37,131,0.99352,3.09,0.33,11.7,5 +7,0.36,0.32,10.5,0.045,35,135,0.9935,3.09,0.33,11.6,5 +7.6,0.2,0.36,1.9,0.043,24,111,0.99237,3.29,0.54,11.3,3 +7.6,0.39,0.32,3.6,0.035,22,93,0.99144,3.08,0.6,12.5,4 +6.7,0.2,0.37,1.65,0.025,42,103,0.99022,3.11,0.45,11.4,2 +6.2,0.235,0.34,1.9,0.036,4,117,0.99032,3.4,0.44,12.2,2 +7.8,0.965,0.6,65.8,0.074,8,160,1.03898,3.39,0.69,11.7,3 +7.1,0.2,0.31,6.85,0.053,32,211,0.99587,3.31,0.59,10.4,3 +7.1,0.2,0.31,7.4,0.053,32,211,0.99587,3.31,0.59,10.4,3 +7.1,0.2,0.31,7.4,0.053,32,211,0.99587,3.31,0.59,10.4,3 +6.4,0.24,0.25,20.2,0.083,35,157,0.99976,3.17,0.5,9.1,2 +8,0.3,0.36,11,0.034,8,70,0.99354,3.05,0.41,12.2,3 +6.4,0.24,0.25,20.2,0.083,35,157,0.99976,3.17,0.5,9.1,2 +6.9,0.4,0.42,6.2,0.066,41,176,0.99552,3.12,0.54,9.4,2 +6.9,0.4,0.43,6.2,0.065,42,178,0.99552,3.11,0.53,9.4,2 +7.1,0.2,0.31,6.85,0.053,32,211,0.99587,3.31,0.59,10.4,3 +6.6,0.25,0.51,8,0.047,61,189,0.99604,3.22,0.49,9.2,2 +6.8,0.26,0.44,8.2,0.046,52,183,0.99584,3.2,0.51,9.4,2 +6.5,0.37,0.3,2.2,0.033,39,107,0.98894,3.22,0.53,13.5,4 +6.8,0.35,0.53,10.1,0.053,37,151,0.9963,3.07,0.4,9.4,2 +6.4,0.22,0.32,7.2,0.028,15,83,0.993,3.13,0.55,10.9,5 +6.5,0.37,0.3,2.2,0.033,39,107,0.98894,3.22,0.53,13.5,4 +6.8,0.35,0.53,10.1,0.053,37,151,0.9963,3.07,0.4,9.4,2 +6.9,0.31,0.32,1.6,0.036,34,114,0.99068,3.19,0.45,11.4,4 +6.7,0.16,0.37,1.3,0.036,45,125,0.98964,3.19,0.51,12.4,4 +6.6,0.25,0.51,8,0.047,61,189,0.99604,3.22,0.49,9.2,2 +6.8,0.26,0.44,8.2,0.046,52,183,0.99584,3.2,0.51,9.4,2 +5.6,0.15,0.31,5.3,0.038,8,79,0.9923,3.3,0.39,10.5,3 +5.5,0.15,0.32,14,0.031,16,99,0.99437,3.26,0.38,11.5,5 +6.4,0.22,0.32,7.2,0.028,15,83,0.993,3.13,0.55,10.9,5 +7.3,0.2,0.26,1.6,0.04,36,123,0.99238,3.34,0.44,10.8,3 +7.5,0.17,0.71,11.8,0.038,52,148,0.99801,3.03,0.46,8.9,2 +7.5,0.18,0.72,9.6,0.039,53,151,0.99802,3.03,0.46,8.9,2 +7,0.27,0.48,6.1,0.042,60,184,0.99566,3.2,0.5,9.4,3 +5.8,0.32,0.31,2.7,0.049,25,153,0.99067,3.44,0.73,12.2,4 +7.8,0.26,0.31,3.6,0.025,22,100,0.99066,2.99,0.47,12.1,4 +7.4,0.3,0.32,1.7,0.03,23,128,0.9929,3.17,0.66,10.9,2 +6.7,0.16,0.34,1.6,0.026,27,109,0.9934,3.34,0.58,10.1,3 +5.8,0.32,0.31,2.7,0.049,25,153,0.99067,3.44,0.73,12.2,4 +6.7,0.19,0.39,1,0.032,14,71,0.98912,3.31,0.38,13,4 +6.6,0.36,0.24,0.9,0.038,15,72,0.99066,3.23,0.39,11,2 +7.2,0.17,0.41,1.6,0.052,24,126,0.99228,3.19,0.49,10.8,2 +6.7,0.19,0.39,1,0.032,14,71,0.98912,3.31,0.38,13,4 +6,0.11,0.47,10.6,0.052,69,148,0.9958,2.91,0.34,9.3,1 +6,0.21,0.34,2,0.042,63,123,0.99052,3.44,0.42,11.4,3 +6.7,0.325,0.82,1.2,0.152,49,120,0.99312,2.99,0.38,9.2,2 +6.6,0.4,0.46,6.2,0.056,42,241,0.9968,3.5,0.6,9.9,2 +6.5,0.2,0.24,9.2,0.044,25,150,0.99502,3.22,0.44,10.5,2 +7.6,0.27,0.34,5,0.04,18,56,0.99084,3.06,0.48,12.4,3 +7.2,0.26,0.4,6.3,0.047,52,172,0.99573,3.18,0.53,9.5,3 +6.3,0.25,0.22,3.3,0.048,41,161,0.99256,3.16,0.5,10.5,3 +6.5,0.22,0.45,8,0.053,52,196,0.9959,3.23,0.48,9.1,3 +6.4,0.14,0.31,1.2,0.034,53,138,0.99084,3.38,0.35,11.5,4 +6.4,0.14,0.31,1.2,0.034,53,138,0.99084,3.38,0.35,11.5,4 +7.1,0.26,0.32,16.2,0.044,31,170,0.99644,3.17,0.37,11.2,2 +6.6,0.22,0.34,11.6,0.05,59,140,0.99526,3.22,0.4,10.8,2 +6.6,0.45,0.43,7.2,0.064,31,186,0.9954,3.12,0.44,9.4,2 +6.6,0.17,0.3,1.1,0.031,13,73,0.99095,3.17,0.58,11,3 +7.2,0.44,0.28,3.4,0.048,22,112,0.99188,3.21,0.37,11.3,4 +6.2,0.15,0.27,1.4,0.041,51,117,0.9909,3.28,0.38,11.2,3 +6.3,0.25,0.22,3.3,0.048,41,161,0.99256,3.16,0.5,10.5,3 +6.5,0.22,0.45,8,0.053,52,196,0.9959,3.23,0.48,9.1,3 +7.3,0.26,0.3,9.3,0.05,35,154,0.99581,3.21,0.5,10.4,3 +6.9,0.15,0.29,2.3,0.033,14,82,0.99132,3.1,0.58,11.2,4 +5.8,0.22,0.29,0.9,0.034,34,89,0.98936,3.14,0.36,11.1,4 +6.5,0.37,0.33,3.5,0.036,23,92,0.99136,3.18,0.38,11.2,3 +5.5,0.375,0.38,1.7,0.036,17,98,0.99142,3.29,0.39,10.5,3 +5.9,0.2,0.4,1.3,0.047,23,92,0.99232,3.2,0.45,10,3 +5.9,0.22,0.38,1.3,0.046,24,90,0.99232,3.2,0.47,10,3 +8,0.22,0.31,5.6,0.049,24,97,0.993,3.1,0.42,10.9,2 +6.5,0.22,0.29,7.4,0.028,16,87,0.99311,3.15,0.56,10.9,4 +6.9,0.15,0.29,2.3,0.033,14,82,0.99132,3.1,0.58,11.2,4 +5.8,0.2,0.34,1,0.035,40,86,0.98993,3.5,0.42,11.7,2 +6.6,0.31,0.07,1.5,0.033,55,144,0.99208,3.16,0.42,10,2 +7.7,0.43,0.37,10,0.169,22,210,0.99776,3.02,0.64,9.5,2 +6.7,0.24,0.29,14.9,0.053,55,136,0.99839,3.03,0.52,9,2 +7.3,0.23,0.34,9.3,0.052,19,86,0.99574,3.04,0.56,10,2 +7.9,0.2,0.39,1,0.041,37,154,0.99093,3.08,0.43,11.9,2 +5.3,0.16,0.39,1,0.028,40,101,0.99156,3.57,0.59,10.6,3 +6.4,0.21,0.28,5.9,0.047,29,101,0.99278,3.15,0.4,11,3 +6.9,0.33,0.26,5,0.027,46,143,0.9924,3.25,0.43,11.2,4 +5.6,0.18,0.58,1.25,0.034,29,129,0.98984,3.51,0.6,12,4 +6.6,0.29,0.31,3.9,0.027,39,96,0.99035,3.24,0.6,12.6,5 +6.9,0.33,0.26,5,0.027,46,143,0.9924,3.25,0.43,11.2,4 +6.6,0.21,0.36,0.8,0.034,48,113,0.99165,3.24,0.68,10.5,3 +7.3,0.21,0.33,1,0.037,66,144,0.9923,3.11,0.52,10.2,3 +6.4,0.21,0.28,5.9,0.047,29,101,0.99278,3.15,0.4,11,3 +5.1,0.11,0.32,1.6,0.028,12,90,0.99008,3.57,0.52,12.2,3 +6.5,0.15,0.32,1.3,0.036,19,76,0.98964,3.18,0.41,12.3,3 +5.3,0.16,0.39,1,0.028,40,101,0.99156,3.57,0.59,10.6,3 +5.6,0.19,0.46,1.1,0.032,33,115,0.9909,3.36,0.5,10.4,3 +5.6,0.18,0.58,1.25,0.034,29,129,0.98984,3.51,0.6,12,4 +6.7,0.48,0.32,1.4,0.021,22,121,0.9889,3.15,0.53,12.7,4 +6.2,0.23,0.23,1.2,0.018,18,128,0.99178,3.05,0.28,10.6,2 +6,0.17,0.29,5,0.028,25,108,0.99076,3.14,0.34,12.3,3 +6.7,0.48,0.32,1.4,0.021,22,121,0.9889,3.15,0.53,12.7,4 +6.7,0.15,0.38,1.7,0.037,20,84,0.99046,3.09,0.53,11.4,3 +4.2,0.17,0.36,1.8,0.029,93,161,0.98999,3.65,0.89,12,4 +5.8,0.21,0.32,1.6,0.045,38,95,0.98946,3.23,0.94,12.4,5 +5.4,0.23,0.36,1.5,0.03,74,121,0.98976,3.24,0.99,12.1,4 +6.7,0.15,0.38,1.7,0.037,20,84,0.99046,3.09,0.53,11.4,3 +6.4,0.22,0.31,13.9,0.04,57,135,0.99672,3.21,0.38,10.7,2 +6.5,0.15,0.55,5.9,0.045,75,162,0.99482,2.97,0.4,9.3,2 +5.9,0.32,0.33,2.1,0.027,35,138,0.98945,3.37,0.42,12.7,3 +5.7,0.37,0.3,1.1,0.029,24,88,0.98883,3.18,0.39,11.7,3 +7.9,0.25,0.35,6.7,0.039,22,64,0.99362,2.93,0.49,10.7,2 +7.2,0.21,0.28,2.7,0.033,38,94,0.99075,2.99,0.43,11.8,4 +7,0.24,0.3,6.7,0.039,37,125,0.99436,3.2,0.39,9.9,2 +6.8,0.475,0.33,3.95,0.047,16,81,0.98988,3.23,0.53,13.4,4 +7,0.28,0.32,7.75,0.032,30,114,0.99158,3.12,0.64,12.8,4 +6.9,0.4,0.3,10.6,0.033,24,87,0.99265,3.15,0.45,12.8,3 +6.6,0.41,0.31,1.6,0.042,18,101,0.99195,3.13,0.41,10.5,2 +6.4,0.2,0.28,2.5,0.032,24,84,0.99168,3.31,0.55,11.5,2 +8.5,0.22,0.34,0.7,0.04,5,25,0.9918,3.04,0.37,10.5,1 +8.4,0.36,0.36,11.1,0.032,21,132,0.99313,2.95,0.39,13,3 +5.2,0.285,0.29,5.15,0.035,64,138,0.9895,3.19,0.34,12.4,5 +6.9,0.2,0.3,4.7,0.041,40,148,0.9932,3.16,0.35,10.2,3 +6.7,0.42,0.46,9.7,0.054,67,234,0.99848,3.23,0.5,9,2 +6.2,0.16,0.34,1.7,0.038,85,153,0.9909,3.33,0.86,12,4 +6.4,0.125,0.36,1.4,0.044,22,68,0.99014,3.15,0.5,11.7,4 +6.4,0.44,0.26,2,0.054,20,180,0.9952,3.58,0.57,10,2 +7,0.31,0.39,7.5,0.055,42,218,0.99652,3.37,0.54,10.3,2 +6.7,0.42,0.46,9.7,0.054,67,234,0.99848,3.23,0.5,9,2 +8.6,0.18,0.28,0.8,0.032,25,78,0.99104,2.99,0.38,11.1,2 +6.2,0.21,0.26,13.1,0.05,59,150,0.99772,3.31,0.46,9,2 +6.1,0.16,0.37,1.1,0.031,37,97,0.9922,3.4,0.58,10.5,3 +6.5,0.22,0.32,2.2,0.028,36,92,0.99076,3.27,0.59,11.9,4 +6.2,0.36,0.14,8.9,0.036,38,155,0.99622,3.27,0.5,9.4,2 +5.7,0.21,0.25,1.1,0.035,26,81,0.9902,3.31,0.52,11.4,3 +6.4,0.25,0.32,0.9,0.034,40,114,0.99114,3.31,0.58,10.8,4 +7.6,0.31,0.26,1.7,0.073,40,157,0.9938,3.1,0.46,9.8,2 +6.6,0.26,0.46,6.9,0.047,59,183,0.99594,3.2,0.45,9.3,2 +5.7,0.21,0.25,1.1,0.035,26,81,0.9902,3.31,0.52,11.4,3 +6.2,0.2,0.31,1,0.031,22,73,0.99035,3.24,0.52,11.3,3 +6.2,0.18,0.3,1,0.031,23,73,0.99032,3.23,0.52,11.3,3 +6.1,0.37,0.2,7.6,0.031,49,170,0.99558,3.22,0.48,9.5,2 +6.2,0.36,0.14,8.9,0.036,38,155,0.99622,3.27,0.5,9.4,2 +6.5,0.22,0.32,2.2,0.028,36,92,0.99076,3.27,0.59,11.9,4 +7.7,0.18,0.3,1.2,0.046,49,199,0.99413,3.03,0.38,9.3,2 +6.9,0.14,0.38,1,0.041,22,81,0.99043,3.03,0.54,11.4,3 +6.9,0.14,0.38,1,0.041,22,81,0.99043,3.03,0.54,11.4,3 +6,0.44,0.26,3.1,0.053,57,128,0.98982,3.22,0.39,12.7,3 +7.1,0.36,0.4,1.95,0.033,26,118,0.98934,3.2,0.45,13.5,4 +5.7,0.28,0.28,2.2,0.019,15,65,0.9902,3.06,0.52,11.2,3 +6.4,0.16,0.32,8.75,0.038,38,118,0.99449,3.19,0.41,10.7,2 +7.4,0.28,0.4,11.9,0.032,13,92,0.99629,3.01,0.46,10.8,1 +6.7,0.39,0.31,2.7,0.054,27,202,0.9948,3.46,0.57,10.5,3 +6.5,0.44,0.47,5.45,0.014,44,137,0.98984,3.13,0.32,13,5 +6.9,0.22,0.31,6.3,0.029,41,131,0.99326,3.08,0.49,10.8,3 +6.6,0.22,0.29,14.4,0.046,39,118,0.99834,3.05,0.5,9.1,3 +7.7,0.25,0.3,7.8,0.038,67,196,0.99555,3.1,0.5,10.1,2 +5.2,0.155,0.33,1.6,0.028,13,59,0.98975,3.3,0.84,11.9,5 +7,0.31,0.31,9.1,0.036,45,140,0.99216,2.98,0.31,12,4 +7,0.31,0.31,9.1,0.036,45,140,0.99216,2.98,0.31,12,4 +6.6,0.22,0.29,14.4,0.046,39,118,0.99834,3.05,0.5,9.1,3 +5.6,0.21,0.4,1.3,0.041,81,147,0.9901,3.22,0.95,11.6,5 +5.2,0.155,0.33,1.6,0.028,13,59,0.98975,3.3,0.84,11.9,5 +6.4,0.25,0.32,11.3,0.038,69,192,0.99573,3.14,0.5,10.2,3 +6.9,0.22,0.31,6.3,0.029,41,131,0.99326,3.08,0.49,10.8,3 +5.3,0.21,0.29,0.7,0.028,11,66,0.99215,3.3,0.4,9.8,2 +7.1,0.27,0.28,1.25,0.023,3,89,0.98993,2.95,0.3,11.4,1 +5.2,0.17,0.27,0.7,0.03,11,68,0.99218,3.3,0.41,9.8,2 +7.7,0.25,0.3,7.8,0.038,67,196,0.99555,3.1,0.5,10.1,2 +7,0.12,0.29,10.3,0.039,41,98,0.99564,3.19,0.38,9.8,5 +7,0.12,0.29,10.3,0.039,41,98,0.99564,3.19,0.38,9.8,5 +7.1,0.29,0.34,7.8,0.036,49,128,0.99397,3.21,0.4,10.7,3 +7.2,0.3,0.3,8.7,0.022,14,111,0.99576,3.11,0.61,10.6,2 +6.8,0.26,0.46,8.3,0.037,49,173,0.99601,3.17,0.47,9.3,2 +7,0.12,0.29,10.3,0.039,41,98,0.99564,3.19,0.38,9.8,5 +7.1,0.29,0.34,7.8,0.036,49,128,0.99397,3.21,0.4,10.7,3 +4.9,0.33,0.31,1.2,0.016,39,150,0.98713,3.33,0.59,14,5 +5.1,0.29,0.28,8.3,0.026,27,107,0.99308,3.36,0.37,11,3 +5.1,0.29,0.28,8.3,0.026,27,107,0.99308,3.36,0.37,11,3 +6.8,0.26,0.48,6.2,0.049,55,182,0.99582,3.21,0.45,9.4,3 +6,0.28,0.52,5,0.078,30,139,0.99494,3.1,0.36,9,3 +6,0.28,0.25,1.8,0.042,8,108,0.9929,3.08,0.55,9,2 +7.2,0.2,0.22,1.6,0.044,17,101,0.99471,3.37,0.53,10,2 +6.1,0.27,0.25,1.8,0.041,9,109,0.9929,3.08,0.54,9,2 +6,0.28,0.25,1.8,0.042,8,108,0.9929,3.08,0.55,9,2 +6.4,0.29,0.3,2.9,0.036,25,79,0.99037,3.29,0.6,12.4,4 +7.4,0.35,0.24,6,0.042,28,123,0.99304,3.14,0.44,11.3,2 +8.1,0.12,0.38,0.9,0.034,36,86,0.99026,2.8,0.55,12,3 +6.4,0.12,0.3,1.1,0.031,37,94,0.98986,3.01,0.56,11.7,3 +7.2,0.2,0.22,1.6,0.044,17,101,0.99471,3.37,0.53,10,2 +7.3,0.4,0.26,5.45,0.016,26,90,0.98951,2.84,0.54,13.2,4 +7.7,0.11,0.34,14.05,0.04,41,114,0.99634,3.07,0.59,11,4 +6.9,0.23,0.41,8,0.03,30,114,0.99368,3.22,0.54,11,3 +6.9,0.38,0.38,13.1,0.112,14,94,0.99792,3.02,0.48,9.2,2 +7.5,0.38,0.29,4.9,0.021,38,113,0.99026,3.08,0.48,13,4 +5.8,0.19,0.24,1.3,0.044,38,128,0.99362,3.77,0.6,10.6,2 +5.5,0.34,0.26,2.2,0.021,31,119,0.98919,3.55,0.49,13,5 +6.6,0.23,0.3,14.9,0.051,33,118,0.99835,3.04,0.54,9,3 +6.6,0.23,0.3,14.9,0.051,33,118,0.99835,3.04,0.54,9,3 +8.4,0.31,0.31,0.95,0.021,52,148,0.99038,2.93,0.32,11.5,2 +6.7,0.2,0.3,1.4,0.025,17,76,0.99104,3.11,0.44,11,3 +8.4,0.31,0.31,0.95,0.021,52,148,0.99038,2.93,0.32,11.5,2 +7.3,0.26,0.24,1.7,0.05,10,112,0.99286,3.11,0.43,9.9,2 +6.3,0.22,0.22,5.6,0.039,31,128,0.99296,3.12,0.46,10.4,3 +6.6,0.23,0.3,14.9,0.051,33,118,0.99835,3.04,0.54,9,3 +7.5,0.19,0.4,7.1,0.056,50,110,0.9954,3.06,0.52,9.9,3 +8,0.14,0.33,1.2,0.045,71,162,0.9914,3.07,0.47,11,3 +6.8,0.32,0.39,9.6,0.026,34,124,0.99286,3.18,0.35,12.1,3 +6.6,0.23,0.2,11.4,0.044,45,131,0.99604,2.96,0.51,9.7,3 +6.6,0.23,0.2,11.4,0.044,45,131,0.99604,2.96,0.51,9.7,3 +6.7,0.36,0.26,7.9,0.034,39,123,0.99119,2.99,0.3,12.2,4 +6.1,0.38,0.42,5,0.016,31,113,0.99007,3.15,0.31,12.4,4 +8.5,0.23,0.28,11.1,0.033,30,97,0.99507,3.03,0.39,10.5,4 +7,0.2,0.31,8,0.05,29,213,0.99596,3.28,0.57,10.4,3 +6,0.26,0.32,3.8,0.029,48,180,0.99011,3.15,0.34,12,3 +6.9,0.3,0.3,10.55,0.037,4,28,0.99184,3.07,0.32,12.7,3 +6.7,0.18,0.28,10.2,0.039,29,115,0.99469,3.11,0.45,10.9,4 +6.7,0.18,0.28,10.2,0.039,29,115,0.99469,3.11,0.45,10.9,4 +6.8,0.18,0.28,9.8,0.039,29,113,0.99406,3.11,0.45,10.9,4 +7.2,0.19,0.31,6.3,0.034,17,103,0.99305,3.15,0.52,11.4,4 +6.2,0.16,0.32,1.1,0.036,74,184,0.99096,3.22,0.41,11,3 +5,0.27,0.32,4.5,0.032,58,178,0.98956,3.45,0.31,12.6,4 +6.3,0.37,0.28,6.3,0.034,45,152,0.9921,3.29,0.46,11.6,4 +6.6,0.2,0.27,10.9,0.038,29,130,0.99496,3.11,0.44,10.5,4 +6.8,0.18,0.28,9.8,0.039,29,113,0.99406,3.11,0.45,10.9,4 +6.8,0.18,0.28,9.8,0.039,29,113,0.99406,3.11,0.45,10.9,4 +6.6,0.28,0.34,0.8,0.037,42,119,0.9888,3.03,0.37,12.5,3 +6.5,0.35,0.36,0.8,0.034,32,111,0.98942,3.11,0.5,12.1,5 +6.9,0.25,0.33,1.2,0.035,35,158,0.99082,3.02,0.58,11.3,3 +6,0.32,0.3,1.3,0.025,18,112,0.98802,3.07,0.64,13.3,4 +6.8,0.18,0.28,9.8,0.039,29,113,0.99406,3.11,0.45,10.9,4 +6.7,0.18,0.28,10.2,0.039,29,115,0.99469,3.11,0.45,10.9,4 +6.6,0.2,0.27,10.9,0.038,29,130,0.99496,3.11,0.44,10.5,4 +6.3,0.37,0.28,6.3,0.034,45,152,0.9921,3.29,0.46,11.6,4 +7.2,0.19,0.31,6.3,0.034,17,103,0.99305,3.15,0.52,11.4,4 +6.3,0.18,0.36,1.2,0.034,26,111,0.99074,3.16,0.51,11,3 +6.9,0.3,0.36,0.9,0.037,40,156,0.98968,3.08,0.36,12.1,3 +6.2,0.16,0.32,1.1,0.036,74,184,0.99096,3.22,0.41,11,3 +5,0.27,0.32,4.5,0.032,58,178,0.98956,3.45,0.31,12.6,4 +5,0.3,0.33,3.7,0.03,54,173,0.9887,3.36,0.3,13,4 +6.5,0.2,0.5,18.1,0.054,50,221,0.99941,2.94,0.64,8.8,3 +6.7,0.25,0.31,1.35,0.061,30.5,218,0.99388,3.16,0.53,9.5,2 +6.6,0.22,0.36,5.5,0.029,30,105,0.99206,3.2,0.47,11.8,3 +6.8,0.25,0.37,3.1,0.026,29,93,0.99035,3.14,0.45,12.2,3 +7,0.13,0.37,12.85,0.042,36,105,0.99581,3.05,0.55,10.7,3 +7,0.45,0.34,19.8,0.04,12,67,0.9976,3.07,0.38,11,3 +7.2,0.32,0.3,8.25,0.02,14,104,0.99362,2.99,0.44,11.4,3 +7,0.13,0.37,12.85,0.042,36,105,0.99581,3.05,0.55,10.7,3 +5.9,0.34,0.3,3.8,0.035,57,135,0.99016,3.09,0.34,12,3 +6.8,0.22,0.31,6.9,0.037,33,121,0.99176,3.02,0.39,11.9,5 +7.2,0.32,0.3,8.25,0.02,14,104,0.99362,2.99,0.44,11.4,3 +8.4,0.32,0.35,11.7,0.029,3,46,0.99439,3.02,0.34,11.8,3 +6.8,0.27,0.29,4.6,0.046,6,88,0.99458,3.34,0.48,10.6,1 +8,0.74,0.21,4,0.05,24,133,0.99418,3.06,0.38,9.7,2 +7,0.45,0.34,19.8,0.04,12,67,0.9976,3.07,0.38,11,3 +7,0.13,0.37,12.85,0.042,36,105,0.99581,3.05,0.55,10.7,3 +5.4,0.22,0.29,1.2,0.045,69,152,0.99178,3.76,0.63,11,4 +8.4,0.22,0.3,8.9,0.024,17,118,0.99456,2.99,0.34,10.5,3 +7.4,0.32,0.22,11.7,0.035,44,150,0.99578,3.1,0.45,10.4,2 +7.5,0.18,0.37,6.2,0.05,21,138,0.99546,3.2,0.55,10.5,3 +7.1,0.47,0.29,14.8,0.024,22,142,0.99518,3.12,0.48,12,5 +7.1,0.47,0.29,14.8,0.024,22,142,0.99518,3.12,0.48,12,5 +5.8,0.19,0.25,10.8,0.042,33,124,0.99646,3.22,0.41,9.2,3 +6.7,0.14,0.46,1.6,0.036,15,92,0.99264,3.37,0.49,10.9,2 +6.8,0.24,0.38,8.3,0.045,50,185,0.99578,3.15,0.5,9.5,3 +6.9,0.25,0.47,8.4,0.042,36,156,0.99604,3.15,0.55,9.4,3 +6,0.24,0.33,2.5,0.026,31,85,0.99014,3.13,0.5,11.3,4 +6.8,0.29,0.34,3.5,0.054,26,189,0.99489,3.42,0.58,10.4,2 +6.3,0.33,0.42,17.2,0.037,57,170,0.99884,3.26,0.57,9.4,3 +6.5,0.23,0.45,2.1,0.027,43,104,0.99054,3.02,0.52,11.3,3 +6.3,0.27,0.29,12.2,0.044,59,196,0.99782,3.14,0.4,8.8,3 +6.3,0.2,0.37,11.8,0.045,58,130,0.99519,3.2,0.35,10.8,2 +6.2,0.33,0.41,16.8,0.037,58,173,0.99882,3.25,0.57,9.4,3 +6.3,0.33,0.42,17.2,0.037,57,170,0.99884,3.26,0.57,9.4,3 +7.2,0.21,1,1.1,0.154,46,114,0.9931,2.95,0.43,9.2,3 +6,0.27,0.3,14.7,0.044,15,144,0.99666,3.12,0.53,10.3,3 +5.7,0.12,0.26,5.5,0.034,21,99,0.99324,3.09,0.57,9.9,3 +6.9,0.24,0.37,6.1,0.027,38,112,0.99086,3.19,0.34,12.4,3 +7.7,0.18,0.53,1.2,0.041,42,167,0.9908,3.11,0.44,11.9,2 +7.1,0.17,0.43,1.3,0.023,33,132,0.99067,3.11,0.56,11.7,3 +7.5,0.33,0.38,8.7,0.126,49,199,0.99711,2.98,0.57,9.4,2 +6.2,0.255,0.24,1.7,0.039,138.5,272,0.99452,3.53,0.53,9.6,1 +7.5,0.33,0.38,8.7,0.126,49,199,0.99711,2.98,0.57,9.4,2 +5.6,0.2,0.66,10.2,0.043,78,175,0.9945,2.98,0.43,10.4,4 +7.6,0.17,0.36,4.5,0.042,26,102,0.99427,3.09,0.47,9.5,2 +5.8,0.15,0.31,5.9,0.036,7,73,0.99152,3.2,0.43,11.9,3 +6.3,0.25,0.44,1.7,0.024,36,116,0.98935,3.18,0.4,12.5,3 +6.9,0.28,0.41,1.4,0.016,6,55,0.98876,3.16,0.4,13.4,2 +7.2,0.27,0.37,5.4,0.026,27,114,0.99174,3.13,0.84,12.7,2 +6.2,0.25,0.38,7.9,0.045,54,208,0.99572,3.17,0.46,9.1,2 +8.5,0.19,0.48,1.1,0.026,23,58,0.99184,2.9,0.5,10.5,3 +6.2,0.25,0.54,7,0.046,58,176,0.99454,3.19,0.7,10.4,2 +6.2,0.25,0.54,7,0.046,58,176,0.99454,3.19,0.7,10.4,2 +6.8,0.28,0.43,7.6,0.03,30,110,0.99164,3.08,0.59,12.5,5 +6.2,0.25,0.54,7,0.046,58,176,0.99454,3.19,0.7,10.4,2 +7.4,0.21,0.8,12.3,0.038,77,183,0.99778,2.95,0.48,9,2 +7,0.15,0.38,15.3,0.045,54,120,0.9975,3.18,0.42,9.8,3 +7.4,0.21,0.8,12.3,0.038,77,183,0.99778,2.95,0.48,9,2 +7.3,0.28,0.42,1.2,0.033,29,142,0.99205,3.17,0.43,10.7,1 +6.1,0.18,0.38,2.3,0.033,28,111,0.98962,3.16,0.49,12.4,3 +7,0.53,0.43,6.1,0.029,6,76,0.99118,3.08,0.5,12.5,5 +6.8,0.28,0.43,7.6,0.03,30,110,0.99164,3.08,0.59,12.5,5 +6.5,0.36,0.38,10.2,0.028,20,82,0.99274,3.1,0.43,12.1,4 +7.5,0.25,0.47,4.1,0.041,95,163,0.99184,2.92,0.59,11.3,3 +6.7,0.24,0.41,2.9,0.039,48,122,0.99052,3.25,0.43,12,2 +6.6,0.25,0.33,8.5,0.042,29,141,0.99546,3.28,0.6,10.4,2 +6.4,0.15,0.4,1.5,0.042,23,87,0.98972,3.11,0.46,12.2,4 +6.3,0.28,0.3,3.1,0.039,24,115,0.9942,3.05,0.43,8.6,2 +6.2,0.25,0.38,7.9,0.045,54,208,0.99572,3.17,0.46,9.1,2 +7.1,0.28,0.35,3.5,0.028,35,91,0.99022,2.96,0.33,12.1,2 +6.6,0.35,0.34,4.9,0.032,9,125,0.99253,3.32,0.81,12,2 +8.5,0.19,0.48,1.1,0.026,23,58,0.99184,2.9,0.5,10.5,3 +6.2,0.25,0.54,7,0.046,58,176,0.99454,3.19,0.7,10.4,2 +6,0.35,0.51,1.2,0.029,10,102,0.9903,3.46,0.42,11.9,3 +5.8,0.31,0.32,4.5,0.024,28,94,0.98906,3.25,0.52,13.7,4 +6.6,0.17,0.35,2.6,0.03,33,78,0.99146,3.22,0.72,11.3,3 +8.5,0.23,0.4,9.9,0.036,24,88,0.9951,3.02,0.42,10.5,3 +5.8,0.31,0.32,4.5,0.024,28,94,0.98906,3.25,0.52,13.7,4 +6.1,0.2,0.34,9.5,0.041,38,201,0.995,3.14,0.44,10.1,0 +6.3,0.37,0.37,1.5,0.024,12,76,0.98876,2.94,0.39,12.3,3 +6.2,0.36,0.38,3.2,0.031,20,89,0.98956,3.06,0.33,12,4 +6.6,0.17,0.35,2.6,0.03,33,78,0.99146,3.22,0.72,11.3,3 +6.3,0.28,0.47,11.2,0.04,61,183,0.99592,3.12,0.51,9.5,3 +7.6,0.27,0.52,3.2,0.043,28,152,0.99129,3.02,0.53,11.4,3 +7,0.25,0.45,2.3,0.045,40,118,0.99064,3.16,0.48,11.9,4 +9.7,0.24,0.49,4.9,0.032,3,18,0.99368,2.85,0.54,10,3 +9.7,0.24,0.49,4.9,0.032,3,18,0.99368,2.85,0.54,10,3 +6.8,0.13,0.39,1.4,0.034,19,102,0.99121,3.23,0.6,11.3,4 +6.6,0.78,0.5,1.5,0.045,30,133,0.99104,3.25,0.48,11.7,2 +5.1,0.33,0.27,6.7,0.022,44,129,0.99221,3.36,0.39,11,4 +6.7,0.34,0.4,2.1,0.033,34,111,0.98924,2.97,0.48,12.2,4 +6.7,0.14,0.51,4.3,0.028,57,124,0.99176,2.91,0.54,10.7,4 +7,0.26,0.34,10.9,0.038,25,84,0.99432,3.11,0.34,10.9,3 +6.5,0.29,0.26,7,0.04,18,113,0.99366,3.17,0.38,10.2,3 +7,0.25,0.45,2.3,0.045,40,118,0.99064,3.16,0.48,11.9,4 +7.6,0.21,0.49,2.5,0.047,20,130,0.99178,3.15,0.48,11.1,2 +7.7,0.26,0.51,2.6,0.045,26,159,0.99126,3,0.5,11.2,3 +7.6,0.27,0.52,3.2,0.043,28,152,0.99129,3.02,0.53,11.4,3 +7.7,0.25,0.49,2.5,0.047,31,169,0.99252,3.07,0.57,10.6,3 +7.6,0.35,0.46,14.7,0.047,33,151,0.99709,3.03,0.53,10.3,2 +6.9,0.3,0.36,4.5,0.054,31,203,0.99513,3.4,0.57,10.4,1 +6.7,0.24,0.46,2.2,0.033,19,111,0.99045,3.1,0.62,11.9,3 +6.5,0.23,0.39,1.9,0.036,41,98,0.99,3.19,0.43,11.9,4 +7.6,0.23,0.34,1.6,0.043,24,129,0.99305,3.12,0.7,10.4,2 +6.5,0.24,0.39,17.3,0.052,22,126,0.99888,3.11,0.47,9.2,3 +6.3,0.17,0.32,4.2,0.04,37,117,0.99182,3.24,0.43,11.3,3 +6.3,0.17,0.32,4.2,0.04,37,117,0.99182,3.24,0.43,11.3,3 +6.7,0.21,0.37,2.5,0.034,35,89,0.9913,3.25,0.5,11,4 +6.5,0.23,0.39,1.9,0.036,41,98,0.99,3.19,0.43,11.9,4 +5.9,0.28,0.39,1.4,0.031,47,147,0.98836,3.08,0.64,12.9,4 +5.9,0.19,0.37,0.8,0.027,3,21,0.9897,3.09,0.31,10.8,2 +6.2,0.25,0.42,8,0.049,53,206,0.99586,3.16,0.47,9.1,3 +7.6,0.23,0.34,1.6,0.043,24,129,0.99305,3.12,0.7,10.4,2 +5.6,0.18,0.27,1.7,0.03,31,103,0.98892,3.35,0.37,12.9,3 +5.5,0.18,0.22,5.5,0.037,10,86,0.99156,3.46,0.44,12.2,2 +6.5,0.24,0.39,17.3,0.052,22,126,0.99888,3.11,0.47,9.2,3 +7.4,0.23,0.38,8.6,0.052,41,150,0.99534,3.06,0.46,10.3,2 +7.2,0.17,0.37,6.9,0.059,47,128,0.99322,3.08,0.46,11,4 +7.6,0.3,0.38,2.1,0.043,10,98,0.99296,3.17,0.65,11,2 +5,0.24,0.21,2.2,0.039,31,100,0.99098,3.69,0.62,11.7,3 +6.1,0.21,0.38,1.5,0.039,37,122,0.98972,3.2,0.43,12,3 +6.5,0.33,0.38,2.5,0.047,30,148,0.98964,3.17,0.43,12.7,3 +6.3,0.35,0.26,17.6,0.061,59,198,0.99918,3.11,0.49,8.8,2 +6.3,0.17,0.32,4.2,0.04,37,117,0.99182,3.24,0.43,11.3,3 +6.6,0.25,0.35,2.9,0.034,38,121,0.99008,3.19,0.4,12.8,3 +6.5,0.16,0.33,4.8,0.043,45,114,0.992,3.18,0.44,11.2,3 +6.6,0.39,0.39,11.9,0.057,51,221,0.99851,3.26,0.51,8.9,3 +5.6,0.19,0.27,0.9,0.04,52,103,0.99026,3.5,0.39,11.2,2 +6.2,0.25,0.39,1.3,0.051,42,135,0.9906,3.23,0.4,11.1,3 +6.9,0.22,0.43,6.4,0.042,34,115,0.99293,3.05,0.51,10.8,3 +6.2,0.19,0.29,4.3,0.045,33,126,0.99658,3.18,0.42,9.3,3 +6.6,0.39,0.39,11.9,0.057,51,221,0.99851,3.26,0.51,8.9,3 +5.9,0.33,0.32,8.1,0.038,9,34,0.9911,3.22,0.36,12.7,4 +7.8,0.17,0.5,1.3,0.045,35,140,0.9904,3.16,0.4,12,3 +5.5,0.19,0.27,0.9,0.04,52,103,0.99026,3.5,0.39,11.2,2 +6.2,0.23,0.36,17.2,0.039,37,130,0.99946,3.23,0.43,8.8,3 +6.2,0.23,0.36,17.2,0.039,37,130,0.99946,3.23,0.43,8.8,3 +6.2,0.23,0.36,17.2,0.039,37,130,0.99946,3.23,0.43,8.8,3 +7.2,0.32,0.4,8.7,0.038,45,154,0.99568,3.2,0.47,10.4,3 +6.2,0.23,0.36,17.2,0.039,37,130,0.99946,3.23,0.43,8.8,3 +7.2,0.32,0.4,8.7,0.038,45,154,0.99568,3.2,0.47,10.4,3 +5.8,0.39,0.47,7.5,0.027,12,88,0.9907,3.38,0.45,14,3 +6.2,0.23,0.36,17.2,0.039,37,130,0.99946,3.23,0.43,8.8,3 +7.6,0.25,1.23,4.6,0.035,51,294,0.99018,3.03,0.43,13.1,3 +5.8,0.29,0.33,3.7,0.029,30,88,0.98994,3.25,0.42,12.3,3 +7.2,0.4,0.38,2.2,0.03,40,109,0.99075,3.27,0.46,12.6,3 +6.8,0.39,0.34,7.4,0.02,38,133,0.99212,3.18,0.44,12,4 +6.1,0.17,0.42,15.1,0.033,28,124,0.99684,2.87,0.47,9.5,2 +6.8,0.39,0.34,7.4,0.02,38,133,0.99212,3.18,0.44,12,4 +7.1,0.36,0.37,4.8,0.019,39,114,0.99036,3.08,0.49,12.7,4 +6.9,0.19,0.32,7.9,0.042,30,130,0.99456,3.4,0.39,10.5,3 +6.5,0.34,0.46,1,0.023,6,80,0.98865,3.15,0.54,12.9,3 +6.1,0.17,0.42,15.1,0.033,28,124,0.99684,2.87,0.47,9.5,2 +6.8,0.39,0.34,7.4,0.02,38,133,0.99212,3.18,0.44,12,4 +7.1,0.36,0.37,4.8,0.019,39,114,0.99036,3.08,0.49,12.7,4 +7.8,0.3,0.36,4.6,0.024,20,198,0.99222,3.06,0.66,11.9,3 +6.1,0.68,0.52,1.4,0.037,32,123,0.99022,3.24,0.45,12,3 +5.2,0.34,0.37,6.2,0.031,42,133,0.99076,3.25,0.41,12.5,3 +5.6,0.28,0.4,6.1,0.034,36,118,0.99144,3.21,0.43,12.1,4 +6.2,0.19,0.38,5.1,0.019,22,82,0.98961,3.05,0.36,12.5,3 +5.7,0.16,0.26,6.3,0.043,28,113,0.9936,3.06,0.58,9.9,3 +7.6,0.17,0.46,0.9,0.036,63,147,0.99126,3.02,0.41,10.7,3 +7.3,0.2,0.39,2.3,0.048,24,87,0.99044,2.94,0.35,12,3 +6.7,0.33,0.36,6.6,0.042,34,116,0.99123,2.97,0.31,12.2,5 +6.7,0.33,0.34,7.5,0.036,39,124,0.99123,2.99,0.32,12.4,5 +6.9,0.36,0.35,8.6,0.038,37,125,0.9916,3,0.32,12.4,5 +7.8,0.21,0.34,11.9,0.039,55,140,0.9959,3.02,0.31,10.3,3 +7.3,0.2,0.39,2.3,0.048,24,87,0.99044,2.94,0.35,12,3 +5.6,0.41,0.22,7.1,0.05,44,154,0.9931,3.3,0.4,10.5,2 +7.6,0.15,0.35,4.3,0.051,23,98,0.99422,3.1,0.44,9.5,3 +8.5,0.2,0.4,1.1,0.046,31,106,0.99194,3,0.35,10.5,1 +6.5,0.24,0.38,1,0.027,31,90,0.98926,3.24,0.36,12.3,3 +8.3,0.16,0.37,7.9,0.025,38,107,0.99306,2.93,0.37,11.9,3 +5.5,0.12,0.33,1,0.038,23,131,0.99164,3.25,0.45,9.8,2 +6.5,0.24,0.38,1,0.027,31,90,0.98926,3.24,0.36,12.3,3 +6.2,0.1,0.41,1,0.04,17,76,0.98988,3.14,0.56,11.4,4 +6.5,0.21,0.4,7.3,0.041,49,115,0.99268,3.21,0.43,11,3 +8.7,0.3,0.59,1.7,0.046,10,70,0.99373,3.06,0.56,10.8,1 +6.7,0.18,0.37,1.3,0.027,42,125,0.98939,3.24,0.37,12.8,4 +7,0.17,0.36,6.4,0.055,42,123,0.99318,3.11,0.5,11,5 +6.6,0.19,0.33,1.8,0.035,42,148,0.99196,3.15,0.36,10.2,2 +5.8,0.28,0.3,1.5,0.026,31,114,0.98952,3.32,0.6,12.5,4 +7.6,0.24,0.44,3.8,0.037,49,146,0.9911,3.06,0.37,11.6,3 +8.3,0.16,0.37,7.9,0.025,38,107,0.99306,2.93,0.37,11.9,3 +5.5,0.12,0.33,1,0.038,23,131,0.99164,3.25,0.45,9.8,2 +5.7,0.16,0.32,1.2,0.036,7,89,0.99111,3.26,0.48,11,2 +7,0.21,0.42,5.3,0.037,36,123,0.99321,3.14,0.52,10.9,3 +6.4,0.22,0.38,9.1,0.044,35,127,0.99326,2.97,0.3,11,4 +7.9,0.34,0.44,6.5,0.027,47,126,0.99124,2.96,0.37,12.5,3 +6.4,0.22,0.38,9.1,0.044,35,127,0.99326,2.97,0.3,11,4 +6.8,0.21,0.4,6.3,0.032,40,121,0.99214,3.18,0.53,12,4 +5.2,0.31,0.36,5.1,0.031,46,145,0.9897,3.14,0.31,12.4,4 +7.9,0.34,0.44,6.5,0.027,47,126,0.99124,2.96,0.37,12.5,3 +5.6,0.42,0.34,2.4,0.022,34,97,0.98915,3.22,0.38,12.8,4 +6.4,0.22,0.38,9.1,0.044,35,127,0.99326,2.97,0.3,11,4 +6.8,0.28,0.34,7.5,0.035,34,177,0.99692,3.33,0.43,9.1,2 +6.8,0.45,0.36,5,0.033,28,156,0.991,3.11,0.4,12.4,4 +6.6,0.29,0.39,6.75,0.031,22,98,0.9913,3.15,0.8,12.9,4 +6.8,0.21,0.42,1.2,0.045,24,126,0.99234,3.09,0.87,10.9,3 +6.8,0.25,0.24,1.6,0.045,39,164,0.99402,3.53,0.58,10.8,2 +6.4,0.21,0.34,16.05,0.04,56,142,0.99678,3.11,0.38,10.6,2 +5.8,0.33,0.23,5,0.053,29,106,0.99458,3.13,0.52,9,2 +8.2,0.3,0.44,12.4,0.043,52,154,0.99452,3.04,0.33,12,3 +6.4,0.24,0.32,0.95,0.041,23,131,0.99033,3.25,0.35,11.8,2 +7.5,0.18,0.45,4.6,0.041,67,158,0.9927,3.01,0.38,10.6,3 +5.2,0.335,0.2,1.7,0.033,17,74,0.99002,3.34,0.48,12.3,3 +7.1,0.14,0.33,1,0.104,20,54,0.99057,3.19,0.64,11.5,3 +7.2,0.13,0.46,1.3,0.044,48,111,0.99127,2.97,0.45,11.1,2 +5.8,0.33,0.23,5,0.053,29,106,0.99458,3.13,0.52,9,2 +6.5,0.29,0.25,2.5,0.142,8,111,0.9927,3,0.44,9.9,1 +6.2,0.35,0.31,2.6,0.036,37,92,0.98938,3.27,0.53,12.8,4 +9,0.38,0.53,2.1,0.102,19,76,0.99001,2.93,0.57,12.9,2 +6.6,0.24,0.38,12.75,0.034,8,74,0.99386,3.1,0.57,12.9,3 +6.6,0.16,0.34,1.1,0.037,41,115,0.9899,3.01,0.68,12,3 +8.2,0.3,0.44,12.4,0.043,52,154,0.99452,3.04,0.33,12,3 +5.7,0.15,0.28,3.7,0.045,57,151,0.9913,3.22,0.27,11.2,3 +6.6,0.33,0.4,2.65,0.041,35,86,0.98916,3.11,0.39,13.3,4 +5.7,0.2,0.3,2.5,0.046,38,125,0.99276,3.34,0.5,9.9,3 +6.8,0.27,0.37,8.2,0.055,52,192,0.99586,3.11,0.52,9.5,3 +6.8,0.27,0.42,7.3,0.054,58,200,0.99556,3.12,0.49,9.4,3 +6.2,0.2,0.26,1.1,0.047,42,119,0.99158,3.48,0.6,11,4 +6.7,0.13,0.57,6.6,0.056,60,150,0.99548,2.96,0.43,9.4,3 +6.8,0.21,0.37,7,0.038,27,107,0.99206,2.98,0.82,11.5,3 +6.7,0.31,0.32,14.5,0.038,6,79,0.99412,3.14,0.34,12.5,2 +6.2,0.2,0.29,11.8,0.035,21,93,0.99364,3.18,0.34,11.9,3 +6.6,0.25,0.34,3,0.054,22,141,0.99338,3.26,0.47,10.4,3 +5.7,0.15,0.28,3.7,0.045,57,151,0.9913,3.22,0.27,11.2,3 +6.9,0.22,0.39,6,0.035,44,141,0.99123,3.11,0.33,12.5,3 +6.4,0.23,0.35,4.6,0.039,43,147,0.99216,3.18,0.4,11,4 +7.6,0.27,0.29,2.5,0.059,37,115,0.99328,3.09,0.37,9.8,2 +6.6,0.34,0.24,3.3,0.034,29,99,0.99031,3.1,0.4,12.3,4 +6.4,0.16,0.42,1,0.036,29,113,0.9908,3.18,0.52,11,3 +5.8,0.3,0.42,1.1,0.036,19,113,0.98871,3.1,0.46,12.6,4 +7,0.29,0.35,1.4,0.036,42,109,0.99119,3.31,0.62,11.6,3 +6.6,0.34,0.24,3.3,0.034,29,99,0.99031,3.1,0.4,12.3,4 +6.7,0.21,0.36,8.55,0.02,20,86,0.99146,3.19,0.22,13.4,4 +7.6,0.27,0.29,2.5,0.059,37,115,0.99328,3.09,0.37,9.8,2 +6.8,0.22,0.41,6.7,0.034,39,116,0.99245,3.18,0.46,11.5,3 +7.7,0.27,0.49,3.8,0.037,46,139,0.99116,3.04,0.38,11.6,3 +6.4,0.25,0.37,4.5,0.039,41,147,0.9921,3.18,0.4,11.1,4 +6.4,0.23,0.35,4.6,0.039,43,147,0.99216,3.18,0.4,11,4 +6.7,0.13,0.45,4.2,0.043,52,131,0.99162,3.06,0.54,11.3,3 +6.7,0.24,0.37,11.3,0.043,64,173,0.99632,3.08,0.53,9.9,3 +7.1,0.26,0.37,5.5,0.025,31,105,0.99082,3.06,0.33,12.6,5 +5.3,0.3,0.16,4.2,0.029,37,100,0.9905,3.3,0.36,11.8,5 +7.1,0.38,0.4,2.2,0.042,54,201,0.99177,3.03,0.5,11.4,2 +7.4,0.19,0.31,14.5,0.045,39,193,0.9986,3.1,0.5,9.2,3 +7.4,0.19,0.31,14.5,0.045,39,193,0.9986,3.1,0.5,9.2,3 +7.4,0.19,0.31,14.5,0.045,39,193,0.9986,3.1,0.5,9.2,3 +7.4,0.19,0.31,14.5,0.045,39,193,0.9986,3.1,0.5,9.2,3 +7.4,0.19,0.31,14.5,0.045,39,193,0.9986,3.1,0.5,9.2,3 +7.4,0.19,0.31,14.5,0.045,39,193,0.9986,3.1,0.5,9.2,3 +6.3,0.32,0.32,1.5,0.03,24,101,0.98923,3.21,0.42,13,2 +7.6,0.19,0.32,18.75,0.047,32,193,1.00014,3.1,0.5,9.3,4 +6.5,0.26,0.31,3.6,0.03,36,92,0.99026,3.22,0.62,12.6,5 +5.9,0.24,0.12,1.4,0.035,60,247,0.99358,3.34,0.44,9.6,3 +4.2,0.215,0.23,5.1,0.041,64,157,0.99688,3.42,0.44,8,0 +8.1,0.24,0.32,10.5,0.03,34,105,0.99407,3.11,0.42,11.8,3 +5.8,0.23,0.2,2,0.043,39,154,0.99226,3.21,0.39,10.2,3 +7.5,0.33,0.36,2.6,0.051,26,126,0.99097,3.32,0.53,12.7,3 +6.6,0.38,0.36,9.2,0.061,42,214,0.9976,3.31,0.56,9.4,2 +6.4,0.15,0.29,1.8,0.044,21,115,0.99166,3.1,0.38,10.2,2 +6.5,0.32,0.34,5.7,0.044,27,91,0.99184,3.28,0.6,12,4 +7.5,0.22,0.32,2.4,0.045,29,100,0.99135,3.08,0.6,11.3,4 +6.4,0.23,0.32,1.9,0.038,40,118,0.99074,3.32,0.53,11.8,4 +6.1,0.22,0.31,1.4,0.039,40,129,0.99193,3.45,0.59,10.9,2 +6.5,0.48,0.02,0.9,0.043,32,99,0.99226,3.14,0.47,9.8,1 +6.6,0.23,0.3,4.6,0.06,29,154,0.99142,3.23,0.49,12.2,5 +6.4,0.16,0.25,1.4,0.057,21,125,0.99091,3.23,0.44,11.1,4 +6.6,0.38,0.36,9.2,0.061,42,214,0.9976,3.31,0.56,9.4,2 +7.4,0.16,0.32,1.4,0.065,23,140,0.99134,3.06,0.47,11.4,3 +6.4,0.15,0.29,1.8,0.044,21,115,0.99166,3.1,0.38,10.2,2 +6.5,0.32,0.3,2.3,0.051,20,127,0.98964,3.13,0.52,12.8,3 +6.7,0.12,0.36,2.3,0.039,43,125,0.99229,3.07,0.67,10.1,4 +6.6,0.2,0.14,4.4,0.184,35,168,0.99396,2.93,0.45,9.4,3 +8,0.34,0.25,6.4,0.035,38,103,0.99148,2.91,0.23,12.2,3 +6.8,0.21,0.31,2.9,0.046,40,121,0.9913,3.07,0.65,10.9,4 +6.8,0.23,0.31,2.8,0.047,40,122,0.99126,3.06,0.64,10.9,4 +6.8,0.21,0.31,2.9,0.046,40,121,0.9913,3.07,0.65,10.9,4 +6.6,0.2,0.14,4.4,0.184,35,168,0.99396,2.93,0.45,9.4,3 +6.6,0.28,0.42,8.2,0.044,60,196,0.99562,3.14,0.48,9.4,2 +7.8,0.25,0.37,1,0.043,10,80,0.99128,3.08,0.38,11.4,2 +5.6,0.12,0.33,2.9,0.044,21,73,0.98896,3.17,0.32,12.9,5 +6.6,0.28,0.41,7,0.046,59,194,0.99558,3.14,0.48,9.4,2 +6.8,0.17,0.35,1.8,0.04,29,84,0.98961,2.91,0.57,12,4 +7.3,0.25,0.28,1.5,0.043,19,113,0.99338,3.38,0.56,10.1,3 +6.6,0.28,0.41,7,0.046,59,194,0.99558,3.14,0.48,9.4,2 +6.6,0.28,0.42,8.2,0.044,60,196,0.99562,3.14,0.48,9.4,2 +6.5,0.25,0.5,7.6,0.047,54,184,0.99572,3.17,0.45,9.2,2 +6.3,0.24,0.35,2.3,0.039,43,109,0.99056,3.34,0.44,11.8,3 +6.8,0.32,0.32,8.7,0.029,31,105,0.99146,3,0.34,12.3,4 +7.8,0.25,0.37,1,0.043,10,80,0.99128,3.08,0.38,11.4,2 +5.6,0.12,0.33,2.9,0.044,21,73,0.98896,3.17,0.32,12.9,5 +6.6,0.24,0.28,6.7,0.032,26,91,0.99172,3.13,0.32,12.3,3 +6.3,0.22,0.34,5,0.032,36,93,0.99012,3.27,0.36,13.5,4 +6,0.32,0.3,1.9,0.033,41,142,0.98912,3.29,0.42,12.8,4 +6.3,0.19,0.29,2,0.022,33,96,0.98902,3.04,0.54,12.8,4 +6,0.32,0.3,1.9,0.033,41,142,0.98912,3.29,0.42,12.8,4 +9.4,0.24,0.29,8.5,0.037,124,208,0.99395,2.9,0.38,11,0 +6.4,0.35,0.28,12.6,0.039,19,124,0.99539,3.2,0.43,10.6,3 +6.7,0.46,0.27,5.2,0.039,35,96,0.99129,3.16,0.44,12.4,4 +6.3,0.3,0.29,2.1,0.048,33,142,0.98956,3.22,0.46,12.9,4 +6,0.19,0.29,1.1,0.047,67,152,0.9916,3.54,0.59,11.1,4 +5.9,0.24,0.28,1.3,0.032,36,95,0.98889,3.08,0.64,12.9,4 +7.3,0.145,0.33,1.1,0.042,14,64,0.99012,3.1,0.37,11.8,4 +6.6,0.435,0.38,9.2,0.058,66,243,0.99833,3.23,0.54,9.1,3 +5.8,0.18,0.37,1.2,0.036,19,74,0.98853,3.09,0.49,12.7,4 +5.8,0.18,0.37,1.1,0.036,31,96,0.98942,3.16,0.48,12,3 +5.6,0.32,0.32,8.3,0.043,32,105,0.99266,3.24,0.47,11.2,3 +6.6,0.16,0.35,1.8,0.042,26,105,0.98962,3.19,0.75,12.4,4 +5.1,0.21,0.28,1.4,0.047,48,148,0.99168,3.5,0.49,10.4,2 +7.5,0.29,0.36,15.7,0.05,29,124,0.9968,3.06,0.54,10.4,2 +6,0.26,0.33,4.35,0.04,15,80,0.98934,3.29,0.5,12.7,3 +5.7,0.26,0.3,1.8,0.039,30,105,0.98995,3.48,0.52,12.5,4 +7.1,0.17,0.31,1.6,0.037,15,103,0.991,3.14,0.5,12,3 +6.9,0.17,0.3,2,0.047,13,117,0.99152,3.16,0.51,11.6,3 +6.8,0.25,0.28,5,0.035,42,126,0.99048,3.12,0.38,12.6,4 +6.6,0.17,0.28,1.8,0.042,62,178,0.99204,3.15,0.42,10.2,2 +5.8,0.17,0.36,1.3,0.036,11,70,0.99202,3.43,0.68,10.4,4 +6.4,0.24,0.29,1,0.038,18,122,0.9906,3.3,0.42,11.5,2 +6.7,0.21,0.34,1.4,0.049,36,112,0.99091,3.02,0.5,11,3 +6.7,0.23,0.33,8.1,0.048,45,176,0.99472,3.11,0.52,10.1,3 +6.8,0.23,0.32,8.6,0.046,47,159,0.99452,3.08,0.52,10.5,3 +6.5,0.22,0.28,3.7,0.059,29,151,0.99177,3.23,0.41,12.1,4 +5.1,0.165,0.22,5.7,0.047,42,146,0.9934,3.18,0.55,9.9,3 +6.6,0.425,0.25,2.35,0.034,23,87,0.99082,3.05,0.41,11.4,3 +6.9,0.38,0.29,13.65,0.048,52,189,0.99784,3,0.6,9.5,3 +6.9,0.38,0.29,13.65,0.048,52,189,0.99784,3,0.6,9.5,3 +6.9,0.38,0.29,13.65,0.048,52,189,0.99784,3,0.6,9.5,3 +7.2,0.27,0.28,15.2,0.046,6,41,0.99665,3.17,0.39,10.9,3 +7.6,0.17,0.27,4.6,0.05,23,98,0.99422,3.08,0.47,9.5,3 +6.2,0.3,0.31,1.2,0.048,19,125,0.98999,3.32,0.54,12.6,3 +7.6,0.17,0.27,4.6,0.05,23,98,0.99422,3.08,0.47,9.5,3 +6.5,0.26,0.32,6.65,0.059,34,104,0.99254,3.18,0.42,11.1,2 +6.9,0.36,0.28,13.55,0.048,51,189,0.99782,3,0.6,9.5,4 +6.9,0.38,0.29,13.65,0.048,52,189,0.99784,3,0.6,9.5,3 +6.8,0.18,0.24,9.8,0.058,64,188,0.9952,3.13,0.51,10.6,3 +6.7,0.18,0.24,10.3,0.057,64,185,0.99519,3.12,0.5,10.6,3 +6.6,0.16,0.21,6.7,0.055,43,157,0.99384,3.15,0.52,10.8,3 +7.2,0.27,0.28,15.2,0.046,6,41,0.99665,3.17,0.39,10.9,3 +6.4,0.17,0.27,9.9,0.047,26,101,0.99596,3.34,0.5,9.9,3 +7.2,0.22,0.28,7.2,0.06,41,132,0.9935,3.08,0.59,11.3,3 +6,0.22,0.28,1.1,0.034,47,90,0.98862,3.22,0.38,12.6,3 +6.7,0.36,0.28,8.3,0.034,29,81,0.99151,2.96,0.39,12.5,3 +6.5,0.43,0.28,11.25,0.032,31,87,0.9922,3.02,0.38,12.4,3 +5.9,0.2,0.28,12.8,0.038,29,132,0.99426,3.31,0.57,11.8,4 +5.3,0.32,0.23,9.65,0.026,26,119,0.99168,3.18,0.53,12.2,3 +6.8,0.2,0.28,12.6,0.048,54,136,0.99556,3.19,0.37,10.7,3 +6,0.22,0.33,12.2,0.033,25,97,0.99356,3.17,0.42,11.3,4 +6.7,0.36,0.28,8.3,0.034,29,81,0.99151,2.96,0.39,12.5,3 +6.5,0.43,0.28,11.25,0.032,31,87,0.9922,3.02,0.38,12.4,3 +7.1,0.18,0.49,1.3,0.033,12,72,0.99072,3.05,0.53,11.3,4 +6.4,0.17,0.27,9.9,0.047,26,101,0.99596,3.34,0.5,9.9,3 +7.2,0.22,0.28,7.2,0.06,41,132,0.9935,3.08,0.59,11.3,3 +6,0.22,0.28,1.1,0.034,47,90,0.98862,3.22,0.38,12.6,3 +6,0.2,0.26,1.1,0.033,38,67,0.98954,3.14,0.38,11.5,3 +7.6,0.2,0.26,4.8,0.033,26,76,0.99076,2.98,0.49,12.3,4 +6.2,0.3,0.21,1.1,0.032,31,111,0.9889,2.97,0.42,12.2,3 +6,0.29,0.25,1.4,0.033,30,114,0.98794,3.08,0.43,13.2,3 +6.6,0.18,0.28,1.7,0.041,53,161,0.99207,3.13,0.45,10.2,3 +7,0.22,0.28,10.6,0.039,32,117,0.99355,3.05,0.55,11.5,4 +6,0.29,0.25,1.4,0.033,30,114,0.98794,3.08,0.43,13.2,3 +6.2,0.3,0.21,1.1,0.032,31,111,0.9889,2.97,0.42,12.2,3 +5.6,0.15,0.26,5.55,0.051,51,139,0.99336,3.47,0.5,11,3 +6.9,0.28,0.24,2.1,0.034,49,121,0.98882,2.98,0.43,13.2,4 +5.9,0.19,0.21,1.7,0.045,57,135,0.99341,3.32,0.44,9.5,2 +7.8,0.22,0.26,9,0.047,38,132,0.997,3.25,0.53,10.2,3 +6.6,0.18,0.28,1.7,0.041,53,161,0.99207,3.13,0.45,10.2,3 +7,0.4,0.25,1.8,0.05,51,189,0.99174,3,0.55,11.4,3 +6.1,0.28,0.27,4.7,0.03,56,140,0.99042,3.16,0.42,12.5,5 +7.6,0.36,0.49,11.3,0.046,87,221,0.9984,3.01,0.43,9.2,2 +6.5,0.28,0.34,3.6,0.04,29,121,0.99111,3.28,0.48,12.1,4 +6.9,0.19,0.35,6.9,0.045,51,125,0.9933,3.1,0.44,10.7,4 +6.5,0.28,0.34,3.6,0.04,29,121,0.99111,3.28,0.48,12.1,4 +6.4,0.22,0.32,4.9,0.046,50,156,0.99316,3.38,0.55,11.2,3 +6.8,0.23,0.3,6.95,0.044,42,179,0.9946,3.25,0.56,10.6,3 +6.4,0.32,0.31,1.9,0.037,34,126,0.99,3.06,0.45,11.8,3 +6.1,0.28,0.27,4.7,0.03,56,140,0.99042,3.16,0.42,12.5,5 +7.6,0.36,0.49,11.3,0.046,87,221,0.9984,3.01,0.43,9.2,2 +8.8,0.39,0.35,1.8,0.096,22,80,0.99016,2.95,0.54,12.6,3 +6.6,0.24,0.3,11.3,0.026,11,77,0.99381,3.13,0.55,12.8,4 +6.9,0.29,0.3,8.2,0.026,35,112,0.99144,3,0.37,12.3,3 +6.9,0.28,0.3,8.3,0.026,37,113,0.99139,2.99,0.38,12.3,5 +6.7,0.38,0.26,9.55,0.036,35,91,0.9919,2.98,0.37,12.4,3 +8,0.28,0.3,8.4,0.03,35,115,0.99192,2.93,0.42,12.3,3 +6.5,0.25,0.45,7.8,0.048,52,188,0.99576,3.2,0.53,9.1,2 +6.6,0.26,0.46,7.8,0.047,48,186,0.9958,3.2,0.54,9.1,2 +7.4,0.29,0.28,10.2,0.032,43,138,0.9951,3.1,0.47,10.6,3 +6.3,0.19,0.29,5.5,0.042,44,189,0.99304,3.19,0.47,10.3,3 +6.1,0.33,0.32,7.8,0.052,52,183,0.99657,3.39,0.65,9.5,2 +5.6,0.32,0.33,7.4,0.037,25,95,0.99268,3.25,0.49,11.1,3 +7.7,0.46,0.18,3.3,0.054,18,143,0.99392,3.12,0.51,10.8,3 +8.8,0.19,0.3,5,0.028,34,120,0.99242,2.94,0.47,11.2,2 +7.7,0.46,0.18,3.3,0.054,18,143,0.99392,3.12,0.51,10.8,3 +8.8,0.27,0.25,5,0.024,52,99,0.9925,2.87,0.49,11.4,2 +5.8,0.18,0.28,1.3,0.034,9,94,0.99092,3.21,0.52,11.2,3 +5.8,0.15,0.32,1.2,0.037,14,119,0.99137,3.19,0.5,10.2,3 +5.6,0.32,0.33,7.4,0.037,25,95,0.99268,3.25,0.49,11.1,3 +6.1,0.33,0.32,7.8,0.052,52,183,0.99657,3.39,0.65,9.5,2 +7.1,0.32,0.3,9.9,0.041,63,192,0.99642,3.12,0.49,10.2,3 +6.2,0.23,0.35,0.7,0.051,24,111,0.9916,3.37,0.43,11,0 +8.9,0.3,0.35,4.6,0.032,32,148,0.99458,3.15,0.45,11.5,4 +6,0.14,0.17,5.6,0.036,37,127,0.99373,3.05,0.57,9.8,3 +6.8,0.24,0.29,9.5,0.042,56,157,0.99586,3.11,0.51,10.1,3 +6.7,0.21,0.48,14.8,0.05,31,195,0.99942,2.95,0.75,8.8,3 +8.9,0.3,0.35,4.6,0.032,32,148,0.99458,3.15,0.45,11.5,4 +6.1,0.3,0.3,2.1,0.031,50,163,0.9895,3.39,0.43,12.7,4 +7.2,0.37,0.4,11.6,0.032,34,214,0.9963,3.1,0.51,9.8,3 +6.7,0.64,0.3,1.2,0.03,18,76,0.9892,3.16,0.6,12.9,1 +7.2,0.37,0.4,11.6,0.032,34,214,0.9963,3.1,0.51,9.8,3 +6.1,0.3,0.3,2.1,0.031,50,163,0.9895,3.39,0.43,12.7,4 +7.6,0.28,0.49,20.15,0.06,30,145,1.00196,3.01,0.44,8.5,2 +6.3,0.29,0.28,4.7,0.059,28,81,0.99036,3.24,0.56,12.7,5 +6.2,0.28,0.28,4.3,0.026,22,105,0.989,2.98,0.64,13.1,5 +7.1,0.18,0.39,14.5,0.051,48,156,0.99947,3.35,0.78,9.1,2 +6.4,0.32,0.27,4.9,0.034,18,122,0.9916,3.36,0.71,12.5,3 +7.1,0.17,0.4,14.55,0.047,47,156,0.99945,3.34,0.78,9.1,3 +7.1,0.17,0.4,14.55,0.047,47,156,0.99945,3.34,0.78,9.1,3 +5.8,0.24,0.26,10.05,0.039,63,162,0.99375,3.33,0.5,11.2,3 +6.4,0.32,0.27,4.9,0.034,18,122,0.9916,3.36,0.71,12.5,3 +7.1,0.18,0.39,14.5,0.051,48,156,0.99947,3.35,0.78,9.1,2 +7.1,0.17,0.4,14.55,0.047,47,156,0.99945,3.34,0.78,9.1,3 +7.1,0.18,0.39,15.25,0.047,45,158,0.99946,3.34,0.77,9.1,3 +7.8,0.29,0.29,3.15,0.044,41,117,0.99153,3.24,0.35,11.5,2 +6.2,0.255,0.27,1.3,0.037,30,86,0.98834,3.05,0.59,12.9,4 +8.2,0.34,0.29,5.2,0.076,19,92,0.99138,2.95,0.39,12.5,3 +6.5,0.24,0.28,1.1,0.034,26,83,0.98928,3.25,0.33,12.3,3 +6.9,0.24,0.23,7.1,0.041,20,97,0.99246,3.1,0.85,11.4,3 +6.7,0.4,0.22,8.8,0.052,24,113,0.99576,3.22,0.45,9.4,2 +6.7,0.3,0.44,18.5,0.057,65,224,0.99956,3.11,0.53,9.1,2 +6.7,0.4,0.22,8.8,0.052,24,113,0.99576,3.22,0.45,9.4,2 +6.8,0.17,0.32,1.4,0.04,35,106,0.99026,3.16,0.66,12,2 +7.1,0.25,0.28,1.2,0.04,31,111,0.99174,3.18,0.53,11.1,2 +5.9,0.27,0.27,5,0.035,14,97,0.99058,3.1,0.33,11.8,4 +6,0.16,0.22,1.6,0.042,36,106,0.9905,3.24,0.32,11.4,3 +6.7,0.3,0.44,18.75,0.057,65,224,0.99956,3.11,0.53,9.1,2 +6.6,0.15,0.32,6,0.033,59,128,0.99192,3.19,0.71,12.1,5 +7.3,0.34,0.3,9.4,0.057,34,178,0.99554,3.15,0.44,10.4,3 +6,0.17,0.29,9.7,0.044,33,98,0.99536,3.12,0.36,9.2,3 +6.7,0.47,0.29,4.75,0.034,29,134,0.99056,3.29,0.46,13,4 +6.6,0.15,0.32,6,0.033,59,128,0.99192,3.19,0.71,12.1,5 +6.6,0.21,0.29,5.35,0.029,43,106,0.99112,2.93,0.43,11.5,4 +6.6,0.21,0.29,5.35,0.029,43,106,0.99112,2.93,0.43,11.5,4 +8,0.24,0.48,6.8,0.047,13,134,0.99616,3.23,0.7,10,2 +5.6,0.34,0.3,6.9,0.038,23,89,0.99266,3.25,0.49,11.1,3 +5.8,0.54,0,1.4,0.033,40,107,0.98918,3.26,0.35,12.4,2 +7.3,0.23,0.24,0.9,0.031,29,86,0.98926,2.9,0.38,12.2,3 +6,0.39,0.13,1.2,0.042,60,172,0.99114,3.06,0.52,10.6,2 +6.1,0.105,0.31,1.3,0.037,55,145,0.9912,3.41,0.41,11.1,4 +5.8,0.32,0.2,2.6,0.027,17,123,0.98936,3.36,0.78,13.9,4 +7.6,0.22,0.28,12,0.056,68,143,0.9983,2.99,0.3,9.2,3 +6.8,0.19,0.4,9.85,0.055,41,103,0.99532,2.98,0.56,10.5,3 +6.7,0.24,0.3,3.85,0.042,105,179,0.99189,3.04,0.59,11.3,5 +6.8,0.17,0.34,2,0.04,38,111,0.99,3.24,0.45,12.9,3 +6.2,0.3,0.31,1.6,0.035,40,106,0.98914,3.26,0.39,12.9,4 +6.9,0.29,0.41,7.8,0.046,52,171,0.99537,3.12,0.51,9.6,2 +6.8,0.19,0.34,1.9,0.04,41,108,0.99,3.25,0.45,12.9,3 +6.8,0.17,0.34,2,0.04,38,111,0.99,3.24,0.45,12.9,3 +6.6,0.24,0.27,10.3,0.047,54,219,0.99742,3.04,0.45,8.8,2 +6.6,0.16,0.36,1.1,0.031,27,93,0.98884,3.23,0.34,13.2,5 +7.6,0.22,0.28,12,0.056,68,143,0.9983,2.99,0.3,9.2,3 +6.7,0.24,0.3,3.85,0.042,105,179,0.99189,3.04,0.59,11.3,5 +6.8,0.19,0.4,9.85,0.055,41,103,0.99532,2.98,0.56,10.5,3 +6.7,0.16,0.36,2,0.045,24,131,0.99284,3.3,0.59,10.5,3 +6.5,0.3,0.27,4,0.038,37,97,0.99026,3.2,0.6,12.6,5 +6.5,0.22,0.19,1.1,0.064,36,191,0.99297,3.05,0.5,9.5,3 +6.2,0.36,0.45,10.4,0.06,22,184,0.99711,3.31,0.56,9.8,3 +6.2,0.37,0.24,6.1,0.032,19,86,0.98934,3.04,0.26,13.4,5 +7.6,0.31,0.24,1.8,0.037,39,150,0.9913,3.05,0.44,11.8,4 +6.2,0.36,0.45,10.4,0.06,22,184,0.99711,3.31,0.56,9.8,3 +5.9,0.32,0.28,4.7,0.039,34,94,0.98964,3.22,0.57,13.1,4 +6.5,0.3,0.27,4,0.038,37,97,0.99026,3.2,0.6,12.6,5 +5.8,0.22,0.3,1.1,0.047,36,131,0.992,3.26,0.45,10.4,2 +5.4,0.45,0.27,6.4,0.033,20,102,0.98944,3.22,0.27,13.4,5 +6.1,0.36,0.26,8.15,0.035,14,88,0.99031,3.06,0.27,13,4 +6.2,0.37,0.24,6.1,0.032,19,86,0.98934,3.04,0.26,13.4,5 +7.5,0.21,0.32,4.8,0.056,39,113,0.99393,3.11,0.52,10.2,4 +6.9,0.28,0.33,1.2,0.039,16,98,0.9904,3.07,0.39,11.7,3 +6.5,0.22,0.19,1.1,0.064,36,191,0.99297,3.05,0.5,9.5,3 +7.8,0.2,0.2,1.4,0.036,25,83,0.99088,3.03,0.46,11.7,3 +6.7,0.28,0.31,7.4,0.041,7,81,0.99254,3.04,0.47,11.4,5 +7.6,0.31,0.24,1.8,0.037,39,150,0.9913,3.05,0.44,11.8,4 +8,0.2,0.44,1,0.057,24,111,0.99158,3.09,0.32,11.2,3 +6,0.28,0.27,15.5,0.036,31,134,0.99408,3.19,0.44,13,4 +6,0.28,0.27,15.5,0.036,31,134,0.99408,3.19,0.44,13,4 +6.7,0.24,0.36,8.4,0.042,42,123,0.99473,3.34,0.52,10.9,3 +6.3,0.22,0.28,2.4,0.042,38,102,0.98998,3.14,0.37,11.6,4 +6,0.24,0.28,3.95,0.038,61,134,0.99146,3.3,0.54,11.3,4 +7.7,0.43,1,19.95,0.032,42,164,0.99742,3.29,0.5,12,3 +6.4,0.3,0.36,2,0.052,18,141,0.99273,3.38,0.53,10.5,3 +6.1,0.33,0.3,3,0.036,30,124,0.98922,3.31,0.4,13.1,4 +6,0.28,0.27,15.5,0.036,31,134,0.99408,3.19,0.44,13,4 +6.7,0.24,0.36,8.4,0.042,42,123,0.99473,3.34,0.52,10.9,3 +6.7,0.29,0.45,14.3,0.054,30,181,0.99869,3.14,0.57,9.1,2 +6.9,0.33,0.31,4.2,0.04,21,93,0.9896,3.18,0.48,13.4,4 +6.5,0.16,0.34,1.4,0.029,29,133,0.99108,3.33,0.64,11.5,4 +6,0.2,0.32,3,0.031,26,118,0.99134,3.38,0.68,11.2,4 +7.5,0.33,0.28,4.9,0.042,21,155,0.99385,3.36,0.57,10.9,3 +7.1,0.36,0.28,2.4,0.036,35,115,0.98936,3.19,0.44,13.5,4 +6.7,0.29,0.45,14.3,0.054,30,181,0.99869,3.14,0.57,9.1,2 +6.4,0.26,0.25,10.7,0.046,66,179,0.99606,3.17,0.55,9.9,3 +7,0.22,0.24,11,0.041,75,167,0.99508,2.98,0.56,10.5,3 +6.5,0.19,0.28,1.4,0.046,22,90,0.99038,3.18,0.51,11.7,4 +6.3,0.21,0.31,1.2,0.043,30,117,0.99158,3.49,0.68,11,3 +7.9,0.35,0.28,12.9,0.032,13,63,0.9932,2.99,0.43,13,3 +7.7,0.38,0.23,10.8,0.03,28,95,0.99164,2.93,0.41,13.6,3 +6.8,0.19,0.33,1.3,0.031,22,87,0.98987,3.08,0.62,12.3,4 +7.2,0.33,0.34,2,0.044,61,171,0.98947,3.25,0.53,13.3,4 +6.6,0.29,0.29,1.8,0.036,38,102,0.98819,3.08,0.42,13.7,4 +7.5,0.2,0.41,1.2,0.05,26,131,0.99133,3.19,0.52,11.1,2 +6.9,0.33,0.62,7.5,0.038,46,132,0.99143,3.23,0.43,13.4,4 +6,0.23,0.15,9.7,0.048,101,207,0.99571,3.05,0.3,9.1,2 +5.9,0.23,0.24,3.8,0.038,61,152,0.99139,3.31,0.5,11.3,4 +6.6,0.32,0.41,7.2,0.048,55,178,0.99537,3.2,0.46,9.4,2 +6,0.23,0.15,9.7,0.048,101,207,0.99571,3.05,0.3,9.1,2 +5.3,0.36,0.27,6.3,0.028,40,132,0.99186,3.37,0.4,11.6,3 +5.3,0.36,0.27,6.3,0.028,40,132,0.99186,3.37,0.4,11.6,3 +8.9,0.27,0.28,0.8,0.024,29,128,0.98984,3.01,0.35,12.4,3 +7.6,0.23,0.29,8.6,0.053,65,146,0.9963,3.11,0.32,9.8,3 +6.9,0.75,0.13,6.3,0.036,19,50,0.99312,3.09,0.25,11.1,1 +7.1,0.35,0.27,3.1,0.034,28,134,0.9897,3.26,0.38,13.1,4 +7.2,0.31,0.35,7.2,0.046,45,178,0.9955,3.14,0.53,9.7,2 +6.4,0.28,0.44,7.1,0.048,49,179,0.99528,3.15,0.48,9.2,2 +7.2,0.23,0.46,6.4,0.036,17,85,0.99279,3.1,0.78,11.7,3 +6.6,0.22,0.3,14.7,0.045,50,136,0.99704,3.14,0.37,10.6,3 +7.2,0.31,0.35,7.2,0.046,45,178,0.9955,3.14,0.53,9.7,2 +6.4,0.28,0.44,7.1,0.048,49,179,0.99528,3.15,0.48,9.2,2 +7.2,0.24,0.28,1.9,0.032,30,92,0.9914,3.1,0.39,10.9,3 +6.2,0.27,0.47,1.2,0.146,28,105,0.99224,3.23,0.51,10.1,2 +6.5,0.28,0.25,4.8,0.029,54,128,0.99074,3.17,0.44,12.2,4 +7.2,0.27,0.31,1.2,0.031,27,80,0.98892,3.03,0.33,12.7,3 +7.8,0.28,0.25,3.4,0.024,27,99,0.98959,2.98,0.37,13,3 +8.1,0.26,0.27,4.3,0.03,43,123,0.99212,3.16,0.33,11.2,3 +6.6,0.23,0.37,8.5,0.036,46,153,0.99576,3.2,0.48,9.4,3 +6,0.33,0.2,1.8,0.031,49,159,0.9919,3.41,0.53,11,3 +6,0.33,0.2,1.8,0.031,49,159,0.9919,3.41,0.53,11,3 +7.3,0.2,0.29,19.5,0.039,69,237,1.00037,3.1,0.48,9.2,3 +6.6,0.23,0.37,8.5,0.036,46,153,0.99576,3.2,0.48,9.4,3 +7.3,0.2,0.29,19.9,0.039,69,237,1.00037,3.1,0.48,9.2,3 +6.2,0.47,0.19,8.3,0.029,24,142,0.992,3.22,0.45,12.3,3 +6,0.33,0.2,1.8,0.031,49,159,0.9919,3.41,0.53,11,3 +7.2,0.14,0.32,1.1,0.022,48,116,0.99218,3.04,0.67,10,3 +5.7,0.22,0.22,16.65,0.044,39,110,0.99855,3.24,0.48,9,3 +5.7,0.22,0.22,16.65,0.044,39,110,0.99855,3.24,0.48,9,3 +5.7,0.22,0.22,16.65,0.044,39,110,0.99855,3.24,0.48,9,3 +8.1,0.2,0.28,0.9,0.023,49,87,0.99062,2.92,0.36,11.1,3 +5.8,0.14,0.15,6.1,0.042,27,123,0.99362,3.06,0.6,9.9,3 +4.8,0.21,0.21,10.2,0.037,17,112,0.99324,3.66,0.48,12.2,4 +8.1,0.2,0.28,0.9,0.023,49,87,0.99062,2.92,0.36,11.1,3 +5.7,0.22,0.22,16.65,0.044,39,110,0.99855,3.24,0.48,9,3 +7.5,0.34,0.24,3.85,0.031,5,34,0.99098,3.01,0.36,11.8,1 +6.6,0.64,0.28,4.4,0.032,19,78,0.99036,3.11,0.62,12.9,3 +7,0.48,0.12,4.5,0.05,23,86,0.99398,2.86,0.35,9,2 +7.6,0.37,0.34,3.2,0.028,42,162,0.9903,3.01,0.33,12.4,3 +7,0.48,0.12,4.5,0.05,23,86,0.99398,2.86,0.35,9,2 +6.6,0.64,0.28,4.4,0.032,19,78,0.99036,3.11,0.62,12.9,3 +8,0.25,0.27,9.7,0.036,15,85,0.99406,2.99,0.36,11.2,3 +7.6,0.38,0.28,4.2,0.029,7,112,0.9906,3,0.41,12.6,3 +6.9,0.26,0.27,4.2,0.031,20,80,0.99089,3.12,0.39,11.5,3 +7.8,0.15,0.34,1.1,0.035,31,93,0.99096,3.07,0.72,11.3,4 +8,0.25,0.27,9.7,0.036,15,85,0.99406,2.99,0.36,11.2,3 +6.9,0.26,0.27,4.2,0.031,20,80,0.99089,3.12,0.39,11.5,3 +5.9,0.655,0,5.6,0.033,8,31,0.9936,3.32,0.51,10.5,1 +7.6,0.38,0.28,4.2,0.029,7,112,0.9906,3,0.41,12.6,3 +7.8,0.31,0.4,1.6,0.027,20,87,0.9911,3.15,0.48,11.9,3 +8.1,0.17,0.21,1.6,0.036,24,119,0.99396,3.18,0.52,10.1,3 +6.8,0.18,0.28,1.1,0.027,32,112,0.99089,3.15,0.45,11,4 +7.4,0.28,0.36,14.6,0.048,35,161,0.9968,3.14,0.56,10.6,2 +7.3,0.23,0.27,2.6,0.035,39,120,0.99138,3.04,0.59,11.3,4 +6.7,0.22,0.22,1.2,0.038,5,124,0.99098,3.1,0.37,11.2,1 +7.4,0.25,0.28,7.25,0.028,14,78,0.99238,2.94,0.37,11.5,4 +7.5,0.3,0.21,6.55,0.026,33,143,0.99244,2.92,0.35,11.1,2 +7.2,0.26,0.24,7,0.023,19,130,0.99176,3.14,0.49,12.8,4 +6.3,0.32,0.32,1.5,0.037,12,76,0.98993,3.3,0.46,12.3,3 +7.7,0.24,0.3,1.4,0.041,15,102,0.9929,3.26,0.53,10.4,3 +7.4,0.25,0.28,7.25,0.028,14,78,0.99238,2.94,0.37,11.5,4 +7,0.24,0.35,1,0.032,42,104,0.98988,3.16,0.37,11.7,4 +5.8,0.28,0.28,4.2,0.044,52,158,0.992,3.35,0.44,10.7,4 +6.8,0.19,0.71,17.5,0.042,21,114,0.99784,2.85,0.5,9.5,3 +6.8,0.19,0.71,17.5,0.042,21,114,0.99784,2.85,0.5,9.5,3 +6.8,0.19,0.71,17.5,0.042,21,114,0.99784,2.85,0.5,9.5,3 +6.6,0.19,0.35,1.5,0.037,37,107,0.99006,3.18,0.68,12,4 +6.4,0.28,0.36,1.3,0.053,28,186,0.99211,3.31,0.45,10.8,2 +5.6,0.28,0.27,3.9,0.043,52,158,0.99202,3.35,0.44,10.7,4 +5.6,0.28,0.28,4.2,0.044,52,158,0.992,3.35,0.44,10.7,4 +6.8,0.19,0.32,7.6,0.049,37,107,0.99332,3.12,0.44,10.7,4 +7.2,0.16,0.29,1,0.031,40,123,0.98958,3.12,0.4,12.1,4 +6.6,0.17,0.28,1.1,0.034,55,108,0.98939,3,0.52,11.9,4 +6.6,0.19,0.28,11.8,0.042,54,137,0.99492,3.18,0.37,10.8,3 +5.8,0.2,0.24,1.4,0.033,65,169,0.99043,3.59,0.56,12.3,4 +6.6,0.39,0.38,9.7,0.053,49,226,0.99787,3.3,0.57,9.4,3 +6.8,0.12,0.3,12.9,0.049,32,88,0.99654,3.2,0.35,9.9,3 +6.6,0.295,0.24,1.6,0.039,29,140,0.99304,3.35,0.61,10.4,4 +6.6,0.26,0.24,7.2,0.038,28,137,0.9952,3.35,0.6,10.4,3 +7,0.32,0.27,7.1,0.027,37,122,0.99165,3.15,0.6,12.6,4 +7.4,0.36,0.23,1.9,0.017,31,69,0.9892,2.93,0.36,12.5,3 +6.7,0.35,0.48,8.8,0.056,35,167,0.99628,3.04,0.47,9.4,2 +6.4,0.38,0.24,7.2,0.047,41,151,0.99604,3.11,0.6,9.2,2 +6.8,0.14,0.18,1.4,0.047,30,90,0.99164,3.27,0.54,11.2,3 +7,0.16,0.25,14.3,0.044,27,149,0.998,2.91,0.46,9.2,3 +7,0.16,0.25,14.3,0.044,27,149,0.998,2.91,0.46,9.2,3 +6.7,0.35,0.48,8.8,0.056,35,167,0.99628,3.04,0.47,9.4,2 +6.8,0.14,0.18,1.4,0.047,30,90,0.99164,3.27,0.54,11.2,3 +6.8,0.16,0.18,1.8,0.046,31,114,0.99226,3.27,0.55,10.8,3 +7,0.16,0.25,14.3,0.044,27,149,0.998,2.91,0.46,9.2,3 +6.4,0.38,0.24,7.2,0.047,41,151,0.99604,3.11,0.6,9.2,2 +7.2,0.24,0.3,1.2,0.037,11,95,0.98914,2.96,0.36,12.5,3 +7.7,0.32,0.61,11.8,0.041,66,188,0.99794,3,0.54,9.3,2 +7,0.29,0.33,0.9,0.041,20,117,0.99048,3.21,0.5,11.4,2 +7.1,0.27,0.24,12.6,0.044,48,118,0.99726,3.04,0.56,10,4 +6.8,0.45,0.28,26.05,0.031,27,122,1.00295,3.06,0.42,10.6,3 +6.3,0.2,0.26,4.7,0.04,108,168,0.99278,3.07,0.75,10.7,4 +7.1,0.27,0.24,12.6,0.044,48,118,0.99726,3.04,0.56,10,4 +7.2,0.24,0.3,1.2,0.037,11,95,0.98914,2.96,0.36,12.5,3 +6.8,0.45,0.28,26.05,0.031,27,122,1.00295,3.06,0.42,10.6,3 +6.6,0.36,0.28,6.1,0.029,12,93,0.99054,3.19,0.27,12.8,4 +7.7,0.32,0.61,11.8,0.041,66,188,0.99794,3,0.54,9.3,2 +7,0.29,0.33,0.9,0.041,20,117,0.99048,3.21,0.5,11.4,2 +6.4,0.37,0.2,5.6,0.117,61,183,0.99459,3.24,0.43,9.5,2 +6.4,0.38,0.2,5.3,0.117,57,181,0.99459,3.24,0.43,9.5,3 +6.4,0.36,0.2,5.7,0.118,61,172,0.9946,3.24,0.43,9.5,3 +6.6,0.3,0.25,8,0.036,21,124,0.99362,3.06,0.38,10.8,3 +6.6,0.3,0.25,8,0.036,21,124,0.99362,3.06,0.38,10.8,3 +6.5,0.21,0.51,17.6,0.045,34,125,0.99966,3.2,0.47,8.8,3 +6.6,0.3,0.25,8,0.036,21,124,0.99362,3.06,0.38,10.8,3 +7.6,0.31,0.27,8.8,0.021,57,156,0.99442,3.08,0.38,11,4 +5.8,0.58,0,1.5,0.02,33,96,0.98918,3.29,0.38,12.4,3 +6.5,0.26,0.39,1.4,0.02,12,66,0.99089,3.25,0.75,11.3,4 +8.7,0.3,0.34,4.8,0.018,23,127,0.99474,3.12,0.49,11.2,4 +6.4,0.29,0.32,2.4,0.014,34,89,0.99008,3.24,0.66,12.5,4 +6.7,0.13,0.32,3.7,0.017,32,99,0.99348,3.12,0.44,10,3 +6.8,0.19,0.33,4.9,0.047,42,130,0.99283,3.12,0.56,11,3 +6,0.25,0.4,5.7,0.052,56,152,0.99398,3.16,0.88,10.5,3 +6,0.25,0.4,5.7,0.052,56,152,0.99398,3.16,0.88,10.5,3 +6.8,0.19,0.33,4.9,0.047,42,130,0.99283,3.12,0.56,11,3 +6.4,0.24,0.23,2,0.046,30,133,0.9908,3.12,0.54,11.4,4 +5.9,0.18,0.28,5.1,0.039,50,139,0.99165,3.16,0.44,11.3,3 +7.2,0.33,0.22,4.5,0.031,10,73,0.99076,2.97,0.52,12.2,4 +6.4,0.29,0.24,3.2,0.037,31,95,0.98942,2.9,0.66,12.6,4 +7.3,0.31,0.25,6.65,0.032,30,138,0.99244,2.9,0.37,11.1,2 +7,0.29,0.37,1.6,0.035,34,126,0.99058,3.26,0.47,12.3,3 +6.9,0.19,0.6,4,0.037,6,122,0.99255,2.92,0.59,10.4,1 +6.3,0.32,0.17,17.75,0.06,51,190,0.99916,3.13,0.48,8.8,3 +6.6,0.085,0.33,1.4,0.036,17,109,0.99306,3.27,0.61,9.5,3 +6.3,0.32,0.17,17.75,0.06,51,190,0.99916,3.13,0.48,8.8,3 +6.8,0.18,0.32,7.2,0.047,17,109,0.99498,3.42,0.44,10.4,3 +6.8,0.52,0.26,5.7,0.038,27,130,0.99,3.11,0.27,13,4 +7.1,0.28,0.28,8.5,0.03,25,191,0.99338,3.16,0.46,12.2,4 +5.7,0.15,0.47,11.4,0.035,49,128,0.99456,3.03,0.34,10.5,5 +5.8,0.275,0.3,5.4,0.043,41,149,0.9926,3.33,0.42,10.8,4 +5.4,0.53,0.16,2.7,0.036,34,128,0.98856,3.2,0.53,13.2,5 +5.8,0.32,0.28,4.3,0.032,46,115,0.98946,3.16,0.57,13,5 +6.7,0.22,0.39,1.2,0.049,26,152,0.99346,3.5,0.47,10,3 +6.1,0.6,0.12,1.8,0.05,11,76,0.99268,3.42,0.48,10.4,1 +6.5,0.26,0.31,1.3,0.034,59,145,0.98944,3.16,0.54,12.4,3 +5,0.29,0.54,5.7,0.035,54,155,0.98976,3.27,0.34,12.9,5 +5.4,0.53,0.16,2.7,0.036,34,128,0.98856,3.2,0.53,13.2,5 +6.8,0.21,0.26,11.7,0.038,61,152,0.99523,3.02,0.56,10.5,4 +5.8,0.32,0.28,4.3,0.032,46,115,0.98946,3.16,0.57,13,5 +6.5,0.27,0.26,11,0.03,2,82,0.99402,3.07,0.36,11.2,2 +5.9,0.37,0.32,1.6,0.029,41,102,0.98916,3.41,0.55,12.7,4 +6.2,0.21,0.18,11.6,0.044,61,155,0.99655,3.14,0.52,9.4,3 +6.8,0.3,0.29,6.2,0.025,29,95,0.99071,3.03,0.32,12.9,4 +7.3,0.41,0.29,1.8,0.032,26,74,0.98889,2.96,0.35,13,5 +5.4,0.3,0.3,1.2,0.029,25,93,0.98742,3.31,0.4,13.6,4 +6.6,0.34,0.2,1,0.053,26,112,0.99336,3.32,0.55,9.1,2 +5.6,0.25,0.19,2.4,0.049,42,166,0.992,3.25,0.43,10.4,3 +5.3,0.3,0.3,1.2,0.029,25,93,0.98742,3.31,0.4,13.6,4 +6.9,0.58,0.58,8.2,0.032,29,169,0.99275,3.28,0.44,12.2,3 +7.2,0.23,0.25,18.8,0.085,19,111,1.00044,3.1,0.51,8.7,2 +7.1,0.2,0.27,9.6,0.037,19,105,0.99444,3.04,0.37,10.5,4 +6.8,0.15,0.41,12.9,0.044,79.5,183,0.99742,3.24,0.78,10.2,3 +7,0.22,0.26,9.2,0.027,37,122,0.99228,3.06,0.34,12.5,5 +6.4,0.16,0.44,1.2,0.051,39,122,0.99058,3.11,0.75,11.3,4 +6.8,0.15,0.41,12.9,0.044,79.5,183,0.99742,3.24,0.78,10.2,3 +6.8,0.31,0.3,8,0.028,33,122,0.99164,3.13,0.63,12.6,4 +6.8,0.15,0.41,12.9,0.044,79.5,183,0.99742,3.24,0.78,10.2,3 +7.6,0.3,0.37,1.6,0.087,27,177,0.99438,3.09,0.5,9.8,2 +6,0.16,0.27,12,0.03,39,98,0.99402,3.15,0.34,10.8,2 +7.1,0.21,0.35,2.5,0.04,41,186,0.99128,3.32,0.56,12.5,3 +7,0.22,0.26,9.2,0.027,37,122,0.99228,3.06,0.34,12.5,5 +5.6,0.21,0.24,4.4,0.027,37,150,0.991,3.3,0.31,11.5,4 +7.4,0.22,0.26,8.8,0.027,23,112,0.9931,2.98,0.41,11.4,3 +7.1,0.2,0.27,9.6,0.037,19,105,0.99444,3.04,0.37,10.5,4 +6.8,0.31,0.3,8,0.028,33,122,0.99164,3.13,0.63,12.6,4 +7.2,0.23,0.25,18.8,0.085,19,111,1.00044,3.1,0.51,8.7,2 +6.4,0.15,0.4,1.3,0.053,61,146,0.99112,3.17,0.68,11,3 +6.4,0.16,0.44,1.2,0.051,39,122,0.99058,3.11,0.75,11.3,4 +6.8,0.15,0.41,12.9,0.044,79.5,182,0.99742,3.24,0.78,10.2,3 +6.3,0.22,0.34,1.2,0.036,32,96,0.98961,3.06,0.74,11.6,3 +7.6,0.3,0.37,1.6,0.087,27,177,0.99438,3.09,0.5,9.8,2 +7,0.3,0.27,1.5,0.076,24,145,0.99344,3.1,0.52,10.1,2 +6.6,0.26,0.22,18.15,0.05,23,139,0.99904,3.06,0.5,9.2,2 +7.5,0.24,0.31,13.1,0.05,26,180,0.99884,3.05,0.53,9.1,3 +7.5,0.24,0.31,13.1,0.05,26,180,0.99884,3.05,0.53,9.1,3 +7.5,0.24,0.31,13.1,0.05,26,180,0.99884,3.05,0.53,9.1,3 +7.5,0.24,0.31,13.1,0.05,26,180,0.99884,3.05,0.53,9.1,3 +6.6,0.15,0.34,1,0.037,45,79,0.98949,2.96,0.5,11.7,3 +6.7,0.34,0.43,1.6,0.041,29,114,0.99014,3.23,0.44,12.6,3 +7.7,0.35,0.46,11.8,0.088,61,183,0.99786,2.86,0.47,9,2 +6.7,0.31,0.09,1.4,0.039,53,141,0.99206,3.12,0.44,10.1,2 +4.7,0.67,0.09,1,0.02,5,9,0.98722,3.3,0.34,13.6,2 +7.5,0.24,0.31,13.1,0.05,26,180,0.99884,3.05,0.53,9.1,3 +6.3,0.2,0.18,10.6,0.045,57,159,0.99666,3.09,0.54,9.2,2 +6.6,0.28,0.23,10.4,0.049,45,190,0.99754,3.12,0.51,8.8,2 +8.5,0.18,0.3,1.1,0.028,34,95,0.99272,2.83,0.36,10,1 +6.5,0.35,0.38,7.4,0.036,20,196,0.99712,3.47,0.48,9.1,3 +6.8,0.22,0.26,1.2,0.041,29,182,0.99104,3.04,0.35,11.2,2 +6.3,0.18,0.24,3.4,0.053,20,119,0.99373,3.11,0.52,9.2,3 +6.6,0.26,0.22,18.15,0.05,23,139,0.99904,3.06,0.5,9.2,2 +6.6,0.3,0.45,8,0.038,54,200,0.9956,3.18,0.48,9.5,2 +6.3,0.34,0.27,2.5,0.024,40,152,0.99095,3.35,0.6,11.9,4 +7.7,0.3,0.23,2,0.068,28,138,0.99382,3.11,0.62,9.8,2 +7.7,0.31,0.23,2,0.069,29,134,0.99382,3.11,0.62,9.8,2 +5.7,0.265,0.28,6.9,0.036,46,150,0.99299,3.36,0.44,10.8,4 +5.4,0.255,0.33,1.2,0.051,29,122,0.99048,3.37,0.66,11.3,3 +6.6,0.26,0.28,9.4,0.028,13,121,0.99254,3.17,0.34,12.1,3 +4.8,0.17,0.28,2.9,0.03,22,111,0.9902,3.38,0.34,11.3,4 +5.7,0.265,0.28,6.9,0.036,46,150,0.99299,3.36,0.44,10.8,4 +6.2,0.2,0.33,5.4,0.028,21,75,0.99012,3.36,0.41,13.5,4 +7.5,0.28,0.41,1.3,0.044,11,126,0.99293,3.28,0.45,10.3,2 +6.2,0.22,0.2,20.8,0.035,58,184,1.00022,3.11,0.53,9,3 +7,0.34,0.26,10.3,0.041,51,166,0.99382,3.08,0.35,11.6,3 +7.5,0.28,0.41,1.3,0.044,11,126,0.99293,3.28,0.45,10.3,2 +6.5,0.19,0.34,1.6,0.029,39,116,0.98954,3.21,0.68,12.5,3 +6,0.21,0.29,13.1,0.042,28,125,0.99936,3.39,0.45,8.6,2 +6.1,0.22,0.46,1.8,0.16,34,74,0.9884,3.19,0.33,13.4,3 +6.5,0.32,0.48,8,0.026,18,88,0.99144,3.22,0.79,12.7,1 +7.1,0.21,0.72,1.6,0.167,65,120,0.99324,2.97,0.51,9.2,2 +5.6,0.26,0.18,1.4,0.034,18,135,0.99174,3.32,0.35,10.2,3 +7,0.15,0.28,14.7,0.051,29,149,0.99792,2.96,0.39,9,4 +7,0.15,0.28,14.7,0.051,29,149,0.99792,2.96,0.39,9,4 +7,0.15,0.28,14.7,0.051,29,149,0.99792,2.96,0.39,9,4 +7,0.15,0.28,14.7,0.051,29,149,0.99792,2.96,0.39,9,4 +7,0.15,0.28,14.7,0.051,29,149,0.99792,2.96,0.39,9,4 +7,0.15,0.28,14.7,0.051,29,149,0.99792,2.96,0.39,9,4 +7,0.15,0.28,14.7,0.051,29,149,0.99792,2.96,0.39,9,4 +7.4,0.27,0.28,1.8,0.04,45,121,0.99043,3.02,0.4,11.9,2 +6.8,0.22,0.3,10.6,0.07,67,194,0.99654,2.89,0.42,9,3 +6.2,0.24,0.25,12.5,0.055,47,134,0.99758,3.3,0.51,9,2 +6.3,0.28,0.29,6.8,0.051,40,143,0.99374,3.43,0.59,11,3 +7,0.15,0.28,14.7,0.051,29,149,0.99792,2.96,0.39,9,4 +5.5,0.17,0.23,2.9,0.039,10,108,0.99243,3.28,0.5,10,2 +6.5,0.26,0.34,1.4,0.04,25,184,0.99216,3.29,0.46,10.7,2 +6.6,0.27,0.33,1.4,0.042,24,183,0.99215,3.29,0.46,10.7,2 +5.4,0.46,0.15,2.1,0.026,29,130,0.98953,3.39,0.77,13.4,5 +7.8,0.19,0.32,7.4,0.015,47,124,0.99278,2.99,0.39,11,3 +5.5,0.17,0.23,2.9,0.039,10,108,0.99243,3.28,0.5,10,2 +6.5,0.26,0.34,1.4,0.04,25,184,0.99216,3.29,0.46,10.7,2 +6.6,0.27,0.33,1.4,0.042,24,183,0.99215,3.29,0.46,10.7,2 +7.8,0.19,0.32,7.4,0.015,47,124,0.99278,2.99,0.39,11,3 +7.8,0.2,0.32,5,0.016,31,101,0.99186,2.99,0.39,11,3 +6.1,0.17,0.28,2.5,0.028,22,98,0.99072,3.16,0.37,11.1,4 +7.4,0.2,0.35,6.1,0.025,10,40,0.99244,2.79,0.52,10.9,2 +6.7,0.39,0.24,2.7,0.017,22,80,0.99084,3.03,0.37,11.5,2 +5.4,0.46,0.15,2.1,0.026,29,130,0.98953,3.39,0.77,13.4,5 +6.9,0.4,0.17,12.9,0.033,59,186,0.99754,3.08,0.49,9.4,2 +6.9,0.4,0.17,12.9,0.033,59,186,0.99754,3.08,0.49,9.4,2 +6.9,0.4,0.17,12.9,0.033,59,186,0.99754,3.08,0.49,9.4,2 +6.3,0.24,0.29,13.7,0.035,53,134,0.99567,3.17,0.38,10.6,3 +6.9,0.4,0.17,12.9,0.033,59,186,0.99754,3.08,0.49,9.4,2 +7.4,0.27,0.31,2.4,0.014,15,143,0.99094,3.03,0.65,12,1 +6.1,0.27,0.28,9.8,0.042,61,125,0.99532,3.14,0.42,10.2,3 +6.3,0.24,0.29,13.7,0.035,53,134,0.99567,3.17,0.38,10.6,3 +5,0.61,0.12,1.3,0.009,65,100,0.9874,3.26,0.37,13.5,2 +6.7,0.42,0.39,12.1,0.04,61,248,0.99794,3.31,0.58,9.7,2 +6.5,0.33,0.28,6.1,0.018,41,103,0.99122,3.24,0.32,12.2,3 +6.9,0.33,0.31,7.7,0.04,29,135,0.99226,3.11,0.57,12.3,2 +6.5,0.33,0.28,6.1,0.018,41,103,0.99122,3.24,0.32,12.2,3 +6.3,0.15,0.3,1.4,0.022,38,100,0.99099,3.42,0.57,11.4,4 +6.5,0.32,0.45,7.7,0.022,31,97,0.99134,3.2,0.7,12.7,4 +6.7,0.42,0.39,12.1,0.04,61,248,0.99794,3.31,0.58,9.7,2 +7.4,0.25,0.29,6.8,0.02,31,113,0.99338,3.13,0.29,10.8,3 +7.6,0.27,0.3,9.2,0.018,23,96,0.9938,3.08,0.29,11,3 +6.4,0.27,0.45,8.3,0.05,52,196,0.9955,3.18,0.48,9.5,2 +6.5,0.25,0.27,17.4,0.064,29,140,0.99776,3.2,0.49,10.1,3 +5.6,0.19,0.31,2.7,0.027,11,100,0.98964,3.46,0.4,13.2,4 +7.4,0.29,0.48,12.8,0.037,61.5,182,0.99808,3.02,0.34,8.8,2 +6.4,0.34,0.44,8.2,0.043,54,201,0.99551,3.18,0.48,9.5,2 +6.6,0.27,0.52,8.1,0.044,53,202,0.99548,3.18,0.48,9.5,2 +6.6,0.26,0.52,8.2,0.047,52,191,0.99541,3.16,0.47,9.5,3 +6.4,0.27,0.45,8.3,0.05,52,196,0.9955,3.18,0.48,9.5,2 +6.5,0.26,0.5,8,0.051,46,197,0.99536,3.18,0.47,9.5,2 +6.8,0.25,0.3,11.8,0.043,53,133,0.99524,3.03,0.58,10.4,3 +6.3,0.32,0.26,12,0.049,63,170,0.9961,3.14,0.55,9.9,3 +5.5,0.24,0.45,1.7,0.046,22,113,0.99224,3.22,0.48,10,2 +6.5,0.25,0.27,17.4,0.064,29,140,0.99776,3.2,0.49,10.1,3 +6.6,0.13,0.29,13.9,0.056,33,95,0.99702,3.17,0.39,9.4,3 +7,0.39,0.21,10.7,0.098,13,91,0.99657,3.03,0.47,9.3,2 +7.9,0.21,0.39,2,0.057,21,138,0.99176,3.05,0.52,10.9,2 +7,0.3,0.28,2.2,0.042,21,177,0.99166,3.2,0.57,11.4,2 +8.1,0.2,0.3,1.3,0.036,7,49,0.99242,2.99,0.73,10.3,2 +8.3,0.18,0.3,1.1,0.033,20,57,0.99109,3.02,0.51,11,3 +7.9,0.21,0.39,2,0.057,21,138,0.99176,3.05,0.52,10.9,2 +7.2,0.17,0.34,6.4,0.042,16,111,0.99278,2.99,0.4,10.8,3 +8.1,0.2,0.3,1.3,0.036,7,49,0.99242,2.99,0.73,10.3,2 +8.3,0.18,0.3,1.1,0.033,20,57,0.99109,3.02,0.51,11,3 +7,0.39,0.21,10.7,0.098,13,91,0.99657,3.03,0.47,9.3,2 +6.8,0.21,0.62,6.4,0.041,7,113,0.99358,2.96,0.59,10.2,2 +6.9,0.21,0.62,6.3,0.042,7,109,0.99358,2.96,0.59,10.2,3 +7.2,0.17,0.34,6.4,0.042,16,111,0.99278,2.99,0.4,10.8,3 +6.8,0.26,0.34,15.1,0.06,42,162,0.99705,3.24,0.52,10.5,0 +7.2,0.28,0.38,2,0.052,23,156,0.9912,3.13,0.52,11.1,2 +7.9,0.21,0.39,2,0.057,21,138,0.99176,3.05,0.52,10.9,2 +7,0.3,0.28,2.2,0.042,21,177,0.99166,3.2,0.57,11.4,2 +7.4,0.34,0.28,12.1,0.049,31,149,0.99677,3.22,0.49,10.3,2 +6.3,0.43,0.32,8.8,0.042,18,106,0.99172,3.28,0.33,12.9,4 +6.8,0.41,0.3,8.8,0.045,28,131,0.9953,3.12,0.59,9.9,2 +6.3,0.4,0.24,5.1,0.036,43,131,0.99186,3.24,0.44,11.3,3 +5.1,0.35,0.26,6.8,0.034,36,120,0.99188,3.38,0.4,11.5,3 +5.1,0.35,0.26,6.8,0.034,36,120,0.99188,3.38,0.4,11.5,3 +6.3,0.3,0.2,3.7,0.039,34,132,0.99158,3,0.38,10.7,2 +6.9,0.28,0.28,12.2,0.042,52,139,0.99522,3.03,0.56,10.4,3 +7,0.33,0.28,5.7,0.033,39,204,0.99176,3.17,0.64,12.5,3 +6.7,0.26,0.49,8.1,0.052,48,197,0.99558,3.19,0.48,9.5,2 +7.3,0.24,0.3,2.5,0.042,31,104,0.9911,3.05,0.56,11.3,4 +6.7,0.46,0.21,4,0.034,12,88,0.99016,3.26,0.54,13,3 +5.1,0.35,0.26,6.8,0.034,36,120,0.99188,3.38,0.4,11.5,3 +5.1,0.23,0.18,1,0.053,13,99,0.98956,3.22,0.39,11.5,2 +6.3,0.4,0.24,5.1,0.036,43,131,0.99186,3.24,0.44,11.3,3 +7.1,0.44,0.23,5.8,0.035,24,100,0.99062,3.15,0.57,13.2,4 +4.8,0.26,0.23,10.6,0.034,23,111,0.99274,3.46,0.28,11.5,4 +6.8,0.31,0.19,3.5,0.086,30,130,0.993,2.83,0.44,9.6,2 +6.8,0.31,0.19,3.5,0.086,30,130,0.993,2.83,0.44,9.6,2 +7,0.15,0.29,16.4,0.058,45,110,0.9978,3.15,0.37,9.7,3 +6.5,0.41,0.22,4.8,0.052,49,142,0.9946,3.14,0.62,9.2,2 +6.2,0.31,0.23,3.3,0.052,34,113,0.99429,3.16,0.48,8.4,2 +8,0.27,0.33,1.2,0.05,41,103,0.99002,3,0.45,12.4,3 +8,0.27,0.33,1.2,0.05,41,103,0.99002,3,0.45,12.4,3 +6.5,0.41,0.22,4.8,0.052,49,142,0.9946,3.14,0.62,9.2,2 +6.2,0.31,0.23,3.3,0.052,34,113,0.99429,3.16,0.48,8.4,2 +6.7,0.37,0.25,2.5,0.028,24,84,0.9909,3.14,0.36,11.7,3 +6.6,0.21,0.5,8.7,0.036,41,191,0.99294,2.96,0.56,11,3 +7.5,0.26,0.31,1.6,0.032,36,109,0.99044,2.97,0.43,11.9,3 +7.5,0.34,0.28,4,0.028,46,100,0.98958,3.2,0.5,13.2,4 +6.7,0.37,0.25,2.5,0.028,24,84,0.9909,3.14,0.36,11.7,3 +6.4,0.32,0.23,16.2,0.055,36,176,0.9986,3.26,0.54,9.1,2 +6.7,0.24,0.32,9,0.023,20,109,0.99262,3.34,0.35,12.6,3 +6.4,0.32,0.23,16.2,0.055,36,176,0.9986,3.26,0.54,9.1,2 +7.1,0.39,0.79,1.4,0.194,23,90,0.99212,3.17,0.46,10.5,3 +8.2,0.31,0.43,7,0.047,18,87,0.99628,3.23,0.64,10.6,2 +6.7,0.24,0.32,9,0.023,20,109,0.99262,3.34,0.35,12.6,3 +5.9,0.17,0.29,3.1,0.03,32,123,0.98913,3.41,0.33,13.7,4 +5.9,0.2,0.23,1.5,0.037,38,93,0.99021,3.36,0.49,12,3 +6.6,0.32,0.26,4.6,0.031,26,120,0.99198,3.4,0.73,12.5,4 +5.9,0.12,0.27,4.8,0.03,40,110,0.99226,3.55,0.68,12.1,3 +5.9,0.18,0.29,4.6,0.032,68,137,0.99159,3.21,0.38,11.3,3 +5.9,0.2,0.23,1.5,0.037,38,93,0.99021,3.36,0.49,12,3 +5.4,0.17,0.27,2.7,0.049,28,104,0.99224,3.46,0.55,10.3,3 +6.1,0.21,0.3,6.3,0.039,47,136,0.99068,3.27,0.31,12.7,3 +7.3,0.25,0.26,7.2,0.048,52,207,0.99587,3.12,0.37,9.2,2 +7.3,0.25,0.26,7.2,0.048,52,207,0.99587,3.12,0.37,9.2,2 +6.2,0.22,0.3,12.4,0.054,108,152,0.99728,3.1,0.47,9.5,3 +6.5,0.27,0.19,6.6,0.045,98,175,0.99364,3.16,0.34,10.1,3 +6.5,0.27,0.19,6.6,0.045,98,175,0.99364,3.16,0.34,10.1,3 +6.6,0.39,0.22,4,0.038,17,98,0.99018,3.25,0.53,13,4 +6,0.31,0.38,4.8,0.04,41,101,0.98968,3.24,0.56,13.1,3 +8.4,0.23,0.32,1.3,0.048,59,113,0.99178,3.1,0.55,11,3 +7.3,0.25,0.26,7.2,0.048,52,207,0.99587,3.12,0.37,9.2,2 +6,0.22,0.25,11.1,0.056,112,177,0.9961,3.08,0.36,9.4,3 +6.2,0.22,0.3,12.4,0.054,108,152,0.99728,3.1,0.47,9.5,3 +6.1,0.23,0.27,9.8,0.055,74,134,0.99534,3.16,0.4,10.2,3 +6.5,0.27,0.19,6.6,0.045,98,175,0.99364,3.16,0.34,10.1,3 +7.3,0.36,0.54,13.3,0.054,63,193,0.99864,3.06,0.49,8.6,1 +7.6,0.37,0.51,11.7,0.094,58,181,0.99776,2.91,0.51,9,2 +6.7,0.26,0.51,8,0.062,50,194,0.99545,3.13,0.5,9.6,2 +7.4,0.22,0.27,1.6,0.057,45,98,0.99299,3.29,0.44,9.9,4 +6.1,0.22,0.28,16.55,0.059,54,135,0.99665,3.2,0.38,10.5,2 +7.1,0.28,0.31,1.5,0.053,20,98,0.99069,3.15,0.5,11.4,2 +6.5,0.35,0.31,10.2,0.069,58,170,0.99692,3.18,0.49,9.4,2 +6.8,0.73,0.2,6.6,0.054,25,65,0.99324,3.12,0.28,11.1,1 +6,0.28,0.24,17.8,0.047,42,111,0.99896,3.1,0.45,8.9,3 +6,0.28,0.24,17.8,0.047,42,111,0.99896,3.1,0.45,8.9,3 +7.1,0.2,0.37,1.5,0.049,28,129,0.99226,3.15,0.52,10.8,2 +6.8,0.33,0.31,7.4,0.045,34,143,0.99226,3.06,0.55,12.2,3 +6,0.28,0.24,17.8,0.047,42,111,0.99896,3.1,0.45,8.9,3 +7.2,0.24,0.36,2,0.029,21,63,0.99076,3.13,0.63,12.5,3 +6.8,0.33,0.31,7.4,0.045,34,143,0.99226,3.06,0.55,12.2,3 +7.2,0.24,0.36,2,0.029,21,63,0.99076,3.13,0.63,12.5,3 +6,0.28,0.24,17.8,0.047,42,111,0.99896,3.1,0.45,8.9,3 +6.2,0.27,0.26,12.1,0.046,43,127,0.9951,3.16,0.37,10.8,3 +6.4,0.38,0.26,8.2,0.043,28,98,0.99234,2.99,0.31,11.4,3 +7.1,0.2,0.37,1.5,0.049,28,129,0.99226,3.15,0.52,10.8,2 +6,0.21,0.3,8.7,0.036,47,127,0.99368,3.18,0.39,10.6,2 +7,0.34,0.1,3.5,0.044,17,63,0.9937,3.01,0.39,9.2,2 +5.9,0.435,0.16,6.4,0.031,21,134,0.99151,3.24,0.46,12.2,3 +7,0.25,0.33,2.1,0.021,17,76,0.99021,3.26,0.45,12.3,3 +6.7,0.26,0.29,7.7,0.038,40,179,0.99479,3.23,0.56,10.4,3 +7,0.24,0.3,12.3,0.035,72,172,0.9954,2.99,0.57,10.4,3 +8.5,0.23,0.34,1.3,0.035,54,110,0.99176,3.07,0.55,11,4 +6,0.21,0.3,8.7,0.036,47,127,0.99368,3.18,0.39,10.6,2 +7,0.34,0.1,3.5,0.044,17,63,0.9937,3.01,0.39,9.2,2 +4.8,0.65,0.12,1.1,0.013,4,10,0.99246,3.32,0.36,13.5,1 +6.1,0.22,0.38,2.8,0.144,12,65,0.9908,2.95,0.64,11.4,3 +5.8,0.27,0.26,3.5,0.071,26,69,0.98994,3.1,0.38,11.5,3 +5,0.455,0.18,1.9,0.036,33,106,0.98746,3.21,0.83,14,4 +6.5,0.33,0.3,3.8,0.036,34,88,0.99028,3.25,0.63,12.5,4 +6.5,0.33,0.3,3.8,0.036,34,88,0.99028,3.25,0.63,12.5,4 +6.7,0.31,0.3,2.4,0.038,30,83,0.98867,3.09,0.36,12.8,4 +6.2,0.39,0.24,4.8,0.037,45,138,0.99174,3.23,0.43,11.2,4 +6.2,0.39,0.24,4.8,0.037,45,138,0.99174,3.23,0.43,11.2,4 +7.1,0.37,0.3,6.2,0.04,49,139,0.99021,3.17,0.27,13.6,3 +7.2,0.23,0.82,1.3,0.149,70,109,0.99304,2.93,0.42,9.2,3 +6.5,0.33,0.3,3.8,0.036,34,88,0.99028,3.25,0.63,12.5,4 +7.2,0.25,0.32,1.5,0.054,24,105,0.99154,3.17,0.48,11.1,3 +6.2,0.39,0.24,4.8,0.037,45,138,0.99174,3.23,0.43,11.2,4 +4.7,0.455,0.18,1.9,0.036,33,106,0.98746,3.21,0.83,14,4 +7.1,0.37,0.3,6.2,0.04,49,139,0.99021,3.17,0.27,13.6,3 +6.2,0.28,0.51,7.9,0.056,49,206,0.9956,3.18,0.52,9.4,2 +6.4,0.35,0.28,1.6,0.037,31,113,0.98779,3.12,0.4,14.2,4 +6.6,0.31,0.28,1.4,0.035,28,107,0.98836,3,0.4,13.2,3 +7.4,0.25,0.37,2.6,0.05,24,132,0.99138,3.04,0.53,11.2,3 +7.3,0.36,0.34,14.8,0.057,46,173,0.99751,3.14,0.57,10.2,2 +6.7,0.31,0.3,2.4,0.038,30,83,0.98867,3.09,0.36,12.8,4 +8.6,0.31,0.3,0.9,0.045,16,109,0.99249,2.95,0.39,10.1,2 +8.6,0.31,0.3,0.9,0.045,16,109,0.99249,2.95,0.39,10.1,2 +8.6,0.22,0.33,1.2,0.031,38,95,0.99239,2.83,0.31,10.3,2 +6.9,0.14,0.29,9.9,0.056,30,91,0.99512,3.19,0.33,9.9,3 +6.5,0.22,0.31,3.9,0.046,17,106,0.99098,3.15,0.31,11.5,2 +6.6,0.32,0.47,15.6,0.063,27,173,0.99872,3.18,0.56,9,2 +6.6,0.32,0.47,15.6,0.063,27,173,0.99872,3.18,0.56,9,2 +6.1,0.28,0.26,1.5,0.03,25,101,0.98894,3.03,0.41,12.1,3 +6.2,0.3,0.28,1.6,0.036,28,106,0.988245,3.14,0.41,13.3,3 +6.9,0.22,0.28,7.8,0.05,43,116,0.99326,3.22,0.6,11.5,5 +8.7,0.31,0.21,5.6,0.039,28,67,0.99328,2.96,0.52,11,1 +7.3,0.27,0.3,1.3,0.04,26,84,0.99222,3.28,0.53,10.7,3 +7,0.46,0.2,16.7,0.046,50,184,0.99898,3.08,0.56,9.4,2 +5.7,0.23,0.25,7.95,0.042,16,108,0.99486,3.44,0.61,10.3,3 +6.5,0.36,0.36,6.7,0.185,51.5,151,0.99528,3.17,0.42,9.3,2 +8.2,0.18,0.38,1.1,0.04,41,92,0.99062,2.88,0.6,12,3 +6.2,0.27,0.32,6.3,0.048,47,159,0.99282,3.21,0.6,11,3 +6.9,0.4,0.37,8.9,0.053,36,148,0.996,3.16,0.5,9.3,2 +4.9,0.345,0.34,1,0.068,32,143,0.99138,3.24,0.4,10.1,2 +7.2,0.23,0.39,1.5,0.053,26,106,0.99166,3.18,0.47,11.1,3 +6.4,0.2,0.15,6.6,0.046,26,113,0.99408,2.99,0.58,9.9,3 +6.1,0.27,0.32,6.2,0.048,47,161,0.99281,3.22,0.6,11,3 +6.2,0.27,0.32,6.3,0.048,47,159,0.99282,3.21,0.6,11,3 +6,0.3,0.33,2.1,0.042,31,127,0.98964,3.32,0.42,12.5,3 +6.1,0.3,0.32,2.2,0.042,41,142,0.98952,3.31,0.44,12.7,4 +5.7,0.14,0.3,5.4,0.045,26,105,0.99469,3.32,0.45,9.3,2 +6.9,0.4,0.37,8.9,0.053,36,148,0.996,3.16,0.5,9.3,2 +4.9,0.345,0.34,1,0.068,32,143,0.99138,3.24,0.4,10.1,2 +6.3,0.33,0.2,17.9,0.066,36,161,0.9991,3.14,0.51,8.8,2 +7,0.16,0.3,2.6,0.043,34,90,0.99047,2.88,0.47,11.2,3 +8.4,0.22,0.3,1.3,0.038,45,122,0.99178,3.13,0.54,10.8,4 +6.3,0.33,0.2,17.9,0.066,36,161,0.9991,3.14,0.51,8.8,2 +7,0.16,0.3,2.6,0.043,34,90,0.99047,2.88,0.47,11.2,3 +5.4,0.24,0.18,2.3,0.05,22,145,0.99207,3.24,0.46,10.3,2 +7.7,0.31,0.36,4.3,0.026,15,87,0.99152,3.11,0.48,12,2 +5.6,0.185,0.19,7.1,0.048,36,110,0.99438,3.26,0.41,9.5,3 +5.6,0.185,0.19,7.1,0.048,36,110,0.99438,3.26,0.41,9.5,3 +6.6,0.43,0.24,11.9,0.04,54,159,0.99622,3.14,0.54,9.8,3 +7.6,0.39,0.46,11.7,0.084,55,170,0.99773,2.91,0.51,9,2 +7.2,0.58,0.27,5.8,0.032,40,118,0.99088,3.17,0.53,13,4 +6,0.34,0.32,3.8,0.044,13,116,0.99108,3.39,0.44,11.8,4 +7.5,0.35,0.48,12.4,0.056,61,176.5,0.99803,2.97,0.52,8.8,2 +7.3,0.38,0.23,6.5,0.05,18,102,0.99304,3.1,0.55,11.2,1 +5.4,0.185,0.19,7.1,0.048,36,110,0.99438,3.26,0.41,9.5,3 +6.3,0.27,0.51,7.6,0.049,35,200,0.99548,3.16,0.54,9.4,1 +6.5,0.29,0.52,7.9,0.049,35,192,0.99551,3.16,0.51,9.5,3 +6.4,0.17,0.3,2.8,0.034,33,125,0.99152,3.03,0.49,10.4,3 +6.7,0.18,0.31,10.6,0.035,42,143,0.99572,3.08,0.49,9.8,4 +6.4,0.17,0.3,2.8,0.034,33,125,0.99152,3.03,0.49,10.4,3 +6.8,0.37,0.67,1.5,0.175,16,98,0.99244,3.06,0.56,10.3,3 +6.3,0.27,0.51,7.6,0.049,35,200,0.99548,3.16,0.54,9.4,1 +6.5,0.29,0.52,7.9,0.049,35,192,0.99551,3.16,0.51,9.5,3 +6.1,0.24,0.26,1.7,0.033,61,134,0.9903,3.19,0.81,11.9,4 +7,0.32,0.29,7.6,0.025,35,124,0.99162,3.15,0.65,12.8,4 +6.9,0.27,0.25,7.5,0.03,18,117,0.99116,3.09,0.38,13,3 +6.5,0.29,0.53,1.7,0.04,41,192,0.9922,3.26,0.59,10.4,4 +6.5,0.29,0.52,1.7,0.034,41,193,0.99223,3.25,0.59,10.4,3 +6.1,0.22,0.25,12.1,0.035,54,135,0.99481,3.21,0.4,10.7,2 +6.3,0.22,0.27,4.5,0.036,81,157,0.9928,3.05,0.76,10.7,4 +6.1,0.24,0.26,1.7,0.033,61,134,0.9903,3.19,0.81,11.9,4 +5.6,0.23,0.25,8,0.043,31,101,0.99429,3.19,0.42,10.4,3 +7,0.32,0.29,7.6,0.025,35,124,0.99162,3.15,0.65,12.8,4 +6.8,0.11,0.27,8.6,0.044,45,104,0.99454,3.2,0.37,9.9,3 +6.8,0.11,0.27,8.6,0.044,45,104,0.99454,3.2,0.37,9.9,3 +7.3,0.23,0.41,14.6,0.048,73,223,0.99863,3.16,0.71,9.4,3 +6.1,0.2,0.17,1.6,0.048,46,129,0.991,3.3,0.43,11.4,3 +6.8,0.11,0.27,8.6,0.044,45,104,0.99454,3.2,0.37,9.9,3 +7.3,0.23,0.41,14.6,0.048,73,223,0.99863,3.16,0.71,9.4,3 +6.9,0.2,0.41,1.1,0.06,36,104,0.99317,2.99,0.39,9.2,2 +6.7,0.19,0.32,3.7,0.041,26,76,0.99173,2.9,0.57,10.5,4 +6.7,0.28,0.34,8.9,0.048,32,111,0.99455,3.25,0.54,11,4 +6.7,0.28,0.34,8.9,0.048,32,111,0.99455,3.25,0.54,11,4 +8,0.37,0.31,4.7,0.038,3,127,0.99186,2.9,0.72,12.1,2 +6.7,0.28,0.34,8.9,0.048,32,111,0.99455,3.25,0.54,11,4 +6,0.26,0.29,3.1,0.041,37,144,0.98944,3.22,0.39,12.8,4 +6.4,0.24,0.49,5.8,0.053,25,120,0.9942,3.01,0.98,10.5,3 +6.4,0.24,0.49,5.8,0.053,25,120,0.9942,3.01,0.98,10.5,3 +6.4,0.24,0.49,5.8,0.053,25,120,0.9942,3.01,0.98,10.5,3 +6.4,0.25,0.57,1,0.062,21,122,0.99238,3,0.4,9.5,2 +6.1,0.25,0.48,15.8,0.052,25,94,0.99782,3.07,0.45,9.2,3 +6.8,0.14,0.35,1.5,0.047,40,117,0.99111,3.07,0.72,11.1,3 +6.5,0.38,0.26,5.2,0.042,33,112,0.99067,3.06,0.5,12.3,4 +6.8,0.14,0.35,1.5,0.047,40,117,0.99111,3.07,0.72,11.1,3 +5.4,0.15,0.32,2.5,0.037,10,51,0.98878,3.04,0.58,12.6,3 +6.4,0.25,0.57,1,0.062,21,122,0.99238,3,0.4,9.5,2 +6.1,0.25,0.48,15.8,0.052,25,94,0.99782,3.07,0.45,9.2,3 +6.8,0.22,0.32,5.9,0.054,40,152,0.9938,3.2,0.57,10.8,3 +7.2,0.21,0.29,3.1,0.044,39,122,0.99143,3,0.6,11.3,3 +6,0.26,0.29,3.1,0.041,37,144,0.98944,3.22,0.39,12.8,4 +6.4,0.24,0.49,5.8,0.053,25,120,0.9942,3.01,0.98,10.5,3 +6.5,0.46,0.24,11.5,0.051,56,171,0.99588,3.08,0.56,9.8,3 +6.5,0.18,0.48,18,0.054,56,183,1.00038,2.98,0.61,8.5,3 +6.2,0.32,0.12,4.8,0.054,6,97,0.99424,3.16,0.5,9.3,2 +7.2,0.4,0.24,8.5,0.055,45,151,0.99626,3.2,0.52,9.2,2 +5.9,0.23,0.24,1.6,0.037,32,115,0.99076,3.21,0.51,11.4,3 +6.4,0.18,0.48,18,0.054,56,183,1.00038,2.98,0.61,8.5,3 +6.2,0.32,0.12,4.8,0.054,6,97,0.99424,3.16,0.5,9.3,2 +6.4,0.37,0.12,5.9,0.056,6,91,0.99536,3.06,0.46,8.4,1 +7,0.23,0.42,1.1,0.062,35,100,0.99318,3.04,0.4,9.2,2 +7.2,0.4,0.24,8.5,0.055,45,151,0.99626,3.2,0.52,9.2,2 +7.6,0.19,0.37,13.1,0.033,52,151,0.99726,3.18,0.79,10.4,3 +6,0.28,0.27,4.1,0.046,50,147,0.99126,3.27,0.56,11.6,3 +6.2,0.32,0.45,2.9,0.029,37,94,0.98998,3.25,0.6,12.4,3 +7.6,0.19,0.37,13.1,0.033,52,151,0.99726,3.18,0.79,10.4,3 +6.4,0.26,0.26,1.1,0.052,22,176,0.99304,3.09,0.54,9.3,2 +5.9,0.25,0.27,1.5,0.029,37,81,0.9892,3.2,0.46,12.2,3 +6.1,0.28,0.3,7.75,0.031,33,139,0.99296,3.22,0.46,11,3 +6.9,0.19,0.38,1.15,0.023,30,105,0.99047,3.11,0.38,11.4,2 +6.4,0.29,0.57,1,0.06,15,120,0.9924,3.06,0.41,9.5,2 +6.8,0.27,0.22,17.8,0.034,16,116,0.9989,3.07,0.53,9.2,2 +7.5,0.26,0.38,5.7,0.021,23,125,0.99338,3.13,0.62,11.1,3 +6.8,0.27,0.22,17.8,0.034,16,116,0.9989,3.07,0.53,9.2,2 +6.4,0.2,0.22,7.4,0.032,53,172,0.99404,3.24,0.58,11,3 +7.3,0.33,0.22,1.4,0.041,40,177,0.99287,3.14,0.48,9.9,2 +7.3,0.34,0.22,1.4,0.044,43,176,0.99286,3.14,0.46,9.9,2 +6.4,0.29,0.57,1,0.06,15,120,0.9924,3.06,0.41,9.5,2 +6.1,1.1,0.16,4.4,0.033,8,109,0.99058,3.35,0.47,12.4,1 +6.3,0.24,0.29,1.6,0.052,48,185,0.9934,3.21,0.5,9.4,2 +6.2,0.24,0.22,7.9,0.053,45,149,0.99545,3.23,0.52,9.3,2 +7.4,0.16,0.27,15.5,0.05,25,135,0.9984,2.9,0.43,8.7,4 +7.4,0.16,0.27,15.5,0.05,25,135,0.9984,2.9,0.43,8.7,4 +7.4,0.16,0.27,15.5,0.05,25,135,0.9984,2.9,0.43,8.7,4 +7.4,0.16,0.27,15.5,0.05,25,135,0.9984,2.9,0.43,8.7,4 +7.2,0.17,0.28,17.55,0.05,33,154,0.99971,2.94,0.43,9,4 +6.9,0.19,0.35,13.5,0.038,49,118,0.99546,3,0.63,10.7,3 +6.9,0.19,0.35,13.5,0.038,49,118,0.99546,3,0.63,10.7,3 +6.8,0.16,0.36,1.3,0.034,32,98,0.99058,3.02,0.58,11.3,3 +7.4,0.16,0.27,15.5,0.05,25,135,0.9984,2.9,0.43,8.7,4 +6.8,0.3,0.27,11.6,0.028,22,97,0.99314,2.96,0.38,11.7,3 +6.2,0.24,0.22,7.9,0.053,45,149,0.99545,3.23,0.52,9.3,2 +7.4,0.16,0.27,15.5,0.05,25,135,0.9984,2.9,0.43,8.7,4 +7.2,0.17,0.28,17.55,0.05,33,154,0.99971,2.94,0.43,9,4 +6.8,0.3,0.27,11.6,0.028,22,97,0.99314,2.96,0.38,11.7,3 +6.5,0.43,0.18,13.15,0.032,25,131,0.99565,3.23,0.51,10.7,2 +6.6,0.17,0.36,1.9,0.036,38,110,0.99056,3.05,0.54,11.4,3 +6.9,0.19,0.35,13.5,0.038,49,118,0.99546,3,0.63,10.7,3 +6.8,0.16,0.36,1.3,0.034,32,98,0.99058,3.02,0.58,11.3,3 +6.4,0.41,0.01,6.1,0.048,20,70,0.99362,3.19,0.42,10,2 +6.4,0.41,0.01,6.1,0.048,20,70,0.99362,3.19,0.42,10,2 +7.4,0.36,0.32,1.9,0.036,27,119,0.99196,3.15,0.49,11.2,3 +6.1,0.17,0.21,1.9,0.09,44,130,0.99255,3.07,0.41,9.7,2 +5.5,0.28,0.21,1.6,0.032,23,85,0.99027,3.42,0.42,12.5,2 +6.6,0.5,0.26,11.3,0.029,32,110,0.99302,3.27,0.78,12.9,5 +7.1,0.44,0.27,8.4,0.057,60,160,0.99257,3.16,0.36,11.8,3 +6.9,0.38,0.28,8.3,0.062,22,166,0.99506,3.16,0.72,10.6,2 +7.1,0.44,0.27,8.4,0.057,60,160,0.99257,3.16,0.36,11.8,3 +6.2,0.24,0.28,12.2,0.049,54,133,0.9952,3.19,0.37,10.7,3 +6.1,0.28,0.27,8,0.048,41,162,0.99498,3.21,0.51,9.9,2 +7.6,0.26,0.32,1.3,0.048,23,76,0.9903,2.96,0.46,12,3 +7.5,0.16,0.38,12.7,0.043,70.5,163,0.99706,3.15,0.82,10.4,4 +6.5,0.36,0.16,1.3,0.054,11,107,0.99398,3.19,0.39,8.5,2 +6.6,0.35,0.19,10.5,0.06,15,82,0.99588,3.13,0.38,9.9,1 +5.7,0.25,0.26,12.5,0.049,52.5,120,0.99691,3.08,0.45,9.4,3 +7.4,0.37,0.26,9.6,0.05,33,134,0.99608,3.13,0.46,10.4,2 +5.7,0.25,0.21,1.5,0.044,21,108,0.99142,3.3,0.59,11,3 +5.8,0.23,0.21,1.5,0.044,21,110,0.99138,3.3,0.57,11,3 +5.4,0.265,0.28,7.8,0.052,27,91,0.99432,3.19,0.38,10.4,3 +5.7,0.25,0.27,10.8,0.05,58,116,0.99592,3.1,0.5,9.8,3 +5.7,0.25,0.26,12.5,0.049,52.5,106,0.99691,3.08,0.45,9.4,3 +5.9,0.23,0.28,8.6,0.046,37,142,0.99432,3.23,0.53,10.6,3 +6.2,0.3,0.32,1.2,0.052,32,185,0.99266,3.28,0.44,10.1,2 +6.5,0.33,0.24,14.5,0.048,20,96,0.99456,3.06,0.3,11.5,5 +7.4,0.26,0.29,3.7,0.048,14,73,0.9915,3.06,0.45,11.4,3 +7,0.2,0.4,1.1,0.058,30,93,0.99322,3.03,0.38,9.2,3 +6.5,0.21,0.42,1.1,0.059,33,101,0.9927,3.12,0.38,9.7,3 +7.3,0.25,0.27,3.8,0.047,16,79,0.99173,3.07,0.46,11.3,3 +6.8,0.27,0.24,4.6,0.098,36,127,0.99412,3.15,0.49,9.6,3 +6.7,0.24,0.3,10.2,0.07,44,179,0.99666,2.86,0.46,8.9,3 +6.4,0.14,0.28,7.9,0.057,21,82,0.99425,3.26,0.36,10,3 +6.4,0.5,0.2,2.4,0.059,19,112,0.99314,3.18,0.4,9.2,3 +6.6,0.41,0.27,10.7,0.11,20,103,0.99672,3.08,0.41,9,3 +6.4,0.25,0.28,4.9,0.03,29,98,0.99024,3.09,0.58,12.8,4 +6.6,0.41,0.27,10.7,0.11,20,103,0.99672,3.08,0.41,9,3 +8,0.25,0.35,1.1,0.054,13,136,0.99366,3.08,0.55,9.5,2 +6.4,0.14,0.28,7.9,0.057,21,82,0.99425,3.26,0.36,10,3 +6.6,0.21,0.34,5.6,0.046,30,140,0.99299,3.22,0.38,11,2 +6.4,0.5,0.2,2.4,0.059,19,112,0.99314,3.18,0.4,9.2,3 +6.3,0.29,0.23,14.2,0.037,24,99,0.99528,3.08,0.38,10.6,3 +6.9,0.37,0.23,9.5,0.057,54,166,0.99568,3.23,0.42,10,2 +6.9,0.37,0.23,9.5,0.057,54,166,0.99568,3.23,0.42,10,2 +5.7,0.31,0.28,4.1,0.03,22,86,0.99062,3.31,0.38,11.7,4 +6.9,0.45,0.27,4.7,0.035,17,80,0.99058,3.12,0.36,12.5,4 +6.9,0.3,0.45,1.4,0.039,36,122,0.99059,3.07,0.47,11.1,4 +5.3,0.23,0.56,0.9,0.041,46,141,0.99119,3.16,0.62,9.7,2 +6.8,0.3,0.26,20.3,0.037,45,150,0.99727,3.04,0.38,12.3,3 +6.7,0.28,0.42,3.5,0.035,43,105,0.99021,3.18,0.38,12.2,3 +5,0.255,0.22,2.7,0.043,46,153,0.99238,3.75,0.76,11.3,3 +7.6,0.4,0.27,1.2,0.053,23,193,0.99164,3.22,0.38,11.6,2 +5.5,0.21,0.25,1.2,0.04,18,75,0.99006,3.31,0.56,11.3,3 +6,0.2,0.25,2,0.041,30,95,0.99078,3.27,0.56,11.1,3 +6.1,0.17,0.29,1.1,0.041,32,92,0.99036,3.26,0.57,11.2,3 +7.5,0.21,0.29,1.5,0.046,35,107,0.99123,3.15,0.45,11.3,3 +7.3,0.26,0.32,1.2,0.041,29,94,0.98978,3.07,0.45,12,3 +6.2,0.35,0.2,18.1,0.069,33,158,0.99908,3.15,0.5,8.8,3 +6.2,0.35,0.2,18.1,0.069,33,158,0.99908,3.15,0.5,8.8,3 +6.5,0.43,0.31,3.6,0.046,19,143,0.99022,3.15,0.34,12,5 +6.5,0.4,0.31,3.5,0.046,22,147,0.99024,3.15,0.31,12,4 +7.4,0.28,0.5,12.1,0.049,48,122,0.9973,3.01,0.44,9,2 +6.3,0.23,0.22,17.45,0.054,42,151,0.99853,3.12,0.6,9.3,3 +6.2,0.34,0.25,12.1,0.059,33,171,0.99769,3.14,0.56,8.7,3 +6.6,0.44,0.32,3,0.095,13,75,0.98954,3.1,0.63,12.8,3 +6,0.13,0.36,1.6,0.052,23,72,0.98974,3.1,0.5,11.5,4 +6.3,0.17,0.23,5.7,0.048,44,147,0.99382,3.08,0.54,10,2 +6.3,0.18,0.22,5.6,0.047,45,147,0.99383,3.09,0.54,10,2 +6.7,0.31,0.34,6.8,0.059,51,215,0.99538,3.33,0.56,10.3,2 +6.6,0.33,0.32,15.6,0.054,62,227,0.99734,3.25,0.56,10.4,2 +6.3,0.34,0.31,6,0.02,18,68,0.98981,3.22,0.29,13.4,4 +6.8,0.29,0.32,1.8,0.032,18,130,0.99095,3.05,0.62,11.2,3 +7.4,0.31,0.26,8.6,0.048,47,206,0.9964,3.26,0.36,9.1,2 +7.4,0.31,0.26,8.6,0.048,47,206,0.9964,3.26,0.36,9.1,2 +5.7,0.25,0.27,11.5,0.04,24,120,0.99411,3.33,0.31,10.8,3 +6.8,0.27,0.28,7.8,0.038,26,89,0.9915,3.24,0.34,12.5,3 +5.9,0.26,0.24,2.4,0.046,27,132,0.99234,3.63,0.73,11.3,2 +5.9,0.65,0.23,5,0.035,20,128,0.99016,3.46,0.48,12.8,3 +7.4,0.31,0.26,8.6,0.048,47,206,0.9964,3.26,0.36,9.1,2 +6.6,0.23,0.32,1.5,0.041,8,72,0.98949,3.22,0.39,12.7,3 +6.8,0.18,0.35,5.4,0.054,53,143,0.99287,3.1,0.54,11,4 +6.8,0.28,0.29,11.9,0.052,51,149,0.99544,3.02,0.58,10.4,3 +6.8,0.28,0.29,11.9,0.052,51,149,0.99544,3.02,0.58,10.4,3 +5.9,0.27,0.27,9,0.051,43,136,0.9941,3.25,0.53,10.7,3 +6.1,0.25,0.28,10,0.055,56,131,0.994,3.22,0.35,10.9,3 +6.8,0.28,0.29,11.9,0.052,51,149,0.99544,3.02,0.58,10.4,3 +6.8,0.26,0.29,11.9,0.052,54,160,0.99546,3.03,0.58,10.4,3 +7.1,0.13,0.29,15.5,0.064,56,115.5,0.99737,3.16,0.41,9.7,4 +6.8,0.18,0.35,5.4,0.054,53,143,0.99287,3.1,0.54,11,4 +6.2,0.2,0.25,15,0.055,8,120,0.99767,3.19,0.53,9.6,3 +5.8,0.24,0.28,1.4,0.038,40,76,0.98711,3.1,0.29,13.9,4 +7.6,0.48,0.31,9.4,0.046,6,194,0.99714,3.07,0.61,9.4,2 +7.4,0.26,0.32,3.7,0.032,29,193,0.99134,3.1,0.67,12.5,3 +6.2,0.2,0.25,15,0.055,8,120,0.99767,3.19,0.53,9.6,3 +6.1,0.3,0.47,1.4,0.049,50,187,0.9927,3.19,0.45,9.5,2 +6.2,0.32,0.5,6.5,0.048,61,186,0.9948,3.19,0.45,9.6,2 +6.1,0.3,0.47,1.4,0.049,50,187,0.9927,3.19,0.45,9.5,2 +6.3,0.34,0.52,6.3,0.047,63,186,0.99481,3.18,0.44,9.6,2 +7.4,0.16,0.3,13.7,0.056,33,168,0.99825,2.9,0.44,8.7,4 +7.4,0.16,0.3,13.7,0.056,33,168,0.99825,2.9,0.44,8.7,4 +7.4,0.16,0.3,13.7,0.056,33,168,0.99825,2.9,0.44,8.7,4 +7.4,0.16,0.3,13.7,0.056,33,168,0.99825,2.9,0.44,8.7,4 +7.4,0.16,0.3,13.7,0.056,33,168,0.99825,2.9,0.44,8.7,4 +7.4,0.16,0.3,13.7,0.056,33,168,0.99825,2.9,0.44,8.7,4 +7.2,0.26,0.38,1.5,0.061,12,120,0.99192,3.18,0.46,10.4,2 +7,0.31,0.35,1.6,0.063,13,119,0.99184,3.22,0.5,10.7,2 +6.6,0.22,0.35,1.4,0.05,23,83,0.99019,3.17,0.48,12,4 +5.8,0.23,0.31,3.5,0.044,35,158,0.98998,3.19,0.37,12.1,4 +6.3,0.17,0.32,1,0.04,39,118,0.98886,3.31,0.4,13.1,5 +6,0.19,0.26,1.4,0.039,30,104,0.98998,3.32,0.41,12.4,3 +6.7,0.21,0.34,1.5,0.035,45,123,0.98949,3.24,0.36,12.6,4 +7.4,0.16,0.3,13.7,0.056,33,168,0.99825,2.9,0.44,8.7,4 +6.6,0.22,0.37,1.6,0.04,31,101,0.99009,3.15,0.66,12,2 +6.8,0.34,0.27,5.2,0.06,14,169,0.99252,3.27,0.57,11.6,3 +7.1,0.34,0.86,1.4,0.174,36,99,0.99288,2.92,0.5,9.3,2 +6.3,0.24,0.22,11.9,0.05,65,179,0.99659,3.06,0.58,9.3,3 +6.9,0.35,0.39,2.4,0.048,25,157,0.99133,3.2,0.54,11.1,4 +6.8,0.24,0.33,3.2,0.049,68,161,0.99324,3.1,0.69,10.2,3 +6.4,0.25,0.33,1.7,0.037,35,113,0.99164,3.23,0.66,10.6,3 +5.8,0.19,0.33,4.2,0.038,49,133,0.99107,3.16,0.42,11.3,4 +6.9,0.24,0.4,15.4,0.052,81,198,0.9986,3.2,0.69,9.4,2 +6.5,0.31,0.61,13,0.053,31,123,0.99708,3.09,0.5,9.3,3 +6.6,0.25,0.32,5.6,0.039,15,68,0.99163,2.96,0.52,11.1,3 +7.5,0.38,0.56,9.7,0.055,15,170,0.99605,3.13,0.65,9.9,3 +6.2,0.3,0.3,2.5,0.041,29,82,0.99065,3.31,0.61,11.8,4 +6.4,0.33,0.28,4,0.04,24,81,0.9903,3.26,0.64,12.6,4 +6.9,0.24,0.4,15.4,0.052,81,198,0.9986,3.2,0.69,9.4,2 +7.6,0.27,0.32,1.2,0.043,23,72,0.99236,3.06,0.68,10.5,2 +5.9,0.24,0.34,2,0.037,40,108,0.98948,3.19,0.5,12.3,3 +5.3,0.33,0.3,1.2,0.048,25,119,0.99045,3.32,0.62,11.3,3 +6.4,0.21,0.21,5.1,0.097,21,105,0.9939,3.07,0.46,9.6,2 +7,0.22,0.3,1.4,0.04,14,63,0.98985,3.2,0.33,12,3 +7.8,0.27,0.35,1.2,0.05,36,140,0.99138,3.09,0.45,11.2,2 +6.7,0.2,0.24,6.5,0.044,28,100,0.99348,3.12,0.33,10.2,3 +8.1,0.27,0.33,1.3,0.045,26,100,0.99066,2.98,0.44,12.4,3 +6.7,0.2,0.24,6.5,0.044,28,100,0.99348,3.12,0.33,10.2,3 +7.1,0.45,0.24,2.7,0.04,24,87,0.98862,2.94,0.38,13.4,5 +5.8,0.22,0.29,1.3,0.036,25,68,0.98865,3.24,0.35,12.6,3 +6.3,0.3,0.48,7.4,0.053,34,149,0.99472,3.18,0.53,9.8,2 +7.9,0.36,0.53,12.9,0.049,63,139,0.99792,2.94,0.45,9.1,2 +8.1,0.27,0.33,1.3,0.045,26,100,0.99066,2.98,0.44,12.4,3 +8,0.24,0.33,1.2,0.044,28,101,0.99035,3.03,0.43,12.5,3 +6.7,0.41,0.27,2.6,0.033,25,85,0.99086,3.05,0.34,11.7,3 +6.7,0.24,0.31,2.3,0.044,37,113,0.99013,3.29,0.46,12.9,3 +6.2,0.3,0.32,1.3,0.054,27,183,0.99266,3.3,0.43,10.1,2 +6.9,0.26,0.38,10.5,0.044,33,139,0.99517,3.06,0.5,10.3,3 +6.7,0.41,0.27,2.6,0.033,25,85,0.99086,3.05,0.34,11.7,3 +5.9,0.32,0.2,14.4,0.05,29,144,0.99666,3.24,0.41,10.3,3 +6.1,0.25,0.3,1.2,0.036,42,107,0.991,3.34,0.56,10.8,4 +5.6,0.23,0.29,3.1,0.023,19,89,0.99068,3.25,0.51,11.2,3 +6.6,0.23,0.32,1.7,0.024,26,102,0.99084,3.29,0.6,11.8,3 +6,0.17,0.21,6,0.05,26,134,0.9939,3.08,0.54,9.8,3 +7.1,0.38,0.42,11.8,0.041,32,193,0.99624,3.04,0.49,10,3 +6.6,0.31,0.37,6.2,0.052,13,164,0.99602,3.24,0.39,8.8,1 +6.5,0.38,0.53,1.4,0.142,5,69,0.9926,3.14,0.52,10.1,1 +7,0.44,0.24,12.1,0.056,68,210,0.99718,3.05,0.5,9.5,2 +7,0.44,0.24,12.1,0.056,68,210,0.99718,3.05,0.5,9.5,2 +7,0.44,0.24,12.1,0.056,68,210,0.99718,3.05,0.5,9.5,2 +6.1,0.38,0.14,3.9,0.06,27,113,0.99344,3.07,0.34,9.2,1 +8,0.33,0.32,4.6,0.041,31,180,0.99184,2.92,0.74,12.2,3 +7,0.44,0.24,12.1,0.056,68,210,0.99718,3.05,0.5,9.5,2 +6,0.19,0.29,1.2,0.046,29,92,0.99033,3.22,0.53,11.3,3 +6.3,0.28,0.34,8.1,0.038,44,129,0.99248,3.26,0.29,12.1,3 +6.1,0.38,0.14,3.9,0.06,27,113,0.99344,3.07,0.34,9.2,1 +5.3,0.43,0.11,1.1,0.029,6,51,0.99076,3.51,0.48,11.2,1 +5.4,0.22,0.35,6.5,0.029,26,87,0.99092,3.29,0.44,12.5,4 +6.2,0.345,0.27,10.1,0.056,38,187,0.99486,3.31,0.56,10.6,2 +5.6,0.255,0.57,10.7,0.056,66,171,0.99464,3.25,0.61,10.4,4 +5.2,0.2,0.27,3.2,0.047,16,93,0.99235,3.44,0.53,10.1,4 +6.2,0.29,0.23,12.4,0.048,33,201,0.99612,3.11,0.56,9.9,3 +6.3,0.26,0.25,5.2,0.046,11,133,0.99202,2.97,0.68,11,3 +6,0.22,0.23,5,0.045,10,122,0.99261,2.94,0.63,10,3 +7.5,0.35,0.37,2.5,0.066,29,89,0.98964,3.14,0.42,12.7,3 +6.6,0.39,0.28,9.2,0.036,10,92,0.99206,3.07,0.35,12.1,3 +6.3,0.23,0.33,6.9,0.052,23,118,0.9938,3.23,0.46,10.4,3 +6.3,0.22,0.3,2,0.05,23,120,0.99204,3.24,0.47,10.4,3 +6.4,0.29,0.18,15,0.04,21,116,0.99736,3.14,0.5,9.2,2 +6.4,0.29,0.18,15,0.04,21,116,0.99736,3.14,0.5,9.2,2 +7.5,0.23,0.3,1.2,0.03,27,80,0.99192,3.05,0.68,10.5,2 +6.4,0.29,0.18,15,0.04,21,116,0.99736,3.14,0.5,9.2,2 +5.7,0.28,0.36,1.8,0.041,38,90,0.99002,3.27,0.98,11.9,4 +6.5,0.26,0.24,10.8,0.042,47,130,0.996,3.08,0.4,10.1,3 +6.4,0.27,0.29,3.9,0.034,62,140,0.99237,3.1,0.59,11.1,3 +5.9,0.22,0.29,4.2,0.037,69,144,0.99214,3.13,0.74,10.8,4 +6.8,0.26,0.26,2,0.019,23.5,72,0.99041,3.16,0.47,11.8,3 +7.6,0.36,0.48,13.5,0.038,44,116,0.9982,3.04,0.48,9.2,2 +7.6,0.35,0.47,13.3,0.037,42,116,0.99822,3.04,0.5,9.2,2 +5.7,0.18,0.26,2.2,0.023,21,95,0.9893,3.07,0.54,12.3,3 +6.6,0.36,0.47,1.4,0.145,26,124,0.99274,3.09,0.56,10.1,3 +5.9,0.14,0.2,1.6,0.04,26,114,0.99105,3.25,0.45,11.4,3 +5.5,0.23,0.19,2.2,0.044,39,161,0.99209,3.19,0.43,10.4,3 +6.7,0.11,0.26,14.8,0.053,44,95,0.99676,3.2,0.35,9.8,3 +7,0.24,0.24,1.8,0.047,29,91,0.99251,3.3,0.43,9.9,3 +6.7,0.11,0.26,14.8,0.053,44,95,0.99676,3.2,0.35,9.8,3 +5.3,0.47,0.1,1.3,0.036,11,74,0.99082,3.48,0.54,11.2,1 +7.5,0.29,0.24,9.9,0.058,25,115,0.99567,3.15,0.46,10.9,2 +6,0.33,0.26,5.1,0.051,16,119,0.99416,3.15,0.41,9.2,2 +6,0.33,0.26,5.1,0.051,16,119,0.99416,3.15,0.41,9.2,2 +5.8,0.32,0.23,1.5,0.033,39,121,0.9887,2.96,0.35,12,2 +5.8,0.3,0.23,1.5,0.034,37,121,0.98871,2.96,0.34,12.1,3 +3.8,0.31,0.02,11.1,0.036,20,114,0.99248,3.75,0.44,12.4,3 +6.2,0.36,0.22,5.25,0.038,44,145,0.99184,3.22,0.4,11.2,3 +6,0.31,0.27,2.3,0.042,19,120,0.98952,3.32,0.41,12.7,4 +6.9,0.52,0.54,7.9,0.036,23,169,0.99267,3.26,0.47,12.2,3 +7,0.55,0.05,8,0.036,19,164,0.99269,3.26,0.46,12.2,3 +5.8,0.2,0.16,1.4,0.042,44,99,0.98912,3.23,0.37,12.2,3 +6.2,0.36,0.22,5.25,0.038,44,145,0.99184,3.22,0.4,11.2,3 +6,0.31,0.27,2.3,0.042,19,120,0.98952,3.32,0.41,12.7,4 +6,0.29,0.27,2.3,0.044,20,117,0.9895,3.31,0.41,12.7,4 +5.7,0.22,0.29,3.5,0.04,27,146,0.98999,3.17,0.36,12.1,3 +7.1,0.46,0.23,13.7,0.045,44,192,0.9981,3.11,0.53,9.4,2 +6.6,0.21,0.3,9.9,0.041,64,174,0.995,3.07,0.5,10.1,3 +6.9,0.42,0.2,15.4,0.043,57,201,0.99848,3.08,0.54,9.4,2 +5.7,0.22,0.2,16,0.044,41,113,0.99862,3.22,0.46,8.9,3 +5.7,0.22,0.2,16,0.044,41,113,0.99862,3.22,0.46,8.9,3 +5.7,0.22,0.2,16,0.044,41,113,0.99862,3.22,0.46,8.9,3 +5.7,0.22,0.2,16,0.044,41,113,0.99862,3.22,0.46,8.9,3 +5.2,0.31,0.2,2.4,0.027,27,117,0.98886,3.56,0.45,13,4 +7.2,0.22,0.35,5.5,0.054,37,183,0.99474,3.08,0.5,10.3,2 +5.6,0.18,0.29,2.3,0.04,5,47,0.99126,3.07,0.45,10.1,1 +6.2,0.24,0.27,16.8,0.04,48,129,0.99691,3.23,0.38,10.5,3 +5.7,0.22,0.2,16,0.044,41,113,0.99862,3.22,0.46,8.9,3 +5.7,0.26,0.24,17.8,0.059,23,124,0.99773,3.3,0.5,10.1,2 +5.7,0.26,0.24,17.8,0.059,23,124,0.99773,3.3,0.5,10.1,2 +6,0.2,0.26,6.8,0.049,22,93,0.9928,3.15,0.42,11,3 +6,0.2,0.26,6.8,0.049,22,93,0.9928,3.15,0.42,11,3 +6,0.2,0.26,6.8,0.049,22,93,0.9928,3.15,0.42,11,3 +6,0.2,0.26,6.8,0.049,22,93,0.9928,3.15,0.42,11,3 +7.6,0.28,0.17,1.6,0.046,28,117,0.99288,3.08,0.43,10,2 +7,0.2,0.33,4.7,0.03,25,76,0.99202,2.88,0.54,10.5,3 +6.6,0.26,0.27,11.8,0.048,28,112,0.99606,2.87,0.49,9.7,3 +5.7,0.26,0.24,17.8,0.059,23,124,0.99773,3.3,0.5,10.1,2 +7.2,0.21,0.36,15.7,0.045,68,183,0.99922,3.25,0.76,9.4,2 +6.9,0.22,0.32,5.8,0.041,20,119,0.99296,3.17,0.55,11.2,3 +7.2,0.21,0.36,15.7,0.045,68,183,0.99922,3.25,0.76,9.4,2 +7.4,0.22,0.28,9,0.046,22,121,0.99468,3.1,0.55,10.8,2 +7.2,0.21,0.36,15.7,0.045,68,183,0.99922,3.25,0.76,9.4,2 +6.9,0.22,0.32,5.8,0.041,20,119,0.99296,3.17,0.55,11.2,3 +7,0.2,0.35,8.8,0.037,31,103,0.99388,3.13,0.49,11,3 +5.6,0.26,0,10.2,0.038,13,111,0.99315,3.44,0.46,12.4,3 +6.3,0.28,0.3,6.6,0.208,60,154,0.99478,3.1,0.4,9.4,3 +6.4,0.29,0.3,6.5,0.209,62,156,0.99478,3.1,0.4,9.4,2 +7.2,0.34,0.23,8.9,0.105,22,155,0.99692,3.01,0.58,9.5,2 +7.1,0.39,0.39,11.1,0.034,25,204,0.99616,3.05,0.52,10,3 +6.9,0.26,0.29,4.2,0.043,33,114,0.9902,3.16,0.31,12.5,3 +6.1,0.24,0.25,1.6,0.044,24,115,0.9921,3.39,0.59,10.9,3 +5.9,0.25,0.24,7.4,0.044,21,113,0.99462,3.38,0.58,10.5,3 +6.1,0.24,0.27,11.5,0.05,51,133,0.99476,3.22,0.37,10.8,3 +6.5,0.22,0.27,1.6,0.039,36,116,0.99178,3.38,0.57,11,4 +6.2,0.26,0.29,2,0.036,16,87,0.99081,3.33,0.61,11.8,3 +6.6,0.34,0.25,4.8,0.038,16,121,0.99198,3.36,0.71,12.6,3 +5.6,0.225,0.24,9.8,0.054,59,140,0.99545,3.17,0.39,10.2,3 +7.1,0.23,0.28,1.9,0.046,33,103,0.98997,3.12,0.31,12,2 +6.9,0.26,0.29,4.2,0.043,33,114,0.9902,3.16,0.31,12.5,3 +6.4,0.27,0.3,1.6,0.04,19,86,0.99089,3.32,0.65,11.5,3 +6.3,0.41,0.22,7.3,0.035,23,117,0.99172,3.2,0.39,11.94,4 +6.7,0.41,0.24,5.4,0.035,33,115,0.9901,3.12,0.44,12.89333333,4 +7.2,0.585,0.2,10.4,0.086,17,94,0.99681,3.13,0.4,9.4,2 +6.7,0.34,0.26,1.9,0.038,58,138,0.9893,3,0.47,12.2,4 +6.3,0.41,0.22,7.3,0.035,23,117,0.99172,3.2,0.39,11.94,4 +6.7,0.41,0.24,5.4,0.035,33,115,0.9901,3.12,0.44,12.89333333,4 +6.4,0.26,0.35,7.7,0.056,45,191,0.99527,3.16,0.5,9.5,2 +6.3,0.28,0.22,11.5,0.036,27,150,0.99445,3,0.33,10.6,3 +7.4,0.16,0.33,1.2,0.042,47,121,0.99198,3.04,0.68,10.5,4 +8.4,0.27,0.3,2.2,0.037,36,129,0.99085,2.89,0.3,11.46666667,3 +5.9,0.2,0.28,1,0.043,45,100,0.99033,3.4,0.41,11.4,3 +6.4,0.24,0.26,8.2,0.054,47,182,0.99538,3.12,0.5,9.5,2 +7.4,0.38,0.34,8.3,0.052,44,168,0.99627,3.11,0.52,9.2,2 +6.4,0.24,0.26,8.2,0.054,47,182,0.99538,3.12,0.5,9.5,2 +6.4,0.42,0.19,9.3,0.043,28,145,0.99433,3.23,0.53,10.98,2 +6.4,0.23,0.26,8.1,0.054,47,181,0.9954,3.12,0.49,9.4,2 +6.4,0.24,0.26,8.2,0.054,47,182,0.99538,3.12,0.5,9.5,2 +7.4,0.38,0.34,8.3,0.052,44,168,0.99627,3.11,0.52,9.2,2 +7.3,0.19,0.27,13.9,0.057,45,155,0.99807,2.94,0.41,8.8,5 +7.3,0.19,0.27,13.9,0.057,45,155,0.99807,2.94,0.41,8.8,5 +7.3,0.19,0.27,13.9,0.057,45,155,0.99807,2.94,0.41,8.8,5 +7.3,0.19,0.27,13.9,0.057,45,155,0.99807,2.94,0.41,8.8,5 +7.3,0.19,0.27,13.9,0.057,45,155,0.99807,2.94,0.41,8.8,5 +7.3,0.19,0.27,13.9,0.057,45,155,0.99807,2.94,0.41,8.8,5 +7.3,0.19,0.27,13.9,0.057,45,155,0.99807,2.94,0.41,8.8,5 +6.8,0.24,0.29,2,0.044,15,96,0.99232,3.23,0.64,10.4,5 +7.3,0.19,0.27,13.9,0.057,45,155,0.99807,2.94,0.41,8.8,5 +7.4,0.27,0.52,15.7,0.054,36,139,0.99788,3.04,0.62,10.03333333,3 +5.7,0.28,0.35,1.2,0.052,39,141,0.99108,3.44,0.69,11.3,3 +5.8,0.22,0.25,1.5,0.024,21,109,0.99234,3.37,0.58,10.4,3 +6.7,0.27,0.69,1.2,0.176,36,106,0.99288,2.96,0.43,9.2,3 +7.1,0.2,0.35,3.2,0.034,21,107,0.99195,3.11,0.54,11.1,3 +6.7,0.27,0.69,1.2,0.176,36,106,0.99288,2.96,0.43,9.2,3 +7.1,0.23,0.3,2.6,0.034,62,148,0.99121,3.03,0.56,11.3,4 +7.6,0.31,0.52,13.2,0.042,61,148,0.99839,2.98,0.47,9.1,3 +7.2,0.34,0.28,10.4,0.108,43,187,0.99738,2.96,0.57,9.4,2 +7,0.36,0.25,5.7,0.015,14,73,0.98963,2.82,0.59,13.2,3 +6.4,0.31,0.28,2.5,0.039,34,137,0.98946,3.22,0.38,12.7,3 +7.3,0.28,0.35,1.6,0.054,31,148,0.99178,3.18,0.47,10.7,2 +7.4,0.16,0.3,1.4,0.064,34,166,0.99136,3.11,0.42,11.43333333,3 +6.4,0.31,0.27,7.4,0.049,48,169,0.99323,3.27,0.45,11.1,3 +6.4,0.31,0.28,2.5,0.039,34,137,0.98946,3.22,0.38,12.7,3 +6.2,0.29,0.29,5.6,0.046,35,178,0.99313,3.25,0.51,10.53333333,2 +5.9,0.28,0.34,3.6,0.04,50,194,0.9912,3.31,0.52,11.6,3 +6.5,0.23,0.2,7.5,0.05,44,179,0.99504,3.18,0.48,9.533333333,2 +7.2,0.34,0.2,5.8,0.062,52,203,0.99461,3.17,0.44,9.8,3 +7.3,0.28,0.35,1.6,0.054,31,148,0.99178,3.18,0.47,10.7,2 +6.5,0.2,0.33,1.5,0.039,36,110,0.99008,3.22,0.65,12,3 +6.2,0.24,0.27,2.9,0.039,30,123,0.98959,3.12,0.37,12.8,3 +7.1,0.31,0.25,11.2,0.048,32,136,0.99663,3.14,0.4,9.5,2 +6.4,0.29,0.21,9.65,0.041,36,119,0.99334,2.99,0.34,10.93333333,3 +6.3,0.19,0.33,10.1,0.063,63,133,0.99561,2.86,0.41,9.1,2 +5.9,0.29,0.28,3.2,0.035,16,117,0.98959,3.26,0.42,12.6,3 +7.1,0.31,0.25,11.2,0.048,32,136,0.99663,3.14,0.4,9.5,2 +6.5,0.3,0.28,11.45,0.041,29,109,0.99418,2.98,0.3,10.9,3 +6.4,0.29,0.21,9.65,0.041,36,119,0.99334,2.99,0.34,10.93333333,3 +6.5,0.22,0.19,4.5,0.096,16,115,0.9937,3.02,0.44,9.6,2 +7,0.23,0.28,2.7,0.053,16,92,0.99372,3.18,0.56,9.3,2 +7.1,0.23,0.23,3.5,0.038,23,112,0.99157,3.05,0.37,11.36666667,3 +6.1,0.26,0.28,1.7,0.043,24,98,0.98918,3.14,0.44,12.5,3 +6.4,0.35,0.21,2.1,0.051,46,171,0.9932,3.16,0.5,9.5,2 +6,0.32,0.32,4.8,0.041,40,186,0.99235,3.22,0.54,11,3 +6.1,0.34,0.21,5,0.042,17,133,0.99373,3.02,0.53,9.4,2 +6.5,0.13,0.27,2.6,0.035,32,76,0.9914,3.21,0.76,11.33333333,3 +6.5,0.315,0.2,6.6,0.041,9,126,0.99494,2.94,0.51,8.8,2 +6.1,0.34,0.21,5,0.042,17,133,0.99373,3.02,0.53,9.4,2 +5.7,0.31,0.29,7.3,0.05,33,143,0.99332,3.31,0.5,11.06666667,3 +6.4,0.3,0.27,5,0.058,27,151,0.99198,3.22,0.49,12.2,3 +7,0.24,0.26,1.7,0.041,31,110,0.99142,3.2,0.53,11,3 +6.5,0.13,0.27,2.6,0.035,32,76,0.9914,3.21,0.76,11.33333333,3 +6.4,0.26,0.21,8.2,0.05,51,182,0.99542,3.23,0.48,9.5,2 +6.4,0.26,0.21,8.2,0.05,51,182,0.99542,3.23,0.48,9.5,2 +6,0.27,0.31,5,0.043,54,170,0.9924,3.28,0.52,11,3 +7.1,0.21,0.33,1.2,0.039,34,97,0.99112,3.11,0.75,11.2,3 +6.7,0.26,0.29,7.1,0.036,28,100,0.99534,3.08,0.36,9.3,3 +6.3,0.28,0.22,9.5,0.04,30,111,0.99338,3.05,0.31,10.8,1 +6.2,0.25,0.44,15.8,0.057,39,167,0.99804,3.14,0.51,9.2,2 +7.3,0.22,0.37,15.5,0.048,70,203,0.99899,3.25,0.77,9.4,2 +6.2,0.25,0.44,15.8,0.057,39,167,0.99804,3.14,0.51,9.2,2 +6.4,0.18,0.28,17.05,0.047,53,139,0.99724,3.25,0.35,10.5,3 +6.3,0.2,0.26,12.7,0.046,60,143,0.99526,3.26,0.35,10.8,3 +6.6,0.24,0.22,12.3,0.051,35,146,0.99676,3.1,0.67,9.4,2 +7.4,0.27,0.26,11.8,0.053,55,173,0.99699,3.11,0.6,9.8,2 +7.4,0.27,0.26,11.8,0.053,55,173,0.99699,3.11,0.6,9.8,2 +7.4,0.27,0.26,11.8,0.053,55,173,0.99699,3.11,0.6,9.8,2 +6.6,0.24,0.22,12.3,0.051,35,146,0.99676,3.1,0.67,9.4,2 +7.4,0.27,0.26,11.8,0.053,55,173,0.99699,3.11,0.6,9.8,2 +7.1,0.38,0.29,13.6,0.041,30,137,0.99461,3.02,0.96,12.1,3 +6.8,0.43,0.26,5.2,0.043,40,176,0.99116,3.17,0.41,12.3,3 +5.2,0.22,0.46,6.2,0.066,41,187,0.99362,3.19,0.42,9.733333333,2 +5.9,0.29,0.16,7.9,0.044,48,197,0.99512,3.21,0.36,9.4,2 +5.9,0.29,0.16,7.9,0.044,48,197,0.99512,3.21,0.36,9.4,2 +6.3,0.29,0.29,3.3,0.037,32,140,0.9895,3.17,0.36,12.8,4 +6.3,0.19,0.32,2.8,0.046,18,80,0.99043,2.92,0.47,11.05,3 +5.7,0.29,0.16,7.9,0.044,48,197,0.99512,3.21,0.36,9.4,2 +6.3,0.29,0.29,3.3,0.037,32,140,0.9895,3.17,0.36,12.8,4 +5.7,0.24,0.47,6.3,0.069,35,182,0.99391,3.11,0.46,9.733333333,2 +5.8,0.3,0.38,4.9,0.039,22,86,0.98963,3.23,0.58,13.1,4 +7.1,0.27,0.27,10.4,0.041,26,114,0.99335,3.04,0.52,11.5,4 +5.8,0.3,0.38,4.9,0.039,22,86,0.98963,3.23,0.58,13.1,4 +7.1,0.27,0.27,10.4,0.041,26,114,0.99335,3.04,0.52,11.5,4 +6.3,0.305,0.22,16,0.061,26,141,0.99824,3.08,0.5,9.1,2 +5.7,0.24,0.47,6.3,0.069,35,182,0.99391,3.11,0.46,9.75,2 +6.2,0.22,0.28,2.2,0.04,24,125,0.9917,3.19,0.48,10.5,3 +6.6,0.22,0.23,17.3,0.047,37,118,0.99906,3.08,0.46,8.8,3 +6.6,0.22,0.23,17.3,0.047,37,118,0.99906,3.08,0.46,8.8,3 +6.6,0.22,0.23,17.3,0.047,37,118,0.99906,3.08,0.46,8.8,3 +6.6,0.22,0.23,17.3,0.047,37,118,0.99906,3.08,0.46,8.8,3 +6.2,0.22,0.28,2.2,0.04,24,125,0.9917,3.19,0.48,10.5,3 +6.2,0.22,0.28,2.2,0.04,24,125,0.9917,3.19,0.48,10.5,3 +6.6,0.22,0.23,17.3,0.047,37,118,0.99906,3.08,0.46,8.8,3 +6.1,0.22,0.5,6.6,0.045,30,122,0.99415,3.22,0.49,9.9,3 +6.2,0.21,0.52,6.5,0.047,28,123,0.99418,3.22,0.49,9.9,3 +6.3,0.32,0.26,12.3,0.044,24,205,0.99611,3.11,0.58,9.9,2 +6.9,0.44,0.27,5,0.038,33,166,0.99124,3.2,0.42,12.2,3 +6.1,0.31,0.34,2.8,0.042,59.5,162,0.99179,3.27,0.47,10.8,3 +8.1,0.36,0.59,13.6,0.051,60,134,0.99886,2.96,0.39,8.7,2 +6.6,0.38,0.28,2.8,0.043,17,67,0.98924,3.21,0.47,13.2,3 +6.7,0.24,0.26,5.4,0.03,15,94,0.99045,3.15,0.38,12.7,3 +6.9,0.56,0.26,10.9,0.06,55,193,0.9969,3.21,0.44,9.4,2 +7.2,0.24,0.24,1.7,0.045,18,161,0.99196,3.25,0.53,11.2,3 +6.5,0.29,0.3,9.15,0.051,25,166,0.99339,3.24,0.56,11.33333333,3 +6.7,0.28,0.28,4.5,0.051,14,92,0.99224,3.36,0.58,11.9,3 +6.5,0.29,0.3,9.15,0.051,25,166,0.99339,3.24,0.56,11.35,3 +6.1,0.21,0.19,1.4,0.046,51,131,0.99184,3.22,0.39,10.5,2 +7.2,0.47,0.16,5.9,0.048,14,125,0.99428,3.09,0.49,9.8,2 +6.7,0.34,0.31,16.4,0.051,20,146,0.99834,3.06,0.54,9.1,2 +6.6,0.27,0.25,1.2,0.033,36,111,0.98918,3.16,0.37,12.4,3 +6.7,0.34,0.31,16.4,0.051,20,146,0.99834,3.06,0.54,9.1,2 +7.2,0.47,0.16,5.9,0.048,14,125,0.99428,3.09,0.49,9.8,2 +5,0.35,0.25,7.8,0.031,24,116,0.99241,3.39,0.4,11.3,3 +5,0.35,0.25,7.8,0.031,24,116,0.99241,3.39,0.4,11.3,3 +4.4,0.46,0.1,2.8,0.024,31,111,0.98816,3.48,0.34,13.1,3 +6.6,0.38,0.29,2.9,0.035,15,101,0.98916,3.04,0.37,12.5,3 +7.3,0.3,0.25,2.5,0.045,32,122,0.99329,3.18,0.54,10.3,2 +6.4,0.28,0.22,12.8,0.039,51,150,0.99535,3.23,0.43,10.7,3 +6.9,0.29,0.25,12.2,0.04,29,136,0.99552,3.05,0.65,10.4,3 +6.3,0.3,0.19,7.7,0.049,47,184,0.99514,3.22,0.48,9.5,2 +6.3,0.39,0.22,2.8,0.048,53,173,0.99304,3.24,0.45,9.8,2 +6.6,0.38,0.29,2.9,0.035,15,101,0.98916,3.04,0.37,12.5,3 +6.6,0.18,0.26,17.3,0.051,17,149,0.9984,3,0.43,9.4,3 +6,0.28,0.29,19.3,0.051,36,174,0.99911,3.14,0.5,9,2 +6,0.28,0.29,19.3,0.051,36,174,0.99911,3.14,0.5,9,2 +6,0.28,0.29,19.3,0.051,36,174,0.99911,3.14,0.5,9,2 +6.6,0.35,0.26,2.7,0.045,19,129,0.98952,3.24,0.48,13,4 +5.9,0.22,0.18,6.4,0.041,28,120,0.99403,3.27,0.5,9.9,2 +6.6,0.18,0.26,17.3,0.051,17,149,0.9984,3,0.43,9.4,3 +7.7,0.28,0.24,2.4,0.044,29,157,0.99312,3.27,0.56,10.6,3 +7.1,0.42,0.2,2.8,0.038,28,109,0.98968,3.23,0.47,13.4,3 +6.7,0.32,0.32,1.7,0.031,31,114,0.98946,3.12,0.35,12.5,3 +6.6,0.26,0.56,15.4,0.053,32,141,0.9981,3.11,0.49,9.3,2 +6.6,0.26,0.56,15.4,0.053,32,141,0.9981,3.11,0.49,9.3,2 +6.2,0.32,0.24,4.1,0.051,34,149,0.99306,3.36,0.52,11,2 +6.3,0.25,0.27,6.6,0.054,40,158,0.99378,3.2,0.48,10.3,2 +6.2,0.21,0.24,1.2,0.051,31,95,0.99036,3.24,0.57,11.3,3 +6.4,0.23,0.27,2.1,0.042,35,100,0.99094,3.03,0.63,10.9,3 +4.7,0.145,0.29,1,0.042,35,90,0.9908,3.76,0.49,11.3,3 +6.2,0.2,0.28,1.1,0.039,24,78,0.9899,3.36,0.47,12.1,3 +7,0.28,0.28,1.4,0.039,12,83,0.99173,3.18,0.65,11.1,2 +7.1,0.36,0.2,1.6,0.271,24,140,0.99356,3.11,0.63,9.8,2 +5.7,0.25,0.22,9.8,0.049,50,125,0.99571,3.2,0.45,10.1,3 +5.7,0.22,0.33,1.9,0.036,37,110,0.98945,3.26,0.58,12.4,3 +6,0.2,0.38,1.3,0.034,37,104,0.98865,3.11,0.52,12.7,3 +6.4,0.32,0.26,7.9,0.05,53,180,0.99514,3.14,0.5,9.6,2 +6.4,0.32,0.26,7.9,0.05,53,180,0.99514,3.14,0.5,9.6,2 +6,0.555,0.26,4.5,0.053,17,126,0.9943,3.24,0.46,9.1,2 +5.9,0.22,0.45,22.6,0.12,55,122,0.99636,3.1,0.35,12.8,2 +6.4,0.32,0.26,7.9,0.05,53,180,0.99514,3.14,0.5,9.6,2 +6.2,0.3,0.33,3.5,0.037,37,155,0.98987,3.18,0.37,12.4,3 +5.8,0.28,0.18,1.2,0.058,7,108,0.99288,3.23,0.58,9.55,1 +5.8,0.555,0.26,4.5,0.053,17,126,0.9943,3.24,0.46,9.1,2 +6.7,0.31,0.33,2,0.033,12,74,0.99064,3.29,0.65,12.5,3 +6.4,0.15,0.25,7.8,0.05,13,68,0.99394,3.16,0.4,9.9,3 +6.4,0.13,0.28,0.9,0.045,32,87,0.99175,3.47,0.52,11.2,3 +6.7,0.48,0.49,2.9,0.03,28,122,0.98926,3.13,0.4,13,3 +6.7,0.48,0.49,2.9,0.03,28,122,0.98926,3.13,0.4,13,3 +5.8,0.3,0.33,3.5,0.033,25,116,0.99057,3.2,0.44,11.7,3 +6.1,0.28,0.23,4.2,0.038,13,95,0.98898,2.97,0.7,13.1,3 +6,0.19,0.37,9.7,0.032,17,50,0.9932,3.08,0.66,12,3 +6.8,0.31,0.25,10.5,0.043,30,165,0.9972,3.36,0.55,10.55,3 +7.5,0.24,0.29,1.1,0.046,34,84,0.9902,3.04,0.39,11.45,3 +6.8,0.23,0.39,16.1,0.053,71,194,0.9988,3.18,0.64,10.2,3 +7.5,0.24,0.29,1.1,0.046,34,84,0.9902,3.04,0.39,11.45,3 +6.3,0.29,0.3,8.1,0.212,60,150,0.9958,3.1,0.4,9.3,2 +6.8,0.2,0.25,6.2,0.052,22,106,0.9935,3.09,0.54,10.8,2 +5.2,0.38,0.26,7.7,0.053,20,103,0.9925,3.27,0.45,12.2,3 +7.8,0.27,0.33,2.4,0.053,36,175,0.992,3.2,0.55,11,3 +6.6,0.54,0.21,16.3,0.055,41,182,0.9986,3.35,0.54,10.4,3 +7.1,0.25,0.31,2.3,0.05,32,156,0.9914,3.14,0.51,11.4,3 +5.8,0.61,0.01,8.4,0.041,31,104,0.9909,3.26,0.72,14.05,4 +6.5,0.32,0.23,8.5,0.051,20,138,0.9943,3.03,0.42,10.7,2 +6.4,0.28,0.23,6,0.051,50,162,0.994,3.15,0.52,10.2,2 +6.6,0.19,0.28,1.1,0.044,38,100,0.9904,3.22,0.69,11.2,3 +5.1,0.305,0.13,1.75,0.036,17,73,0.99,3.4,0.51,12.33333333,2 +5.8,0.26,0.3,2.6,0.034,75,129,0.9902,3.2,0.38,11.5,1 +6.7,0.23,0.17,1.3,0.061,14,100,0.9925,3.07,0.55,9.5,2 +6.8,0.33,0.3,2.1,0.047,35,147,0.9886,3.24,0.56,13.4,3 +6.1,0.27,0.32,1.1,0.034,24,110,0.9898,3.36,0.4,12.5,3 +6.1,0.27,0.32,1.1,0.034,24,110,0.9898,3.36,0.4,12.5,3 +6.8,0.4,0.29,2.8,0.044,27,97,0.9904,3.12,0.42,11.2,3 +6.1,0.4,0.18,9,0.051,28.5,259,0.9964,3.19,0.5,8.8,2 +7.1,0.28,0.26,2.8,0.039,50,118,0.9908,3.06,0.59,11.2,3 +6.2,0.32,0.32,2.2,0.036,15,70,0.9899,3.16,0.48,12.7,3 +6.8,0.17,0.17,5.1,0.049,26,82,0.993,3,0.38,9.8,3 +9,0.2,0.33,3.5,0.049,10,40,0.9944,3.14,0.36,9.8,3 +5.8,0.13,0.22,12.7,0.058,24,183,0.9956,3.32,0.42,11.7,3 +5.8,0.31,0.31,7.5,0.052,55,230,0.9949,3.19,0.46,9.8,2 +6.3,0.36,0.2,2,0.048,48,191,0.9929,3.17,0.51,9.6,2 +9,0.2,0.33,3.5,0.049,10,40,0.9944,3.14,0.36,9.8,3 +6.7,0.18,0.25,14.3,0.048,79,149,0.9975,3.12,0.37,9.7,2 +6.6,0.16,0.25,9.8,0.049,59.5,137,0.995,3.16,0.38,10,3 +5.8,0.13,0.22,12.7,0.058,24,183,0.9956,3.32,0.42,11.7,3 +5.8,0.27,0.22,12.7,0.058,42,206,0.9946,3.32,0.38,12.3,3 +6.8,0.17,0.17,5.1,0.049,26,82,0.993,3,0.38,9.8,3 +6.4,0.37,0.19,3.5,0.068,18,101,0.9934,3.03,0.38,9,3 +7.3,0.26,0.53,12.7,0.047,60.5,164.5,0.9984,3.06,0.45,9.1,3 +7.3,0.28,0.54,12.9,0.049,62,162.5,0.9984,3.06,0.45,9.1,3 +7.3,0.28,0.54,12.9,0.049,62,162.5,0.9984,3.06,0.45,9.1,3 +5.8,0.12,0.21,1.3,0.056,35,121,0.9908,3.32,0.33,11.4,3 +6.1,0.25,0.18,10.5,0.049,41,124,0.9963,3.14,0.35,10.5,2 +6.4,0.24,0.27,1.5,0.04,35,105,0.98914,3.13,0.3,12.4,3 +7.3,0.26,0.53,12.7,0.047,60.5,156,0.9984,3.06,0.45,9.1,3 +7.3,0.28,0.54,12.9,0.049,62,152,0.9984,3.06,0.45,9.1,3 +8.3,0.18,0.37,1.2,0.049,6,94,0.9937,3.18,0.52,10.1,2 +7.1,0.09,0.3,6.2,0.032,24,134,0.993,2.99,0.39,10.9,3 +8.3,0.14,0.36,8.8,0.026,13,60,0.9956,3.13,0.35,11.05,2 +5.8,0.28,0.3,3.9,0.026,36,105,0.98963,3.26,0.58,12.75,3 +6,0.23,0.34,1.3,0.025,23,111,0.98961,3.36,0.37,12.7,3 +6.9,0.28,0.37,9.1,0.037,16,76,0.9948,3.05,0.54,11.1,2 +6.9,0.28,0.37,9.1,0.037,16,76,0.9948,3.05,0.54,11.1,2 +5.8,0.28,0.3,3.9,0.026,36,105,0.98963,3.26,0.58,12.75,3 +6.3,0.25,0.53,1.8,0.021,41,101,0.989315,3.19,0.31,13,3 +6.5,0.2,0.31,2.1,0.033,32,95,0.989435,2.96,0.61,12,3 +5.9,0.29,0.32,1.4,0.022,17,47,0.9899,3.35,0.35,11.5,3 +6.4,0.46,0.22,14.7,0.047,51,183,0.998275,3.39,0.6,10.5,2 +6.9,0.28,0.37,9.1,0.037,16,76,0.9948,3.05,0.54,11.1,2 +6.8,0.23,0.33,1.9,0.047,20,101,0.9914,3.1,0.46,11.1,3 +7,0.23,0.32,1.8,0.048,25,113,0.9915,3.11,0.47,11.1,3 +6.4,0.55,0.26,9.6,0.027,20,104,0.9924,3.22,0.73,13.1,3 +5.7,0.28,0.3,3.9,0.026,36,105,0.98963,3.26,0.58,12.75,3 +6,0.23,0.34,1.3,0.025,23,111,0.98961,3.36,0.37,12.7,3 +6.8,0.45,0.3,11.8,0.094,23,97,0.997,3.09,0.44,9.6,2 +6.1,0.2,0.4,1.9,0.028,32,138,0.9914,3.26,0.72,11.7,2 +6.1,0.37,0.46,12,0.042,61,210,0.997,3.17,0.59,9.7,3 +5.9,0.21,0.23,7.9,0.033,22,130,0.9944,3.38,0.59,10.9,3 +6.9,0.22,0.32,9.3,0.04,22,110,0.9958,3.34,0.54,10.7,4 +5.4,0.27,0.22,4.6,0.022,29,107,0.98889,3.33,0.54,13.8,3 +6,0.26,0.26,2.2,0.035,10,72,0.989465,3.11,0.48,12.15,3 +5.6,0.18,0.3,10.2,0.028,28,131,0.9954,3.49,0.42,10.8,4 +5.6,0.26,0.27,10.6,0.03,27,119,0.9947,3.4,0.34,10.7,4 +7,0.23,0.35,1.4,0.036,31,113,0.9912,3.16,0.48,10.8,4 +5.8,0.28,0.66,9.1,0.039,26,159,0.9965,3.66,0.55,10.8,2 +8.6,0.36,0.26,11.1,0.03,43.5,171,0.9948,3.03,0.49,12,2 +5.8,0.28,0.66,9.1,0.039,26,159,0.9965,3.66,0.55,10.8,2 +6.4,0.3,0.27,4.4,0.055,17,135,0.9925,3.23,0.44,12.2,3 +6.2,0.2,0.32,2.8,0.05,17,126,0.9936,3.18,0.55,9.4,3 +5.8,0.29,0.15,1.1,0.029,12,83,0.9898,3.3,0.4,11.4,3 +5.7,0.22,0.28,1.3,0.027,26,101,0.98948,3.35,0.38,12.5,4 +5.6,0.22,0.32,1.2,0.024,29,97,0.98823,3.2,0.46,13.05,4 +6.8,0.32,0.23,3.3,0.026,31,99,0.9896,3.1,0.4,12.4,3 +6.2,0.2,0.26,9.7,0.03,39,102,0.9908,3.08,0.56,12.9,4 +6.1,0.35,0.24,2.3,0.034,25,133,0.9906,3.34,0.59,12,4 +5.9,0.3,0.29,1.1,0.036,23,56,0.9904,3.19,0.38,11.3,2 +6.3,0.15,0.34,11.4,0.05,25,96,0.99754,3.21,0.49,10,3 +4.8,0.13,0.32,1.2,0.042,40,98,0.9898,3.42,0.64,11.8,4 +6,0.2,0.26,14.7,0.045,53,125,0.998365,2.99,0.69,9.4,3 +5.7,0.2,0.24,13.8,0.047,44,112,0.99837,2.97,0.66,8.8,3 +6,0.27,0.26,1.3,0.038,32,138,0.99125,3.46,0.43,11.1,3 +6.3,0.37,0.51,6.3,0.048,35,146,0.9943,3.1,1.01,10.5,3 +6.4,0.23,0.37,7.9,0.05,60,150,0.99488,2.86,0.49,9.3,3 +5.9,0.34,0.25,2,0.042,12,110,0.99034,3.02,0.54,11.4,3 +5,0.33,0.23,11.8,0.03,23,158,0.99322,3.41,0.64,11.8,3 +5.4,0.29,0.38,1.2,0.029,31,132,0.98895,3.28,0.36,12.4,3 +8,0.33,0.35,10,0.035,22,108,0.99457,3.12,0.36,11.6,3 +6.4,0.3,0.33,5.2,0.05,30,137,0.99304,3.26,0.58,11.1,2 +5.4,0.29,0.38,1.2,0.029,31,132,0.98895,3.28,0.36,12.4,3 +6.4,0.33,0.3,7.2,0.041,42,168,0.99331,3.22,0.49,11.1,3 +7,0.33,0.78,9.9,0.042,21,251,0.99435,3.01,0.55,11,3 +6.7,0.45,0.3,5.3,0.036,27,165,0.99122,3.12,0.46,12.2,3 +6.5,0.36,0.31,13.55,0.053,20,113,0.99544,3.2,0.56,11,3 +5.8,0.42,0.3,2.2,0.035,26,129,0.989,3.32,0.47,12.9,3 +7.1,0.39,0.3,9.9,0.037,29,124,0.99414,3.07,0.42,10.9,3 +6.7,0.53,0.29,4.3,0.069,20,114,0.99014,3.22,0.59,13.4,3 +6.7,0.66,0,13,0.033,32,75,0.99551,3.15,0.5,10.7,3 +6.5,0.36,0.31,13.55,0.053,20,113,0.99544,3.2,0.56,11,3 +6.5,0.16,0.33,1,0.027,23,75,0.9908,3.3,0.39,11.4,4 +8.3,0.22,0.34,1.1,0.043,20,116,0.9927,3,0.47,10.2,3 +6.9,0.23,0.35,6.9,0.03,45,116,0.99244,2.8,0.54,11,3 +6.4,0.17,0.34,13.4,0.044,45,139,0.99752,3.06,0.43,9.1,3 +5,0.33,0.18,4.6,0.032,40,124,0.99114,3.18,0.4,11,3 +6.8,0.38,0.29,9.9,0.037,40,146,0.99326,3.11,0.37,11.5,3 +6.5,0.29,0.32,3,0.036,38,93,0.9906,3.16,0.59,12,3 +6.9,0.29,0.32,5.8,0.04,16,112,0.993,3.04,0.58,11.2,2 +6.6,0.28,0.3,12.9,0.033,31,177,0.99479,3.12,0.39,11.2,3 +6.2,0.36,0.27,3.2,0.032,13,73,0.98942,2.9,0.69,12.6,4 +6,0.615,0.04,0.8,0.032,8,50,0.99036,3.14,0.4,11,1 +5.9,0.44,0.36,2.5,0.03,12,73,0.99201,3.22,0.48,10.8,3 +5.9,0.42,0.36,2.4,0.034,19,77,0.99184,3.25,0.48,10.9,2 +5.8,0.34,0.21,7.2,0.041,48,146,0.99441,3.16,0.49,9.8,2 +5.8,0.27,0.2,7.3,0.04,42,145,0.99442,3.15,0.48,9.8,2 +7.1,0.33,0.18,6.3,0.094,27,166,0.99474,2.9,0.49,9.5,2 +6.1,0.44,0.28,4.25,0.032,43,132,0.9916,3.26,0.47,11.26666667,4 +7.3,0.28,0.37,1.2,0.039,26,99,0.99198,3.01,0.62,10.8,2 +5.2,0.5,0.18,2,0.036,23,129,0.98949,3.36,0.77,13.4,4 +6.1,0.44,0.28,4.25,0.032,43,132,0.9916,3.26,0.47,11.3,4 +6.4,0.62,0.12,4.7,0.06,33,196,0.99556,3.22,0.48,8.9,2 +6.4,0.38,0.19,4.5,0.038,36,119,0.99151,3.07,0.42,11.2,3 +7.5,0.305,0.38,1.4,0.047,30,95,0.99158,3.22,0.52,11.5,4 +6.5,0.5,0.22,4.1,0.036,35,131,0.9902,3.26,0.55,13,4 +6.6,0.4,0.3,5.3,0.038,20,125,0.99204,3.36,0.73,12.6,3 +6.4,0.4,0.25,4.2,0.032,15,91,0.98988,3.26,0.52,13.1,3 +8.3,0.49,0.23,6.65,0.034,6,158,0.99344,3.05,0.48,11.2,2 +6.3,0.3,0.91,8.2,0.034,50,199,0.99394,3.39,0.49,11.7,3 +6.1,0.19,0.37,2.6,0.041,24,99,0.99153,3.18,0.5,10.9,3 +6.1,0.19,0.37,2.6,0.041,24,99,0.99153,3.18,0.5,10.9,3 +5.6,0.24,0.34,2,0.041,14,73,0.98981,3.04,0.45,11.6,4 +5.7,0.25,0.32,12.2,0.041,43,127,0.99524,3.23,0.53,10.4,4 +6.6,0.21,0.39,2.3,0.041,31,102,0.99221,3.22,0.58,10.9,4 +6.3,0.3,0.91,8.2,0.034,50,199,0.99394,3.39,0.49,11.7,3 +6.2,0.28,0.41,5,0.043,50,188,0.99318,3.23,0.64,10.8,3 +5.8,0.29,0.38,10.7,0.038,49,136,0.99366,3.11,0.59,11.2,3 +5.8,0.345,0.15,10.8,0.033,26,120,0.99494,3.25,0.49,10,3 +6.5,0.51,0.25,1.7,0.048,39,177,0.99212,3.28,0.57,10.56666667,2 +6,0.24,0.41,1.3,0.036,42,118,0.99018,3.04,0.64,11.73333333,3 +6.5,0.51,0.25,1.7,0.048,39,177,0.99212,3.28,0.57,10.6,2 +6.9,0.54,0.26,12.7,0.049,59,195,0.99596,3.26,0.54,10.5,3 +6,0.24,0.41,1.3,0.036,42,118,0.99018,3.04,0.64,11.75,3 +6.6,0.26,0.36,1.2,0.035,43,126,0.99094,3.01,0.63,11.4,3 +5.7,0.24,0.3,1.3,0.03,25,98,0.98968,3.37,0.43,12.4,4 +6.5,0.21,0.35,5.7,0.043,47,197,0.99392,3.24,0.5,10.1,3 +6.8,0.29,0.22,3.4,0.035,40,122,0.99024,3.09,0.47,12.3,3 +5,0.24,0.34,1.1,0.034,49,158,0.98774,3.32,0.32,13.1,4 +5.9,0.18,0.28,1,0.037,24,88,0.99094,3.29,0.55,10.65,4 +5.8,0.26,0.29,1,0.042,35,101,0.99044,3.36,0.48,11.4,4 +6.7,0.61,0.21,1.65,0.117,40,240,0.9938,3.11,0.57,9.3,2 +5.7,0.695,0.06,6.8,0.042,9,84,0.99432,3.44,0.44,10.2,2 +5.6,0.695,0.06,6.8,0.042,9,84,0.99432,3.44,0.44,10.2,2 +5.7,0.39,0.25,4.9,0.033,49,113,0.98966,3.26,0.58,13.1,4 +6.1,0.38,0.47,1.4,0.051,59,210,0.99309,3.24,0.5,9.6,2 +6.3,0.36,0.28,2.5,0.035,18,73,0.98868,3.1,0.47,12.8,4 +6,0.29,0.41,10.8,0.048,55,149,0.9937,3.09,0.59,10.96666667,4 +6,0.29,0.41,10.8,0.048,55,149,0.9937,3.09,0.59,10.96666667,4 +6,0.29,0.41,10.8,0.048,55,149,0.9937,3.09,0.59,10.96666667,4 +6,0.29,0.41,10.8,0.048,55,149,0.9937,3.09,0.59,11,4 +7.1,0.43,0.25,2.8,0.036,43,132,0.98975,3.21,0.47,13.4,3 +6.6,0.25,0.25,1.3,0.04,28,85,0.98984,2.87,0.48,11.2,3 +6.6,0.33,0.41,2,0.027,14,79,0.99063,3.27,0.63,12.4,3 +8,0.23,0.41,1.1,0.048,35,150,0.99168,3.09,0.47,11.2,2 +7.3,0.17,0.36,8.2,0.028,44,111,0.99272,3.14,0.41,12.4,3 +6,0.17,0.33,6,0.036,30,111,0.99362,3.32,0.58,10.13333333,4 +6.1,0.16,0.34,6.1,0.034,31,114,0.99365,3.32,0.58,10.13333333,4 +7.3,0.17,0.36,8.2,0.028,44,111,0.99272,3.14,0.41,12.4,3 +6.4,0.31,0.53,8.8,0.057,36,221,0.99642,3.17,0.44,9.1,2 +6.1,0.16,0.34,6.1,0.034,31,114,0.99365,3.32,0.58,10.15,4 +6,0.17,0.33,6,0.036,30,111,0.99362,3.32,0.58,10.15,4 +5.9,0.44,0.33,1.2,0.049,12,117,0.99134,3.46,0.44,11.5,2 +6.6,0.285,0.49,11.4,0.035,57,137,0.99732,3.08,0.54,8.9,3 +4.9,0.335,0.14,1.3,0.036,69,168,0.99212,3.47,0.46,10.46666667,2 +4.9,0.335,0.14,1.3,0.036,69,168,0.99212,3.47,0.46,10.46666667,2 +6,0.28,0.52,6.2,0.028,37,104,0.99161,3.28,0.51,11.8,4 +5.8,0.35,0.29,3.2,0.034,41,151,0.9912,3.35,0.58,11.63333333,4 +5.7,0.21,0.37,4.5,0.04,58,140,0.99332,3.29,0.62,10.6,3 +6.5,0.25,0.32,9.9,0.045,41,128,0.99636,3.18,0.52,9.6,3 +6,0.28,0.52,6.2,0.028,37,104,0.99161,3.28,0.51,11.8,4 +6.6,0.285,0.49,11.4,0.035,57,137,0.99732,3.08,0.54,8.9,3 +4.7,0.335,0.14,1.3,0.036,69,168,0.99212,3.47,0.46,10.5,2 +6.8,0.63,0.04,1.3,0.058,25,133,0.99271,3.17,0.39,10.2,1 +5.6,0.27,0.37,0.9,0.025,11,49,0.98845,3.29,0.33,13.1,3 +6.8,0.32,0.33,0.7,0.027,15,66,0.9899,3.11,0.31,11.8,3 +6.5,0.33,0.32,1,0.041,39,120,0.99004,3.06,0.37,12.2,3 +6,0.24,0.34,1,0.036,52,184,0.99097,3.44,0.44,11.45,3 +7.2,0.26,0.32,10.4,0.062,23,114,0.9966,3.23,0.49,10.5,2 +6.8,0.63,0.04,1.3,0.058,25,133,0.99271,3.17,0.39,10.2,1 +6.7,0.16,0.32,12.5,0.035,18,156,0.99666,2.88,0.36,9,3 +6.7,0.16,0.32,12.5,0.035,18,156,0.99666,2.88,0.36,9,3 +6.7,0.16,0.32,12.5,0.035,18,156,0.99666,2.88,0.36,9,3 +6.7,0.16,0.32,12.5,0.035,18,156,0.99666,2.88,0.36,9,3 +6.9,0.19,0.31,19.25,0.043,38,167,0.99954,2.93,0.52,9.1,4 +6,0.36,0.32,1.1,0.053,26,173,0.99414,3.38,0.54,8.8,2 +6.7,0.16,0.32,12.5,0.035,18,156,0.99666,2.88,0.36,9,3 +6.9,0.19,0.31,19.25,0.043,38,167,0.99954,2.93,0.52,9.1,4 +6.7,0.35,0.32,9,0.032,29,113,0.99188,3.13,0.65,12.9,4 +6.1,0.15,0.4,1.2,0.03,19,84,0.98926,3.19,0.96,13,3 +6.7,0.35,0.32,9,0.032,29,113,0.99188,3.13,0.65,12.9,4 +7,0.27,0.74,1.3,0.173,34,121,0.99334,3.04,0.46,9.2,3 +6.8,0.3,0.33,12.8,0.041,60,168,0.99659,3.1,0.56,9.8,2 +6.8,0.3,0.33,12.8,0.041,60,168,0.99659,3.1,0.56,9.8,2 +6.4,0.69,0.09,7.6,0.044,34,144,0.9948,3.26,0.38,10.1,3 +6.4,0.69,0.09,7.6,0.044,34,144,0.9948,3.26,0.38,10.1,3 +5.9,0.12,0.28,1.4,0.037,36,83,0.99074,3.33,0.42,10.9,4 +6.3,0.36,0.5,8.3,0.053,51,202,0.9955,3.2,0.51,9.6,3 +5.7,0.27,0.16,9,0.053,32,111,0.99474,3.36,0.37,10.4,3 +6.1,0.22,0.4,1.85,0.031,25,111,0.98966,3.03,0.3,11.8,4 +5.6,0.205,0.16,12.55,0.051,31,115,0.99564,3.4,0.38,10.8,3 +7.2,0.33,0.28,1.4,0.034,26,109,0.99246,3.28,0.57,10.6,3 +5.9,0.21,0.31,1.8,0.033,45,142,0.98984,3.35,0.5,12.7,3 +5.4,0.33,0.31,4,0.03,27,108,0.99031,3.3,0.43,12.2,4 +5.4,0.205,0.16,12.55,0.051,31,115,0.99564,3.4,0.38,10.8,3 +5.7,0.27,0.16,9,0.053,32,111,0.99474,3.36,0.37,10.4,3 +6.4,0.28,0.28,3,0.04,19,98,0.99216,3.25,0.47,11.1,3 +6.1,0.22,0.4,1.85,0.031,25,111,0.98966,3.03,0.3,11.8,4 +6.7,0.15,0.32,7.9,0.034,17,81,0.99512,3.29,0.31,10,3 +5.5,0.315,0.38,2.6,0.033,10,69,0.9909,3.12,0.59,10.8,3 +4.8,0.225,0.38,1.2,0.074,47,130,0.99132,3.31,0.4,10.3,3 +5.2,0.24,0.15,7.1,0.043,32,134,0.99378,3.24,0.48,9.9,3 +6.7,0.15,0.32,7.9,0.034,17,81,0.99512,3.29,0.31,10,3 +6.6,0.27,0.32,1.3,0.044,18,93,0.99044,3.11,0.56,12.25,2 +6.1,0.32,0.33,10.7,0.036,27,98,0.99521,3.34,0.52,10.2,3 +6,0.25,0.28,7.7,0.053,37,132,0.99489,3.06,0.5,9.4,3 +6.4,0.42,0.46,8.4,0.05,58,180,0.99495,3.18,0.46,9.7,3 +6.1,0.32,0.33,10.7,0.036,27,98,0.99521,3.34,0.52,10.2,3 +6.9,0.31,0.33,12.7,0.038,33,116,0.9954,3.04,0.65,10.4,3 +6.3,0.48,0.48,1.8,0.035,35,96,0.99121,3.49,0.74,12.2,3 +6,0.25,0.28,7.7,0.053,37,132,0.99489,3.06,0.5,9.4,3 +7.2,0.21,0.31,10.5,0.035,36,122,0.99478,3.12,0.4,10.6,3 +6.8,0.32,0.43,1.6,0.05,4,65,0.99346,3.27,0.47,10.7,2 +7.9,0.3,0.6,1.85,0.048,13,106,0.99331,3.24,0.49,11.85,2 +5.3,0.31,0.38,10.5,0.031,53,140,0.99321,3.34,0.46,11.7,3 +5.3,0.31,0.38,10.5,0.031,53,140,0.99321,3.34,0.46,11.7,3 +5.2,0.185,0.22,1,0.03,47,123,0.99218,3.55,0.44,10.15,3 +5.5,0.16,0.31,1.2,0.026,31,68,0.9898,3.33,0.44,11.63333333,3 +6,0.17,0.36,1.7,0.042,14,61,0.99144,3.22,0.54,10.8,3 +6,0.16,0.36,1.6,0.042,13,61,0.99143,3.22,0.54,10.8,3 +6.1,0.24,0.32,9,0.031,41,134,0.99234,3.25,0.26,12.3,4 +5.5,0.3,0.25,1.9,0.029,33,118,0.98972,3.36,0.66,12.5,3 +5.5,0.16,0.31,1.2,0.026,31,68,0.9898,3.33,0.44,11.65,3 +6,0.32,0.46,1.5,0.05,56,189,0.99308,3.24,0.49,9.6,2 +6.1,0.27,0.31,3.9,0.034,42,137,0.99218,3.24,0.46,10.9,3 +6,0.27,0.32,3.6,0.035,36,133,0.99215,3.23,0.46,10.8,3 +6,0.14,0.37,1.2,0.032,63,148,0.99185,3.32,0.44,11.2,2 +5,0.24,0.19,5,0.043,17,101,0.99438,3.67,0.57,10,2 +6.1,0.26,0.25,2.9,0.047,289,440,0.99314,3.44,0.64,10.5,0 +6.3,0.23,0.5,10.4,0.043,61,132,0.99542,2.86,0.46,9.1,3 +5.6,0.26,0.5,11.4,0.029,25,93,0.99428,3.23,0.49,10.5,3 +6.1,0.34,0.24,18.35,0.05,33,184,0.99943,3.12,0.61,9.3,2 +6.2,0.35,0.25,18.4,0.051,28,182,0.99946,3.13,0.62,9.3,3 +6,0.14,0.37,1.2,0.032,63,148,0.99185,3.32,0.44,11.2,2 +7.3,0.36,0.62,7.1,0.033,48,185,0.99472,3.14,0.62,10.6,3 +5.1,0.25,0.36,1.3,0.035,40,78,0.9891,3.23,0.64,12.1,4 +5.5,0.16,0.26,1.5,0.032,35,100,0.99076,3.43,0.77,12,3 +6.4,0.19,0.35,10.2,0.043,40,106,0.99632,3.16,0.5,9.7,3 +6.6,0.29,0.73,2.2,0.027,21,92,0.99,3.12,0.48,12.4,3 +6,0.38,0.26,3.5,0.035,38,111,0.98872,3.18,0.47,13.6,4 +6,0.38,0.26,3.5,0.035,38,111,0.98872,3.18,0.47,13.6,4 +6.5,0.2,0.35,3.9,0.04,27,140,0.99102,2.98,0.53,11.8,3 +6.6,0.17,0.26,7.4,0.052,45,128,0.99388,3.16,0.37,10,3 +6.6,0.17,0.26,7.4,0.052,45,128,0.99388,3.16,0.37,10,3 +6.2,0.15,0.27,11,0.035,46,116,0.99602,3.12,0.38,9.1,3 +5.9,0.48,0.3,1.5,0.037,19,78,0.99057,3.47,0.42,11.9,4 +5.3,0.4,0.25,3.9,0.031,45,130,0.99072,3.31,0.58,11.75,4 +5.9,0.26,0.29,5.4,0.046,34,116,0.99224,3.24,0.41,11.4,3 +5.2,0.3,0.34,1.5,0.038,18,96,0.98942,3.56,0.48,13,5 +6.4,0.32,0.25,5,0.055,28,138,0.99171,3.27,0.5,12.4,5 +6.6,0.19,0.25,1.2,0.052,34,181,0.99352,3.3,0.42,9.4,4 +6.8,0.27,0.3,13,0.047,69,160,0.99705,3.16,0.5,9.6,3 +6.8,0.27,0.3,13,0.047,69,160,0.99705,3.16,0.5,9.6,3 +6.8,0.27,0.3,13,0.047,69,160,0.99705,3.16,0.5,9.6,3 +6.8,0.27,0.3,13,0.047,69,160,0.99705,3.16,0.5,9.6,3 +6.4,0.28,0.45,8.6,0.057,47,223,0.99654,3.16,0.51,9.1,2 +5.2,0.21,0.31,1.7,0.048,17,61,0.98953,3.24,0.37,12,4 +7.1,0.24,0.34,1.2,0.045,6,132,0.99132,3.16,0.46,11.2,1 +5,0.27,0.4,1.2,0.076,42,124,0.99204,3.32,0.47,10.1,3 +5.8,0.27,0.4,1.2,0.076,47,130,0.99185,3.13,0.45,10.3,3 +5.9,0.27,0.32,2,0.034,31,102,0.98952,3.16,0.56,12.3,3 +5.8,0.315,0.19,19.4,0.031,28,106,0.99704,2.97,0.4,10.55,3 +6,0.59,0,0.8,0.037,30,95,0.99032,3.1,0.4,10.9,1 +5.8,0.3,0.09,6.3,0.042,36,138,0.99382,3.15,0.48,9.7,2 +5.6,0.3,0.1,6.4,0.043,34,142,0.99382,3.14,0.48,9.8,2 +6.7,0.3,0.5,12.1,0.045,38,127,0.9974,3.04,0.53,8.9,3 +6.7,0.3,0.5,12.1,0.045,38,127,0.9974,3.04,0.53,8.9,3 +6.4,0.31,0.31,12.9,0.045,55,161,0.99546,3.02,0.59,10.2,2 +6.9,0.25,0.29,2.4,0.038,28,76,0.99088,3.01,0.36,11.7,4 +4.4,0.32,0.39,4.3,0.03,31,127,0.98904,3.46,0.36,12.8,5 +3.9,0.225,0.4,4.2,0.03,29,118,0.989,3.57,0.36,12.8,5 +6.4,0.31,0.31,12.9,0.045,55,161,0.99546,3.02,0.59,10.2,2 +5.5,0.62,0.33,1.7,0.037,24,118,0.98758,3.15,0.39,13.55,3 +6.2,0.3,0.42,2.2,0.036,28,128,0.9901,3.13,0.38,11.6,3 +6.7,0.3,0.5,12.1,0.045,38,127,0.9974,3.04,0.53,8.9,3 +4.7,0.785,0,3.4,0.036,23,134,0.98981,3.53,0.92,13.8,3 +6,0.31,0.32,7.4,0.175,47,159,0.9952,3.19,0.5,9.4,3 +6,0.32,0.3,7.3,0.174,46,159,0.99519,3.18,0.49,9.4,2 +6.4,0.105,0.29,1.1,0.035,44,140,0.99142,3.17,0.55,10.7,4 +6.4,0.105,0.29,1.1,0.035,44,140,0.99142,3.17,0.55,10.7,4 +5.7,0.33,0.32,1.4,0.043,28,93,0.9897,3.31,0.5,12.3,3 +5.9,0.32,0.19,14.5,0.042,37,115,0.99684,3.16,0.43,10.3,2 +6.2,0.26,0.2,8,0.047,35,111,0.99445,3.11,0.42,10.4,3 +6,0.2,0.33,1.1,0.039,45,126,0.99051,3.31,0.45,11.6,4 +6.4,0.105,0.29,1.1,0.035,44,140,0.99142,3.17,0.55,10.7,4 +5.8,0.28,0.34,2.2,0.037,24,125,0.98986,3.36,0.33,12.8,5 +6.4,0.31,0.5,5.8,0.038,42,111,0.99189,3.18,0.53,11.9,4 +6,0.35,0.46,0.9,0.033,9,65,0.98934,3.24,0.35,12.1,1 +5.1,0.26,0.34,6.4,0.034,26,99,0.99449,3.23,0.41,9.2,3 +6.6,0.28,0.09,10.9,0.051,37,131,0.99566,2.93,0.62,9.5,3 +6,0.17,0.3,7.3,0.039,39,104,0.99252,2.91,0.57,11,3 +7.3,0.35,0.67,8.3,0.053,10,100,0.9959,3.19,0.5,10.9,2 +6,0.26,0.24,1.3,0.053,66,150,0.9924,3.21,0.62,10.4,3 +5.4,0.375,0.4,3.3,0.054,29,147,0.99482,3.42,0.52,9.1,2 +7,0.17,0.42,1,0.075,19,71,0.99103,3.32,0.62,11.4,3 +5.1,0.26,0.33,1.1,0.027,46,113,0.98946,3.35,0.43,11.4,4 +5.8,0.36,0.5,1,0.127,63,178,0.99212,3.1,0.45,9.7,2 +5.7,0.4,0.35,5.1,0.026,17,113,0.99052,3.18,0.67,12.4,3 +6.2,0.76,0.01,3.2,0.041,18,120,0.99026,3.2,0.94,13.7,4 +6.1,0.41,0.2,12.6,0.032,54,136,0.99516,2.91,0.43,10.6,3 +5.8,0.385,0.25,3.7,0.031,38,122,0.99128,3.2,0.63,11.2,3 +6,0.27,0.4,1.7,0.021,18,82,0.9891,3.24,0.95,13.13333333,3 +5.7,0.4,0.35,5.1,0.026,17,113,0.99052,3.18,0.67,12.4,3 +5.8,0.36,0.5,1,0.127,63,178,0.99212,3.1,0.45,9.7,2 +7,0.24,0.47,1.3,0.043,18,131,0.99176,3.19,0.45,11,3 +6.8,0.23,0.48,1.5,0.036,35,165,0.99162,3.18,0.45,11.3,3 +6.5,0.28,0.34,4.6,0.054,22,130,0.99193,3.2,0.46,12,4 +6.4,0.23,0.35,10.3,0.042,54,140,0.9967,3.23,0.47,9.2,2 +6,0.34,0.29,6.1,0.046,29,134,0.99462,3.48,0.57,10.7,3 +6,0.34,0.29,6.1,0.046,29,134,0.99462,3.48,0.57,10.7,3 +6.7,0.22,0.33,1.2,0.036,36,86,0.99058,3.1,0.76,11.4,3 +6.4,0.23,0.35,10.3,0.042,54,140,0.9967,3.23,0.47,9.2,2 +6,0.32,0.33,9.9,0.032,22,90,0.99258,3.1,0.43,12.1,4 +5.8,0.29,0.27,1.6,0.062,17,140,0.99138,3.23,0.35,11.1,3 +5.8,0.38,0.26,1.1,0.058,20,140,0.99271,3.27,0.43,9.7,3 +5.9,0.32,0.26,1.5,0.057,17,141,0.9917,3.24,0.36,10.7,2 +5.6,0.33,0.28,1.2,0.031,33,97,0.99126,3.49,0.58,10.9,3 +5.9,0.37,0.3,1.5,0.033,35,95,0.98986,3.36,0.56,12,4 +5.6,0.295,0.26,1.1,0.035,40,102,0.99154,3.47,0.56,10.6,3 +6.7,0.5,0.36,11.5,0.096,18,92,0.99642,3.11,0.49,9.6,2 +6.5,0.28,0.38,7.8,0.031,54,216,0.99154,3.03,0.42,13.1,3 +5.3,0.275,0.24,7.4,0.038,28,114,0.99313,3.38,0.51,11,3 +5.2,0.405,0.15,1.45,0.038,10,44,0.99125,3.52,0.4,11.6,1 +6.8,0.34,0.36,8.9,0.029,44,128,0.99318,3.28,0.35,11.95,4 +5.7,0.22,0.25,1.1,0.05,97,175,0.99099,3.44,0.62,11.1,3 +6.2,0.28,0.57,1,0.043,50,92,0.99004,3.17,0.36,11.5,3 +5.6,0.34,0.25,2.5,0.046,47,182,0.99093,3.21,0.4,11.3,2 +4.8,0.29,0.23,1.1,0.044,38,180,0.98924,3.28,0.34,11.9,3 +6.6,0.38,0.29,2.4,0.136,15,93,0.99336,3.18,0.6,9.5,2 +5.1,0.3,0.3,2.3,0.048,40,150,0.98944,3.29,0.46,12.2,3 +4.4,0.54,0.09,5.1,0.038,52,97,0.99022,3.41,0.4,12.2,4 +7,0.36,0.35,2.5,0.048,67,161,0.99146,3.05,0.56,11.1,3 +6.4,0.33,0.44,8.9,0.055,52,164,0.99488,3.1,0.48,9.6,2 +7,0.36,0.35,2.5,0.048,67,161,0.99146,3.05,0.56,11.1,3 +6.4,0.33,0.44,8.9,0.055,52,164,0.99488,3.1,0.48,9.6,2 +6.2,0.23,0.38,1.6,0.044,12,113,0.99176,3.3,0.73,11.4,2 +5.2,0.25,0.23,1.4,0.047,20,77,0.99001,3.32,0.62,11.4,2 +6.2,0.35,0.29,3.9,0.041,22,79,0.99005,3.1,0.59,12.06666667,3 +7.1,0.23,0.39,13.7,0.058,26,172,0.99755,2.9,0.46,9,3 +7.1,0.23,0.39,13.7,0.058,26,172,0.99755,2.9,0.46,9,3 +7.5,0.38,0.33,9.2,0.043,19,116,0.99444,3.08,0.42,11.4,3 +6.4,0.35,0.51,7.8,0.055,53,177,0.99502,3.12,0.45,9.6,2 +6,0.43,0.34,7.6,0.045,25,118,0.99222,3.03,0.37,11,3 +6,0.52,0.33,7.7,0.046,24,119,0.99224,3.04,0.38,11,3 +5.5,0.31,0.29,3,0.027,16,102,0.99067,3.23,0.56,11.2,3 +5.9,0.22,0.3,1.3,0.052,42,86,0.99069,3.31,0.47,11.55,3 +6.2,0.36,0.32,4,0.036,44,92,0.98936,3.2,0.5,13.3,4 +6,0.41,0.23,1.1,0.066,22,148,0.99266,3.3,0.47,9.633333333,2 +6.2,0.355,0.35,2,0.046,31,95,0.98822,3.06,0.46,13.6,3 +5.7,0.41,0.21,1.9,0.048,30,112,0.99138,3.29,0.55,11.2,3 +5.3,0.6,0.34,1.4,0.031,3,60,0.98854,3.27,0.38,13,3 +5.8,0.23,0.31,4.5,0.046,42,124,0.99324,3.31,0.64,10.8,3 +6.6,0.24,0.33,10.1,0.032,8,81,0.99626,3.19,0.51,9.8,3 +6.1,0.32,0.28,6.6,0.021,29,132,0.99188,3.15,0.36,11.45,4 +5,0.2,0.4,1.9,0.015,20,98,0.9897,3.37,0.55,12.05,3 +6,0.42,0.41,12.4,0.032,50,179,0.99622,3.14,0.6,9.7,2 +5.7,0.21,0.32,1.6,0.03,33,122,0.99044,3.33,0.52,11.9,3 +5.6,0.2,0.36,2.5,0.048,16,125,0.99282,3.49,0.49,10,3 +7.4,0.22,0.26,1.2,0.035,18,97,0.99245,3.12,0.41,9.7,3 +6.2,0.38,0.42,2.5,0.038,34,117,0.99132,3.36,0.59,11.6,4 +5.9,0.54,0,0.8,0.032,12,82,0.99286,3.25,0.36,8.8,2 +6.2,0.53,0.02,0.9,0.035,6,81,0.99234,3.24,0.35,9.5,1 +6.6,0.34,0.4,8.1,0.046,68,170,0.99494,3.15,0.5,9.533333333,3 +6.6,0.34,0.4,8.1,0.046,68,170,0.99494,3.15,0.5,9.533333333,3 +5,0.235,0.27,11.75,0.03,34,118,0.9954,3.07,0.5,9.4,3 +5.5,0.32,0.13,1.3,0.037,45,156,0.99184,3.26,0.38,10.7,2 +4.9,0.47,0.17,1.9,0.035,60,148,0.98964,3.27,0.35,11.5,3 +6.5,0.33,0.38,8.3,0.048,68,174,0.99492,3.14,0.5,9.6,2 +6.6,0.34,0.4,8.1,0.046,68,170,0.99494,3.15,0.5,9.55,3 +6.2,0.21,0.28,5.7,0.028,45,121,0.99168,3.21,1.08,12.15,4 +6.2,0.41,0.22,1.9,0.023,5,56,0.98928,3.04,0.79,13,4 +6.8,0.22,0.36,1.2,0.052,38,127,0.9933,3.04,0.54,9.2,2 +4.9,0.235,0.27,11.75,0.03,34,118,0.9954,3.07,0.5,9.4,3 +6.1,0.34,0.29,2.2,0.036,25,100,0.98938,3.06,0.44,11.8,3 +5.7,0.21,0.32,0.9,0.038,38,121,0.99074,3.24,0.46,10.6,3 +6.5,0.23,0.38,1.3,0.032,29,112,0.99298,3.29,0.54,9.7,2 +6.2,0.21,0.29,1.6,0.039,24,92,0.99114,3.27,0.5,11.2,3 +6.6,0.32,0.36,8,0.047,57,168,0.9949,3.15,0.46,9.6,2 +6.5,0.24,0.19,1.2,0.041,30,111,0.99254,2.99,0.46,9.4,3 +5.5,0.29,0.3,1.1,0.022,20,110,0.98869,3.34,0.38,12.8,4 +6,0.21,0.38,0.8,0.02,22,98,0.98941,3.26,0.32,11.8,3 \ No newline at end of file diff --git a/dependencies-deploy.yaml b/dependencies-deploy.yaml deleted file mode 100644 index 9a9c007..0000000 --- a/dependencies-deploy.yaml +++ /dev/null @@ -1,20 +0,0 @@ -name: mercs -channels: - - defaults - - conda-forge - - pytorch -dependencies: - - python>=3.6 - - pip - - ipython - - pip: - - numpy - - scipy - - pandas - - networkx - - scikit-learn - - dask - - toolz - - tornado - - pydot - - shap diff --git a/dependencies-develop.yaml b/dependencies-develop.yaml deleted file mode 100644 index bd981f7..0000000 --- a/dependencies-develop.yaml +++ /dev/null @@ -1,21 +0,0 @@ -name: eliatest -channels: - - defaults - - conda-forge - - pytorch -dependencies: - # Defaults - - pytest - - jupyterlab - - mkdocs - - mkdocs-material - - pygments - - pylint - - xgboost - - lightgbm - - catboost - - pip: - - mkdocs-minify-plugin>=0.2 - - pymdown-extensions - - semantic_version - - matplotlib \ No newline at end of file diff --git a/deploy.md b/deploy.md index dde0ee2..50600e4 100644 --- a/deploy.md +++ b/deploy.md @@ -2,166 +2,46 @@ Deployment information. -1 Development workflows +1 Development workflow ======================= -1.1 Start project +1.1 Clone the repository ----------------- -Using the power of [cookiecutter](https://cookiecutter.readthedocs.io/en/latest/), this single command provides a pretty solid starting point for any new project. - -```bash -cookiecutter gh:eliavw/cookiecutter-datascience -``` - -1.2 git -------- - -Version control goes without saying. For the local repository, do; - -```bash -git init -git add . -git commit -m "First commit" -``` - -For the remote repository, do; - -```bash -git remote add origin git@github.com:eliavw/mercs.git -git remote -v -git push origin master -``` - -And that's it for git. - -### One-liners - -We can summarize the above procedure in two one-liners, should you really care about doing this fast. - -```bash -git init; git add .; git commit -m "First commit"; -``` - -and - ```bash -git remote add origin git@github.com:eliavw/mercs.git; git remote -v; git push origin master +git clone https://github.com/systemallica/mercs ``` -1.3 Conda Environments +1.2 Create virtual environment and install the dependencies ---------------------- -### Introduction - -This cookiecutter is set up for optimal use with [conda](https://docs.conda.io/projects/conda/en/4.6.0/_downloads/52a95608c49671267e40c689e0bc00ca/conda-cheatsheet.pdf), for **local dependency managment**. The takeaway is this; _for local dependency managment, we rely on conda and nothing else._ - -Note that this has nothing to do with **remote dependency managment**. This is what you need to take care of when preparing a _release_ of your code which goes via [PyPi](https://pypi.org/) or alternatives. We treat that as an independent problem. Mixing remote and local dependency managment tends to add complexity instead of removing it. - -### Workflow - -To create our default environment, do: - -```bash -conda env create -f dependencies-deploy.yaml -n mercs -``` - -To additionally add the packages which are relevant for the development phase, do: - -```bash -conda activate mercs -conda env update -n mercs -f dependencies-develop.yaml -``` - -### Jupyterlab - -To add your isolated python installation (i.e., the one in your new conda environment) to the list of "kernels" found by Jupyter, execute the following. - -```bash -conda activate mercs -python -m ipykernel install --user --name mercs --display-name "mercs" -``` - -1.4 Local Installation ----------------------- - -One fundamental assumption is the following; - -> All code in this repository belongs to one of the two following categories: source code or standalone scripts. +The project uses [Poetry](https://python-poetry.org) as dependency manager, which also creates a `virtualenv` automatically on install. So all you need to do is `poetry install`. -- Code in [src](./src) is considered source code. It composes a Python package. -- Code in [scripts](./scripts) or [note](./note) acts as standalone scripts. +You can now navigate to the `/tests` folder and write your own experiments. -This means that even our own code has to be installed before we are able to use it. This seems a bit tedious but has some important advantages too: - -1. Our scripts will consider our own algorithm(s) and external competitors both as packages to be imported. Putting these on equal footing enforces code quality (e.g., modularity, API-design, ...) and reproducibility. -2. If we build it like a package from the start on our local machine, the transition to an actual publishable package will be a lot smoother afterwards. In other words, we will try to get it right from the start. - -### Installation instructions - -To install, activate the conda environment and execute this line of code. - -```bash -python setup.py develop # or `install` -``` - -What is the difference between `develop` or `install`? When you install the package with the `develop` flag, symlinks are created from yoru code to the python installation. That means that every time you change something in your codebase, the installed package in your python environment will also change. Typically, this is what you'd want: to see your changes reflected immediately. - -The install option just copies your code as it is at time of installation and install the package in the python environment. This mimics what a third party would do. - - -1.5 CI (Travis) +1.3 Continuous Integration --------------- -Do not allow yourself to proceed without at least accumulating some tests. Therefore, we've set out to intigrate [CI](https://en.wikipedia.org/wiki/Continuous_integration) (i.e. [Travis](https://travis-ci.com)) right from the start. +Do not allow yourself to proceed without at least accumulating some tests. Therefore, we've set out to integrate [CI](https://en.wikipedia.org/wiki/Continuous_integration) right from the start. -Follow these steps: +CI has been set up with a [GitHub Action](https://github.com/features/actions) and will be triggered on every commit to master. -1. Go to the [Travis](https://travis-ci.com/eliavw/mercs) page of this repo. -2. See if it ran. - -**Note:** The tests depend on our **local dependency managment**. Why? Because we have full control of the Travis servers running our tests. Therefore, we can simply treat it as a computer we control. We only need to fall back on remote dependency managment if other people need to get our code up and running, without our intervention. - - - -2 Distribution workflows +2 Distribution workflow ======================== This part is about publishing your project on PyPi. -2.1 Pypi +2.1 PyPi -------- -Make your project publicly available on the Python Package Index, [PyPi](https://pypi.org/). To achieve this, we need **remote dependency managment**, since you want your software to run without forcing the users to recreate your conda environments. All dependencies have to be managed, automatically, during installation. To make this work, we need to do some extra work. - -We follow the steps as outlined in the most basic (and official) [PyPi tutorial](https://packaging.python.org/tutorials/packaging-projects/). - -### Generate distribution archives - -Generate distribution packages for the package. These are archives that are uploaded to the Package Index and can be installed by pip. - -```bash -python setup.py sdist bdist_wheel -``` - -After this, your package can be uploaded to the python package index. To see if it works on PyPi test server, do - -```bash -python -m twine upload --repository-url https://test.pypi.org/legacy/ dist/* -``` - -and this will prompt some questions, but your package will end up in the index. - -To make your package end up in the actual PyPi, the procedure is almost as simple, do - - -```bash -python -m twine upload --repository-url https://pypi.org/legacy/ dist/* -``` +As we have configured our project with Poetry, deploying to PyPi is as easy as: +1. `poetry build` +2. `poetry publish` +The terminal will ask for your PyPi username and password, and then publish the package. 2.2 Docs -------- -Every good open source project at least consists of a bit of documentation. A part of this documentation is generated from decent docstrings you wrote together with your code. +Every good open source project at least contains a bit of documentation. A part of this documentation is generated from decent docstrings you wrote together with your code. ### Tools @@ -177,9 +57,9 @@ Which means that we can write everything once, and link it together. All the for ### Procedure -The cookiecutter already contains the [mkdocs.yml](mkdocs.yml) file, which is -unsurprisingly- the configuration file for your mkdocs project. Using this cookiecutter, you can focus on content. Alongside this configuration file, we also included a demo page; [index.md](./docs/index.md), which is the home page of the documentation website. +The project already contains the [mkdocs.yml](mkdocs.yml) file, which is -unsurprisingly- the configuration file for your mkdocs project. Using this, you can focus on content. Alongside this configuration file, we also included a demo page; [index.md](./docs/index.md), which is the home page of the documentation website. -For a test drive, you need to know some commands. To build your website (i.e., generate html starting from your markdown sources), you do +For a test drive, you need to use some commands. To build your website (i.e., generate html starting from your markdown sources), you do ```bash mkdocs build @@ -201,24 +81,6 @@ Now, the last challenge is to make this website available over the internet. Luc mkdocs gh-deploy ``` -and your site should be online at; [https://eliavw.github.io/mercs/](https://eliavw.github.io/mercs/). - -What happens under the hood is that a `mkdocs build` is executed, and then the resulting `site` directory is pushed to the `gh pages` branch in your repository. From that point on, github takes care of the rest. - - -### Repository Description - -Often overlooked, but this is right on top of your repository and hence the absolute perfect place to link to your project website. Hence, a cookiecutter-generated sentence to put there would be; - -> MERCS, cf. https://eliavw.github.io/mercs - - -2.3 Docker ----------- - -Reproducible containers in their most popular form. - -2.4 Singularity ---------------- +and your site should be online at; [https://xxxx.github.io/mercs/](https://xxxx.github.io/mercs/). -Reproducible containers which can be run on HPC infrastructures. +What happens under the hood is that a `mkdocs build` is executed, and then the resulting `site` directory is pushed to the `gh pages` branch in your repository. From that point on, github takes care of the rest. \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 2632b87..ae887db 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,23 +4,26 @@ MERCS stands for **multi-directional ensembles of classification and regression ## Installation -Easy via pip; +Easy via pip: ``` pip install mercs ``` -## Website +## Quickstart -Cf. [https://eliavw.github.io/mercs/](https://eliavw.github.io/mercs/) +Now that you have installed MERCS you are ready to fit your first versatile model: [quickstart](https://eliavw.github.io/mercs/quickstart/) -## Tutorials +## Source code -Cf. the quickstart section of the website, [https://eliavw.github.io/mercs/quickstart](https://eliavw.github.io/mercs/quickstart). +MERCS is fully open-source cf. our [github-repository](https://github.com/eliavw/mercs/) -## Code +## Run/Build locally +To run the project, you need [Poetry](https://python-poetry.org). Once installed: -MERCS is fully open-source cf. our [github-repository](https://github.com/eliavw/mercs/) +1. Clone the repository. +2. Run `poetry install`. +3. The development environment is ready. You can test it by running `pytest`. ## Publications @@ -44,4 +47,4 @@ People involved in this project: * [Elia Van Wolputte](https://eliavw.github.io/) * Evgeniya Korneva * [Prof. Hendrik Blockeel](https://people.cs.kuleuven.be/~hendrik.blockeel/) - +* [Andrés Reverón Molina](https://andres.reveronmolina.me) diff --git a/docs/quickstart.md b/docs/quickstart.md index f4ce8b2..f068c39 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -6,17 +6,16 @@ ```python -import mercs import numpy as np -from mercs.tests import load_iris, default_dataset -from mercs.core import Mercs - import pandas as pd + +from mercs import Mercs +from mercs.utils import default_dataset ``` -## Fit +## Fit the model -Here a small MERCS testdrive for what I suppose you'll need. First, let us generate a basic dataset. Some utility-functions are integrated in MERCS so that goes like this +Here's a small MERCS test-drive for the basic use-case. First, let us generate a basic dataset. Some utility-functions are integrated in MERCS so that goes like this ```python diff --git a/etc/legacy/gt.py b/etc/legacy/gt.py deleted file mode 100644 index cd2ac2b..0000000 --- a/etc/legacy/gt.py +++ /dev/null @@ -1,156 +0,0 @@ -from ..utils import code_to_query -from graph_tool.all import GraphView, Graph -import numpy as np - -NODE_PREFIXES = dict(data="D", model="M", imputation="I") - - -def build_graph(m_codes, m_list): - n_models, n_attributes = m_codes.shape - - g = Graph() - - v_map = {} - names = g.new_vertex_property("object") - - v_atts = g.add_vertex(n_attributes) - v_mods = g.add_vertex(n_models) - v_imps = g.add_vertex(n_attributes) - - for v_idx, v in enumerate(v_atts): - v_n = v_name(v_idx, kind="data") - v_map[v_n] = int(v) - names[v] = v_n - - for v_idx, v in enumerate(v_mods): - v_n = v_name(v_idx, kind="model") - v_map[v_n] = int(v) - names[v] = v_n - - in_edges = ((d, v) for d in m_list[v_idx].desc_ids) - out_edges = ((v, t) for t in m_list[v_idx].targ_ids) - - g.add_edge_list(in_edges) - g.add_edge_list(out_edges) - - for v_idx, v in enumerate(v_imps): - v_n = v_name(v_idx, kind="imputation") - v_map[v_n] = int(v) - names[v] = v_n - - g.vp.names = names - g.v_map = v_map - return g - - -def build_diagram(g, m_list, m_sel, q_code, prune=False): - g.clear_filters() - - if not isinstance(m_sel[0], (list, np.ndarray)): - m_sel = [m_sel] - - # Init (graph properties) - g_a_src = g.new_vertex_property("bool", False) - g_f_tgt = g.new_vertex_property("bool", False) - - v_filter = g.new_vertex_property("bool", False) - e_filter = g.new_edge_property("bool", False) - - # Availability of attributes (= available sources and forbidden targets) - f_tgt = set([]) - a_src, a_tgt, _ = code_to_query(q_code, return_sets=True) - - a_src = [g.v_map[v_name(a, kind="data")] for a in a_src] - f_tgt = [g.v_map[v_name(a, kind="data")] for a in f_tgt] - - for a in a_src: - g_a_src[a] = True - - for a in f_tgt: - g_f_tgt[a] = True - - imputation_edges = [] - for m_layer in m_sel: - vertices = [g.v_map[v_name(m_idx, kind="model")] for m_idx in m_layer] - vertices = [(v_idx, g.vertex(v_idx)) for v_idx in vertices] - - imputation_edges_single_layer = build_diagram_single_layer( - vertices, g_a_src, g_f_tgt, v_filter, e_filter, g - ) - imputation_edges.extend(imputation_edges_single_layer) - - g.add_edge_list(imputation_edges, eprops=[e_filter]) - - q_diagram = GraphView(g, efilt=e_filter, vfilt=v_filter) - - if prune: - q_diagram = _prune(q_diagram, a_tgt, g.v_map) - - # Attributes based on query - q_diagram.desc_ids = a_src - q_diagram.targ_ids = a_tgt - - return q_diagram - - -def build_diagram_single_layer(vertices, g_a_src, g_f_tgt, v_filter, e_filter, g): - - imputation_edges = [] - - for v_idx, vertex in vertices: - v_filter[vertex] = True - - for e in vertex.in_edges(): - a = e.source() - if g_a_src[a]: - v_filter[a] = True - g_f_tgt[a] = True - e_filter[e] = True - else: - i_idx = g.v_map[v_name(int(a), kind="imputation")] - v_filter[i_idx] = True - imputation_edges.append([i_idx, v_idx, True]) - - for v_idx, vertex in vertices: - for e in vertex.out_edges(): - a = e.target() - - if not g_f_tgt[a]: - e_filter[e] = True - g_a_src[a] = True - v_filter[a] = True - - - return imputation_edges - - -# Utils -def v_name(idx, kind="model"): - return (NODE_PREFIXES[kind], idx) - - -# Helpers -def _prune(g, q_tgt, v_map): - result = g.new_vertex_property("bool", False) - - for a in q_tgt: - vertex = g.vertex(v_map[("D", a)]) - result[vertex] = True - _ancestor_filter(g, vertex, result) - - return GraphView(g, vfilt=result) - - -def _ancestor_filter(g, v, result=None): - if result is None: - result = g.new_vertex_property("bool", False) - - in_vertices = g.get_in_neighbors(v) - in_degrees = g.get_in_degrees(in_vertices) - - for d, v in zip(in_degrees, in_vertices): - result[v] = True - if d: - _ancestor_filter(g, v, result) - return result - diff --git a/etc/legacy/turbo_inference.py b/etc/legacy/turbo_inference.py deleted file mode 100644 index bbe0862..0000000 --- a/etc/legacy/turbo_inference.py +++ /dev/null @@ -1,173 +0,0 @@ -import numpy as np -from dask import delayed -from functools import partial -from graph_tool.topology import topological_sort - -from ..composition import o - -from ..utils.inference_tools import ( - _dummy_array, - _map_classes, - _pad_proba, - _select_nominal, - _select_numeric, -) - -# Main algorithm -def inference_algorithm(g, m_list, i_list, data, nominal_ids): - - # Lambdas - data_node = lambda k, n: k == "D" - model_node = lambda k, n: k == "M" - imputation_node = lambda k, n: k == "I" - - # Vertex Props - dask = g.new_vertex_property("object") - dask_proba = g.new_vertex_property("object") - g_classes = g.new_vertex_property("vector") - - nb_rows, _ = data.shape - - nodes = ((v_idx, g.vp.names[v_idx]) for v_idx in topological_sort(g)) - - g_desc_ids = list(g.desc_ids) - data = delayed(data[:, g_desc_ids]) - - for v_idx, n in nodes: - vertex = g.vertex(v_idx) - - if data_node(*n): - if vertex.in_degree() == 0: - dask_input_data_node(dask, n, v_idx, g_desc_ids, data) - elif vertex.in_degree() == 1: - dask_single_data_node(dask, g, n, v_idx, m_list) - elif vertex.in_degree() > 1: - if n[1] in nominal_ids: - dask_nominal_data_node(g, n, m_list) - else: - dask_numeric_data_node(dask, g, n, v_idx, m_list) - elif model_node(*n): - dask_model_node(dask, dask_proba, g, n, v_idx, m_list) - elif imputation_node(*n): - dask_imputation_node(dask, n, v_idx, i_list, nb_rows) - else: - raise ValueError("Did not recognize node kind of {}".format(n)) - - return dask - - -# Nodes - Imputation -def dask_imputation_node(dask, node, v_idx, i_list, nb_rows): - - f1 = _dummy_array - f2 = i_list[node[1]].transform - f3 = np.ravel - f = o(f3, o(f2, f1)) - - dask[v_idx] = delayed(f)(nb_rows) - return - - -# Nodes - Data -def dask_input_data_node(dask, node, v_idx, g_desc_ids, data): - dask[v_idx] = delayed(_select_numeric(g_desc_ids.index(node[1])))(data) - return - - -def dask_single_data_node(dask, g, node, v_idx, m_list): - # Single output to recover from model, I do not have to merge or anything. - idx, parent_functions = _get_parents_of_numeric_data_node( - dask, g, m_list, v_idx, node - )[0] - - dask[v_idx] = delayed(_select_numeric(idx))(parent_functions) - return - - -def dask_numeric_data_node(dask, g, node, v_idx, m_list): - - idx_fnc = _get_parents_of_numeric_data_node(dask, g, m_list, v_idx, node) - - parent_functions = [delayed(_select_numeric(idx))(fnc) for idx, fnc in idx_fnc] - dask[v_idx] = delayed(partial(np.mean, axis=0))(parent_functions) - return - - -def dask_nominal_data_node(dask, dask_proba, g_classes, g, node, v_idx, m_list): - idx_cls_fnc = _get_parents_of_nominal_data_node(dask, g, m_list, v_idx, node) - classes = np.unique(np.hstack([c for _, c, _ in idx_cls_fnc])) - - # Reduce - parent_functions = [] - for idx, c, fnc in idx_cls_fnc: - - f1 = delayed(_select_nominal(idx))(fnc) - if len(c) < len(classes): - f2 = delayed(_pad_proba(c, classes))(f1) - parent_functions.append(f2) - else: - parent_functions.append(f1) - - f3 = delayed(partial(np.sum, axis=0))(parent_functions) - dask_proba[v_idx] = f3 - g_classes[v_idx] = classes - - # Vote - def vote(X): - return classes.take(np.argmax(X, axis=1), axis=0) - - dask[v_idx] = delayed(vote)(f3) - return - - -# Nodes - Model -def dask_model_node(dask, dask_proba, g, node, v_idx, m_list): - # Collect input data - parent_functions = _get_parents_of_model_node(g, dask, v_idx) - collector = delayed(np.stack)(parent_functions, axis=1) - - # Convert function - dask[v_idx] = delayed(m_list[node[1]].predict)(collector) - - if hasattr(m_list[node[1]], "predict_proba"): - dask_proba[v_idx] = delayed(m_list[node[1]].predict_proba)(collector) - - return - - -# Finding Parents -def _get_parents_of_numeric_data_node(dask, g, m_list, v_idx, node): - rel_idx = lambda p_idx, n_idx: m_list[p_idx].targ_ids.index(n_idx) - - parents = ((g.vp.names[idx], idx) for idx in g.get_in_neighbours(v_idx)) - - idx_fnc = [ - (rel_idx(p_idx, node[1]) if k == "M" else 0, dask[v_idx]) - for (k, p_idx), v_idx in parents - ] - - return idx_fnc - - -def _get_parents_of_nominal_data_node(dask, g, m_list, v_idx, node): - rel_idx = lambda p_idx, n_idx: m_list[p_idx].targ_ids.index(n_idx) - classes = lambda p_idx, r_idx: m_list[p_idx].classes_[r_idx] - - parents = ((g.vp.names[idx], idx) for idx in g.get_in_neighbours(v_idx)) - - idx_fnc = ( - (rel_idx(p_idx, node[1]) if k == "M" else 0, p_idx, dask[v_idx]) - for (k, p_idx), v_idx in parents - ) - - idx_cls_fnc = [(r_idx, classes(p_idx, r_idx), f) for r_idx, p_idx, f in idx_cls_fnc] - - return idx_cls_fnc - - -def _get_parents_of_model_node(g, dask, v_idx): - parent_functions = { - g.vp.names[idx][1]: dask[idx] for idx in g.get_in_neighbours(v_idx) - } - parent_functions = [v for k, v in sorted(parent_functions.items())] - return parent_functions diff --git a/glossary.md b/glossary.md new file mode 100644 index 0000000..5a71f0e --- /dev/null +++ b/glossary.md @@ -0,0 +1,9 @@ +q = query +c = composite +m = model +fimps = feature importances +targ = target +desc = descriptive +dask = parallelization library +k = node type +G = graph \ No newline at end of file diff --git a/src/mercs/__init__.py b/mercs/__init__.py similarity index 84% rename from src/mercs/__init__.py rename to mercs/__init__.py index 72ff609..32f2faf 100644 --- a/src/mercs/__init__.py +++ b/mercs/__init__.py @@ -1,6 +1,6 @@ from pkg_resources import get_distribution, DistributionNotFound -from . import algo, composition, core, graph, tests, utils, visuals +from . import algo, composition, core, graph, utils, visuals from .core import Mercs try: diff --git a/src/mercs/algo/__init__.py b/mercs/algo/__init__.py similarity index 61% rename from src/mercs/algo/__init__.py rename to mercs/algo/__init__.py index 1df03d6..d76eac7 100644 --- a/src/mercs/algo/__init__.py +++ b/mercs/algo/__init__.py @@ -1,3 +1 @@ -from .new_prediction import (mi, mrai, it, rw) - from .selection import base_selection_algorithm, random_selection_algorithm diff --git a/src/mercs/algo/evaluation.py b/mercs/algo/evaluation.py similarity index 69% rename from src/mercs/algo/evaluation.py rename to mercs/algo/evaluation.py index 3562d91..0beae28 100644 --- a/src/mercs/algo/evaluation.py +++ b/mercs/algo/evaluation.py @@ -1,15 +1,13 @@ import numpy as np -from functools import partial from sklearn.preprocessing import maxabs_scale, minmax_scale -from sklearn.metrics import f1_score, r2_score, mean_squared_error, accuracy_score +from sklearn.metrics import mean_squared_error, accuracy_score from sklearn.model_selection import train_test_split -from ..utils.inference_tools import _dummy_array -from ..utils import DESC_ENCODING, TARG_ENCODING, MISS_ENCODING, get_i_o +from mercs.utils.inference_tools import dummy_array +from mercs.utils import TARG_ENCODING, get_i_o -def dummy_evaluation( - data, m_codes, m_list, i_list, random_state=42, test_size=0.2, **kwargs -): + +def dummy_evaluation(m_codes): return _dummy_evaluation(m_codes) @@ -21,8 +19,7 @@ def base_evaluation( random_state=42, test_size=0.2, per_attribute_normalization=False, - consider_imputations=False, - **kwargs + consider_imputations=False ): # Data @@ -84,10 +81,8 @@ def normalize_m_score(m_score, dummy_evaluation, per_attribute_normalization=Fal def _model_evaluation(X, m_list, m_codes): m_score = np.zeros(m_codes.shape) - for m_idx, mod in enumerate(m_list): - i, o = get_i_o(X, mod.desc_ids, mod.targ_ids, filter_nan=True) - - # i, o = X[:, mod.desc_ids], X[:, mod.targ_ids] + for m_idx, model in enumerate(m_list): + i, o = get_i_o(X, model.desc_ids, model.targ_ids, filter_nan=True) multi_target = o.shape[1] != 1 if not multi_target: @@ -95,13 +90,11 @@ def _model_evaluation(X, m_list, m_codes): o = o.ravel() y_true = o - y_pred = mod.predict(i) - - metric = _select_metric(mod) - mod.score = _calc_performance(y_true, y_pred, metric, multi_target) - m_score[m_idx, mod.targ_ids] = mod.score + y_pred = model.predict(i) - # m_score[m_idx, mod.targ_ids] = (mod.score - i_score[mod.targ_ids])/mod.score + metric = _select_metric(model) + model.score = _calc_performance(y_true, y_pred, metric, model, multi_target) + m_score[m_idx, model.targ_ids] = model.score return m_score @@ -111,10 +104,8 @@ def _imputer_evaluation(X, i_list): for i_idx, imp in enumerate(i_list): _, o = get_i_o(X, [], [i_idx], filter_nan=True) - # o = X[:, i_idx] - y_true = o - y_pred = imp.transform(_dummy_array(len(o))).ravel() + y_pred = imp.transform(dummy_array(len(o))).ravel() metric = _select_metric(imp) imp.score = _calc_performance(y_true, y_pred, metric) @@ -129,21 +120,22 @@ def _dummy_evaluation(m_codes): def _select_metric(model): - if model.out_kind in {"nominal"}: + if model.out_kind == "nominal": metric = accuracy_score - #metric = partial(f1_score, average="macro") - else: + elif model.out_kind == "numeric": metric = normalized_root_mean_squared_error - # metric = r2_score + else: + # mixed model + metric = mixed_score return metric -def _calc_performance(y_true, y_pred, metric, multi_target=False): - +def _calc_performance(y_true, y_pred, metric, model=None, multi_target=False): if multi_target: - performance = [ - metric(y_true[:, i], y_pred[:, i]) for i in range(y_true.shape[1]) - ] + if model.out_kind == "mixed": + performance = metric(y_true, y_pred, model.model.classification_targets) + else: + performance = [metric(y_true[:, i], y_pred[:, i]) for i in range(y_true.shape[1])] else: performance = metric(y_true, y_pred) return performance @@ -158,6 +150,19 @@ def normalized_root_mean_squared_error(y_true, y_pred): """ mse = mean_squared_error(y_true, y_pred) var = np.var(y_true) - - nrmse = np.sqrt(mse / var) + if var != 0: + nrmse = np.sqrt(mse / var) + else: + nrmse = np.sqrt(mse) return 1 - nrmse + + +def mixed_score(y_true, y_pred, classification_targets): + scores = np.zeros(y_true.shape[1]) + for i in range(y_true.shape[1]): + if i in classification_targets: + scores[i] = accuracy_score(y_true[:, i], y_pred[:, i]) + else: + scores[i] = normalized_root_mean_squared_error(y_true[:, i], y_pred[:, i]) + + return scores diff --git a/src/mercs/algo/imputation.py b/mercs/algo/imputation.py similarity index 99% rename from src/mercs/algo/imputation.py rename to mercs/algo/imputation.py index 0831b1d..0a10d3d 100644 --- a/src/mercs/algo/imputation.py +++ b/mercs/algo/imputation.py @@ -25,7 +25,6 @@ def nan_imputation(X, nominal_attributes): def skl_imputation(X, nominal_attributes): - # Init n_rows, n_cols = X.shape i_list = [] diff --git a/src/mercs/algo/induction.py b/mercs/algo/induction.py similarity index 65% rename from src/mercs/algo/induction.py rename to mercs/algo/induction.py index 509dfdc..885a404 100644 --- a/src/mercs/algo/induction.py +++ b/mercs/algo/induction.py @@ -1,31 +1,10 @@ -import warnings -from functools import partial, wraps import itertools -import numpy as np -import pandas as pd - -from sklearn.ensemble import ( - RandomForestClassifier, - RandomForestRegressor, - ExtraTreesClassifier, - ExtraTreesRegressor, -) -from sklearn.metrics import f1_score, r2_score -from sklearn.model_selection import train_test_split -from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor +import warnings +import numpy as np +import shap from joblib import Parallel, delayed -from ..utils.decoration import decorate_tree - from sklearn.preprocessing import normalize -import shap - - -try: - from xgboost import XGBClassifier as XGBC - from xgboost import XGBRegressor as XGBR -except: - XGBC, XGBR = None, None try: from lightgbm import LGBMClassifier as LGBMC @@ -45,23 +24,25 @@ except: WLC, WLR = None, None -from ..composition.CanonicalModel import CanonicalModel -from ..utils import code_to_query, debug_print, get_att, get_i_o +from mercs.composition.CanonicalModel import CanonicalModel +from mercs.utils import code_to_query, get_i_o def base_induction_algorithm( - data, - m_codes, - metadata, - classifier, - regressor, - classifier_kwargs, - regressor_kwargs, - random_state=997, - calculation_method_feature_importances="default", - min_nb_samples=10, - n_jobs=1, - verbose=0, + data, + m_codes, + metadata, + classifier, + regressor, + mixed, + classifier_kwargs, + regressor_kwargs, + mixed_kwargs, + random_state=997, + calculation_method_feature_importances="default", + min_nb_samples=10, + n_jobs=1, + verbose=0, ): """Basic induction algorithm. Models according to the m_codes it receives. @@ -71,8 +52,10 @@ def base_induction_algorithm( metadata {dict} -- Metadata of MERCS classifier {Supported ML learner} -- Supported ML learner regressor {Supported ML learner} -- Supported ML learner + mixed {Supported ML mixed learner} -- Supported ML mixed learner classifier_kwargs {dict} -- Kwargs for classifier regressor_kwargs {dict} -- Kwargs for regressor + mixed_kwargs {dict} -- kwargs for mixed learner Keyword Arguments: random_state {int} -- Seed for random numbers (default: {997}) @@ -83,7 +66,7 @@ def base_induction_algorithm( ValueError: When trying to learn a model with both nominal and numeric outputs. Returns: - list -- List of learned ML-models + m_list -- List of learned ML-models """ assert isinstance(data, np.ndarray) @@ -119,6 +102,8 @@ def base_induction_algorithm( numeric_attributes, regressor, regressor_kwargs, + mixed, + mixed_kwargs, random_states, calculation_method_feature_importances, min_nb_samples, @@ -132,19 +117,19 @@ def base_induction_algorithm( def expand_induction_algorithm( - data, - m_codes, - metadata, - classifier, - regressor, - classifier_kwargs, - regressor_kwargs, - random_state=997, - n_jobs=1, - verbose=0, + data, + m_codes, + metadata, + classifier, + regressor, + classifier_kwargs, + regressor_kwargs, + random_state=997, + n_jobs=1, + verbose=0, ): """Basic induction algorithm. Models according to the m_codes it receives. - + Arguments: data {np.ndarray} -- Input data m_codes {np.ndarray} -- Model codes @@ -153,17 +138,17 @@ def expand_induction_algorithm( regressor {Supported ML learner} -- Supported ML learner classifier_kwargs {dict} -- Kwargs for classifier regressor_kwargs {dict} -- Kwargs for regressor - + Keyword Arguments: random_state {int} -- Seed for random numbers (default: {997}) n_jobs {int} -- Joblib can be used in training. (default: {1}) verbose {int} -- Verbosity level for Joblib. (default: {0}) - + Raises: ValueError: When trying to learn a model with both nominal and numeric outputs. - + Returns: - list -- List of learned ML-models + m_list -- List of learned ML-models """ m_list = base_induction_algorithm( data, @@ -171,8 +156,10 @@ def expand_induction_algorithm( metadata, classifier, regressor, + None, classifier_kwargs, regressor_kwargs, + None, random_state=random_state, n_jobs=n_jobs, verbose=verbose, @@ -188,8 +175,23 @@ def _expand_m_list(m_list): def _build_models(parameters, n_jobs=1, verbose=0): - m_list = [] + """ Method in charge of learning the models based on the given parameters. It can be done is parallel by specifying + the number of jobs. + + Args: + parameters: configuration parameters of the models + n_jobs: number of parallel jobs + verbose: verbosity level for multi-core learning + + Returns: + m_list: list of trained models + + """ + if n_jobs < 2: + if n_jobs < 1: + msg = """Number of jobs needs to be at least 1. Assuming 1 job.""" + warnings.warn(msg) m_list = [_learn_model(*a, **k) for a, k in parameters] else: msg = """Training is being parallellized using Joblib. Number of jobs = {}""".format( @@ -204,41 +206,68 @@ def _build_models(parameters, n_jobs=1, verbose=0): def _build_parameters( - ids, - nominal_attributes, - classifier, - classifier_kwargs, - numeric_attributes, - regressor, - regressor_kwargs, - random_states, - calculation_method_feature_importances, - min_nb_samples, - data, + ids, + nominal_attributes, + classifier, + classifier_kwargs, + numeric_attributes, + regressor, + regressor_kwargs, + mixed, + mixed_kwargs, + random_states, + calculation_method_feature_importances, + min_nb_samples, + data, ): + """ Creates the "parameters" object used by the models + + Args: + ids: query ids in the form of [(descriptive, target), (descriptive, target), ...] + nominal_attributes: idxs of the nominal attributes + classifier: classifier algorithm + classifier_kwargs: classifier configuration + numeric_attributes: idxs of the numeric attributes + regressor: regressor algorithm + regressor_kwargs: regressor configuration + mixed: mixed learning algorithm + mixed_kwargs: mixed learner configuration + random_states: + calculation_method_feature_importances: + min_nb_samples: minimum number of samples + data: training data + + Returns: + parameters: list of the model parameters + - data: training data + - desc_ids: descriptive parameters + - targ_ids: target parameters + - learner: learner algorithm + - out_kind: output data type(nominal, numeric, mixed) + - kwargs: model kwargs + + """ parameters = [] for idx, (desc_ids, targ_ids) in enumerate(ids): - if set(targ_ids).issubset(nominal_attributes): learner = classifier out_kind = "nominal" - metric = partial(f1_score, average="macro") kwargs = classifier_kwargs.copy() # Copy is essential + kwargs["random_state"] = random_states[idx] elif set(targ_ids).issubset(numeric_attributes): learner = regressor out_kind = "numeric" - metric = r2_score kwargs = regressor_kwargs.copy() # Copy is essential + kwargs["random_state"] = random_states[idx] else: - msg = """ - Cannot learn mixed (i.e. nominal+numeric) models - """ - raise ValueError(msg) - - kwargs["random_state"] = random_states[idx] - kwargs[ - "calculation_method_feature_importances" - ] = calculation_method_feature_importances + # Case when target ids contain both numerical and nominal data + learner = mixed + out_kind = "mixed" + kwargs = mixed_kwargs.copy() + _, classification_targets, _ = np.intersect1d(np.array(targ_ids), np.array(list(nominal_attributes)), return_indices=True) + kwargs["classification_targets"] = classification_targets + + kwargs["calculation_method_feature_importances"] = calculation_method_feature_importances kwargs["min_nb_samples"] = min_nb_samples kwargs = _add_categorical_features_to_kwargs( @@ -246,31 +275,43 @@ def _build_parameters( ) # This is learner-specific # Learn a model for current desc_ids-targ_ids combo - args = (data, desc_ids, targ_ids, learner, out_kind, metric) + args = (data, desc_ids, targ_ids, learner, out_kind) parameters.append((args, kwargs)) return parameters def _learn_model( - data, - desc_ids, - targ_ids, - learner, - out_kind, - metric, - filter_nan=True, - min_nb_samples=10, - calculation_method_feature_importances="default", - **kwargs + data, + desc_ids, + targ_ids, + learner, + out_kind, + filter_nan=True, + min_nb_samples=10, + calculation_method_feature_importances="default", + **kwargs ): - """ - Learn a model from the data. + """Learn a single model from the data. The arguments of this function determine specifics on which task, which learner etc. Model is a machine learning method that has a .fit() method. + + Args: + data: training data + desc_ids: ids of the descriptive attributes + targ_ids: ids of the target attributes + learner: learning algorithm + out_kind: type of the ouput data (numeric, nominal or mixed) + filter_nan: indicates if NaN values should be filtered + min_nb_samples: minimum number of samples + calculation_method_feature_importances: + **kwargs: keyword argument + + Returns: + model: the learned model """ assert learner is not None @@ -345,34 +386,6 @@ def _add_categorical_features_to_kwargs(learner, desc_ids, nominal_attributes, k return kwargs -def _score_model(model, metric, y_test, y_pred, multi_target): - try: - performance = _calc_performance(y_test, y_pred, metric, multi_target) - except ValueError as e: - mean = np.nanmean(y_pred) - if not np.isfinite(mean): - warnings.warn( - """We have a model that cannot solve anything. Something shady might be going on.""" - ) - performance = 0 - else: - y_pred[np.isnan(y_pred)] = mean - assert np.all(np.isfinite(y_pred)) - performance = _calc_performance(y_test, y_pred, metric, multi_target) - - return performance - - -def _calc_performance(y_test, y_pred, metric, multi_target): - if multi_target: - performance = [ - metric(y_test[:, i], y_pred[:, i]) for i in range(y_test.shape[1]) - ] - else: - performance = metric(y_test, y_pred) - return performance - - def _get_cat_features(desc_ids, nominal_ids): cat_features = np.where( np.in1d(np.array(list(desc_ids)), np.array(list(nominal_ids))) diff --git a/mercs/algo/inference.py b/mercs/algo/inference.py new file mode 100644 index 0000000..7e01f02 --- /dev/null +++ b/mercs/algo/inference.py @@ -0,0 +1,247 @@ +import numpy as np + +from mercs.utils.inference_tools import ( + dummy_array, + pad_proba, + select_nominal, + select_numeric, +) + +INPUTS = "inputs" +COMPUTE = "compute" + + +# Main algorithm +def inference_algorithm(g, m_list, i_list, c_list, data, nominal_ids): + """Add inference information to graph g + The information is added to the graph passed as parameter, no new object is returned + + reminder: node[1] = node attribute id + + Arguments: + g {[type]} -- graph + m_list {[type]} -- models + i_list {[type]} -- imputation nodes + c_list {[type]} -- composition nodes + data {[type]} -- test data to predict + nominal_ids {[type]} -- identifiers of the nominal attributes + + Raises: + ValueError: raised when a node type cannot be recognized + + """ + + # Helper functions to check node type + def _data_node(kind): return kind == "D" + def _model_node(kind): return kind == "M" + def _imputation_node(kind): return kind == "I" + def _composite_node(kind): return kind == "C" + + nb_rows, _ = data.shape + + g_descriptive_ids = list(g.desc_ids) + + if data is not None: + g.data = data[:, g_descriptive_ids] + else: + g.data = None + for node in g.nodes(): + if _data_node(node[0]): + in_degree = g.in_degree(node) + if in_degree == 0: + input_data_node(g, node, g_descriptive_ids) + elif in_degree > 0: + if node[1] in nominal_ids: + nominal_data_node(g, node, m_list, c_list) + else: + numeric_data_node(g, node, m_list, c_list) + elif _model_node(node[0]): + model_node(g, node, m_list) + elif _imputation_node(node[0]): + imputation_node(g, node, i_list, nb_rows) + elif _composite_node(node[0]): + composite_node(g, node, c_list) + else: + raise ValueError("Did not recognize node kind of {}".format(node)) + + +# Specific nodes: +# 1. input data +# 2. imputation +# 3. numeric data +# 4. nominal data +# 5. model +def input_data_node(g, node, g_desc_ids): + def f(rel_idx): + f1 = select_numeric(g.data, rel_idx) + return f1 + + g.nodes[node][INPUTS] = g_desc_ids.index(node[1]) + g.nodes[node][COMPUTE] = f + + +def imputation_node(g, node, i_list, nb_rows): + # Build function + def f(n): + return i_list[node[1]].transform(dummy_array(n)).ravel() + + g.nodes[node][INPUTS] = nb_rows + g.nodes[node][COMPUTE] = f + + +def numeric_data_node(g, node, m_list, c_list): + node_parents = _get_parents(g, m_list, c_list, node) + + def f(parents): + collector = _numeric_inputs(g, parents) + return np.mean(collector, axis=0) + + g.nodes[node][INPUTS] = node_parents + g.nodes[node][COMPUTE] = f + + +def nominal_data_node(g, node, m_list, c_list): + node_parents = _get_parents(g, m_list, c_list, node, nominal=True) + classes = np.unique(np.hstack([c for _, c, _, _ in node_parents])) + + def vote(X): + max_x = np.argmax(X, axis=1) + return classes.take(max_x, axis=0) + + def F(parents): + collector = _nominal_inputs(g, parents, classes) + return np.sum(collector, axis=0) + + def F2(parents): + sum = F(parents) + return vote(sum) + + g.nodes[node]["classes"] = classes + g.nodes[node][INPUTS] = node_parents + g.nodes[node]["compute_proba"] = F + g.nodes[node][COMPUTE] = F2 + + +def model_node(g, node, m_list): + model_parents = _model_parents(g, node) + + def f(parents): + X = _model_inputs(g, parents) + return m_list[node[1]].predict(X) + + g.nodes[node][INPUTS] = model_parents + g.nodes[node][COMPUTE] = f + + if hasattr(m_list[node[1]], "predict_proba"): + def f2(parents): + X = _model_inputs(g, parents) + probabilities = m_list[node[1]].predict_proba(X) + return probabilities + + g.nodes[node]["compute_proba"] = f2 + + +def composite_node(g, node, c_list): + return model_node(g, node, c_list) + + +# Helper functions +def compute(g, node, proba=False): + result_str = "result" + compute_str = COMPUTE + + if proba: + result_str += "_proba" + compute_str += "_proba" + + result = g.nodes[node].get(result_str, None) + if result is None: + inputs = g.nodes[node].get(INPUTS) + f = g.nodes[node].get(compute_str) + g.nodes[node][result_str] = f(inputs) + result = g.nodes[node][result_str] + return result + else: + return result + + +def _nominal_inputs(g, parents, classes): + # Returns the 'nominal' inputs of the parent nodes + collector = [] + for rel_idx, parent_classes, n, model_type in parents: + if len(parent_classes) == len(classes): + X = compute(g, n, proba=True) + selected = select_nominal(X, rel_idx, model_type) + collector.append(selected) + else: + prob = pad_proba(parent_classes, classes) + X = compute(g, n, proba=True) + selected = prob(select_nominal(X, rel_idx, model_type)) + collector.append(selected) + + return collector + + +def _numeric_inputs(g, parents): + # Returns the 'numeric' inputs of the parent nodes + collector = [] + for rel_idx, n, model_type in parents: + X = compute(g, n) + selected = select_numeric(X, rel_idx) + collector.append(selected) + return collector + + +def _model_inputs(g, parents): + # Returns the 'model' inputs of the parent nodes + collector = [compute(g, n) for n in parents] + collector = np.stack(collector, axis=1) + return collector + + +def _get_parents(g, m_list, c_list, node, nominal=False): + # Returns the 'nominal' parents of a node + parents = [] + for kind, predecessor_idx in g.predecessors(node): + rel_idx = _rel_idx(predecessor_idx, node[1], kind, m_list, c_list) + model_type = m_list[predecessor_idx].out_kind + if nominal: + classes = _classes( + predecessor_idx, + rel_idx, + kind, + m_list, + c_list + ) + parents.append((rel_idx, classes, (kind, predecessor_idx), model_type)) + else: + parents.append((rel_idx, (kind, predecessor_idx), model_type)) + + return parents + + +def _model_parents(g, node): + # Returns the 'model' parents of a node + idxs = {predecessor_idx: (m, predecessor_idx) for m, predecessor_idx in g.predecessors(node)} + + parents = [n for kind, n in sorted(idxs.items())] + + return parents + + +def _rel_idx(predecessor_idx, node_idx, kind, m_list, c_list): + # Calculates the relative id of a node with respect to its predecessor, based on node kind + if kind == "M": + return m_list[predecessor_idx].targ_ids.index(node_idx) + elif kind == "C": + return c_list[predecessor_idx].targ_ids.index(node_idx) + else: + return 0 + + +def _classes(predecessor_idx, rel_idx, kind, m_list, c_list): + # Returns the classes of a model, based on node kind + if kind == "M": + return m_list[predecessor_idx].classes_[rel_idx] + elif kind == "C": + return c_list[predecessor_idx].classes_[rel_idx] diff --git a/src/mercs/algo/inference.py b/mercs/algo/inference_legacy.py similarity index 79% rename from src/mercs/algo/inference.py rename to mercs/algo/inference_legacy.py index 0733f75..dc12f00 100644 --- a/src/mercs/algo/inference.py +++ b/mercs/algo/inference_legacy.py @@ -1,18 +1,29 @@ +from functools import partial + import networkx as nx import numpy as np - -from functools import partial, reduce from dask import delayed -from ..graph.network import get_ids, node_label -from ..composition import o, x -from ..utils import debug_print +from mercs.composition import o, x + +from mercs.utils.inference_tools import ( + pad_proba, + select_nominal, + select_numeric, +) +from mercs.utils.inference_tools_legacy import get_ids +from mercs.utils import debug_print VERBOSITY = 0 +""" +This file has two inference algorithms: base and dask. +Base is called 'legacy' in MERCS, maybe it should be deleted. +Dask is an inference algorithm which makes use of the Dask parallel-computing library. +""" -def base_inference_algorithm(g, X=None): +def base_inference_algorithm(g): # Convert the graph to its functions sorted_nodes = list(nx.topological_sort(g)) @@ -30,7 +41,7 @@ def base_inference_algorithm(g, X=None): if node.get("kind", None) == "data": if len(nx.ancestors(g, node_name)) == 0: - functions[node_name] = _select_numeric(q_desc_ids.index(node["idx"])) + functions[node_name] = select_numeric(q_desc_ids.index(node["idx"])) else: # Select the relevant output previous_node = [t[0] for t in g.in_edges(node_name)][0] @@ -38,7 +49,7 @@ def base_inference_algorithm(g, X=None): relevant_idx = previous_t_idx.index(node["idx"]) functions[node_name] = o( - _select_numeric(relevant_idx), functions[previous_node] + select_numeric(relevant_idx), functions[previous_node] ) elif node.get("kind", None) == "imputation": @@ -71,10 +82,10 @@ def base_inference_algorithm(g, X=None): ] for idx, (f1, t, c) in enumerate(inputs): - f2 = o(_select_nominal(t.index(prob_idx)), f1) + f2 = o(select_nominal(t.index(prob_idx)), f1) if len(c) < len(prob_classes): - f2 = o(_pad_proba(c, prob_classes), f2) + f2 = o(pad_proba(c, prob_classes), f2) inputs[idx] = f2 @@ -94,7 +105,7 @@ def base_inference_algorithm(g, X=None): inputs = [(functions[n], t) for n, t in zip(previous_nodes, previous_t_idx)] inputs = [ - o(_select_numeric(t_idx.index(merge_idx)), f) for f, t_idx in inputs + o(select_numeric(t_idx.index(merge_idx)), f) for f, t_idx in inputs ] inputs = o(np.transpose, x(*inputs, return_type=np.array)) @@ -107,7 +118,7 @@ def base_inference_algorithm(g, X=None): def dask_inference_algorithm(g, X=None, sorted_nodes=None): if sorted_nodes is None: sorted_nodes = list(nx.topological_sort(g)) - + functions = {} q_desc_ids = list(get_ids(g, kind="desc")) @@ -145,17 +156,17 @@ def dask_data_node(g, node, node_name, data, q_desc_ids): if n_parents == 0: idx = node["idx"] - node["dask"] = delayed(_select_numeric(q_desc_ids.index(idx)))(data) + node["dask"] = delayed(select_numeric(q_desc_ids.index(idx)))(data) else: # Select the relevant output parent_relative_idx, parent_function = _get_parents_of_data_node(g, node, node_name) - node["dask"] = delayed(_select_numeric(parent_relative_idx))(parent_function) + node["dask"] = delayed(select_numeric(parent_relative_idx))(parent_function) return def dask_model_node(g, node, node_name): # Collect input data - parent_functions = _get_parents_of_model_node(g, node, node_name) + parent_functions = _get_parents_of_model_node(g, node) collector = delayed(np.stack)(parent_functions, axis=1) # Convert function @@ -179,10 +190,10 @@ def dask_prob_node(g, node, node_name): # Incorporate extra step(s) for idx, (f1, t, c) in enumerate(inputs): - f2 = delayed(_select_nominal(t.index(node["idx"])))(f1) + f2 = delayed(select_nominal(t.index(node["idx"])))(f1) if len(c) < len(node["classes"]): - f3 = delayed(_pad_proba(c, node["classes"]))(f2) + f3 = delayed(pad_proba(c, node["classes"]))(f2) else: f3 = f2 @@ -218,7 +229,7 @@ def dask_merge_node(g, node, node_name): # Incorporate extra step(s) for idx, (f1, t) in enumerate(inputs): - f2 = delayed(_select_numeric(t.index(node["idx"])))(f1) + f2 = delayed(select_numeric(t.index(node["idx"])))(f1) parent_functions[idx] = f2 node["dask"] = delayed(partial(np.mean, axis=0))(parent_functions) @@ -235,44 +246,6 @@ def dask_merge_node(g, node, node_name): ) -# Helpers -def _pad_proba(classes, all_classes): - idx = _map_classes(classes, all_classes) - - def pad(X): - R = np.zeros((X.shape[0], len(all_classes))) - R[:, idx] = X - return R - - return pad - - -def _map_classes(classes, all_classes): - sorted_idx = np.argsort(all_classes) - matches = np.searchsorted(all_classes[sorted_idx], classes) - return sorted_idx[matches] - - -def _select_numeric(idx): - def select(X): - if X.ndim == 2: - return X.take(idx, axis=1) - else: - return X - - return select - - -def _select_nominal(idx): - def select(X): - if isinstance(X, list): - return X[idx] - elif isinstance(X, np.ndarray): - return X - - return select - - def _get_parents_of_data_node(g, node, node_name): # It can only be one parent parent_node = g.nodes[[s for s, t in g.in_edges(node_name)].pop()] @@ -283,7 +256,7 @@ def _get_parents_of_data_node(g, node, node_name): return parent_relative_idx, parent_function -def _get_parents_of_model_node(g, node, node_name): +def _get_parents_of_model_node(g, node_name): parent_nodes = [s for s, t in g.in_edges(node_name)] parent_indices = [g.nodes[n]["idx"] for n in parent_nodes] @@ -293,7 +266,7 @@ def _get_parents_of_model_node(g, node, node_name): return parent_functions -def _get_parents_of_prob_node(g, node, node_name): +def _get_parents_of_prob_node(g, node_name): parent_nodes = [s for s, t in g.in_edges(node_name)] parent_functions = [g.nodes[n]["dask"] for n in parent_nodes] diff --git a/src/mercs/algo/vector_prediction.py b/mercs/algo/prediction.py similarity index 74% rename from src/mercs/algo/vector_prediction.py rename to mercs/algo/prediction.py index 061d873..a4cd310 100644 --- a/src/mercs/algo/vector_prediction.py +++ b/mercs/algo/prediction.py @@ -1,30 +1,31 @@ -import numpy as np import warnings -from sklearn.preprocessing import minmax_scale, normalize +import numpy as np +from sklearn.preprocessing import normalize -from ..utils import code_to_query, get_att_2d, TARG_ENCODING +from mercs.utils import code_to_query, get_att_2d, TARG_ENCODING EPSILON = 0.00001 -# Strategies +# There are 4 possible strategies for prediction +# 1. mi: missing value imputation +# 2. mrai: model activation(based on 'mi') +# 3. it(default): iteratively uses 'mrai', uses feature importances for model selection +# 4. random walks: also based on 'mrai' +# Any of them will return a list of selected models, based on the m_codes and q_codes def mi( - m_codes, - m_fimps, - m_score, - q_code, - a_src=None, - a_tgt=None, - m_avl=None, - random_state=997, + m_codes, + q_code, + a_src=None, + a_tgt=None, + m_avl=None, ): # Init - m_sel = [] m_avl = _init_m_avl(m_codes, m_avl=m_avl) a_src, a_tgt = _init_a_src_a_tgt(q_code=q_code, a_src=a_src, a_tgt=a_tgt) - c_all = criterion(m_codes, row_filter=m_avl, col_filter=a_tgt, aggregation=False) + c_all = _criterion(m_codes, row_filter=m_avl, col_filter=a_tgt, aggregation=False) m_sel_idx = np.unique(np.where(c_all == TARG_ENCODING)[0]).astype(int) m_sel = m_avl[m_sel_idx] @@ -35,22 +36,20 @@ def mi( def mrai( - m_codes, - m_fimps, - m_score, - q_code, - a_src=None, - a_tgt=None, - m_avl=None, - init_threshold=1.0, - stepsize=0.1, - any_target=False, - picking_function="greedy", - thresholds=None, - random_state=997, + m_codes, + m_fimps, + m_score, + q_code, + a_src=None, + a_tgt=None, + m_avl=None, + init_threshold=1.0, + stepsize=0.1, + any_target=False, + picking_function="greedy", + random_state=997, ): # Init - m_sel = [] m_avl = _init_m_avl(m_codes, m_avl=m_avl) thresholds = _init_thresholds(init_threshold, stepsize) a_src, a_tgt = _init_a_src_a_tgt(q_code=q_code, a_src=a_src, a_tgt=a_tgt) @@ -58,13 +57,10 @@ def mrai( # Filtering m_flt = mi( m_codes, - m_fimps, - m_score, None, a_src=a_src, a_tgt=a_tgt, m_avl=m_avl, - random_state=random_state, ) if m_flt is None: @@ -72,10 +68,10 @@ def mrai( return None else: # Criterion - c_tgt = criterion( + c_tgt = _criterion( m_score, row_filter=m_flt, col_filter=a_tgt, aggregation=False ) - c_src = criterion(m_fimps, row_filter=m_flt, col_filter=a_src, aggregation=True) + c_src = _criterion(m_fimps, row_filter=m_flt, col_filter=a_src, aggregation=True) c_all = c_src * c_tgt + EPSILON if any_target: @@ -98,20 +94,17 @@ def mrai( def it( - m_codes, - m_fimps, - m_score, - q_code, - m_avl=None, - max_steps=4, - init_threshold=1.0, - stepsize=0.1, - picking_function="greedy", - random_state=997, + m_codes, + m_fimps, + m_score, + q_code, + m_avl=None, + max_steps=4, + picking_function="greedy", + random_state=997, ): m_sel = [] m_avl = _init_m_avl(m_codes, m_avl=m_avl) - thresholds = _init_thresholds(init_threshold, stepsize) any_target = True q_desc, q_targ, q_miss = code_to_query(q_code) @@ -136,7 +129,6 @@ def it( a_tgt=a_tgt, m_avl=m_avl, any_target=any_target, - thresholds=thresholds, picking_function=picking_function, random_state=random_state, ) @@ -160,31 +152,26 @@ def it( return m_sel -def rw( - m_codes, - m_fimps, - m_score, - q_code, - m_avl=None, - nb_walks=5, - max_steps=4, - init_threshold=1.0, - stepsize=0.1, - straight=True, - picking_function="stochastic", - random_state=997, +def random_walk( + m_codes, + m_fimps, + m_score, + q_code, + m_avl=None, + nb_walks=5, + max_steps=4, + straight=True, + picking_function="stochastic", + random_state=997, ): - random_walks = [ - walk( + _walk( m_codes, m_fimps, m_score, q_code, m_avl=m_avl, max_steps=max_steps, - init_threshold=init_threshold, - stepsize=stepsize, straight=straight, picking_function=picking_function, random_state=random_state + i * 997, # Otherwise you do identical walks! @@ -195,22 +182,19 @@ def rw( return tuple(random_walks) -def walk( - m_codes, - m_fimps, - m_score, - q_code, - m_avl=None, - max_steps=4, - init_threshold=1.0, - stepsize=0.1, - straight=True, - picking_function="stochastic", - random_state=997, +def _walk( + m_codes, + m_fimps, + m_score, + q_code, + m_avl=None, + max_steps=4, + straight=True, + picking_function="stochastic", + random_state=997, ): m_sel = [] m_avl = _init_m_avl(m_codes, m_avl=m_avl) - thresholds = _init_thresholds(init_threshold, stepsize) any_target = True q_desc, q_targ, q_miss = code_to_query(q_code) @@ -228,7 +212,6 @@ def walk( a_tgt=a_tgt, m_avl=m_avl, any_target=any_target, - thresholds=thresholds, picking_function=picking_function, random_state=random_state + step, ) @@ -241,7 +224,6 @@ def walk( # Allow to predict anything that follows if not straight: - s_tgt = get_att_2d(m_codes[step_m_sel, :], kind="targ") # HACK s_src = np.union1d(a_tgt, s_src) # HACK a_tgt = np.setdiff1d(s_src, a_src) @@ -255,8 +237,8 @@ def walk( return m_sel -# MRAI-IT-RW Criterion -def criterion(matrix, row_filter=None, col_filter=None, aggregation=False): +# Criterion used by MRAI, IT and RW strategies +def _criterion(matrix, row_filter=None, col_filter=None, aggregation=False): """ Typical usecase @@ -279,24 +261,24 @@ def criterion(matrix, row_filter=None, col_filter=None, aggregation=False): # Picks -def _all_pick(criterion, **kwargs): - return np.where(criterion >= 0.0)[0] +def _all_pick(crit, **kwargs): + return np.where(crit >= 0.0)[0] -def _greedy_pick(criterion, thresholds=None, **kwargs): - +def _greedy_pick(crit, thresholds=None, **kwargs): + m_sel = None for thr in thresholds: - m_sel = np.where(criterion >= thr)[0] + m_sel = np.where(crit >= thr)[0] if _stopping_criterion_greedy_pick(m_sel): break return m_sel -def _stochastic_pick(c_all, random_state=997, normalize=True, **kwargs): +def _stochastic_pick(c_all, random_state=997, normalize_criteria=True): assert len(c_all) > 0 - if normalize: + if normalize_criteria: c_all = _criteria_to_distribution(c_all) np.random.seed(random_state) @@ -310,13 +292,16 @@ def _stochastic_pick(c_all, random_state=997, normalize=True, **kwargs): return m_sel -def _random_pick(criterion, random_state=997, **kwargs): - criterion = _criteria_to_uniform_distribution(criterion) - return _stochastic_pick(criterion, normalize=False) +def _random_pick(crit): + crit = _criteria_to_uniform_distribution(crit) + return _stochastic_pick(crit, normalize_criteria=False) PICKS = dict( - all=_all_pick, greedy=_greedy_pick, stochastic=_stochastic_pick, random=_random_pick + all=_all_pick, + greedy=_greedy_pick, + stochastic=_stochastic_pick, + random=_random_pick ) @@ -371,7 +356,6 @@ def _criteria_to_distribution(criteria, epsilon=EPSILON): # Inits def _init_thresholds(init_threshold, stepsize, thresholds=None, tolerance=EPSILON): - if thresholds is None: thresholds = np.arange(init_threshold, -1 - stepsize, -stepsize) @@ -394,4 +378,3 @@ def _init_a_src_a_tgt(q_code=None, a_src=None, a_tgt=None): return a_src, a_tgt else: return a_src, a_tgt - diff --git a/src/mercs/algo/selection.py b/mercs/algo/selection.py similarity index 50% rename from src/mercs/algo/selection.py rename to mercs/algo/selection.py index a3cdaf0..60e0652 100755 --- a/src/mercs/algo/selection.py +++ b/mercs/algo/selection.py @@ -1,11 +1,14 @@ -import numpy as np import warnings -from ..utils import DESC_ENCODING, TARG_ENCODING, MISS_ENCODING + +import numpy as np + +from mercs.utils import TARG_ENCODING -def base_selection_algorithm(metadata, nb_targets=1, nb_iterations=1, random_state=997): +def base_selection_algorithm(metadata, generate_mixed_codes, nb_targets=1, nb_iterations=1, random_state=997): m_codes = random_selection_algorithm( metadata, + generate_mixed_codes, nb_targets=nb_targets, nb_iterations=nb_iterations, fraction_missing=0.0, @@ -15,7 +18,7 @@ def base_selection_algorithm(metadata, nb_targets=1, nb_iterations=1, random_sta def random_selection_algorithm( - metadata, nb_targets=1, nb_iterations=1, fraction_missing=0.2, random_state=997 + metadata, generate_mixed_codes, nb_targets=1, nb_iterations=1, fraction_missing=0.2, random_state=997 ): if isinstance(fraction_missing, list): codes = [] @@ -23,6 +26,7 @@ def random_selection_algorithm( codes.append( random_selection_algorithm( metadata, + generate_mixed_codes, nb_targets=nb_targets, nb_iterations=nb_iterations, fraction_missing=f, @@ -31,49 +35,66 @@ def random_selection_algorithm( ) m_codes = np.vstack(codes) return m_codes - + else: - # Init np.random.seed(random_state) nb_attributes = metadata["n_attributes"] nb_targets = _set_nb_targets(nb_targets, nb_attributes) if fraction_missing in {'sqrt'}: - fraction_missing = 1-np.sqrt(nb_attributes)/nb_attributes + fraction_missing = 1 - np.sqrt(nb_attributes) / nb_attributes elif fraction_missing in {"log2"}: - fraction_missing = 1-np.log2(nb_attributes)/nb_attributes + fraction_missing = 1 - np.log2(nb_attributes) / nb_attributes - codes = [] - for attribute_kind in {"nominal_attributes", "numeric_attributes"}: - potential_targets = np.array(list(metadata[attribute_kind])) + m_codes = [] + if generate_mixed_codes: + # In the mixed case, targets can be nominal and numeric + potential_targets = np.sort( + np.array(list(metadata["nominal_attributes"]) + list(metadata["numeric_attributes"]))) - if potential_targets.shape[0] > 0: - for iterations in range(nb_iterations): - m_codes = _single_iteration_random_selection( + if len(potential_targets) > 0: + for i in range(nb_iterations): + code = _single_iteration_random_selection( nb_attributes, nb_targets, fraction_missing, potential_targets ) - codes.append(m_codes) - - m_codes = np.vstack(codes) - - m_codes = _ensure_desc_atts(m_codes) + m_codes.append(code) + else: + for attribute_kind in {"nominal_attributes", "numeric_attributes"}: + potential_targets = np.array(list(metadata[attribute_kind])) + + if len(potential_targets) > 0: + for i in range(nb_iterations): + code = _single_iteration_random_selection( + nb_attributes, nb_targets, fraction_missing, potential_targets + ) + m_codes.append(code) + + m_codes = np.vstack(m_codes) return m_codes.astype(np.int8) def _single_iteration_random_selection( - nb_attributes, nb_targets, fraction_missing, potential_targets + nb_attributes, nb_targets, fraction_missing, potential_targets ): - nb_models, deficit = _nb_models_and_deficit(nb_targets, potential_targets) + """ Select random combination of descriptive + target parameters for the model - # Init + Args: + nb_attributes: total number of attributes + nb_targets: number of targets + fraction_missing: percentage of missing values + potential_targets: attributes that can be used as targets + + Returns: + code: an array indicating which attributes are descriptive and which attributes are targets + """ + nb_models, deficit = _nb_models_and_deficit(nb_targets, potential_targets) target_sets, nb_models = _target_sets(potential_targets, nb_targets, nb_models, deficit) - m_codes = _init(nb_models, nb_attributes) + code = np.zeros((nb_models, nb_attributes), dtype=np.int8) + code = _set_targets(code, target_sets) + code = _set_missing(code, fraction_missing) - m_codes = _set_targets(m_codes, target_sets) - m_codes = _set_missing(m_codes, fraction_missing) - m_codes - return m_codes + return code # Helpers @@ -90,7 +111,7 @@ def _set_missing(m_codes, fraction=0.2): def _ensure_desc_atts(m_codes): """ - If there are no input attributes in a code, we flip one missing attribute at random. + If there are no descriptive attributes in a code, we flip one missing attribute at random. """ for row in m_codes: if 0 not in np.unique(row): @@ -121,37 +142,44 @@ def _set_nb_targets(nb_targets, nb_atts): def _nb_models_and_deficit(nb_targets, potential_targets): + """ Calculates the number of models to learn based on the number of targets and the potential targets - nb_potential_targets = potential_targets.shape[0] + Args: + nb_targets: number of targets + potential_targets: attributes that can be used as targets - nb_models_with_regular_nb_targets = nb_potential_targets // nb_targets + Returns: + nb_models: number of models + nb_leftover_targets: number of potential targets which will not be used + """ + nb_potential_targets = len(potential_targets) + nb_models = nb_potential_targets // nb_targets nb_leftover_targets = nb_potential_targets % nb_targets - if nb_leftover_targets: - nb_models = nb_models_with_regular_nb_targets - deficit = nb_leftover_targets - else: - nb_models = nb_models_with_regular_nb_targets - deficit = 0 - - return nb_models, deficit - - -def _init(nb_models, nb_attributes): - return np.zeros((nb_models, nb_attributes), dtype=np.int8) + return nb_models, nb_leftover_targets def _target_sets(potential_targets, nb_targets, nb_models, deficit): + """ + Args: + potential_targets: attributes that can be used as targets + nb_targets: number of targets + nb_models: number of models + deficit: number of potential targets which will not be used + + Returns: + result: random target combinations + nb_models: updated number of models to learn + """ nb_targets = min(len(potential_targets), nb_targets) - - np.random.shuffle(potential_targets) + np.random.shuffle(potential_targets) choices = potential_targets[deficit:] result = np.random.choice(choices, replace=False, size=(nb_models, nb_targets)) if deficit: - choices = potential_targets[:nb_targets] # This includes all the ones you left out! + choices = potential_targets[:nb_targets] # This includes all the ones you left out! extra = np.random.choice(choices, replace=False, size=(1, nb_targets)) result = np.vstack([result, extra]) nb_models += 1 @@ -160,10 +188,8 @@ def _target_sets(potential_targets, nb_targets, nb_models, deficit): def _set_targets(m_codes, target_sets): - - row_idx = np.arange(m_codes.shape[0]).reshape(-1, 1) + row_idx = np.arange(len(m_codes)).reshape(-1, 1) col_idx = target_sets m_codes[row_idx, col_idx] = TARG_ENCODING return m_codes - diff --git a/src/mercs/composition/CanonicalModel.py b/mercs/composition/CanonicalModel.py similarity index 67% rename from src/mercs/composition/CanonicalModel.py rename to mercs/composition/CanonicalModel.py index d548ac7..9ee28a3 100644 --- a/src/mercs/composition/CanonicalModel.py +++ b/mercs/composition/CanonicalModel.py @@ -1,25 +1,29 @@ from functools import wraps -import warnings from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor try: from catboost import CatBoostClassifier as CBC - from catboost import CatBoostRegressor as CBR except: - CBC, CBR = None, None + CBC = None + +try: + from morfist import MixedRandomForest as MRF +except: + MRF = None class CanonicalModel(object): """ Canonical Attributes: - - desc_ids, {1,2} - - targ_ids, {3} - - out_kind, {'numerical', 'nominal', 'mix'} + - model: learning algorithm + - desc_ids: ids of the descriptive attributes. E.g. {1,2} + - targ_ids: ids of the target attributes. E.g. {3} + - out_kind: output data type. {'numerical', 'nominal', 'mixed'} - feature_importances - - classes_, list of arrays of shape n_classes - - n_classes_, list of ints + - classes_: list of arrays of shape n_classes + - n_classes_: list of ints Canonical Methods: - predict, np.ndarray, shape = nb_instances X nb_desc_ids @@ -39,11 +43,14 @@ def __init__(self, model, desc_ids, targ_ids, out_kind, performance=1.0): if hasattr(model, 'shap_values_'): self.feature_importances_ = self.model.shap_values_ + elif isinstance(model, MRF): + # FIXME: the correct importances should be calculated by morfist + self.feature_importances_ = [1 / len(desc_ids) for _ in desc_ids] else: self.feature_importances_ = self.model.feature_importances_ # Canonization of prediction-related stuff - if self.out_kind in {"nominal", "mix"}: + if self.out_kind == "nominal": self.predict = self.model.predict self.predict_proba = self.model.predict_proba self.classes_ = self.model.classes_ @@ -59,25 +66,31 @@ def __init__(self, model, desc_ids, targ_ids, out_kind, performance=1.0): self.classes_ = [self.classes_] if single_target_sklearn_classifier(model): + # TODO: fill this pass - # self.predict = canonical_predict(self.model.predict) - # self.predict_proba = canonical_predict_proba(self.model.predict_proba) - # self.classes_ = [self.model.classes_] - # self.n_classes_ = [self.model.n_classes_] - elif self.out_kind in {"numeric"}: + elif self.out_kind == "numeric": self.predict = self.model.predict - # if single_target_sklearn_regressor(model): - # self.predict = canonical_predict(self.model.predict) + elif self.out_kind == "mixed": + self.predict = self.model.predict + self.predict_proba = self.model.predict_proba + + # add labels of nominal target variables + # add dummy label None for numeric target variables + # this is needed because of the way the graph is built + self.classes_ = [] + self.n_classes_ = [] + for i in range(len(targ_ids)): + labels = self.model.classification_labels.get(i) + self.classes_.append(labels) + self.n_classes_.append(len(labels) if labels is not None else -1) else: raise NotImplementedError( "I do not recognize this kind of model: {}".format(out_kind) ) - return - def __len__(self): """Returns the number of estimators in the ensemble.""" try: @@ -99,7 +112,7 @@ def __getitem__(self, index): except TypeError: # The underlying model does not allow expansion, only index 0 makes sense. assert ( - index == 0 + index == 0 ), "You are not an ensemble model, so there can be only one index: 0" return self @@ -137,13 +150,13 @@ def predict_proba(*args, **kwargs): # Helpers def single_target_sklearn_regressor(model): return ( - isinstance(model, (DecisionTreeRegressor, RandomForestRegressor)) - and model.n_outputs_ == 1 + isinstance(model, (DecisionTreeRegressor, RandomForestRegressor)) + and model.n_outputs_ == 1 ) def single_target_sklearn_classifier(model): return ( - isinstance(model, (DecisionTreeClassifier, RandomForestClassifier)) - and model.n_outputs_ == 1 + isinstance(model, (DecisionTreeClassifier, RandomForestClassifier)) + and model.n_outputs_ == 1 ) diff --git a/src/mercs/composition/NewCompositeModel.py b/mercs/composition/CompositeModel.py similarity index 82% rename from src/mercs/composition/NewCompositeModel.py rename to mercs/composition/CompositeModel.py index c8bca19..79ffb3c 100644 --- a/src/mercs/composition/NewCompositeModel.py +++ b/mercs/composition/CompositeModel.py @@ -1,24 +1,22 @@ import numpy as np -from dask import delayed from sklearn.preprocessing import normalize -from ..algo.inference_v3 import compute -from .compose import o, x -from ..graph.network import get_ids, node_label, get_nodes - -from ..utils import debug_print +from mercs.algo.inference import compute VERBOSITY = 0 -class NewCompositeModel(object): +class CompositeModel(object): + """ + Builds a model from the diagram generated by the inference algorithm. + Sets the desc and targ ids, feature imps, classes and prediction methods. + """ def __init__(self, diagram, desc_ids=None, targ_ids=None, nominal_attributes=None, n_component_models=0): # Assign desc and targ ids - - for k, idx in diagram.nodes(): - if k == 'M' and (idx >= n_component_models): - diagram.nodes[(k, idx)]['shape'] = 'square' + for kind, idx in diagram.nodes(): + if kind == 'M' and (idx >= n_component_models): + diagram.nodes[(kind, idx)]['shape'] = 'square' if desc_ids is not None: self.desc_ids = desc_ids @@ -33,7 +31,7 @@ def __init__(self, diagram, desc_ids=None, targ_ids=None, nominal_attributes=Non self.desc_ids = sorted(list(self.desc_ids)) self.targ_ids = sorted(list(self.targ_ids)) - self.feature_importances_ = [1/len(self.desc_ids) for _ in self.desc_ids] + self.feature_importances_ = [1 / len(self.desc_ids) for _ in self.desc_ids] self.predict = _get_predict(diagram, self.targ_ids) @@ -46,10 +44,9 @@ def __init__(self, diagram, desc_ids=None, targ_ids=None, nominal_attributes=Non return - def get_confidences(self, X=None, redo=False, normalize_outputs=True): - confidences = [np.array([[1.0]]) for t in self.targ_ids] + confidences = [np.array([[1.0]]) for _ in self.targ_ids] nominal_prb = self.predict_proba(X, redo=redo) for targ_id, proba in zip(self.nominal_targ_ids, nominal_prb): diff --git a/src/mercs/composition/__init__.py b/mercs/composition/__init__.py similarity index 58% rename from src/mercs/composition/__init__.py rename to mercs/composition/__init__.py index a2a0505..4da822b 100644 --- a/src/mercs/composition/__init__.py +++ b/mercs/composition/__init__.py @@ -1,3 +1,2 @@ from .compose import o, x from .CompositeModel import CompositeModel -from .NewCompositeModel import NewCompositeModel diff --git a/src/mercs/composition/compose.py b/mercs/composition/compose.py similarity index 92% rename from src/mercs/composition/compose.py rename to mercs/composition/compose.py index 4e64911..4edb60f 100644 --- a/src/mercs/composition/compose.py +++ b/mercs/composition/compose.py @@ -1,7 +1,4 @@ -from functools import lru_cache - def o(f1, f2): - def sequential_composition(*function_arguments): return f1(f2(*function_arguments)) @@ -9,6 +6,9 @@ def sequential_composition(*function_arguments): def x(*functions, return_type=tuple): + """ + Apparently not used anywhere. + """ def parallel_composition(*function_arguments): if len(function_arguments) == 1: res = return_type([f(function_arguments[0]) for f in functions]) diff --git a/src/mercs/core/Mercs.py b/mercs/core/Mercs.py similarity index 60% rename from src/mercs/core/Mercs.py rename to mercs/core/Mercs.py index f801e17..bf6238c 100644 --- a/src/mercs/core/Mercs.py +++ b/mercs/core/Mercs.py @@ -1,22 +1,39 @@ +import itertools import warnings from inspect import signature from timeit import default_timer -import dask -import itertools import numpy as np - -from dask import delayed -from networkx import NetworkXUnfeasible, find_cycle, topological_sort +from networkx import NetworkXUnfeasible, find_cycle from sklearn.ensemble import ( RandomForestClassifier, RandomForestRegressor, ExtraTreesClassifier, ExtraTreesRegressor, ) -from sklearn.impute import SimpleImputer from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor +from mercs.algo import ( + imputation, + induction, + inference_legacy, + inference, + selection, + prediction, + evaluation, +) +from mercs.composition import CompositeModel, o +from mercs.graph import build_diagram +from mercs.utils import ( + TARG_ENCODING, + code_to_query, + query_to_code, + DecoratedDecisionTreeClassifier, + DecoratedDecisionTreeRegressor, + DecoratedRandomForestClassifier +) +from mercs.visuals import show_diagram + try: from xgboost import XGBClassifier as XGBC from xgboost import XGBRegressor as XGBR @@ -41,32 +58,10 @@ except: WLC, WLR = None, None - -from ..algo import ( - imputation, - inference, - inference_v3, - new_inference, - new_prediction, - selection, - vector_prediction, - evaluation, -) -from ..algo.induction import base_induction_algorithm, expand_induction_algorithm -from ..composition import CompositeModel, NewCompositeModel, o, x -from ..graph import build_diagram, compose_all, get_targ, model_to_graph -from ..utils import ( - DESC_ENCODING, - MISS_ENCODING, - TARG_ENCODING, - code_to_query, - query_to_code, - DecoratedDecisionTreeClassifier, - DecoratedDecisionTreeRegressor, - DecoratedRandomForestClassifier, - DecoratedRandomForestRegressor, -) -from ..visuals import save_diagram, show_diagram +try: + from morfist import MixedRandomForest as MRF +except: + MRF = None class Mercs(object): @@ -79,9 +74,9 @@ class Mercs(object): ) induction_algorithms = dict( - base=base_induction_algorithm, - default=base_induction_algorithm, - expand=expand_induction_algorithm, + base=induction.base_induction_algorithm, + default=induction.base_induction_algorithm, + expand=induction.expand_induction_algorithm, ) classifier_algorithms = dict( @@ -113,16 +108,17 @@ class Mercs(object): ) prediction_algorithms = dict( - mi=vector_prediction.mi, - mrai=vector_prediction.mrai, - it=vector_prediction.it, - rw=vector_prediction.rw, + mi=prediction.mi, + mrai=prediction.mrai, + it=prediction.it, + random_walk=prediction.random_walk, + default=prediction.it ) inference_algorithms = dict( - base=inference.base_inference_algorithm, - dask=inference_v3.inference_algorithm, - own=inference_v3.inference_algorithm, + base=inference.inference_algorithm, + dask=inference_legacy.dask_inference_algorithm, + legacy=inference_legacy.base_inference_algorithm, ) imputer_algorithms = dict( @@ -142,6 +138,11 @@ class Mercs(object): dummy=evaluation.dummy_evaluation, ) + mixed_algorithms = dict( + morfist=MRF, + default=MRF, + ) + # Used in parse kwargs to identify parameters. If this identification goes wrong, you are sending settings # somewhere you do not want them to be. So, this is a tricky part, and moreover hardcoded. In other words: # this is risky terrain, and should probably be done differently in the future. @@ -153,23 +154,26 @@ class Mercs(object): inference={"inference", "infr", "inf"}, classification={"classification", "classifier", "clf"}, regression={"regression", "regressor", "rgr"}, + mixed={"mixed"}, metadata={"metadata", "meta", "mtd"}, evaluation={"evaluation", "evl"}, ) def __init__( - self, - selection_algorithm="base", - induction_algorithm="base", - classifier_algorithm="DT", - regressor_algorithm="DT", - prediction_algorithm="mi", - inference_algorithm="own", - imputer_algorithm="default", - evaluation_algorithm="default", - random_state=42, - **kwargs + self, + selection_algorithm="base", + induction_algorithm="base", + classifier_algorithm="DT", + regressor_algorithm="DT", + prediction_algorithm="mi", + inference_algorithm="base", + imputer_algorithm="default", + evaluation_algorithm="default", + mixed_algorithm=None, + random_state=42, + **kwargs ): + # Explicit parameters self.params = dict( selection_algorithm=selection_algorithm, induction_algorithm=induction_algorithm, @@ -179,37 +183,46 @@ def __init__( inference_algorithm=inference_algorithm, imputer_algorithm=imputer_algorithm, evaluation_algorithm=evaluation_algorithm, - random_state=random_state, + mixed_algorithm=mixed_algorithm, + random_state=random_state ) - self.params = {**self.params, **kwargs} + # Add MixedRandomForest configuration if the algorithm has been selected + # As opposed to the rest of algorithms, this one is optional, so it has to be initialised in a different way + if mixed_algorithm in self.mixed_algorithms: + self.mixed_algorithm = self.mixed_algorithms[mixed_algorithm] + elif mixed_algorithm is not None: + warnings.warn("Unknown mixed algorithm") + exit(-1) + else: + self.mixed_algorithm = None + + # For some reason, some parameters are expected to be passed as kwargs, so we aggregate them here with the + # explicitly-passed parameters + self.params = {**self.params, **kwargs} self.random_state = random_state + # Parse some parameters from the list of possible values + # N.b.: For some parameters, first try to look up the key. + # If the key is not found, we assume the algorithm itself was passed. self.selection_algorithm = self.selection_algorithms[selection_algorithm] - - # N.b.: First try to look up the key. If the key is not found, we assume the algorithm itself was passed. - self.classifier_algorithm = self.classifier_algorithms.get( - classifier_algorithm, classifier_algorithm - ) - self.regressor_algorithm = self.regressor_algorithms.get( - regressor_algorithm, regressor_algorithm - ) - + self.classifier_algorithm = self.classifier_algorithms.get(classifier_algorithm, classifier_algorithm) + self.regressor_algorithm = self.regressor_algorithms.get(regressor_algorithm, regressor_algorithm) self.prediction_algorithm = self.prediction_algorithms[prediction_algorithm] self.inference_algorithm = self.inference_algorithms[inference_algorithm] - self.induction_algorithm = self.induction_algorithms[ - induction_algorithm - ] # For now, we only have one. + self.induction_algorithm = self.induction_algorithms[induction_algorithm] # For now, we only have one. self.imputer_algorithm = self.imputer_algorithms[imputer_algorithm] self.evaluation_algorithm = self.evaluation_algorithms[evaluation_algorithm] - # Data-structures + # Global variables initialization self.m_codes = np.array([]) self.m_list = [] self.c_list = [] self.g_list = [] self.i_list = [] - self.m_fimps = np.array([]) + # Feature importances of each model + self.m_feature_importances = np.array([]) + # Model score self.m_score = np.array([]) self.FI = np.array([]) @@ -222,43 +235,67 @@ def __init__( self.q_diagram = None self.q_compose = None self.q_methods = [] + self.q_model = None - # Configurations - self.imp_cfg = self._default_config(self.imputer_algorithm) - self.ind_cfg = self._default_config(self.induction_algorithm) - self.sel_cfg = self._default_config(self.selection_algorithm) - self.clf_cfg = self._default_config(self.classifier_algorithm) - self.rgr_cfg = self._default_config(self.regressor_algorithm) - self.prd_cfg = self._default_config(self.prediction_algorithm) - self.inf_cfg = self._default_config(self.inference_algorithm) - self.evl_cfg = self._default_config(self.evaluation_algorithm) - - self.configuration = dict( - imputation=self.imp_cfg, - induction=self.ind_cfg, - selection=self.sel_cfg, - classification=self.clf_cfg, - regression=self.rgr_cfg, - prediction=self.prd_cfg, - inference=self.inf_cfg, - ) # Collect all configs in one - - self._update_config(random_state=random_state, **kwargs) + self.c_sel = [] + self.c_diagram = [] self.metadata = dict() self.model_data = dict() - self._extra_checks_on_config() + # Configurations for each algorithm + self.imputer_config = self._default_config(self.imputer_algorithm) + self.induction_config = self._default_config(self.induction_algorithm) + self.selection_config = self._default_config(self.selection_algorithm) + self.classifier_config = self._default_config(self.classifier_algorithm) + self.regressor_config = self._default_config(self.regressor_algorithm) + self.prediction_config = self._default_config(self.prediction_algorithm) + self.inference_config = self._default_config(self.inference_algorithm) + self.evaluation_config = self._default_config(self.evaluation_algorithm) + + # Aggregate all configurations + self.configuration = dict( + imputation=self.imputer_config, + induction=self.induction_config, + selection=self.selection_config, + classification=self.classifier_config, + regression=self.regressor_config, + prediction=self.prediction_config, + inference=self.inference_config, + ) - return + # Add MixedRandomForest configuration if the algorithm has been selected + self.mixed_config = None + if self.mixed_algorithm: + self.mixed_config = self._default_config(self.mixed_algorithm) + self.configuration["mixed"] = self.mixed_config + + # Update config based on random_state and kwargs + self._update_config(random_state=random_state, **kwargs) + self._extra_checks_on_config() def fit(self, X, y=None, m_codes=None, **kwargs): + """ + Fits n models for the given dataset, based on its metadata(n of models, desc and targ attributes, etc.) + The models are fitted by the induction algorithm. + The m_codes are generated by the selection algorithm. + Missing data is handled by the imputer algorithm. + A score is calculated by the evaluation algorithm. + + Args: + X: dataset + y: labels(optional). They will be used as another column of X. + m_codes: model codes(optional). If not given, they will be randomly generated. + **kwargs: metadata + + """ assert isinstance(X, np.ndarray) + # If labels are provided, they are added to the X data as a new column at the end + # MERCS does not care about labels and will treat them as a new variable if y is not None: assert isinstance(y, np.ndarray) X = np.c_[X, y] - tic = default_timer() self.metadata = self._default_metadata(X) @@ -266,9 +303,10 @@ def fit(self, X, y=None, m_codes=None, **kwargs): self.i_list = self.imputer_algorithm(X, self.metadata.get("nominal_attributes")) - # N.b.: `random state` parameter is in `self.sel_cfg` + # N.b.: 'random state' parameter is in 'self.sel_config' if m_codes is None: - self.m_codes = self.selection_algorithm(self.metadata, **self.sel_cfg) + generate_mixed_codes = True if self.mixed_algorithm else False + self.m_codes = self.selection_algorithm(self.metadata, generate_mixed_codes, **self.selection_config) else: self.m_codes = m_codes @@ -278,36 +316,51 @@ def fit(self, X, y=None, m_codes=None, **kwargs): self.metadata, self.classifier_algorithm, self.regressor_algorithm, - self.clf_cfg, - self.rgr_cfg, - **self.ind_cfg + self.mixed_algorithm, + self.classifier_config, + self.regressor_config, + self.mixed_config, + **self.induction_config ) self._filter_m_list_m_codes() - self._consistent_datastructures() + self._consistent_data_structures() if self.imputer_algorithm == self.imputer_algorithms.get("nan"): # If you do no have imputers, you cannot use them as a baseline evaluation - self.evl_cfg["consider_imputations"] = False + self.evaluation_config["consider_imputations"] = False self.m_score = self.evaluation_algorithm( - X, self.m_codes, self.m_list, self.i_list, **self.evl_cfg + X, self.m_codes, self.m_list, self.i_list, **self.evaluation_config ) toc = default_timer() self.model_data["ind_time"] = toc - tic self.metadata["n_component_models"] = len(self.m_codes) - return def predict( - self, - X, - q_code=None, - inference_algorithm=None, - prediction_algorithm=None, - **kwargs + self, + X, + q_code=None, + inference_algorithm=None, + prediction_algorithm=None, + **kwargs ): + """ + + Args: + X: dataset. + q_code: query code(indicates descriptive and target attributes). + A default code will be used if not provided. + inference_algorithm: the chosen inference algorithm. Adds data to the graph. + prediction_algorithm: the chosen prediction algorithm. Indicates the prediction strategy. + Used to determine which models should be used for prediction. + **kwargs: prediction algorithm metadata + + Returns: the prediction + + """ # Update configuration if necessary if q_code is None: q_code = self._default_q_code() @@ -328,24 +381,22 @@ def predict( # Make query-diagram tic_prediction = default_timer() - self.m_sel = self.prediction_algorithm( - self.m_codes, self.m_fimps, self.m_score, q_code=self.q_code, **self.prd_cfg + m_selection = self.prediction_algorithm( + self.m_codes, self.m_feature_importances, self.m_score, q_code=self.q_code, **self.prediction_config ) toc_prediction = default_timer() tic_diagram = default_timer() - self.q_diagram = self._build_q_diagram(self.m_list, self.m_sel) + # Builds empty diagram with the selected models' structure + self.q_diagram = self._build_q_diagram(self.m_list, m_selection) toc_diagram = default_timer() - tic_infalgo = default_timer() + tic_inference = default_timer() + # Fills the diagram nodes with the needed data and methods if isinstance(self.q_diagram, tuple): - self.q_diagrams = self.q_diagram - - # for d in self.q_diagrams: - # print(d.nodes) - # self.c_list.append(self._build_q_model(X, d)) + q_diagrams = self.q_diagram - self.c_list = [self._build_q_model(X, d) for d in self.q_diagrams] + self.c_list = [self._build_q_model(X, d) for d in q_diagrams] self.c_sel = list(range(len(self.c_list))) self.c_diagram = self._build_q_diagram( self.c_list, self.c_sel, composition=True @@ -354,8 +405,7 @@ def predict( self.q_model = self._build_q_model(X, self.c_diagram) else: self.q_model = self._build_q_model(X, self.q_diagram) - - toc_infalgo = default_timer() + toc_inference = default_timer() tic_dask = default_timer() X = X[:, self.q_model.desc_ids] @@ -364,48 +414,41 @@ def predict( self.model_data["prd_time"] = toc_prediction - tic_prediction self.model_data["dia_time"] = toc_diagram - tic_diagram - self.model_data["infalgo_time"] = toc_infalgo - tic_infalgo + self.model_data["inference_time"] = toc_inference - tic_inference self.model_data["dsk_time"] = toc_dask - tic_dask self.model_data["inf_time"] = toc_dask - tic_prediction return result - def get_params(self, deep=False): - return self.params + def show_q_diagram(self, kind="svg", fi=False, ortho=False, index=None, **kwargs): + if isinstance(self.q_diagram, tuple) and index is None: + return show_diagram(self.c_diagram, kind=kind, fi=fi, ortho=ortho, **kwargs) + elif isinstance(self.q_diagram, tuple): + return show_diagram( + self.q_diagram[index], kind=kind, fi=fi, ortho=ortho, **kwargs + ) + else: + return show_diagram(self.q_diagram, kind=kind, fi=fi, ortho=ortho, **kwargs) # Diagrams - def _build_q_diagram(self, m_list, m_sel, composition=False): - if isinstance(m_sel, tuple): + def _build_q_diagram(self, m_list, m_selection, composition=False): + if isinstance(m_selection, tuple): diagrams = [ build_diagram( m_list, - m_sel_instance, + m_selection_instance, self.q_code, prune=True, composition=composition, ) - for m_sel_instance in m_sel + for m_selection_instance in m_selection ] return tuple(diagrams) else: return build_diagram( - m_list, m_sel, self.q_code, prune=True, composition=composition + m_list, m_selection, self.q_code, prune=True, composition=composition ) - def show_q_diagram(self, kind="svg", fi=False, ortho=False, index=None, **kwargs): - - if isinstance(self.q_diagram, tuple) and index is None: - return show_diagram(self.c_diagram, kind=kind, fi=fi, ortho=ortho, **kwargs) - elif isinstance(self.q_diagram, tuple): - return show_diagram( - self.q_diagram[index], kind=kind, fi=fi, ortho=ortho, **kwargs - ) - else: - return show_diagram(self.q_diagram, kind=kind, fi=fi, ortho=ortho, **kwargs) - - def save_diagram(self, fname=None, kind="svg", fi=False, ortho=False): - return save_diagram(self.q_diagram, fname, kind=kind, fi=fi, ortho=ortho) - # Inference def _build_q_model(self, X, diagram): try: @@ -431,95 +474,29 @@ def _build_q_model(self, X, diagram): raise RecursionError(msg) n_component_models = self.metadata["n_component_models"] - q_model = NewCompositeModel( + q_model = CompositeModel( diagram, nominal_attributes=self.metadata["nominal_attributes"], n_component_models=n_component_models, ) return q_model - def _merge_q_models(self, q_models): - q_diagram = build_diagram(self.c_list, self.c_sel, self.q_code, prune=True) - return q_diagram - - def merge_models(self, q_models): - - types = self._get_types(self.metadata) - - walks = [ - model_to_graph(m, types, idx=idx, composition=True) - for idx, m in enumerate(q_models) - ] - q_diagram = compose_all(walks) - filtered_nodes = self.filter_nodes(q_diagram) - - try: - self.inference_algorithm(q_diagram, sorted_nodes=filtered_nodes) - except NetworkXUnfeasible: - cycle = find_cycle(q_diagram, orientation="original") - msg = """ - Topological sort failed, investigate diagram to debug. - - I will never be able to squeeze a prediction out of a diagram with a loop. - - Cycle was: {} - """.format( - cycle - ) - raise RecursionError(msg) - - q_model = CompositeModel(q_diagram) - return q_diagram, q_model - - def _get_q_model(self, q_diagram, X): - - self._add_imputer_function(q_diagram) - - try: - self.inference_algorithm(q_diagram, X=X) - except NetworkXUnfeasible: - cycle = find_cycle(q_diagram, orientation="original") - msg = """ - Topological sort failed, investigate diagram to debug. - - I will never be able to squeeze a prediction out of a diagram with a loop. - - Cycle was: {} - """.format( - cycle - ) - raise RecursionError(msg) - - q_model = CompositeModel(q_diagram) - return q_model - - # Filter def _filter_m_list_m_codes(self): """Filtering out the failed models. This happens when TODO: EXPLAIN """ - fail_m_idxs = [i for i, m in enumerate(self.m_list) if m is None] self.m_codes = np.delete(self.m_codes, fail_m_idxs, axis=0) self.m_list = [m for m in self.m_list if m is not None] - return - # Graphs - def _consistent_datastructures(self, binary_scores=False): + def _consistent_data_structures(self): self._update_m_codes() - self._update_m_fimps() - return + self._update_m_feature_importances() def _expand_m_list(self): self.m_list = list(itertools.chain.from_iterable(self.m_list)) - return - - def _add_model(self, model, binary_scores=False): - self.m_list.append(model) - self._consistent_datastructures(binary_scores=binary_scores) - return def _update_m_codes(self): self.m_codes = np.array( @@ -532,23 +509,15 @@ def _update_m_codes(self): for model in self.m_list ] ) - return - def _update_m_fimps(self): + def _update_m_feature_importances(self): init = np.zeros(self.m_codes.shape) for m_idx, mod in enumerate(self.m_list): init[m_idx, list(mod.desc_ids)] = mod.feature_importances_ - self.m_fimps = init - - return - - def _update_m_score(self, binary_scores=False): - if binary_scores: - self.m_score = (self.m_codes == TARG_ENCODING).astype(float) - return + self.m_feature_importances = init # Imputer def _add_imputer_function(self, g): @@ -563,15 +532,6 @@ def _add_imputer_function(self, g): g.nodes[n]["function"] = o(f_3, o(f_2, f_1)) - return - - # Add ids - @staticmethod - def _add_ids(g, desc_ids, targ_ids): - g.graph["desc_ids"] = set(desc_ids) - g.graph["targ_ids"] = set(targ_ids) - return g - # Metadata def _default_metadata(self, X): if X.ndim != 2: @@ -605,32 +565,27 @@ def _update_metadata(self, **kwargs): nominal = self.metadata["nominal_attributes"] att_ids = self.metadata["attributes"] - if len(nominal) + len(numeric) < len(att_ids): + if len(nominal) + len(numeric) != len(att_ids): numeric = att_ids - nominal self._update_dictionary( self.metadata, kind="metadata", numeric_attributes=numeric ) - return - # Configuration def _reconfig_prediction(self, prediction_algorithm="mi", **kwargs): self.prediction_algorithm = self.prediction_algorithms[prediction_algorithm] - self.prd_cfg = self._default_config(self.prediction_algorithm) + self.prediction_config = self._default_config(self.prediction_algorithm) - self.configuration["prediction"] = self.prd_cfg + self.configuration["prediction"] = self.prediction_config self._update_config(**kwargs) - return - - def _reconfig_inference(self, inference_algorithm="own", **kwargs): + def _reconfig_inference(self, inference_algorithm="base", **kwargs): self.inference_algorithm = self.inference_algorithms[inference_algorithm] - self.inf_cfg = self._default_config(self.inference_algorithm) + self.inf_config = self._default_config(self.inference_algorithm) - self.configuration["inference"] = self.inf_cfg + self.configuration["inference"] = self.inf_config self._update_config(**kwargs) - return @staticmethod def _default_config(method): @@ -643,16 +598,11 @@ def _default_config(method): return config def _update_config(self, **kwargs): - for kind in self.configuration: self._update_dictionary(self.configuration[kind], kind=kind, **kwargs) - return - def _extra_checks_on_config(self): - self._check_xgb_single_target() - return def _check_xgb_single_target(self): @@ -662,8 +612,8 @@ def _check_xgb_single_target(self): return None else: if ( - self.classifier_algorithm is self.classifier_algorithms["XGB"] - or self.regressor_algorithm is self.regressor_algorithms["XGB"] + self.classifier_algorithm is self.classifier_algorithms["XGB"] + or self.regressor_algorithm is self.regressor_algorithms["XGB"] ): xgb = True else: @@ -681,10 +631,7 @@ def _check_xgb_single_target(self): warnings.warn(msg) self.configuration["selection"]["nb_targets"] = 1 - return - def _parse_kwargs(self, kind="selection", **kwargs): - prefixes = [e + self.delimiter for e in self.configuration_prefixes[kind]] parameter_map = { @@ -710,16 +657,6 @@ def _update_dictionary(self, dictionary, kind=None, **kwargs): for k in overlap: dictionary[k] = kwargs[parameter_map[k]] - return - - # Helpers - def _filter_X(self, X): - # Filter relevant input attributes - if X.shape[1] != len(self.q_compose.desc_ids): - indices = self._overlapping_indices( - self.q_desc_ids, self.q_compose.desc_ids - ) - return X[:, indices] @staticmethod def _dummy_array(X): @@ -753,19 +690,13 @@ def _default_q_code(self): @staticmethod def _is_nominal(t): - condition_01 = t == np.dtype(int) - return condition_01 + is_nominal = t == np.dtype(int) + return is_nominal @staticmethod def _is_numeric(t): - condition_01 = t == np.dtype(float) - return condition_01 - - @staticmethod - def _get_types(metadata): - nominal = {i: "nominal" for i in metadata["nominal_attributes"]} - numeric = {i: "numeric" for i in metadata["numeric_attributes"]} - return {**nominal, **numeric} + is_numeric = t == np.dtype(float) + return is_numeric @staticmethod def _overlapping_indices(a, b): @@ -789,79 +720,3 @@ def _overlapping_indices(a, b): """ return np.nonzero(np.in1d(a, b))[0] - - @staticmethod - def filter_nodes(g): - # This is not as safe as it should be - - sorted_nodes = list(topological_sort(g)) - filtered_nodes = [] - for n in reversed(sorted_nodes): - if g.nodes[n]["kind"] == "model": - break - filtered_nodes.append(n) - filtered_nodes = list(reversed(filtered_nodes)) - return filtered_nodes - - # SYNTH - def autocomplete(X, **kwargs): - return - - # Legacy (delete when I am sure they can go) - def predict_old( - self, X, q_code=None, prediction_algorithm=None, beta=False, **kwargs - ): - # Update configuration if necessary - if q_code is None: - q_code = self._default_q_code() - - if prediction_algorithm is not None: - reuse = False - self._reconfig_prediction( - prediction_algorithm=prediction_algorithm, **kwargs - ) - - # Adjust data - tic_prediction = default_timer() - self.q_code = q_code - self.q_desc_ids, self.q_targ_ids, _ = code_to_query( - self.q_code, return_list=True - ) - - # Make query-diagram - self.q_diagram = self.prediction_algorithm( - self.g_list, q_code, self.fi, self.t_codes, **self.prd_cfg - ) - - toc_prediction = default_timer() - - tic_dask = default_timer() - - toc_dask = default_timer() - - tic_compute = default_timer() - res = self.q_model.predict.compute() - toc_compute = default_timer() - - # Diagnostics - self.model_data["prd_time"] = toc_prediction - tic_prediction - self.model_data["dsk_time"] = toc_dask - tic_dask - self.model_data["cmp_time"] = toc_compute - tic_compute - self.model_data["inf_time"] = toc_compute - tic_prediction - self.model_data["ratios"] = ( - self.model_data["prd_time"] / self.model_data["inf_time"], - self.model_data["dsk_time"] / self.model_data["inf_time"], - self.model_data["cmp_time"] / self.model_data["inf_time"], - ) - return res - - def _update_g_list(self): - types = self._get_types(self.metadata) - self.g_list = [ - model_to_graph(m, types=types, idx=idx) for idx, m in enumerate(self.m_list) - ] - return - - def _update_t_codes(self): - self.t_codes = (self.m_codes == TARG_ENCODING).astype(int) - return diff --git a/src/mercs/core/__init__.py b/mercs/core/__init__.py similarity index 100% rename from src/mercs/core/__init__.py rename to mercs/core/__init__.py diff --git a/mercs/graph/__init__.py b/mercs/graph/__init__.py new file mode 100644 index 0000000..ab013fa --- /dev/null +++ b/mercs/graph/__init__.py @@ -0,0 +1 @@ +from .q_diagram import build_diagram diff --git a/src/mercs/graph/q_diagram.py b/mercs/graph/q_diagram.py similarity index 65% rename from src/mercs/graph/q_diagram.py rename to mercs/graph/q_diagram.py index 545dad2..1362ba8 100644 --- a/src/mercs/graph/q_diagram.py +++ b/mercs/graph/q_diagram.py @@ -1,14 +1,10 @@ -from functools import reduce - import networkx as nx import numpy as np -from ..utils import code_to_query - - +from mercs.utils import code_to_query NODE_PREFIXES = dict(data="D", model="M", imputation="I", composition="C") -NODE_KINDS = {v:k for k,v in NODE_PREFIXES.items()} +NODE_KINDS = {v: k for k, v in NODE_PREFIXES.items()} def build_diagram(m_list, m_sel, q_code, g=None, prune=False, composition=False): @@ -36,31 +32,30 @@ def build_diagram(m_list, m_sel, q_code, g=None, prune=False, composition=False) def build_diagram_single_layer(models, a_src, f_tgt, g=None, composition=False): - if g is None: g = nx.DiGraph() node_kind = "composition" if composition else "model" - valid_src = lambda a: a in a_src - valid_tgt = lambda a: a not in f_tgt + def valid_source_id(idx): return idx in a_src + def valid_target_id(idx): return idx not in f_tgt e_src = [] e_tgt = [] - for m_idx, m in models: - for a in m.desc_ids: - if valid_src(a): - e_src.append((v_name(a, kind="data"), v_name(m_idx, kind=node_kind))) - f_tgt.add(a) + for m_idx, model in models: + for a_idx in model.desc_ids: + if valid_source_id(a_idx): + e_src.append((v_name(a_idx, kind="data"), v_name(m_idx, kind=node_kind))) + f_tgt.add(a_idx) else: - e_src.append((v_name(a, kind="imputation"), v_name(m_idx, kind=node_kind))) + e_src.append((v_name(a_idx, kind="imputation"), v_name(m_idx, kind=node_kind))) - for m_idx, m in models: - for a in m.targ_ids: - if valid_tgt(a): - e_tgt.append((v_name(m_idx, kind=node_kind), (v_name(a, kind="data")))) - a_src.add(a) + for m_idx, model in models: + for a_idx in model.targ_ids: + if valid_target_id(a_idx): + e_tgt.append((v_name(m_idx, kind=node_kind), (v_name(a_idx, kind="data")))) + a_src.add(a_idx) g.add_edges_from(e_src + e_tgt) return a_src, f_tgt, g @@ -68,16 +63,12 @@ def build_diagram_single_layer(models, a_src, f_tgt, g=None, composition=False): # Helpers def v_name(idx, kind="model"): - return (NODE_PREFIXES[kind], idx) + return NODE_PREFIXES[kind], idx -def _prune(g): +def _prune(g): tgt_nodes = {("D", n) for n in g.targ_ids} ancestors = [nx.ancestors(g, source=n) for n in tgt_nodes] retain = set.union(*ancestors, tgt_nodes) remove = [n for n in g.nodes if n not in retain] g.remove_nodes_from(remove) - - return - - diff --git a/src/mercs/utils/__init__.py b/mercs/utils/__init__.py similarity index 89% rename from src/mercs/utils/__init__.py rename to mercs/utils/__init__.py index 579af25..590c98e 100644 --- a/src/mercs/utils/__init__.py +++ b/mercs/utils/__init__.py @@ -20,3 +20,4 @@ from .data_handling import(get_i_o) +from .test_data import load_iris, default_dataset diff --git a/src/mercs/tests/data/iris-test.csv b/mercs/utils/data/iris-test.csv similarity index 100% rename from src/mercs/tests/data/iris-test.csv rename to mercs/utils/data/iris-test.csv diff --git a/src/mercs/tests/data/iris-train.csv b/mercs/utils/data/iris-train.csv similarity index 100% rename from src/mercs/tests/data/iris-train.csv rename to mercs/utils/data/iris-train.csv diff --git a/src/mercs/utils/data_handling.py b/mercs/utils/data_handling.py similarity index 54% rename from src/mercs/utils/data_handling.py rename to mercs/utils/data_handling.py index 9c29df7..a36b146 100644 --- a/src/mercs/utils/data_handling.py +++ b/mercs/utils/data_handling.py @@ -1,6 +1,19 @@ import numpy as np + def get_i_o(data, desc_ids, targ_ids, filter_nan=True): + """ Splits data into X and y sets before fitting the model + + Args: + data: training data + desc_ids: descriptive attributes + targ_ids: target attributes + filter_nan: indicates if NaN values should be filtered + + Returns: + i: X values to be passed to the model + o: y values to be passed to the model + """ if filter_nan: i_o = data[:, desc_ids+targ_ids] @@ -13,4 +26,4 @@ def get_i_o(data, desc_ids, targ_ids, filter_nan=True): else: i, o = data[:, desc_ids], data[:, targ_ids] - return i, o \ No newline at end of file + return i, o diff --git a/src/mercs/utils/debug.py b/mercs/utils/debug.py similarity index 100% rename from src/mercs/utils/debug.py rename to mercs/utils/debug.py diff --git a/src/mercs/utils/decoration.py b/mercs/utils/decoration.py similarity index 100% rename from src/mercs/utils/decoration.py rename to mercs/utils/decoration.py diff --git a/src/mercs/utils/encoding.py b/mercs/utils/encoding.py similarity index 97% rename from src/mercs/utils/encoding.py rename to mercs/utils/encoding.py index 40521cb..943949d 100644 --- a/src/mercs/utils/encoding.py +++ b/mercs/utils/encoding.py @@ -23,11 +23,10 @@ def encode_attribute(att, desc, targ): return code_int -# Ugly but it just needs to be done once so deal with it. +# Not an elegant solution but it will do for now DESC_ENCODING = encode_attribute(1, [1], [2]) TARG_ENCODING = encode_attribute(2, [1], [2]) MISS_ENCODING = encode_attribute(0, [1], [2]) - ENCODING = dict(desc=DESC_ENCODING, targ=TARG_ENCODING, miss=MISS_ENCODING) diff --git a/src/mercs/graph/graphviz.py b/mercs/utils/graphviz.py similarity index 100% rename from src/mercs/graph/graphviz.py rename to mercs/utils/graphviz.py diff --git a/src/mercs/utils/inference_tools.py b/mercs/utils/inference_tools.py similarity index 53% rename from src/mercs/utils/inference_tools.py rename to mercs/utils/inference_tools.py index 0efc3b7..4cf2beb 100644 --- a/src/mercs/utils/inference_tools.py +++ b/mercs/utils/inference_tools.py @@ -1,13 +1,14 @@ import numpy as np + # Helpers - Data Handling -def _dummy_array(nb_rows): +def dummy_array(nb_rows): a = np.empty((nb_rows, 1)) a.fill(np.nan) return a -def _pad_proba(classes, all_classes): +def pad_proba(classes, all_classes): idx = _map_classes(classes, all_classes) def pad(X): @@ -24,21 +25,18 @@ def _map_classes(classes, all_classes): return sorted_idx[matches] -def _select_numeric(idx): - def select(X): - if X.ndim == 2: - return X.take(idx, axis=1) - else: - return X - - return select +def select_numeric(X, idx): + if X.ndim == 2: + return X.take(idx, axis=1) + else: + return X -def _select_nominal(idx): - def select(X): - if isinstance(X, list): - return X[idx] - elif isinstance(X, np.ndarray): - return X +def select_nominal(X, idx, model_type): + if isinstance(X, list): + return X[idx] + elif model_type == "mixed": + return X[:, idx].tolist() + elif isinstance(X, np.ndarray): + return X - return select \ No newline at end of file diff --git a/mercs/utils/inference_tools_legacy.py b/mercs/utils/inference_tools_legacy.py new file mode 100644 index 0000000..fd8e39e --- /dev/null +++ b/mercs/utils/inference_tools_legacy.py @@ -0,0 +1,56 @@ +NODE_PREFIXES = dict( + data="d", + vote="v", + prob="p", + merge="M", + imputation="I", + imputer="I", + function="f", + composition="c", + model="f") + + +# Utils, used only in 'inference_legacy.py' +def get_ids(g, kind="desc"): + + if kind in {"s", "src", "source", "d", "desc", "descriptive"}: + r = get_desc(g, ids=True) + elif kind in {"t", "tgt", "targ", "target"}: + r = get_targ(g, ids=True) + else: + msg = """ + Did not recognize kind: {} + """.format( + kind + ) + raise ValueError(msg) + + return r + + +def get_desc(g, ids=False): + data_nodes = get_nodes(g, kind="data") + + r = {n for n in data_nodes if len(g.in_edges(n)) == 0} + + if ids: + r = {g.nodes[n]["idx"] for n in r} + + return r + + +def get_targ(g, ids=False): + data_nodes = get_nodes(g, kind="data") + + r = {n for n in data_nodes if len(g.out_edges(n)) == 0} + + if ids: + r = {g.nodes[n]["idx"] for n in r} + + return r + + +def get_nodes(g, kind="data"): + prefix = NODE_PREFIXES[kind] + r = {n for n in g.nodes if n.startswith(prefix)} + return r diff --git a/src/mercs/tests/setup.py b/mercs/utils/test_data.py similarity index 100% rename from src/mercs/tests/setup.py rename to mercs/utils/test_data.py diff --git a/src/mercs/visuals/__init__.py b/mercs/visuals/__init__.py similarity index 100% rename from src/mercs/visuals/__init__.py rename to mercs/visuals/__init__.py diff --git a/src/mercs/visuals/diagrams.py b/mercs/visuals/diagrams.py similarity index 99% rename from src/mercs/visuals/diagrams.py rename to mercs/visuals/diagrams.py index 71e0cba..150d9fc 100644 --- a/src/mercs/visuals/diagrams.py +++ b/mercs/visuals/diagrams.py @@ -51,7 +51,6 @@ def dotstring_to_image(dotstring): def show_diagram(diagram, kind="svg", fi=False, ortho=False, **kwargs): try: - get_ipython() dotstring = diagram_to_dotstring(diagram, fi_labels=fi, ortho=ortho) f_img, f_vec = dotstring_to_image(dotstring) diff --git a/mkdocs.yml b/mkdocs.yml index 71bfae8..d6dc835 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -8,7 +8,7 @@ repo_name: 'eliavw/mercs' repo_url: 'https://github.com/eliavw/mercs' # Copyright -copyright: 'Copyright © 2015 - 2019 Elia vw' +copyright: 'Copyright © 2020 Elia vw' # Configuration theme: @@ -23,10 +23,12 @@ theme: # Customization extra: - manifest: 'manifest.webmanifest' social: - - type: 'github' - link: 'https://github.com/eliavw' + - icon: fontawesome/brands/github + link: https://github.com/eliavw + - icon: fontawesome/solid/paper-plane + link: mailto: + manifest: 'manifest.webmanifest' # Extensions markdown_extensions: diff --git a/models/.gitignore b/models/.gitignore deleted file mode 100644 index 5e7d273..0000000 --- a/models/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore diff --git a/note/catboost/191118 - catboost tryout.ipynb b/note/catboost/191118 - catboost tryout.ipynb deleted file mode 100644 index 754a153..0000000 --- a/note/catboost/191118 - catboost tryout.ipynb +++ /dev/null @@ -1,393 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# CatBoost Tryout\n", - "\n", - "Testing and integration of CatBoost in MERCS. Catboost can handle missing values and therefore is rather interesting to us." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "import catboost as cb\n", - "\n", - "from catboost.datasets import titanic\n", - "\n", - "from mercs.tests import load_iris\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "iris = load_iris()\n", - "\n", - "train = iris[0]\n", - "test = iris[1]\n", - "nominal_ids = iris[2]" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "train_df, test_df = titanic()\n", - "train_df.fillna(-999, inplace=True)\n", - "test_df.fillna(-999, inplace=True)\n", - "\n", - "X = train_df.drop('Survived', axis=1)\n", - "y = train_df.Survived\n", - "\n", - "nominal_ids = np.where(X.dtypes != np.float)[0]\n", - "\n", - "from sklearn.model_selection import train_test_split\n", - "\n", - "X_train, X_validation, y_train, y_validation = train_test_split(X, y, train_size=0.75, random_state=42)\n", - "\n", - "X_test = test_df\n", - "\n", - "train_pool = Pool(X_train, y_train, cat_features=nominal_ids)\n", - "validate_pool = Pool(X_validation, y_validation, cat_features=nominal_ids )" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[dtype('int64'),\n", - " dtype('int64'),\n", - " dtype('int64'),\n", - " dtype('O'),\n", - " dtype('O'),\n", - " dtype('float64'),\n", - " dtype('int64'),\n", - " dtype('int64'),\n", - " dtype('O'),\n", - " dtype('float64'),\n", - " dtype('O'),\n", - " dtype('O')]" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "types = list(train_df.dtypes)\n", - "types" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "PassengerId int64\n", - "Survived int64\n", - "Pclass int64\n", - "Name object\n", - "Sex object\n", - "Age float64\n", - "SibSp int64\n", - "Parch int64\n", - "Ticket object\n", - "Fare float64\n", - "Cabin object\n", - "Embarked object\n", - "dtype: object" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "train_df.dtypes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.api.types.is_object_dtype(types[4])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "from catboost import CatBoostClassifier, Pool, cv\n", - "from sklearn.metrics import accuracy_score" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "model = CatBoostClassifier(\n", - " custom_loss=[\"Accuracy\"], random_seed=42, logging_level=\"Silent\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "params = dict(\n", - " custom_loss=[\"Accuracy\"],\n", - " iterations=100,\n", - " learning_rate=0.1,\n", - " logging_level=\"Silent\",\n", - " od_type= 'Iter',\n", - " od_wait= 40\n", - ")\n", - "\n", - "mod = CatBoostClassifier(**params)" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "159 ms ± 55.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "mod.fit(X_train, y_train,\n", - " cat_features=nominal_ids,)" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "desc_ids = {1,2,3,4}\n", - "\n", - "nominal_ids = {1,4,2}" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1, 2, 3, 4])" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.array(list(desc_ids))" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0, 1, 3])" - ] - }, - "execution_count": 76, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.where(np.in1d(np.array(list(desc_ids)), np.array(list(nominal_ids))))[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "def get_cat_features(desc_ids, nominal_ids):\n", - " return np.where(np.in1d(np.array(list(desc_ids)), np.array(list(nominal_ids))))[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.9" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/catboost/python_tutorial.ipynb b/note/catboost/python_tutorial.ipynb deleted file mode 100644 index e12b3a7..0000000 --- a/note/catboost/python_tutorial.ipynb +++ /dev/null @@ -1,5778 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# $$CatBoost\\ Tutorial$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this tutorial we would explore some base cases of using catboost, such as model training, cross-validation and predicting, as well as some useful features like early stopping, snapshot support, feature importances and parameters tuning.\n", - " \n", - "You could run this tutorial in Google Colaboratory environment with free CPU or GPU. Just click on this link." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## $$Contents$$\n", - "* [1. Data Preparation](#$$1.\\-Data\\-Preparation$$)\n", - " * [1.1 Data Loading](#1.1-Data-Loading)\n", - " * [1.2 Feature Preparation](#1.2-Feature-Preparation)\n", - " * [1.3 Data Splitting](#1.3-Data-Splitting)\n", - "* [2. CatBoost Basics](#$$2.\\-CatBoost\\-Basics$$)\n", - " * [2.1 Model Training](#2.1-Model-Training)\n", - " * [2.2 Model Cross-Validation](#2.2-Model-Cross-Validation)\n", - " * [2.3 Model Applying](#2.3-Model-Applying)\n", - "* [3. CatBoost Features](#$$3.\\-CatBoost\\-Features$$)\n", - " * [3.1 Using the best model](#3.1-Using-the-best-model)\n", - " * [3.2 Early Stopping](#3.2-Early-Stopping)\n", - " * [3.3 Using Baseline](#3.3-Using-Baseline)\n", - " * [3.4 Snapshot Support](#3.4-Snapshot-Support)\n", - " * [3.5 User Defined Objective Function](#3.5-User-Defined-Objective-Function)\n", - " * [3.6 User Defined Metric Function](#3.6-User-Defined-Metric-Function)\n", - " * [3.7 Staged Predict](#3.7-Staged-Predict)\n", - " * [3.8 Feature Importances](#3.8-Feature-Importances)\n", - " * [3.9 Eval Metrics](#3.9-Eval-Metrics)\n", - " * [3.10 Learning Processes Comparison](#3.10-Learning-Processes-Comparison)\n", - " * [3.11 Model Saving](#3.11-Model-Saving)\n", - "* [4. Parameters Tuning](#$$4.\\-Parameters\\-Tuning$$)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## $$1.\\ Data\\ Preparation$$\n", - "### 1.1 CatBoost installation\n", - "If you have not already installed CatBoost, you can do so by running '!pip install catboost' command. \n", - " \n", - "Also you should install ipywidgets package and run special command before launching jupyter notebook to draw plots." - ] - }, - { - "cell_type": "raw", - "metadata": { - "jupyter": { - "outputs_hidden": true - } - }, - "source": [ - "!pip install ipywidgets\n", - "!jupyter nbextension enable --py widgetsnbextension" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.2 Data Loading\n", - "The data for this tutorial can be obtained from [this page](https://www.kaggle.com/c/titanic/data) (you would have to register a kaggle account or just login with facebook or google+) or you could use catboost.datasets as in code below." - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", - "
" - ], - "text/plain": [ - " PassengerId Survived Pclass \\\n", - "0 1 0 3 \n", - "1 2 1 1 \n", - "2 3 1 3 \n", - "3 4 1 1 \n", - "4 5 0 3 \n", - "\n", - " Name Sex Age SibSp \\\n", - "0 Braund, Mr. Owen Harris male 22.0 1 \n", - "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", - "2 Heikkinen, Miss. Laina female 26.0 0 \n", - "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", - "4 Allen, Mr. William Henry male 35.0 0 \n", - "\n", - " Parch Ticket Fare Cabin Embarked \n", - "0 0 A/5 21171 7.2500 NaN S \n", - "1 0 PC 17599 71.2833 C85 C \n", - "2 0 STON/O2. 3101282 7.9250 NaN S \n", - "3 0 113803 53.1000 C123 S \n", - "4 0 373450 8.0500 NaN S " - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from catboost.datasets import titanic\n", - "import numpy as np\n", - "\n", - "train_df, test_df = titanic()\n", - "\n", - "train_df.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.3 Feature Preparation\n", - "First of all let's check how many absent values do we have:" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Age 177\n", - "Cabin 687\n", - "Embarked 2\n", - "dtype: int64" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "null_value_stats = train_df.isnull().sum(axis=0)\n", - "null_value_stats[null_value_stats != 0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As we cat see, **`Age`**, **`Cabin`** and **`Embarked`** indeed have some missing values, so let's fill them with some number way out of their distributions - so the model would be able to easily distinguish between them and take it into account:" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [], - "source": [ - "train_df.fillna(-999, inplace=True)\n", - "test_df.fillna(-999, inplace=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's separate features and label variable:" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [], - "source": [ - "X = train_df.drop('Survived', axis=1)\n", - "y = train_df.Survived" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Pay attention that our features are of differnt types - some of them are numeric, some are categorical, and some are even just strings, which normally should be handled in some specific way (for example encoded with bag-of-words representation). But in our case we could treat these string features just as categorical one - all the heavy lifting is done inside CatBoost. How cool is that? :)" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PassengerId int64\n", - "Pclass int64\n", - "Name object\n", - "Sex object\n", - "Age float64\n", - "SibSp int64\n", - "Parch int64\n", - "Ticket object\n", - "Fare float64\n", - "Cabin object\n", - "Embarked object\n", - "dtype: object\n", - "[ 0 1 2 3 5 6 7 9 10]\n" - ] - } - ], - "source": [ - "print(X.dtypes)\n", - "categorical_features_indices = np.where(X.dtypes != np.float)[0]\n", - "\n", - "print(categorical_features_indices )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.4 Data Splitting\n", - "Let's split the train data into training and validation sets." - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.model_selection import train_test_split\n", - "\n", - "X_train, X_validation, y_train, y_validation = train_test_split(X, y, train_size=0.75, random_state=42)\n", - "\n", - "X_test = test_df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## $$2.\\ CatBoost\\ Basics$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's make necessary imports." - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [], - "source": [ - "from catboost import CatBoostClassifier, Pool, cv\n", - "from sklearn.metrics import accuracy_score" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2.1 Model Training\n", - "Now let's create the model itself: We would go here with default parameters (as they provide a _really_ good baseline almost all the time), the only thing We would like to specify here is `custom_loss` parameter, as this would give us an ability to see what's going on in terms of this competition metric - accuracy, as well as to be able to watch for logloss, as it would be more smooth on dataset of such size." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "model = CatBoostClassifier(\n", - " custom_loss=['Accuracy'],\n", - " random_seed=42,\n", - " logging_level='Silent'\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "020f822c6b1a4b3b9f4f2bd2dd643b16", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.fit(\n", - " X_train, y_train,\n", - " cat_features=categorical_features_indices,\n", - " eval_set=(X_validation, y_validation),\n", - " # logging_level='Verbose', # you can uncomment this for text output\n", - " plot=True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As you can see, it is possible to watch our model learn through verbose output or with nice plots (personally I would definately go with the second option - just check out those plots: you can, for example, zoom in areas of interest!)\n", - "\n", - "With this we can see that the best accuracy value of **0.8340** (on validation set) was acheived on **157** boosting step." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2.2 Model Cross-Validation\n", - "\n", - "It is good to validate your model, but to cross-validate it - even better. And also with plots! So with no more words:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "86f08d5ec012434eb8f6f73c2965aaa5", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mPool\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcat_features\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcategorical_features_indices\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mcv_params\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mplot\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m )\n", - "\u001b[0;32m~/miniconda3/envs/mercs/lib/python3.7/site-packages/catboost/core.py\u001b[0m in \u001b[0;36mcv\u001b[0;34m(pool, params, dtrain, iterations, num_boost_round, fold_count, nfold, inverted, partition_random_seed, seed, shuffle, logging_level, stratified, as_pandas, metric_period, verbose, verbose_eval, plot, early_stopping_rounds, save_snapshot, snapshot_file, snapshot_interval, folds, type)\u001b[0m\n\u001b[1;32m 4679\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mlog_fixup\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplot_wrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0m_get_train_dir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4680\u001b[0m return _cv(params, pool, fold_count, inverted, partition_random_seed, shuffle, stratified,\n\u001b[0;32m-> 4681\u001b[0;31m as_pandas, folds, type)\n\u001b[0m\u001b[1;32m 4682\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4683\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost._cv\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost._cv\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "cv_params = model.get_params()\n", - "cv_params.update({\n", - " 'loss_function': 'Logloss'\n", - "})\n", - "cv_data = cv(\n", - " Pool(X, y, cat_features=categorical_features_indices),\n", - " cv_params,\n", - " plot=True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we have values of our loss functions at each boosting step averaged by 3 folds, which should provide us with a more accurate estimation of our model performance:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Best validation accuracy score: {:.2f}±{:.2f} on step {}'.format(\n", - " np.max(cv_data['test-Accuracy-mean']),\n", - " cv_data['test-Accuracy-std'][np.argmax(cv_data['test-Accuracy-mean'])],\n", - " np.argmax(cv_data['test-Accuracy-mean'])\n", - "))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Precise validation accuracy score: {}'.format(np.max(cv_data['test-Accuracy-mean'])))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As we can see, our initial estimation of performance on single validation fold was too optimistic - that is why cross-validation is so important!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2.3 Model Applying\n", - "All you have to do to get predictions is" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0. 0. 0. 0. 1. 0. 1. 0. 1. 0.]\n", - "[[0.84987725 0.15012275]\n", - " [0.63046191 0.36953809]\n", - " [0.90554753 0.09445247]\n", - " [0.89012541 0.10987459]\n", - " [0.27457868 0.72542132]\n", - " [0.89390021 0.10609979]\n", - " [0.40826533 0.59173467]\n", - " [0.73892855 0.26107145]\n", - " [0.39703925 0.60296075]\n", - " [0.94389082 0.05610918]]\n" - ] - } - ], - "source": [ - "predictions = model.predict(X_test)\n", - "predictions_probs = model.predict_proba(X_test)\n", - "print(predictions[:10])\n", - "print(predictions_probs[:10])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But let's try to get a better predictions and Catboost features help us in it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## $$3.\\ CatBoost\\ Features$$\n", - "You may have noticed that on model creation step I've specified not only `custom_loss` but also `random_seed` parameter. That was done in order to make this notebook reproducible - by default catboost chooses some random value for seed:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Random seed assigned for this model: 0\n" - ] - } - ], - "source": [ - "model_without_seed = CatBoostClassifier(iterations=10, logging_level='Silent')\n", - "model_without_seed.fit(X, y, cat_features=categorical_features_indices)\n", - "\n", - "print('Random seed assigned for this model: {}'.format(model_without_seed.random_seed_))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's define some params and create `Pool` for more convenience. It stores all information about dataset (features, labeles, categorical features indices, weights and and much more)." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "params = {\n", - " 'iterations': 500,\n", - " 'learning_rate': 0.1,\n", - " 'eval_metric': 'Accuracy',\n", - " 'random_seed': 42,\n", - " 'logging_level': 'Silent',\n", - " 'use_best_model': False\n", - "}\n", - "train_pool = Pool(X_train, y_train, cat_features=categorical_features_indices)\n", - "validate_pool = Pool(X_validation, y_validation, cat_features=categorical_features_indices)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.1 Using the best model\n", - "If you essentially have a validation set, it's always better to use the `use_best_model` parameter during training. By default, this parameter is enabled. If it is enabled, the resulting trees ensemble is shrinking to the best iteration." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Simple model validation accuracy: 0.8072\n", - "\n", - "Best model validation accuracy: 0.8296\n" - ] - } - ], - "source": [ - "model = CatBoostClassifier(**params)\n", - "model.fit(train_pool, eval_set=validate_pool)\n", - "\n", - "best_model_params = params.copy()\n", - "best_model_params.update({\n", - " 'use_best_model': True\n", - "})\n", - "best_model = CatBoostClassifier(**best_model_params)\n", - "best_model.fit(train_pool, eval_set=validate_pool);\n", - "\n", - "print('Simple model validation accuracy: {:.4}'.format(\n", - " accuracy_score(y_validation, model.predict(X_validation))\n", - "))\n", - "print('')\n", - "\n", - "print('Best model validation accuracy: {:.4}'.format(\n", - " accuracy_score(y_validation, best_model.predict(X_validation))\n", - "))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.2 Early Stopping\n", - "If you essentially have a validation set, it's always easier and better to use early stopping. This feature is similar to the previous one, but only in addition to improving the quality it still saves time." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 15.6 s, sys: 2.03 s, total: 17.6 s\n", - "Wall time: 3.22 s\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "model = CatBoostClassifier(**params)\n", - "model.fit(train_pool, eval_set=validate_pool)" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1.71 s, sys: 172 ms, total: 1.88 s\n", - "Wall time: 402 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "earlystop_params = params.copy()\n", - "earlystop_params.update({\n", - " 'od_type': 'Iter',\n", - " 'od_wait': 40\n", - "})\n", - "earlystop_model = CatBoostClassifier(**earlystop_params)\n", - "earlystop_model.fit(train_pool, eval_set=validate_pool);" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "train_pool" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'iterations': 500,\n", - " 'learning_rate': 0.1,\n", - " 'eval_metric': 'Accuracy',\n", - " 'random_seed': 42,\n", - " 'logging_level': 'Silent',\n", - " 'use_best_model': False,\n", - " 'od_type': 'Iter',\n", - " 'od_wait': 40}" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "earlystop_params" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Simple model tree count: 50\n" - ] - }, - { - "ename": "CatBoostError", - "evalue": "Invalid type for cat_feature[non-default value idx=1,feature_idx=5]=0.0 : cat_features must be integer or string, real number values and NaN values should be converted to string.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mCatBoostError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost.get_cat_factor_bytes_representation\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost.get_id_object_bytes_string_representation\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mCatBoostError\u001b[0m: bad object for id: 0.0", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[0;31mCatBoostError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Simple model tree count: {}'\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtree_count_\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m print('Simple model validation accuracy: {:.4}'.format(\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0maccuracy_score\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_validation\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_validation\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m ))\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/mercs/lib/python3.7/site-packages/catboost/core.py\u001b[0m in \u001b[0;36mpredict\u001b[0;34m(self, data, prediction_type, ntree_start, ntree_end, thread_count, verbose)\u001b[0m\n\u001b[1;32m 3835\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mprobability\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mevery\u001b[0m \u001b[0;32mclass\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0meach\u001b[0m \u001b[0mobject\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3836\u001b[0m \"\"\"\n\u001b[0;32m-> 3837\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_predict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprediction_type\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mntree_start\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mntree_end\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthread_count\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'predict'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3838\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3839\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mpredict_proba\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mntree_start\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mntree_end\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthread_count\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/mercs/lib/python3.7/site-packages/catboost/core.py\u001b[0m in \u001b[0;36m_predict\u001b[0;34m(self, data, prediction_type, ntree_start, ntree_end, thread_count, verbose, parent_method_name)\u001b[0m\n\u001b[1;32m 1844\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mverbose\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1845\u001b[0m \u001b[0mverbose\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1846\u001b[0;31m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata_is_single_object\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_process_predict_input_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparent_method_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1847\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_validate_prediction_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprediction_type\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1848\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/mercs/lib/python3.7/site-packages/catboost/core.py\u001b[0m in \u001b[0;36m_process_predict_input_data\u001b[0;34m(self, data, parent_method_name, label)\u001b[0m\n\u001b[1;32m 1830\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlabel\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1831\u001b[0m \u001b[0mcat_features\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_cat_feature_indices\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mFeaturesData\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1832\u001b[0;31m \u001b[0mtext_features\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_text_feature_indices\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mFeaturesData\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1833\u001b[0m )\n\u001b[1;32m 1834\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_single_object\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/mercs/lib/python3.7/site-packages/catboost/core.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data, label, cat_features, text_features, column_description, pairs, delimiter, has_header, weight, group_id, group_weight, subgroup_id, pairs_weight, baseline, feature_names, thread_count)\u001b[0m\n\u001b[1;32m 369\u001b[0m )\n\u001b[1;32m 370\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 371\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_init\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcat_features\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtext_features\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpairs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgroup_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgroup_weight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubgroup_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpairs_weight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbaseline\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeature_names\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 372\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mPool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 373\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/mercs/lib/python3.7/site-packages/catboost/core.py\u001b[0m in \u001b[0;36m_init\u001b[0;34m(self, data, label, cat_features, text_features, pairs, weight, group_id, group_weight, subgroup_id, pairs_weight, baseline, feature_names)\u001b[0m\n\u001b[1;32m 949\u001b[0m \u001b[0mbaseline\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbaseline\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0msamples_count\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 950\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_baseline_shape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbaseline\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msamples_count\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 951\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_init_pool\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcat_features\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtext_features\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpairs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgroup_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgroup_weight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubgroup_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpairs_weight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbaseline\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeature_names\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 952\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 953\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost._PoolBase._init_pool\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost._PoolBase._init_pool\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost._PoolBase._init_features_order_layout_pool\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost._set_features_order_data_pd_data_frame\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost.get_cat_factor_bytes_representation\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mCatBoostError\u001b[0m: Invalid type for cat_feature[non-default value idx=1,feature_idx=5]=0.0 : cat_features must be integer or string, real number values and NaN values should be converted to string." - ] - } - ], - "source": [ - "print('Simple model tree count: {}'.format(model.tree_count_))\n", - "print('Simple model validation accuracy: {:.4}'.format(\n", - " accuracy_score(y_validation, model.predict(X_validation))\n", - "))\n", - "print('')\n", - "\n", - "print('Early-stopped model tree count: {}'.format(earlystop_model.tree_count_))\n", - "print('Early-stopped model validation accuracy: {:.4}'.format(\n", - " accuracy_score(y_validation, earlystop_model.predict(X_validation))\n", - "))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
7097103Moubarek, Master. Halim Gonios (\"William George\")NanNaNNan1266115.2458-999C
4394402Kvillner, Mr. Johan Henrik Johannessonmale31.000C.A. 1872310.5000-999S
8408413Alhomaki, Mr. Ilmari Rudolfmale20.000SOTON/O2 31012877.9250-999S
7207212Harper, Miss. Annie Jessie \"Nina\"female6.00124872733.0000-999S
39403Nicola-Yarred, Miss. Jamilafemale14.010265111.2417-999C
....................................
8808812Shelley, Mrs. William (Imanita Parrish Hall)female25.00123043326.0000-999S
4254263Wiseman, Mr. Phillippemale-999.000A/4. 342447.2500-999S
1011023Petroff, Mr. Pastcho (\"Pentcho\")male-999.0003492157.8958-999S
1992002Yrois, Miss. Henriette (\"Mrs Harbeck\")female24.00024874713.0000-999S
4244253Rosblom, Mr. Viktor Richardmale18.01137012920.2125-999S
\n", - "

223 rows × 11 columns

\n", - "
" - ], - "text/plain": [ - " PassengerId Pclass Name \\\n", - "709 710 3 Moubarek, Master. Halim Gonios (\"William George\") \n", - "439 440 2 Kvillner, Mr. Johan Henrik Johannesson \n", - "840 841 3 Alhomaki, Mr. Ilmari Rudolf \n", - "720 721 2 Harper, Miss. Annie Jessie \"Nina\" \n", - "39 40 3 Nicola-Yarred, Miss. Jamila \n", - ".. ... ... ... \n", - "880 881 2 Shelley, Mrs. William (Imanita Parrish Hall) \n", - "425 426 3 Wiseman, Mr. Phillippe \n", - "101 102 3 Petroff, Mr. Pastcho (\"Pentcho\") \n", - "199 200 2 Yrois, Miss. Henriette (\"Mrs Harbeck\") \n", - "424 425 3 Rosblom, Mr. Viktor Richard \n", - "\n", - " Sex Age SibSp Parch Ticket Fare Cabin Embarked \n", - "709 Nan NaN Nan 1 2661 15.2458 -999 C \n", - "439 male 31.0 0 0 C.A. 18723 10.5000 -999 S \n", - "840 male 20.0 0 0 SOTON/O2 3101287 7.9250 -999 S \n", - "720 female 6.0 0 1 248727 33.0000 -999 S \n", - "39 female 14.0 1 0 2651 11.2417 -999 C \n", - ".. ... ... ... ... ... ... ... ... \n", - "880 female 25.0 0 1 230433 26.0000 -999 S \n", - "425 male -999.0 0 0 A/4. 34244 7.2500 -999 S \n", - "101 male -999.0 0 0 349215 7.8958 -999 S \n", - "199 female 24.0 0 0 248747 13.0000 -999 S \n", - "424 male 18.0 1 1 370129 20.2125 -999 S \n", - "\n", - "[223 rows x 11 columns]" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "X_validation.iloc[0, 3] = 'Nan'\n", - "X_validation.iloc[0, 4] = np.nan\n", - "X_validation.iloc[0, 5] = 'Nan'\n", - "X_validation" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "ename": "CatBoostError", - "evalue": "Invalid type for cat_feature[non-default value idx=1,feature_idx=5]=0.0 : cat_features must be integer or string, real number values and NaN values should be converted to string.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mCatBoostError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost.get_cat_factor_bytes_representation\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost.get_id_object_bytes_string_representation\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mCatBoostError\u001b[0m: bad object for id: 0.0", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[0;31mCatBoostError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_validation\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/miniconda3/envs/mercs/lib/python3.7/site-packages/catboost/core.py\u001b[0m in \u001b[0;36mpredict\u001b[0;34m(self, data, prediction_type, ntree_start, ntree_end, thread_count, verbose)\u001b[0m\n\u001b[1;32m 3835\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mprobability\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mevery\u001b[0m \u001b[0;32mclass\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0meach\u001b[0m \u001b[0mobject\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3836\u001b[0m \"\"\"\n\u001b[0;32m-> 3837\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_predict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprediction_type\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mntree_start\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mntree_end\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthread_count\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'predict'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3838\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3839\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mpredict_proba\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mntree_start\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mntree_end\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthread_count\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/mercs/lib/python3.7/site-packages/catboost/core.py\u001b[0m in \u001b[0;36m_predict\u001b[0;34m(self, data, prediction_type, ntree_start, ntree_end, thread_count, verbose, parent_method_name)\u001b[0m\n\u001b[1;32m 1844\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mverbose\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1845\u001b[0m \u001b[0mverbose\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1846\u001b[0;31m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata_is_single_object\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_process_predict_input_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparent_method_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1847\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_validate_prediction_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprediction_type\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1848\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/mercs/lib/python3.7/site-packages/catboost/core.py\u001b[0m in \u001b[0;36m_process_predict_input_data\u001b[0;34m(self, data, parent_method_name, label)\u001b[0m\n\u001b[1;32m 1830\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlabel\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1831\u001b[0m \u001b[0mcat_features\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_cat_feature_indices\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mFeaturesData\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1832\u001b[0;31m \u001b[0mtext_features\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_text_feature_indices\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mFeaturesData\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1833\u001b[0m )\n\u001b[1;32m 1834\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_single_object\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/mercs/lib/python3.7/site-packages/catboost/core.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data, label, cat_features, text_features, column_description, pairs, delimiter, has_header, weight, group_id, group_weight, subgroup_id, pairs_weight, baseline, feature_names, thread_count)\u001b[0m\n\u001b[1;32m 369\u001b[0m )\n\u001b[1;32m 370\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 371\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_init\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcat_features\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtext_features\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpairs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgroup_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgroup_weight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubgroup_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpairs_weight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbaseline\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeature_names\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 372\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mPool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 373\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/mercs/lib/python3.7/site-packages/catboost/core.py\u001b[0m in \u001b[0;36m_init\u001b[0;34m(self, data, label, cat_features, text_features, pairs, weight, group_id, group_weight, subgroup_id, pairs_weight, baseline, feature_names)\u001b[0m\n\u001b[1;32m 949\u001b[0m \u001b[0mbaseline\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbaseline\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0msamples_count\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 950\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_baseline_shape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbaseline\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msamples_count\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 951\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_init_pool\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcat_features\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtext_features\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpairs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgroup_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgroup_weight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubgroup_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpairs_weight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbaseline\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeature_names\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 952\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 953\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost._PoolBase._init_pool\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost._PoolBase._init_pool\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost._PoolBase._init_features_order_layout_pool\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost._set_features_order_data_pd_data_frame\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m_catboost.pyx\u001b[0m in \u001b[0;36m_catboost.get_cat_factor_bytes_representation\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mCatBoostError\u001b[0m: Invalid type for cat_feature[non-default value idx=1,feature_idx=5]=0.0 : cat_features must be integer or string, real number values and NaN values should be converted to string." - ] - } - ], - "source": [ - "model.predict(X_validation)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So we get better quality in a shorter time.\n", - "\n", - "Though as was shown earlier simple validation scheme does not precisely describes model out-of-train score (may be biased because of dataset split) it is still nice to track model improvement dynamics - and thereby as we can see from this example it is really good to stop boosting process earlier (before the overfitting kicks in)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.3 Using Baseline\n", - "It is posible to use pre-training results (baseline) for training." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "current_params = params.copy()\n", - "current_params.update({\n", - " 'iterations': 10\n", - "})\n", - "model = CatBoostClassifier(**current_params).fit(X_train, y_train, categorical_features_indices)\n", - "# Get baseline (only with prediction_type='RawFormulaVal')\n", - "baseline = model.predict(X_train, prediction_type='RawFormulaVal')\n", - "# Fit new model\n", - "model.fit(X_train, y_train, categorical_features_indices, baseline=baseline);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.4 Snapshot Support\n", - "Catboost supports snapshots. You can use it for recovering training after an interruption or for starting training with previous results. " - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0:\tlearn: 0.8053892\ttest: 0.7937220\tbest: 0.7937220 (0)\ttotal: 3.1ms\tremaining: 12.4ms\n", - "1:\tlearn: 0.8008982\ttest: 0.7982063\tbest: 0.7982063 (1)\ttotal: 4.98ms\tremaining: 7.47ms\n", - "2:\tlearn: 0.8068862\ttest: 0.8026906\tbest: 0.8026906 (2)\ttotal: 6.57ms\tremaining: 4.38ms\n", - "3:\tlearn: 0.8113772\ttest: 0.8116592\tbest: 0.8116592 (3)\ttotal: 8.34ms\tremaining: 2.08ms\n", - "4:\tlearn: 0.8143713\ttest: 0.7937220\tbest: 0.8116592 (3)\ttotal: 9.64ms\tremaining: 0us\n", - "\n", - "bestTest = 0.8116591928\n", - "bestIteration = 3\n", - "\n", - "5:\tlearn: 0.8188623\ttest: 0.7982063\tbest: 0.8116592 (3)\ttotal: 14.1ms\tremaining: 17.8ms\n", - "6:\tlearn: 0.8188623\ttest: 0.7982063\tbest: 0.8116592 (3)\ttotal: 18.9ms\tremaining: 13.9ms\n", - "7:\tlearn: 0.8218563\ttest: 0.7982063\tbest: 0.8116592 (3)\ttotal: 23.5ms\tremaining: 9.24ms\n", - "8:\tlearn: 0.8203593\ttest: 0.7982063\tbest: 0.8116592 (3)\ttotal: 27.8ms\tremaining: 4.54ms\n", - "9:\tlearn: 0.8188623\ttest: 0.8026906\tbest: 0.8116592 (3)\ttotal: 33.4ms\tremaining: 0us\n", - "\n", - "bestTest = 0.8116591928\n", - "bestIteration = 3\n", - "\n" - ] - } - ], - "source": [ - "params_with_snapshot = params.copy()\n", - "params_with_snapshot.update({\n", - " 'iterations': 5,\n", - " 'learning_rate': 0.5,\n", - " 'logging_level': 'Verbose'\n", - "})\n", - "model = CatBoostClassifier(**params_with_snapshot).fit(train_pool, eval_set=validate_pool, save_snapshot=True)\n", - "params_with_snapshot.update({\n", - " 'iterations': 10,\n", - " 'learning_rate': 0.1,\n", - "})\n", - "model = CatBoostClassifier(**params_with_snapshot).fit(train_pool, eval_set=validate_pool, save_snapshot=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.5 User Defined Objective Function\n", - "It is possible to create your own objective function. Let's create logloss objective function." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "class LoglossObjective(object):\n", - " def calc_ders_range(self, approxes, targets, weights):\n", - " # approxes, targets, weights are indexed containers of floats\n", - " # (containers which have only __len__ and __getitem__ defined).\n", - " # weights parameter can be None.\n", - " #\n", - " # To understand what these parameters mean, assume that there is\n", - " # a subset of your dataset that is currently being processed.\n", - " # approxes contains current predictions for this subset,\n", - " # targets contains target values you provided with the dataset.\n", - " #\n", - " # This function should return a list of pairs (der1, der2), where\n", - " # der1 is the first derivative of the loss function with respect\n", - " # to the predicted value, and der2 is the second derivative.\n", - " #\n", - " # In our case, logloss is defined by the following formula:\n", - " # target * log(sigmoid(approx)) + (1 - target) * (1 - sigmoid(approx))\n", - " # where sigmoid(x) = 1 / (1 + e^(-x)).\n", - " \n", - " assert len(approxes) == len(targets)\n", - " if weights is not None:\n", - " assert len(weights) == len(approxes)\n", - " \n", - " result = []\n", - " for index in range(len(targets)):\n", - " e = np.exp(approxes[index])\n", - " p = e / (1 + e)\n", - " der1 = (1 - p) if targets[index] > 0.0 else -p\n", - " der2 = -p * (1 - p)\n", - "\n", - " if weights is not None:\n", - " der1 *= weights[index]\n", - " der2 *= weights[index]\n", - "\n", - " result.append((der1, der2))\n", - " return result" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0:\tlearn: 0.6827074\ttotal: 22.6ms\tremaining: 203ms\n", - "1:\tlearn: 0.6722947\ttotal: 33.4ms\tremaining: 134ms\n", - "2:\tlearn: 0.6624914\ttotal: 43.1ms\tremaining: 101ms\n", - "3:\tlearn: 0.6528402\ttotal: 53.6ms\tremaining: 80.4ms\n", - "4:\tlearn: 0.6436863\ttotal: 63ms\tremaining: 63ms\n", - "5:\tlearn: 0.6346627\ttotal: 72.2ms\tremaining: 48.2ms\n", - "6:\tlearn: 0.6279562\ttotal: 82.5ms\tremaining: 35.4ms\n", - "7:\tlearn: 0.6201005\ttotal: 92.6ms\tremaining: 23.1ms\n", - "8:\tlearn: 0.6127656\ttotal: 102ms\tremaining: 11.3ms\n", - "9:\tlearn: 0.6053589\ttotal: 111ms\tremaining: 0us\n" - ] - } - ], - "source": [ - "model = CatBoostClassifier(\n", - " iterations=10,\n", - " random_seed=42, \n", - " loss_function=LoglossObjective(), \n", - " eval_metric=\"Logloss\"\n", - ")\n", - "# Fit model\n", - "model.fit(train_pool)\n", - "# Only prediction_type='RawFormulaVal' is allowed with custom `loss_function`\n", - "preds_raw = model.predict(X_test, prediction_type='RawFormulaVal')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.6 User Defined Metric Function\n", - "Also it is possible to create your own metric function. Let's create logloss metric function." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "class LoglossMetric(object):\n", - " def get_final_error(self, error, weight):\n", - " return error / (weight + 1e-38)\n", - "\n", - " def is_max_optimal(self):\n", - " return False\n", - "\n", - " def evaluate(self, approxes, target, weight):\n", - " # approxes is a list of indexed containers\n", - " # (containers with only __len__ and __getitem__ defined),\n", - " # one container per approx dimension.\n", - " # Each container contains floats.\n", - " # weight is a one dimensional indexed container.\n", - " # target is float.\n", - " \n", - " # weight parameter can be None.\n", - " # Returns pair (error, weights sum)\n", - " \n", - " assert len(approxes) == 1\n", - " assert len(target) == len(approxes[0])\n", - "\n", - " approx = approxes[0]\n", - "\n", - " error_sum = 0.0\n", - " weight_sum = 0.0\n", - "\n", - " for i in range(len(approx)):\n", - " w = 1.0 if weight is None else weight[i]\n", - " weight_sum += w\n", - " error_sum += -w * (target[i] * approx[i] - np.log(1 + np.exp(approx[i])))\n", - "\n", - " return error_sum, weight_sum" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Learning rate set to 0.5\n", - "0:\tlearn: 0.5521578\ttotal: 19.8ms\tremaining: 178ms\n", - "1:\tlearn: 0.4885686\ttotal: 38.6ms\tremaining: 154ms\n", - "2:\tlearn: 0.4646498\ttotal: 43.9ms\tremaining: 102ms\n", - "3:\tlearn: 0.4433198\ttotal: 50ms\tremaining: 75.1ms\n", - "4:\tlearn: 0.4348036\ttotal: 56ms\tremaining: 56ms\n", - "5:\tlearn: 0.4304872\ttotal: 59.3ms\tremaining: 39.5ms\n", - "6:\tlearn: 0.4169664\ttotal: 62.6ms\tremaining: 26.8ms\n", - "7:\tlearn: 0.4067507\ttotal: 66.6ms\tremaining: 16.7ms\n", - "8:\tlearn: 0.4019576\ttotal: 69.7ms\tremaining: 7.74ms\n", - "9:\tlearn: 0.3970545\ttotal: 72.9ms\tremaining: 0us\n" - ] - } - ], - "source": [ - "model = CatBoostClassifier(\n", - " iterations=10,\n", - " random_seed=42, \n", - " loss_function=\"Logloss\",\n", - " eval_metric=LoglossMetric()\n", - ")\n", - "# Fit model\n", - "model.fit(train_pool)\n", - "# Only prediction_type='RawFormulaVal' is allowed with custom `loss_function`\n", - "preds_raw = model.predict(X_test, prediction_type='RawFormulaVal')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.7 Staged Predict\n", - "CatBoost model has `staged_predict` method. It allows you to iteratively get predictions for a given range of trees." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "First class probabilities using the first 3 trees: [0.42990422 0.42665956 0.4192657 0.56176543 0.4763258 ]\n", - "First class probabilities using the first 5 trees: [0.40394604 0.35310234 0.38666939 0.57518619 0.49553116]\n", - "First class probabilities using the first 7 trees: [0.39987636 0.34035878 0.3468137 0.53325091 0.54678221]\n" - ] - } - ], - "source": [ - "model = CatBoostClassifier(iterations=10, random_seed=42, logging_level='Silent').fit(train_pool)\n", - "ntree_start, ntree_end, eval_period = 3, 9, 2\n", - "predictions_iterator = model.staged_predict(validate_pool, 'Probability', ntree_start, ntree_end, eval_period)\n", - "for preds, tree_count in zip(predictions_iterator, range(ntree_start, ntree_end, eval_period)):\n", - " print('First class probabilities using the first {} trees: {}'.format(tree_count, preds[:5, 1]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.8 Feature Importances\n", - "Sometimes it is very important to understand which feature made the greatest contribution to the final result. To do this, the CatBoost model has a `get_feature_importance` method." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sex: 51.41658987510373\n", - "Pclass: 16.32065704682949\n", - "Age: 6.764251091077789\n", - "Ticket: 5.872907452392819\n", - "Parch: 5.55470806077143\n", - "Fare: 4.033431135370703\n", - "Cabin: 4.024420047437621\n", - "Embarked: 3.125540769301777\n", - "SibSp: 2.887494521714639\n", - "PassengerId: 0.0\n", - "Name: 0.0\n" - ] - } - ], - "source": [ - "model = CatBoostClassifier(iterations=50, random_seed=42, logging_level='Silent').fit(train_pool)\n", - "feature_importances = model.get_feature_importance(train_pool)\n", - "feature_names = X_train.columns\n", - "for score, name in sorted(zip(feature_importances, feature_names), reverse=True):\n", - " print('{}: {}'.format(name, score))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This shows that features **`Sex`** and **`Pclass`** had the biggest influence on the result." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.9 Eval Metrics\n", - "The CatBoost has a `eval_metrics` method that allows to calculate a given metrics on a given dataset. And to draw them of course:)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model = CatBoostClassifier(iterations=50, random_seed=42, logging_level='Silent').fit(train_pool)\n", - "eval_metrics = model.eval_metrics(validate_pool, ['AUC'], plot=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(eval_metrics['AUC'][:6])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.10 Learning Processes Comparison\n", - "You can also compare different models learning process on a single plot." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model1 = CatBoostClassifier(iterations=10, depth=1, train_dir='model_depth_1/', logging_level='Silent')\n", - "model1.fit(train_pool, eval_set=validate_pool)\n", - "model2 = CatBoostClassifier(iterations=10, depth=5, train_dir='model_depth_5/', logging_level='Silent')\n", - "model2.fit(train_pool, eval_set=validate_pool);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from catboost import MetricVisualizer\n", - "widget = MetricVisualizer(['model_depth_1', 'model_depth_5'])\n", - "widget.start()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.11 Model Saving\n", - "It is always really handy to be able to dump your model to disk (especially if training took some time)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model = CatBoostClassifier(iterations=10, random_seed=42, logging_level='Silent').fit(train_pool)\n", - "model.save_model('catboost_model.dump')\n", - "model = CatBoostClassifier()\n", - "model.load_model('catboost_model.dump');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# $$4.\\ Parameters\\ Tuning$$\n", - "While you could always select optimal number of iterations (boosting steps) by cross-validation and learning curve plots, it is also important to play with some of model parameters, and we would like to pay some special attention to `l2_leaf_reg` and `learning_rate`.\n", - "\n", - "In this section, we'll select these parameters using the **`hyperopt`** package." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install hyperopt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import hyperopt\n", - "\n", - "def hyperopt_objective(params):\n", - " model = CatBoostClassifier(\n", - " l2_leaf_reg=int(params['l2_leaf_reg']),\n", - " learning_rate=params['learning_rate'],\n", - " iterations=500,\n", - " eval_metric='Accuracy',\n", - " random_seed=42,\n", - " verbose=False,\n", - " loss_function='Logloss',\n", - " )\n", - " \n", - " cv_data = cv(\n", - " Pool(X, y, cat_features=categorical_features_indices),\n", - " model.get_params()\n", - " )\n", - " best_accuracy = np.max(cv_data['test-Accuracy-mean'])\n", - " \n", - " return 1 - best_accuracy # as hyperopt minimises" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from numpy.random import RandomState\n", - "\n", - "params_space = {\n", - " 'l2_leaf_reg': hyperopt.hp.qloguniform('l2_leaf_reg', 0, 2, 1),\n", - " 'learning_rate': hyperopt.hp.uniform('learning_rate', 1e-3, 5e-1),\n", - "}\n", - "\n", - "trials = hyperopt.Trials()\n", - "\n", - "best = hyperopt.fmin(\n", - " hyperopt_objective,\n", - " space=params_space,\n", - " algo=hyperopt.tpe.suggest,\n", - " max_evals=50,\n", - " trials=trials,\n", - " rstate=RandomState(123)\n", - ")\n", - "\n", - "print(best)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's get all cv data with best parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model = CatBoostClassifier(\n", - " l2_leaf_reg=int(best['l2_leaf_reg']),\n", - " learning_rate=best['learning_rate'],\n", - " iterations=500,\n", - " eval_metric='Accuracy',\n", - " random_seed=42,\n", - " verbose=False,\n", - " loss_function='Logloss',\n", - ")\n", - "cv_data = cv(Pool(X, y, cat_features=categorical_features_indices), model.get_params())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Precise validation accuracy score: {}'.format(np.max(cv_data['test-Accuracy-mean'])))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Recall that with default parameters out cv score was 0.8283, and thereby we have (probably not statistically significant) some improvement." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Make submission\n", - "Now we would re-train our tuned model on all train data that we have" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model.fit(X, y, cat_features=categorical_features_indices)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And finally let's prepare the submission file:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "submisstion = pd.DataFrame()\n", - "submisstion['PassengerId'] = X_test['PassengerId']\n", - "submisstion['Survived'] = model.predict(X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "submisstion.to_csv('submission.csv', index=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally you can make submission at [Titanic Kaggle competition](https://www.kaggle.com/c/titanic).\n", - "\n", - "That's it! Now you can play around with CatBoost and win some competitions! :)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.4" - }, - "widgets": { - "state": { - "c26d03b66add4e078d26695cab837033": { - "views": [ - { - "cell_index": 21 - } - ] - } - }, - "version": "1.2.0" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/deploy/conda.ipynb b/note/deploy/conda.ipynb deleted file mode 100644 index 9216f43..0000000 --- a/note/deploy/conda.ipynb +++ /dev/null @@ -1,397 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Conda Environments" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Imports" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "import os\n", - "from os.path import dirname\n", - "\n", - "import getpass\n", - "import configparser\n", - "import semantic_version" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Initialization\n", - "\n", - "Some important variables to be used afterwards." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "name = \"mercs\"\n", - "\n", - "root_dir = dirname(dirname(os.getcwd()))\n", - "\n", - "fn_conda_dep = 'dependencies-deploy.yaml'\n", - "fn_conda_dev = 'dependencies-develop.yaml'" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Introduction\n", - "\n", - "This cookiecutter is set up for optimal use with conda, for local dependency managment. The takeaway is this; for local dependency managment, we rely on conda and nothing else.\n", - "\n", - "Note that this has nothing to do with remote dependency managment. This is what you need to take care of when preparing a release of your code which goes via PyPi or alternatives. We treat that as an independent problem. Mixing remote and local dependency managment tends to add complexity instead of removing it." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Workflow\n", - "\n", - "We distinguish between `deployment` and `development` environments. Of course, in research this is not always that useful or clear. We follow this rule of thumb:\n", - "\n", - "```\n", - "Everything that should end up in pip, goes in deployment\n", - "```\n", - "\n", - "Which still justifies keeping the two separated." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Deployment Environment\n", - "\n", - "This environment is whatever an end user may need in order to use your package.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "# conda environments:\n", - "#\n", - "base * /cw/dtaijupiter/NoCsBack/dtai/elia/miniconda\n", - "rwrf /cw/dtaijupiter/NoCsBack/dtai/elia/miniconda/envs/rwrf\n", - "\n", - "dependencies-deploy.yaml\n" - ] - } - ], - "source": [ - "%%bash -s \"$name\" \"$root_dir\" \"$fn_conda_dep\"\n", - "\n", - "source ~/.bashrc\n", - "\n", - "conda env list" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collecting package metadata (repodata.json): ...working... done\n", - "Solving environment: ...working... done\n", - "\n", - "Downloading and Extracting Packages\n", - "certifi-2019.11.28 | 156 KB | ########## | 100% \n", - "ipython_genutils-0.2 | 39 KB | ########## | 100% \n", - "python-3.8.0 | 39.6 MB | ########## | 100% \n", - "backcall-0.1.0 | 20 KB | ########## | 100% \n", - "six-1.13.0 | 27 KB | ########## | 100% \n", - "wcwidth-0.1.7 | 24 KB | ########## | 100% \n", - "ptyprocess-0.6.0 | 23 KB | ########## | 100% \n", - "jedi-0.15.1 | 708 KB | ########## | 100% \n", - "setuptools-42.0.2 | 654 KB | ########## | 100% \n", - "ipython-7.10.2 | 980 KB | ########## | 100% \n", - "pip-19.3.1 | 1.9 MB | ########## | 100% \n", - "parso-0.5.2 | 69 KB | ########## | 100% \n", - "pexpect-4.7.0 | 79 KB | ########## | 100% \n", - "pickleshare-0.7.5 | 13 KB | ########## | 100% \n", - "wheel-0.33.6 | 35 KB | ########## | 100% \n", - "traitlets-4.3.3 | 135 KB | ########## | 100% \n", - "Preparing transaction: ...working... done\n", - "Verifying transaction: ...working... done\n", - "Executing transaction: ...working... done\n", - "Ran pip subprocess with arguments:\n", - "['/cw/dtaijupiter/NoCsBack/dtai/elia/miniconda/envs/mercs/bin/python', '-m', 'pip', 'install', '-U', '-r', '/cw/dtaijupiter/NoCsBack/dtai/elia/mercs/condaenv.nm_iiuns.requirements.txt']\n", - "Pip subprocess output:\n", - "Collecting numpy\n", - " Downloading https://files.pythonhosted.org/packages/d7/6a/3fed132c846d1e47963f30376cc041e9dd586d286d931055ad06ff65c6c7/numpy-1.17.4-cp38-cp38-manylinux1_x86_64.whl (20.5MB)\n", - "Collecting scipy\n", - " Downloading https://files.pythonhosted.org/packages/f3/08/8bdcdcd149ea41b655956feb7c19ebf7e1f561738bd5570b6ae015daf411/scipy-1.4.1-cp38-cp38-manylinux1_x86_64.whl (26.0MB)\n", - "Collecting pandas\n", - " Downloading https://files.pythonhosted.org/packages/7b/fd/41698f20fd297cef2dc43a72a8ca42d149eaf7d954f1fb2bd3fc366a658d/pandas-0.25.3-cp38-cp38-manylinux1_x86_64.whl (10.4MB)\n", - "Collecting networkx\n", - " Downloading https://files.pythonhosted.org/packages/41/8f/dd6a8e85946def36e4f2c69c84219af0fa5e832b018c970e92f2ad337e45/networkx-2.4-py3-none-any.whl (1.6MB)\n", - "Collecting scikit-learn\n", - " Downloading https://files.pythonhosted.org/packages/6c/f8/6071da4d8ce0f9d0e42b6d9de406f9adc057864dabb945d84a8b2966a9a5/scikit_learn-0.22-cp38-cp38-manylinux1_x86_64.whl (7.0MB)\n", - "Collecting dask\n", - " Downloading https://files.pythonhosted.org/packages/bf/b3/9175539d5a43b0bb1fe6d9729613a9639dd78a0e13c3fa7fc1ba702e56fa/dask-2.9.0-py3-none-any.whl (770kB)\n", - "Collecting toolz\n", - " Downloading https://files.pythonhosted.org/packages/22/8e/037b9ba5c6a5739ef0dcde60578c64d49f45f64c5e5e886531bfbc39157f/toolz-0.10.0.tar.gz (49kB)\n", - "Collecting tornado\n", - " Downloading https://files.pythonhosted.org/packages/30/78/2d2823598496127b21423baffaa186b668f73cd91887fcef78b6eade136b/tornado-6.0.3.tar.gz (482kB)\n", - "Collecting pydot\n", - " Downloading https://files.pythonhosted.org/packages/33/d1/b1479a770f66d962f545c2101630ce1d5592d90cb4f083d38862e93d16d2/pydot-1.4.1-py2.py3-none-any.whl\n", - "Collecting pytz>=2017.2\n", - " Downloading https://files.pythonhosted.org/packages/e7/f9/f0b53f88060247251bf481fa6ea62cd0d25bf1b11a87888e53ce5b7c8ad2/pytz-2019.3-py2.py3-none-any.whl (509kB)\n", - "Collecting python-dateutil>=2.6.1\n", - " Downloading https://files.pythonhosted.org/packages/d4/70/d60450c3dd48ef87586924207ae8907090de0b306af2bce5d134d78615cb/python_dateutil-2.8.1-py2.py3-none-any.whl (227kB)\n", - "Requirement already satisfied, skipping upgrade: decorator>=4.3.0 in /cw/dtaijupiter/NoCsBack/dtai/elia/miniconda/envs/mercs/lib/python3.8/site-packages (from networkx->-r /cw/dtaijupiter/NoCsBack/dtai/elia/mercs/condaenv.nm_iiuns.requirements.txt (line 4)) (4.4.1)\n", - "Collecting joblib>=0.11\n", - " Downloading https://files.pythonhosted.org/packages/28/5c/cf6a2b65a321c4a209efcdf64c2689efae2cb62661f8f6f4bb28547cf1bf/joblib-0.14.1-py2.py3-none-any.whl (294kB)\n", - "Collecting pyparsing>=2.1.4\n", - " Downloading https://files.pythonhosted.org/packages/c0/0c/fc2e007d9a992d997f04a80125b0f183da7fb554f1de701bbb70a8e7d479/pyparsing-2.4.5-py2.py3-none-any.whl (67kB)\n", - "Requirement already satisfied, skipping upgrade: six>=1.5 in /cw/dtaijupiter/NoCsBack/dtai/elia/miniconda/envs/mercs/lib/python3.8/site-packages (from python-dateutil>=2.6.1->pandas->-r /cw/dtaijupiter/NoCsBack/dtai/elia/mercs/condaenv.nm_iiuns.requirements.txt (line 3)) (1.13.0)\n", - "Building wheels for collected packages: toolz, tornado\n", - " Building wheel for toolz (setup.py): started\n", - " Building wheel for toolz (setup.py): finished with status 'done'\n", - " Created wheel for toolz: filename=toolz-0.10.0-cp38-none-any.whl size=55576 sha256=8c9af341e0ad2fce73e2e87ce77a410e99c5843d067771de354276d5ee505063\n", - " Stored in directory: /home/elia/.cache/pip/wheels/e1/8b/65/3294e5b727440250bda09e8c0153b7ba19d328f661605cb151\n", - " Building wheel for tornado (setup.py): started\n", - " Building wheel for tornado (setup.py): finished with status 'done'\n", - " Created wheel for tornado: filename=tornado-6.0.3-cp38-cp38-linux_x86_64.whl size=418769 sha256=0a49cffac0b89e0dc279afcc2ac93ae1ebd0f333e6158a13fafd16da8c0ec866\n", - " Stored in directory: /home/elia/.cache/pip/wheels/84/bf/40/2f6ef700f48401ca40e5e3dd7d0e3c0a90e064897b7fe5fc08\n", - "Successfully built toolz tornado\n", - "Installing collected packages: numpy, scipy, pytz, python-dateutil, pandas, networkx, joblib, scikit-learn, dask, toolz, tornado, pyparsing, pydot\n", - "Successfully installed dask-2.9.0 joblib-0.14.1 networkx-2.4 numpy-1.17.4 pandas-0.25.3 pydot-1.4.1 pyparsing-2.4.5 python-dateutil-2.8.1 pytz-2019.3 scikit-learn-0.22 scipy-1.4.1 toolz-0.10.0 tornado-6.0.3\n", - "\n", - "#\n", - "# To activate this environment, use\n", - "#\n", - "# $ conda activate mercs\n", - "#\n", - "# To deactivate an active environment, use\n", - "#\n", - "# $ conda deactivate\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - "\n", - "==> WARNING: A newer version of conda exists. <==\n", - " current version: 4.7.12\n", - " latest version: 4.8.0\n", - "\n", - "Please update conda by running\n", - "\n", - " $ conda update -n base conda\n", - "\n", - "\n" - ] - } - ], - "source": [ - "%%bash -s \"$name\" \"$root_dir\" \"$fn_conda_dep\"\n", - "\n", - "source ~/.bashrc\n", - "\n", - "cd $2\n", - "\n", - "conda env create -f $3 -n $1" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Development environment\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collecting package metadata (repodata.json): ...working... done\n", - "Solving environment: ...working... done\n", - "\n", - "Downloading and Extracting Packages\n", - "catboost-0.20.1 | 52.0 MB | ########## | 100% \n", - "wrapt-1.11.2 | 49 KB | ########## | 100% \n", - "more-itertools-8.0.2 | 39 KB | ########## | 100% \n", - "importlib_metadata-1 | 46 KB | ########## | 100% \n", - "astroid-2.3.3 | 292 KB | ########## | 100% \n", - "mccabe-0.6.1 | 14 KB | ########## | 100% \n", - "ipython-7.10.2 | 975 KB | ########## | 100% \n", - "isort-4.3.21 | 69 KB | ########## | 100% \n", - "joblib-0.14.1 | 201 KB | ########## | 100% \n", - "scipy-1.3.2 | 13.9 MB | ########## | 100% \n", - "pytest-5.3.2 | 370 KB | ########## | 100% \n", - "lightgbm-2.3.0 | 1.0 MB | ########## | 100% \n", - "pylint-2.4.4 | 432 KB | ########## | 100% \n", - "jupyterlab-1.2.4 | 2.8 MB | ########## | 100% \n", - "scikit-learn-0.22 | 5.3 MB | ########## | 100% \n", - "_py-xgboost-mutex-2. | 9 KB | ########## | 100% \n", - "lazy-object-proxy-1. | 31 KB | ########## | 100% \n", - "pyyaml-5.2 | 181 KB | ########## | 100% \n", - "certifi-2019.11.28 | 156 KB | ########## | 100% \n", - "Preparing transaction: ...working... done\n", - "Verifying transaction: ...working... done\n", - "Executing transaction: ...working... done\n", - "#\n", - "# To activate this environment, use\n", - "#\n", - "# $ conda activate mercs\n", - "#\n", - "# To deactivate an active environment, use\n", - "#\n", - "# $ conda deactivate\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - "\n", - "==> WARNING: A newer version of conda exists. <==\n", - " current version: 4.7.12\n", - " latest version: 4.8.0\n", - "\n", - "Please update conda by running\n", - "\n", - " $ conda update -n base conda\n", - "\n", - "\n" - ] - } - ], - "source": [ - "%%bash -s \"$name\" \"$root_dir\" \"$fn_conda_dev\"\n", - "\n", - "source ~/.bashrc\n", - "\n", - "cd $2\n", - "\n", - "conda activate $1\n", - "\n", - "conda env update -n $1 -f $3" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Jupyter kernel\n", - "\n", - "Expose the environment to your jupyter." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Installed kernelspec mercs in /home/elia/.local/share/jupyter/kernels/mercs\n" - ] - } - ], - "source": [ - "%%bash -s \"$name\" \"$root_dir\" \"$fn_conda_dep\"\n", - "\n", - "source ~/.bashrc\n", - "\n", - "cd $2\n", - "\n", - "conda activate $1\n", - "python -m ipykernel install --user --name $1 --display-name \"$1\"" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - }, - "toc-autonumbering": true - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/deploy/docs.ipynb b/note/deploy/docs.ipynb deleted file mode 100644 index 452964c..0000000 --- a/note/deploy/docs.ipynb +++ /dev/null @@ -1,287 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Docs\n", - "\n", - "Every good open source project at least consists of a bit of documentation. A part of this documentation is generated from decent docstrings you wrote together with your code.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Imports" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "import os\n", - "from os.path import dirname\n", - "\n", - "import getpass\n", - "import configparser\n", - "import semantic_version" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Initialization\n", - "\n", - "Some important variables to be used afterwards." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "name = \"mercs\"\n", - "\n", - "root_dir = dirname(dirname(os.getcwd()))\n", - "docs_dir = os.path.join(root_dir, 'docs')\n", - "\n", - "fn_conda_dep = 'dependencies-deploy.yaml'\n", - "fn_conda_dev = 'dependencies-develop.yaml'" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Tools\n", - "\n", - "We will use [Mkdocs](https://www.mkdocs.org/), with its [material](https://squidfunk.github.io/mkdocs-material/) theme. This generates very nice webpages and is -in my humble opinion- a bit more modern than Sphinx (which is also good!).\n", - "\n", - "The main upside of `mkdocs` is the fact that its source files are [markdown](https://en.wikipedia.org/wiki/Markdown), which is the most basic formatted text format there is. Readmes and even this deployment document are written in markdown itself. In that sense, we gain consistency, all the stuff that we want to communicate is written in markdown: \n", - "\n", - "- readme's in the repo\n", - "- text cells in jupyter notebooks\n", - "- source files for the documentation site\n", - "\n", - "Which means that we can write everything once, and link it together. All the formats are the same, hence trivially compatible." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Automation\n", - "\n", - "I always work in notebooks (like this one), and I prefer to push this way of working as far as possible. Hence, any notebook written in `note/docs` or `note/tutorial` will be exported to a markdown document and added in the `docs` folder." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NbConvertApp] Converting notebook quickstart.ipynb to markdown\n", - "[NbConvertApp] Support files will be in quickstart_files/\n", - "[NbConvertApp] Making directory /cw/dtaijupiter/NoCsBack/dtai/elia/mercs/docs/quickstart_files\n", - "[NbConvertApp] Making directory /cw/dtaijupiter/NoCsBack/dtai/elia/mercs/docs/quickstart_files\n", - "[NbConvertApp] Making directory /cw/dtaijupiter/NoCsBack/dtai/elia/mercs/docs/quickstart_files\n", - "[NbConvertApp] Writing 10646 bytes to /cw/dtaijupiter/NoCsBack/dtai/elia/mercs/docs/quickstart.md\n" - ] - } - ], - "source": [ - "%%bash -s \"$root_dir\" \"$name\" \"$docs_dir\"\n", - "\n", - "source ~/.bashrc\n", - "cd $1\n", - "conda activate $2\n", - "\n", - "cd note/tutorial\n", - "\n", - "jupyter nbconvert *.ipynb --to markdown --output-dir=$3" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Workflow\n", - "\n", - "The cookiecutter already contains the [mkdocs.yml](../../mkdocs.yml) file, which is -unsurprisingly- the configuration file for your mkdocs project. Using this cookiecutter, you can focus on content. Alongside this configuration file, we also included a demo page; [index.md](../../docs/index.md), which is the home page of the documentation website. \n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Build\n", - "\n", - "For a test drive, you need to know some commands. To build your website (i.e., generate `.html` starting from your markdown sources), you do" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO - Cleaning site directory \n", - "INFO - Building documentation to directory: /cw/dtaijupiter/NoCsBack/dtai/elia/mercs/site \n" - ] - } - ], - "source": [ - "%%bash -s \"$root_dir\" \"$name\"\n", - "\n", - "source ~/.bashrc\n", - "cd $1\n", - "conda activate $2\n", - "\n", - "mkdocs build\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Preview (host locally)\n", - "\n", - "To preview your website locally, you do" - ] - }, - { - "cell_type": "raw", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "%%bash -s \"$root_dir\" \"$name\"\n", - "\n", - "source ~/.bashrc\n", - "cd $1\n", - "conda activate $2\n", - "\n", - "mkdocs serve" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "and surf to [localhost:8000](http://localhost:8000). Also note that this server will refresh whenever you alter something on disk (which is nice!), and hence does the build command automatically." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Publish\n", - "\n", - "Now, the last challenge is to make this website available over the internet. Luckily, mkdocs makes this [extremely easy](https://www.mkdocs.org/user-guide/deploying-your-docs/) when you want to host on [github pages](https://pages.github.com/)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO - Cleaning site directory \n", - "INFO - Building documentation to directory: /cw/dtaijupiter/NoCsBack/dtai/elia/mercs/site \n", - "INFO - Copying '/cw/dtaijupiter/NoCsBack/dtai/elia/mercs/site' to 'gh-pages' branch and pushing to GitHub. \n", - "INFO - Your documentation should shortly be available at: https://eliavw.github.io/mercs/ \n" - ] - } - ], - "source": [ - "%%bash -s \"$root_dir\" \"$name\"\n", - "\n", - "source ~/.bashrc\n", - "cd $1\n", - "conda activate $2\n", - "\n", - "mkdocs gh-deploy" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "and your site should be online at; [https://eliavw.github.io/mercs/](https://eliavw.github.io/mercs/). \n", - "\n", - "What happens under the hood is that a `mkdocs build` is executed, and then the resulting `site` directory is pushed to the `gh pages` branch in your repository. From that point on, github takes care of the rest.\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - }, - "toc-autonumbering": true - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/deploy/git.ipynb b/note/deploy/git.ipynb deleted file mode 100644 index e79dfe6..0000000 --- a/note/deploy/git.ipynb +++ /dev/null @@ -1,105 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# GIT\n", - "\n", - "Documented shell script which makes explicit all the hooks I desire before doing a commit." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# HOOK: Documentation\n", - "\n", - "Crucial for reproducibility and therefore our first hook." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# HOOK: Tests\n", - "\n", - "CI happens on github. I do not like to spend time on writing tests (nobody does), but I do most of my dev-work in notebooks anyway. I preserve those notebooks, which at the end of a development session are supposed to work, as tests. In this way the work done lives on as a test of the future codebase. \n", - "\n", - "When a notebook becomes obsolete, I am forced to delete or adapt, which I think is a good thing." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Actual Git actions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/deploy/pypi.ipynb b/note/deploy/pypi.ipynb deleted file mode 100644 index 93f10f9..0000000 --- a/note/deploy/pypi.ipynb +++ /dev/null @@ -1,509 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "N.b.: This notebook and other deployment workflows should end up in the cookiecutter to make one-click, documented workflows to automate important tasks for all future projects." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Publish to PIP\n", - "\n", - "Exectuable guide of how to publish your project on PyPi." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Imports" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "import os\n", - "from os.path import dirname\n", - "\n", - "import getpass\n", - "import configparser\n", - "import semantic_version\n", - "\n", - "root_dir = dirname(dirname(os.getcwd()))\n", - "fn_setup_cfg = os.path.join(root_dir, 'setup.cfg')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Functions" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "def get_config(fn_setup_cfg):\n", - " config = configparser.ConfigParser()\n", - " config.read(fn_setup_cfg)\n", - " return config\n", - "\n", - "def update_version(fn_setup_cfg, major=False, minor=False, patch=True, verbose=True):\n", - " assert sum([major, minor, patch]) == 1, \"Only one version number can be changed.\"\n", - " \n", - " # Load config\n", - " config = get_config(fn_setup_cfg)\n", - " \n", - " # Get version\n", - " v = semantic_version.Version(config['metadata'].get('version', '0.0.0'))\n", - " \n", - " # Update version\n", - " if patch:\n", - " config['metadata']['version'] = str(v.next_patch())\n", - " elif minor:\n", - " config['metadata']['version'] = str(v.next_minor())\n", - " elif major:\n", - " config['metadata']['version'] = str(v.next_major())\n", - " \n", - " if verbose:\n", - " msg = \"\"\"\n", - " Version updated to: {}\n", - " \"\"\".format(config['metadata']['version'])\n", - " print(msg)\n", - " \n", - " # Save config\n", - " with open(fn_setup_cfg, 'w') as f:\n", - " config.write(f)\n", - " return str(config['metadata']['version'])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "PyPi\n", - "----\n", - "\n", - "Make your project publicly available on the Python Package Index, [PyPi](https://pypi.org/). To achieve this, we need **remote dependency managment**, since you want your software to run without forcing the users to recreate your conda environments. All dependencies have to be managed, automatically, during installation. To make this work, we need to do some extra work.\n", - "\n", - "We follow the steps as outlined in the most basic (and official) [PyPi tutorial](https://packaging.python.org/tutorials/packaging-projects/)." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "### Generate distribution archives\n", - "\n", - "Generate distribution packages for the package. These are archives that are uploaded to the Package Index and can be installed by pip." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Root directory is /cw/dtaijupiter/NoCsBack/dtai/elia/mercs\n" - ] - } - ], - "source": [ - "print(\"Root directory is {}\".format(root_dir))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "We also update the version. PIP does not accept another identical file, since it keeps a complete history. Thus, we always must at least update the patch in order to push our thing to PIP. We do so automatically by adapting the versioning number in the `setup.cfg` file." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - " Version updated to: 0.0.37\n", - " \n" - ] - } - ], - "source": [ - "version = update_version(fn_setup_cfg, patch=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "running sdist\n", - "running egg_info\n", - "writing src/mercs.egg-info/PKG-INFO\n", - "writing dependency_links to src/mercs.egg-info/dependency_links.txt\n", - "writing requirements to src/mercs.egg-info/requires.txt\n", - "writing top-level names to src/mercs.egg-info/top_level.txt\n", - "reading manifest file 'src/mercs.egg-info/SOURCES.txt'\n", - "writing manifest file 'src/mercs.egg-info/SOURCES.txt'\n", - "running check\n", - "creating mercs-0.0.37\n", - "creating mercs-0.0.37/src\n", - "creating mercs-0.0.37/src/mercs\n", - "creating mercs-0.0.37/src/mercs.egg-info\n", - "creating mercs-0.0.37/src/mercs/algo\n", - "creating mercs-0.0.37/src/mercs/composition\n", - "creating mercs-0.0.37/src/mercs/core\n", - "creating mercs-0.0.37/src/mercs/graph\n", - "creating mercs-0.0.37/src/mercs/tests\n", - "creating mercs-0.0.37/src/mercs/utils\n", - "creating mercs-0.0.37/src/mercs/visuals\n", - "copying files to mercs-0.0.37...\n", - "copying README.md -> mercs-0.0.37\n", - "copying setup.cfg -> mercs-0.0.37\n", - "copying setup.py -> mercs-0.0.37\n", - "copying src/mercs/__init__.py -> mercs-0.0.37/src/mercs\n", - "copying src/mercs/skeleton.py -> mercs-0.0.37/src/mercs\n", - "copying src/mercs.egg-info/PKG-INFO -> mercs-0.0.37/src/mercs.egg-info\n", - "copying src/mercs.egg-info/SOURCES.txt -> mercs-0.0.37/src/mercs.egg-info\n", - "copying src/mercs.egg-info/dependency_links.txt -> mercs-0.0.37/src/mercs.egg-info\n", - "copying src/mercs.egg-info/not-zip-safe -> mercs-0.0.37/src/mercs.egg-info\n", - "copying src/mercs.egg-info/requires.txt -> mercs-0.0.37/src/mercs.egg-info\n", - "copying src/mercs.egg-info/top_level.txt -> mercs-0.0.37/src/mercs.egg-info\n", - "copying src/mercs/algo/__init__.py -> mercs-0.0.37/src/mercs/algo\n", - "copying src/mercs/algo/evaluation.py -> mercs-0.0.37/src/mercs/algo\n", - "copying src/mercs/algo/imputation.py -> mercs-0.0.37/src/mercs/algo\n", - "copying src/mercs/algo/induction.py -> mercs-0.0.37/src/mercs/algo\n", - "copying src/mercs/algo/inference.py -> mercs-0.0.37/src/mercs/algo\n", - "copying src/mercs/algo/inference_v3.py -> mercs-0.0.37/src/mercs/algo\n", - "copying src/mercs/algo/new_inference.py -> mercs-0.0.37/src/mercs/algo\n", - "copying src/mercs/algo/new_prediction.py -> mercs-0.0.37/src/mercs/algo\n", - "copying src/mercs/algo/prediction.py -> mercs-0.0.37/src/mercs/algo\n", - "copying src/mercs/algo/selection.py -> mercs-0.0.37/src/mercs/algo\n", - "copying src/mercs/algo/vector_prediction.py -> mercs-0.0.37/src/mercs/algo\n", - "copying src/mercs/composition/CanonicalModel.py -> mercs-0.0.37/src/mercs/composition\n", - "copying src/mercs/composition/CompositeModel.py -> mercs-0.0.37/src/mercs/composition\n", - "copying src/mercs/composition/NewCompositeModel.py -> mercs-0.0.37/src/mercs/composition\n", - "copying src/mercs/composition/__init__.py -> mercs-0.0.37/src/mercs/composition\n", - "copying src/mercs/composition/compose.py -> mercs-0.0.37/src/mercs/composition\n", - "copying src/mercs/core/Mercs.py -> mercs-0.0.37/src/mercs/core\n", - "copying src/mercs/core/__init__.py -> mercs-0.0.37/src/mercs/core\n", - "copying src/mercs/graph/__init__.py -> mercs-0.0.37/src/mercs/graph\n", - "copying src/mercs/graph/graphviz.py -> mercs-0.0.37/src/mercs/graph\n", - "copying src/mercs/graph/network.py -> mercs-0.0.37/src/mercs/graph\n", - "copying src/mercs/graph/q_diagram.py -> mercs-0.0.37/src/mercs/graph\n", - "copying src/mercs/tests/__init__.py -> mercs-0.0.37/src/mercs/tests\n", - "copying src/mercs/tests/setup.py -> mercs-0.0.37/src/mercs/tests\n", - "copying src/mercs/utils/__init__.py -> mercs-0.0.37/src/mercs/utils\n", - "copying src/mercs/utils/data_handling.py -> mercs-0.0.37/src/mercs/utils\n", - "copying src/mercs/utils/debug.py -> mercs-0.0.37/src/mercs/utils\n", - "copying src/mercs/utils/decoration.py -> mercs-0.0.37/src/mercs/utils\n", - "copying src/mercs/utils/encoding.py -> mercs-0.0.37/src/mercs/utils\n", - "copying src/mercs/utils/inference_tools.py -> mercs-0.0.37/src/mercs/utils\n", - "copying src/mercs/visuals/__init__.py -> mercs-0.0.37/src/mercs/visuals\n", - "copying src/mercs/visuals/diagrams.py -> mercs-0.0.37/src/mercs/visuals\n", - "Writing mercs-0.0.37/setup.cfg\n", - "Creating tar archive\n", - "removing 'mercs-0.0.37' (and everything under it)\n", - "running bdist_wheel\n", - "running build\n", - "running build_py\n", - "copying src/mercs/composition/CanonicalModel.py -> build/lib/mercs/composition\n", - "copying src/mercs/algo/vector_prediction.py -> build/lib/mercs/algo\n", - "copying src/mercs/algo/induction.py -> build/lib/mercs/algo\n", - "copying src/mercs/core/Mercs.py -> build/lib/mercs/core\n", - "installing to build/bdist.linux-x86_64/wheel\n", - "running install\n", - "running install_lib\n", - "creating build/bdist.linux-x86_64/wheel\n", - "creating build/bdist.linux-x86_64/wheel/mercs\n", - "creating build/bdist.linux-x86_64/wheel/mercs/visuals\n", - "copying build/lib/mercs/visuals/diagrams.py -> build/bdist.linux-x86_64/wheel/mercs/visuals\n", - "copying build/lib/mercs/visuals/__init__.py -> build/bdist.linux-x86_64/wheel/mercs/visuals\n", - "creating build/bdist.linux-x86_64/wheel/mercs/graph\n", - "copying build/lib/mercs/graph/network.py -> build/bdist.linux-x86_64/wheel/mercs/graph\n", - "copying build/lib/mercs/graph/graphviz.py -> build/bdist.linux-x86_64/wheel/mercs/graph\n", - "copying build/lib/mercs/graph/__init__.py -> build/bdist.linux-x86_64/wheel/mercs/graph\n", - "copying build/lib/mercs/graph/q_diagram.py -> build/bdist.linux-x86_64/wheel/mercs/graph\n", - "copying build/lib/mercs/graph/gt.py -> build/bdist.linux-x86_64/wheel/mercs/graph\n", - "creating build/bdist.linux-x86_64/wheel/mercs/utils\n", - "copying build/lib/mercs/utils/debug.py -> build/bdist.linux-x86_64/wheel/mercs/utils\n", - "copying build/lib/mercs/utils/__init__.py -> build/bdist.linux-x86_64/wheel/mercs/utils\n", - "copying build/lib/mercs/utils/inference_tools.py -> build/bdist.linux-x86_64/wheel/mercs/utils\n", - "copying build/lib/mercs/utils/decoration.py -> build/bdist.linux-x86_64/wheel/mercs/utils\n", - "copying build/lib/mercs/utils/encoding.py -> build/bdist.linux-x86_64/wheel/mercs/utils\n", - "copying build/lib/mercs/utils/data_handling.py -> build/bdist.linux-x86_64/wheel/mercs/utils\n", - "creating build/bdist.linux-x86_64/wheel/mercs/algo\n", - "copying build/lib/mercs/algo/evaluation.py -> build/bdist.linux-x86_64/wheel/mercs/algo\n", - "copying build/lib/mercs/algo/__init__.py -> build/bdist.linux-x86_64/wheel/mercs/algo\n", - "copying build/lib/mercs/algo/selection.py -> build/bdist.linux-x86_64/wheel/mercs/algo\n", - "copying build/lib/mercs/algo/induction.py -> build/bdist.linux-x86_64/wheel/mercs/algo\n", - "copying build/lib/mercs/algo/new_inference.py -> build/bdist.linux-x86_64/wheel/mercs/algo\n", - "copying build/lib/mercs/algo/turbo_inference.py -> build/bdist.linux-x86_64/wheel/mercs/algo\n", - "copying build/lib/mercs/algo/vector_prediction.py -> build/bdist.linux-x86_64/wheel/mercs/algo\n", - "copying build/lib/mercs/algo/imputation.py -> build/bdist.linux-x86_64/wheel/mercs/algo\n", - "copying build/lib/mercs/algo/inference_v3.py -> build/bdist.linux-x86_64/wheel/mercs/algo\n", - "copying build/lib/mercs/algo/prediction.py -> build/bdist.linux-x86_64/wheel/mercs/algo\n", - "copying build/lib/mercs/algo/inference.py -> build/bdist.linux-x86_64/wheel/mercs/algo\n", - "copying build/lib/mercs/algo/new_prediction.py -> build/bdist.linux-x86_64/wheel/mercs/algo\n", - "creating build/bdist.linux-x86_64/wheel/mercs/core\n", - "copying build/lib/mercs/core/Mercs.py -> build/bdist.linux-x86_64/wheel/mercs/core\n", - "copying build/lib/mercs/core/__init__.py -> build/bdist.linux-x86_64/wheel/mercs/core\n", - "copying build/lib/mercs/__init__.py -> build/bdist.linux-x86_64/wheel/mercs\n", - "creating build/bdist.linux-x86_64/wheel/mercs/tests\n", - "copying build/lib/mercs/tests/setup.py -> build/bdist.linux-x86_64/wheel/mercs/tests\n", - "copying build/lib/mercs/tests/__init__.py -> build/bdist.linux-x86_64/wheel/mercs/tests\n", - "creating build/bdist.linux-x86_64/wheel/mercs/composition\n", - "copying build/lib/mercs/composition/CompositeModel.py -> build/bdist.linux-x86_64/wheel/mercs/composition\n", - "copying build/lib/mercs/composition/CanonicalModel.py -> build/bdist.linux-x86_64/wheel/mercs/composition\n", - "copying build/lib/mercs/composition/NewCompositeModel.py -> build/bdist.linux-x86_64/wheel/mercs/composition\n", - "copying build/lib/mercs/composition/__init__.py -> build/bdist.linux-x86_64/wheel/mercs/composition\n", - "copying build/lib/mercs/composition/compose.py -> build/bdist.linux-x86_64/wheel/mercs/composition\n", - "copying build/lib/mercs/skeleton.py -> build/bdist.linux-x86_64/wheel/mercs\n", - "running install_egg_info\n", - "Copying src/mercs.egg-info to build/bdist.linux-x86_64/wheel/mercs-0.0.37-py3.7.egg-info\n", - "running install_scripts\n", - "adding license file \"LICENSE.txt\" (matched pattern \"LICEN[CS]E*\")\n", - "adding license file \"AUTHORS.rst\" (matched pattern \"AUTHORS*\")\n", - "creating build/bdist.linux-x86_64/wheel/mercs-0.0.37.dist-info/WHEEL\n", - "creating 'dist/mercs-0.0.37-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it\n", - "adding 'mercs/__init__.py'\n", - "adding 'mercs/skeleton.py'\n", - "adding 'mercs/algo/__init__.py'\n", - "adding 'mercs/algo/evaluation.py'\n", - "adding 'mercs/algo/imputation.py'\n", - "adding 'mercs/algo/induction.py'\n", - "adding 'mercs/algo/inference.py'\n", - "adding 'mercs/algo/inference_v3.py'\n", - "adding 'mercs/algo/new_inference.py'\n", - "adding 'mercs/algo/new_prediction.py'\n", - "adding 'mercs/algo/prediction.py'\n", - "adding 'mercs/algo/selection.py'\n", - "adding 'mercs/algo/turbo_inference.py'\n", - "adding 'mercs/algo/vector_prediction.py'\n", - "adding 'mercs/composition/CanonicalModel.py'\n", - "adding 'mercs/composition/CompositeModel.py'\n", - "adding 'mercs/composition/NewCompositeModel.py'\n", - "adding 'mercs/composition/__init__.py'\n", - "adding 'mercs/composition/compose.py'\n", - "adding 'mercs/core/Mercs.py'\n", - "adding 'mercs/core/__init__.py'\n", - "adding 'mercs/graph/__init__.py'\n", - "adding 'mercs/graph/graphviz.py'\n", - "adding 'mercs/graph/gt.py'\n", - "adding 'mercs/graph/network.py'\n", - "adding 'mercs/graph/q_diagram.py'\n", - "adding 'mercs/tests/__init__.py'\n", - "adding 'mercs/tests/setup.py'\n", - "adding 'mercs/utils/__init__.py'\n", - "adding 'mercs/utils/data_handling.py'\n", - "adding 'mercs/utils/debug.py'\n", - "adding 'mercs/utils/decoration.py'\n", - "adding 'mercs/utils/encoding.py'\n", - "adding 'mercs/utils/inference_tools.py'\n", - "adding 'mercs/visuals/__init__.py'\n", - "adding 'mercs/visuals/diagrams.py'\n", - "adding 'mercs-0.0.37.dist-info/AUTHORS.rst'\n", - "adding 'mercs-0.0.37.dist-info/LICENSE.txt'\n", - "adding 'mercs-0.0.37.dist-info/METADATA'\n", - "adding 'mercs-0.0.37.dist-info/WHEEL'\n", - "adding 'mercs-0.0.37.dist-info/top_level.txt'\n", - "adding 'mercs-0.0.37.dist-info/RECORD'\n", - "removing build/bdist.linux-x86_64/wheel\n" - ] - } - ], - "source": [ - "%%bash -s \"$root_dir\"\n", - "\n", - "cd $1\n", - "\n", - "python setup.py sdist bdist_wheel" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "### Upload to test-PyPi\n", - "\n", - "After this, your package can be uploaded to the python package index. To see if it works on PyPi test server, the following" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stdin", - "output_type": "stream", - "text": [ - " ······\n", - " ··········\n" - ] - } - ], - "source": [ - "username = getpass.getpass()\n", - "pwd = getpass.getpass()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Uploading distributions to https://test.pypi.org/legacy/\n", - "Uploading mercs-0.0.37-py3-none-any.whl\n", - "100%|██████████| 58.2k/58.2k [00:02<00:00, 26.1kB/s]\n", - "Uploading mercs-0.0.37.tar.gz\n", - "100%|██████████| 40.9k/40.9k [00:01<00:00, 30.6kB/s]\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - "cd $1\n", - "\n", - "python -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*$4* -u $2 -p $3\n" - ] - } - ], - "source": [ - "%%bash --verbose -s \"$root_dir\" \"$username\" \"$pwd\" \"$version\"\n", - "\n", - "cd $1\n", - "\n", - "python -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*$4* -u $2 -p $3" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Upload to Real PyPi\n", - "\n", - "Test PyPi really does not work very well.." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Uploading distributions to https://upload.pypi.org/legacy/\n", - "Uploading mercs-0.0.37-py3-none-any.whl\n", - "100%|██████████| 58.2k/58.2k [00:02<00:00, 28.0kB/s]\n", - "Uploading mercs-0.0.37.tar.gz\n", - "100%|██████████| 40.9k/40.9k [00:01<00:00, 28.4kB/s]\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - "cd $1\n", - "\n", - "python -m twine upload dist/*$4* -u $2 -p $3\n" - ] - } - ], - "source": [ - "%%bash --verbose -s \"$root_dir\" \"$username\" \"$pwd\" \"$version\"\n", - "\n", - "cd $1\n", - "\n", - "python -m twine upload dist/*$4* -u $2 -p $3" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/deploy/tests.ipynb b/note/deploy/tests.ipynb deleted file mode 100644 index ca15f13..0000000 --- a/note/deploy/tests.ipynb +++ /dev/null @@ -1,54 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Tests\n", - "\n", - "Auto-generate tests from notebooks" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/expand-induction/expand-induction.ipynb b/note/expand-induction/expand-induction.ipynb deleted file mode 100644 index ca59dc1..0000000 --- a/note/expand-induction/expand-induction.ipynb +++ /dev/null @@ -1,1048 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Expanded Induction\n", - "\n", - "Learn ensembles, expand those trees to MERCS as a whole." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Preliminaries" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "import mercs\n", - "import numpy as np\n", - "from mercs.tests import load_iris, default_dataset\n", - "from mercs.core import Mercs" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Setup" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "train, test = default_dataset(n_features=4)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Sandbox" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "clf = Mercs(\n", - " max_depth=3,\n", - " classifier_algorithm=\"XGB\",\n", - " regressor_algorithm=\"XGB\",\n", - " selection_algorithm=\"random\",\n", - " induction_algorithm=\"expand\",\n", - " fraction_missing=0.,\n", - " nb_targets=1,\n", - " nb_iterations=1,\n", - " n_jobs=1,\n", - " verbose=0,\n", - " inference_algorithm=\"own\",\n", - " n_estimators=30,\n", - " max_steps=8,\n", - " prediction_algorithm=\"rw\",\n", - " random_state=800,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[16:37:58] WARNING: /workspace/src/objective/regression_obj.cu:152: reg:linear is now deprecated in favor of reg:squarederror.\n", - "[16:37:58] WARNING: /workspace/src/objective/regression_obj.cu:152: reg:linear is now deprecated in favor of reg:squarederror.\n", - "[16:37:58] WARNING: /workspace/src/objective/regression_obj.cu:152: reg:linear is now deprecated in favor of reg:squarederror.\n", - "[16:37:58] WARNING: /workspace/src/objective/regression_obj.cu:152: reg:linear is now deprecated in favor of reg:squarederror.\n", - "[16:37:58] WARNING: /workspace/src/objective/regression_obj.cu:152: reg:linear is now deprecated in favor of reg:squarederror.\n" - ] - } - ], - "source": [ - "clf.fit(train)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[0.20425399, 0.33127284, 0.19544564, 0.26902747, 0. ],\n", - " [0. , 0.49231061, 0.18906608, 0.15399042, 0.16463287],\n", - " [0.54791719, 0. , 0.09427208, 0.13314822, 0.22466254],\n", - " [0.13021789, 0.29938748, 0.21197984, 0. , 0.35841483],\n", - " [0.14261092, 0.22913216, 0. , 0.29138091, 0.336876 ]])" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "clf.m_fimps" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TreeNodeIDFeatureSplitYesNoMissingGainCover
0000-0f10.2924100-10-20-141.977325800.0
1010-1f20.6750690-30-40-316.354549604.0
2020-2f21.5480200-50-60-510.074129196.0
3030-3f00.1261350-70-80-718.433580331.0
4040-4f30.3504520-90-100-936.905792273.0
5050-5f3-2.5062380-110-120-113.799362182.0
6060-6f10.3731580-130-140-130.74285714.0
7070-7LeafNaNNaNNaNNaN-0.037937285.0
8080-8LeafNaNNaNNaNNaN0.02978746.0
9090-9LeafNaNNaNNaNNaN0.036306156.0
100100-10LeafNaNNaNNaNNaN-0.037712117.0
110110-11LeafNaNNaNNaNNaN-0.0285716.0
120120-12LeafNaNNaNNaNNaN0.048588176.0
130130-13LeafNaNNaNNaNNaN0.0250001.0
140140-14LeafNaNNaNNaNNaN-0.04642913.0
15101-0f10.2924101-11-21-134.002857800.0
16111-1f20.6750691-31-41-313.248913604.0
17121-2f21.5480201-51-61-58.193048196.0
18131-3f00.2523041-71-81-715.161594331.0
19141-4f30.3504521-91-101-929.943153273.0
20151-5f3-2.5062381-111-121-113.118263182.0
21161-6f10.3731581-131-141-130.63677314.0
22171-7LeafNaNNaNNaNNaN-0.033103295.0
23181-8LeafNaNNaNNaNNaN0.03494036.0
24191-9LeafNaNNaNNaNNaN0.032698156.0
251101-10LeafNaNNaNNaNNaN-0.033973117.0
261111-11LeafNaNNaNNaNNaN-0.0261226.0
271121-12LeafNaNNaNNaNNaN0.043756176.0
281131-13LeafNaNNaNNaNNaN0.0237501.0
291141-14LeafNaNNaNNaNNaN-0.04211713.0
.................................
41028028-0f21.74290228-128-228-10.401472800.0
41128128-1f00.84482828-328-428-30.375497732.0
41228228-2f3-0.63063128-528-628-50.20775468.0
41328328-3f20.19899228-728-828-70.708730622.0
41428428-4f10.58944128-928-1028-90.455205110.0
41528528-5f1-2.23575228-1128-1228-110.12704511.0
41628628-6f30.08320828-1328-1428-130.13846257.0
41728728-7LeafNaNNaNNaNNaN-0.003947287.0
41828828-8LeafNaNNaNNaNNaN0.002813335.0
41928928-9LeafNaNNaNNaNNaN0.01607231.0
420281028-10LeafNaNNaNNaNNaN0.00190479.0
421281128-11LeafNaNNaNNaNNaN0.0111738.0
422281228-12LeafNaNNaNNaNNaN-0.0104323.0
423281328-13LeafNaNNaNNaNNaN-0.0232116.0
424281428-14LeafNaNNaNNaNNaN-0.00773451.0
42529029-0f1-1.29599829-129-229-10.364826800.0
42629129-1f3-0.98074629-329-429-30.512717242.0
42729229-2f0-2.02245129-529-629-50.557239558.0
42829329-3f1-1.39848629-729-829-70.20222681.0
42929429-4f2-1.11099029-929-1029-90.407899161.0
43029529-5f31.67485229-1129-1229-110.41270829.0
43129629-6f2-0.37518329-1329-1429-130.467102529.0
43229729-7LeafNaNNaNNaNNaN0.00465575.0
43329829-8LeafNaNNaNNaNNaN-0.0131516.0
43429929-9LeafNaNNaNNaNNaN0.0172556.0
435291029-10LeafNaNNaNNaNNaN-0.007548155.0
436291129-11LeafNaNNaNNaNNaN-0.01534927.0
437291229-12LeafNaNNaNNaNNaN0.0243202.0
438291329-13LeafNaNNaNNaNNaN-0.000996252.0
439291429-14LeafNaNNaNNaNNaN0.004945277.0
\n", - "

440 rows × 10 columns

\n", - "
" - ], - "text/plain": [ - " Tree Node ID Feature Split Yes No Missing Gain Cover\n", - "0 0 0 0-0 f1 0.292410 0-1 0-2 0-1 41.977325 800.0\n", - "1 0 1 0-1 f2 0.675069 0-3 0-4 0-3 16.354549 604.0\n", - "2 0 2 0-2 f2 1.548020 0-5 0-6 0-5 10.074129 196.0\n", - "3 0 3 0-3 f0 0.126135 0-7 0-8 0-7 18.433580 331.0\n", - "4 0 4 0-4 f3 0.350452 0-9 0-10 0-9 36.905792 273.0\n", - ".. ... ... ... ... ... ... ... ... ... ...\n", - "435 29 10 29-10 Leaf NaN NaN NaN NaN -0.007548 155.0\n", - "436 29 11 29-11 Leaf NaN NaN NaN NaN -0.015349 27.0\n", - "437 29 12 29-12 Leaf NaN NaN NaN NaN 0.024320 2.0\n", - "438 29 13 29-13 Leaf NaN NaN NaN NaN -0.000996 252.0\n", - "439 29 14 29-14 Leaf NaN NaN NaN NaN 0.004945 277.0\n", - "\n", - "[440 rows x 10 columns]" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "clf.m_list[0].model.get_booster().trees_to_dataframe()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "aaai20-frost", - "language": "python", - "name": "aaai20-frost" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.9" - }, - "toc-autonumbering": true - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/hello_world.ipynb b/note/hello_world.ipynb deleted file mode 100644 index 6797e74..0000000 --- a/note/hello_world.ipynb +++ /dev/null @@ -1,64 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Demo notebook\n", - "\n", - "In this folder, you will store your notebooks." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "msg = \"\"\"\n", - "Hello world!\n", - "\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Hello world!\n", - "\n" - ] - } - ], - "source": [ - "print(msg)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/note/implementation/191125 - recursion.ipynb b/note/implementation/191125 - recursion.ipynb deleted file mode 100644 index e8532a2..0000000 --- a/note/implementation/191125 - recursion.ipynb +++ /dev/null @@ -1,952 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Recursion\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Imports" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Random seed for this experiment is: 42\n", - "\n", - "This is my typical random seed for all my experiments.\n", - "\n" - ] - } - ], - "source": [ - "import pprint\n", - "import numpy as np\n", - "\n", - "from mercs import Mercs\n", - "\n", - "#from modulo.core import Modulo\n", - "#from modulo.graph import model_to_graph\n", - "#from modulo.visuals import show_diagram\n", - "\n", - "from mercs.tests.setup import RANDOM_STATE, default_dataset\n", - "\n", - "pp = pprint.PrettyPrinter(indent=4)\n", - "\n", - "msg = \"\"\"\n", - "Random seed for this experiment is: {}\n", - "\n", - "This is my typical random seed for all my experiments.\n", - "\"\"\".format(RANDOM_STATE)\n", - "\n", - "print(msg)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Setup\n", - "\n", - "Create an interesting enough composite model" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "train, test = default_dataset()\n", - "q_code = np.array([0, 0, -1, -1, -1, -1, 0, 1])\n", - "\n", - "m_basic = Mercs(\n", - " random_state=RANDOM_STATE,\n", - " prediction_algorithm=\"mi\",\n", - " selection_algorithm=\"random\",\n", - " nb_iterations=3,\n", - " fraction_missing=0.5,\n", - " max_depth=2,\n", - " regression_max_depth=2,\n", - ")\n", - "\n", - "m_basic.fit(train, nominal_attributes={7})\n", - "#m_basic.m_codes" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "24" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(m_basic.m_codes)" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "y_pred_01 = m_basic.predict(test, q_code=q_code)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "So, this model has now done a prediction for the provided query. But we can easily examine what it did, by showing the diagram of the composition." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "G\n", - "\n", - "\n", - "\n", - "('I', 2)\n", - "\n", - "('I', 2)\n", - "\n", - "\n", - "\n", - "('M', 21)\n", - "\n", - "('M', 21)\n", - "\n", - "\n", - "\n", - "('I', 2)->('M', 21)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('M', 22)\n", - "\n", - "('M', 22)\n", - "\n", - "\n", - "\n", - "('I', 2)->('M', 22)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('M', 23)\n", - "\n", - "('M', 23)\n", - "\n", - "\n", - "\n", - "('I', 2)->('M', 23)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 7)\n", - "\n", - "('D', 7)\n", - "\n", - "\n", - "\n", - "('M', 21)->('D', 7)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('I', 3)\n", - "\n", - "('I', 3)\n", - "\n", - "\n", - "\n", - "('I', 3)->('M', 21)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('I', 3)->('M', 22)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('I', 4)\n", - "\n", - "('I', 4)\n", - "\n", - "\n", - "\n", - "('I', 4)->('M', 21)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 0)\n", - "\n", - "('D', 0)\n", - "\n", - "\n", - "\n", - "('D', 0)->('M', 22)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('M', 22)->('D', 7)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 1)\n", - "\n", - "('D', 1)\n", - "\n", - "\n", - "\n", - "('D', 1)->('M', 22)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 6)\n", - "\n", - "('D', 6)\n", - "\n", - "\n", - "\n", - "('D', 6)->('M', 22)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 6)->('M', 23)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('M', 23)->('D', 7)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('I', 5)\n", - "\n", - "('I', 5)\n", - "\n", - "\n", - "\n", - "('I', 5)->('M', 23)\n", - "\n", - "\n", - "\n", - "\n", - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "m_basic.show_q_diagram()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "The composition is again an ML model, which we can extract as `q_compose` (n.b., the `q` refers to `query`). And we can examine its attributes. These attributes are obviously derived from the original query." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "({0, 1, 6}, {7})" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q_compose = m_basic.q_diagram\n", - "q_compose.desc_ids, q_compose.targ_ids" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "From this diagram, which encodes the computation (and most importantly, the _data flow_), we derive an implicit _query model_ which from the outside, behaves exactly as a regular ML-model. Mathematically, it behaves as a function, essentially." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "q_model = m_basic.q_model" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "([array([0., 1.])],\n", - " [0.3333333333333333, 0.3333333333333333, 0.3333333333333333])" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q_model.classes_, q_model.feature_importances_" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0., 0., 0., 0., 0., 0., 0., 1., 0., 0.])" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y_pred = q_model.predict(test[:, list(q_model.desc_ids)])\n", - "y_pred[:10]" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[1.73766071, 1.26233929],\n", - " [1.92093814, 1.07906186],\n", - " [1.92093814, 1.07906186],\n", - " [1.73766071, 1.26233929],\n", - " [1.92093814, 1.07906186],\n", - " [1.92093814, 1.07906186],\n", - " [1.92093814, 1.07906186],\n", - " [1.32776292, 1.67223708],\n", - " [1.92093814, 1.07906186],\n", - " [1.92093814, 1.07906186]])" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y_proba = q_model.predict_proba(test[:, list(q_model.desc_ids)])\n", - "y_proba[0][:10]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# MRAI" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "q_code = np.array([0, 0, -1, -1, -1, -1, 0, 1])\n", - "\n", - "m_mrai = Mercs(\n", - " random_state=RANDOM_STATE,\n", - " prediction_algorithm=\"mrai\",\n", - " clf_criterion=\"entropy\",\n", - " rgr_criterion=\"mae\",\n", - " selection_algorithm=\"random\",\n", - " nb_iterations=1,\n", - " fraction_missing=0.5,\n", - " max_depth=15,\n", - " regression_max_depth=25,\n", - ")\n", - "\n", - "m_mrai.fit(train, nominal_attributes={7})" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "Now, we'll epxlicitly add our previous composition to this new mercs model. **Note that this new mercs model is 100% oblivious** about the true nature of this new component, it just treats it as if it was any other model/graph that it possseses." - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "m_mrai._add_model(q_model)" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "y_pred_02 = m_mrai.predict(test, q_code=q_code)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "G\n", - "\n", - "\n", - "\n", - "('D', 0)\n", - "\n", - "('D', 0)\n", - "\n", - "\n", - "\n", - "('M', 8)\n", - "\n", - "('M', 8)\n", - "\n", - "\n", - "\n", - "('D', 0)->('M', 8)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 7)\n", - "\n", - "('D', 7)\n", - "\n", - "\n", - "\n", - "('M', 8)->('D', 7)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 1)\n", - "\n", - "('D', 1)\n", - "\n", - "\n", - "\n", - "('D', 1)->('M', 8)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 6)\n", - "\n", - "('D', 6)\n", - "\n", - "\n", - "\n", - "('D', 6)->('M', 8)\n", - "\n", - "\n", - "\n", - "\n", - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "m_mrai.show_q_diagram()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# IT\n", - "\n", - "Let us verify that `M-8` is really 100% a model on par with the other building blocks and see if it can get picked as a component when making fresh compositions." - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "q_code = np.array([0, 0, -1, -1, -1, -1, 0, 1])\n", - "\n", - "q_code = np.array([0, 1, 0, 0, 0, 0, 0, 0])\n", - "\n", - "q_code = np.array([1,0,0,-1,-1,-1,0,1])\n", - "\n", - "m_it = Mercs(random_state=RANDOM_STATE,\n", - " prediction_algorithm='it',\n", - " clf_criterion='entropy',\n", - " rgr_criterion='mae',\n", - " selection_algorithm='random',\n", - " nb_iterations=3,\n", - " fraction_missing=0.5,\n", - " max_depth=15,\n", - " regression_max_depth=25)\n", - "\n", - "m_it.fit(train, nominal_attributes={7})\n", - "\n", - "m_it._add_model(q_model)" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "The ID of the composite model is: 24\n", - "\n" - ] - } - ], - "source": [ - "msg = \"\"\"\n", - "The ID of the composite model is: {}\n", - "\"\"\".format(len(m_it.m_list)-1)\n", - "print(msg)" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "G\n", - "\n", - "\n", - "\n", - "('I', 0)\n", - "\n", - "('I', 0)\n", - "\n", - "\n", - "\n", - "('M', 24)\n", - "\n", - "('M', 24)\n", - "\n", - "\n", - "\n", - "('I', 0)->('M', 24)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 7)\n", - "\n", - "('D', 7)\n", - "\n", - "\n", - "\n", - "('M', 24)->('D', 7)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 1)\n", - "\n", - "('D', 1)\n", - "\n", - "\n", - "\n", - "('D', 1)->('M', 24)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('M', 1)\n", - "\n", - "('M', 1)\n", - "\n", - "\n", - "\n", - "('D', 1)->('M', 1)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('M', 19)\n", - "\n", - "('M', 19)\n", - "\n", - "\n", - "\n", - "('D', 1)->('M', 19)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 6)\n", - "\n", - "('D', 6)\n", - "\n", - "\n", - "\n", - "('D', 6)->('M', 24)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('M', 10)\n", - "\n", - "('M', 10)\n", - "\n", - "\n", - "\n", - "('D', 7)->('M', 10)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 2)\n", - "\n", - "('D', 2)\n", - "\n", - "\n", - "\n", - "('D', 2)->('M', 1)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 2)->('M', 10)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('I', 3)\n", - "\n", - "('I', 3)\n", - "\n", - "\n", - "\n", - "('I', 3)->('M', 19)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('I', 5)\n", - "\n", - "('I', 5)\n", - "\n", - "\n", - "\n", - "('I', 5)->('M', 1)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('I', 5)->('M', 19)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 0)\n", - "\n", - "('D', 0)\n", - "\n", - "\n", - "\n", - "('M', 1)->('D', 0)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('M', 10)->('D', 0)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('M', 19)->('D', 0)\n", - "\n", - "\n", - "\n", - "\n", - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "y_pred_03 = m_it.predict(test, q_code=q_code)\n", - "\n", - "m_it.show_q_diagram()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "ERROR:root:No traceback has been produced, nothing to debug.\n" - ] - } - ], - "source": [ - "%debug" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "j-rwrf", - "language": "python", - "name": "j-rwrf" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - }, - "toc-autonumbering": true - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/implementation/random-walks/recursion.ipynb b/note/implementation/random-walks/recursion.ipynb deleted file mode 100644 index 1e75a4f..0000000 --- a/note/implementation/random-walks/recursion.ipynb +++ /dev/null @@ -1,901 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Random Walks \n", - "\n", - "Once again, a notebook dedicated to the ultimate Random Walks implementation." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Preliminaries" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import networkx as nx" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from mercs import Mercs\n", - "from mercs.tests.setup import default_dataset\n", - "from mercs.composition import CompositeModel\n", - "from mercs.graph import model_to_graph\n", - "from mercs.graph import compose_all, add_merge_nodes\n", - "from mercs.algo.inference import dask_inference_algorithm" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Train" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "m_small = Mercs(\n", - " random_state=100,\n", - " prediction_algorithm=\"it\",\n", - " clf_criterion=\"entropy\",\n", - " rgr_criterion=\"mae\",\n", - " selection_algorithm=\"random\",\n", - " nb_iterations=5,\n", - " fraction_missing=0.5,\n", - " max_depth=4,\n", - " regression_max_depth=4,\n", - ")\n", - "\n", - "X_train, X_test = default_dataset()\n", - "\n", - "m_small.fit(X_train, nominal_attributes={7})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## IT" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "G\n", - "\n", - "\n", - "d-00\n", - "\n", - "d-00\n", - "\n", - "\n", - "f-20\n", - "\n", - "f-20\n", - "\n", - "\n", - "d-00->f-20\n", - "\n", - "\n", - "\n", - "\n", - "f-36\n", - "\n", - "f-36\n", - "\n", - "\n", - "d-00->f-36\n", - "\n", - "\n", - "\n", - "\n", - "d-02\n", - "\n", - "d-02\n", - "\n", - "\n", - "d-02->f-20\n", - "\n", - "\n", - "\n", - "\n", - "f-07\n", - "\n", - "f-07\n", - "\n", - "\n", - "d-02->f-07\n", - "\n", - "\n", - "\n", - "\n", - "f-18\n", - "\n", - "f-18\n", - "\n", - "\n", - "d-02->f-18\n", - "\n", - "\n", - "\n", - "\n", - "d-03\n", - "\n", - "d-03\n", - "\n", - "\n", - "d-03->f-07\n", - "\n", - "\n", - "\n", - "\n", - "f-24\n", - "\n", - "f-24\n", - "\n", - "\n", - "d-03->f-24\n", - "\n", - "\n", - "\n", - "\n", - "f-20->d-03\n", - "\n", - "\n", - "\n", - "\n", - "d-01\n", - "\n", - "d-01\n", - "\n", - "\n", - "d-01->f-36\n", - "\n", - "\n", - "\n", - "\n", - "d-01->f-24\n", - "\n", - "\n", - "\n", - "\n", - "d-01->f-18\n", - "\n", - "\n", - "\n", - "\n", - "d-06\n", - "\n", - "d-06\n", - "\n", - "\n", - "d-06->f-07\n", - "\n", - "\n", - "\n", - "\n", - "d-06->f-24\n", - "\n", - "\n", - "\n", - "\n", - "d-06->f-18\n", - "\n", - "\n", - "\n", - "\n", - "f-36->d-06\n", - "\n", - "\n", - "\n", - "\n", - "I(d-04)\n", - "\n", - "I(d-04)\n", - "\n", - "\n", - "I(d-04)->f-36\n", - "\n", - "\n", - "\n", - "\n", - "d-05\n", - "\n", - "d-05\n", - "\n", - "\n", - "d-05->f-18\n", - "\n", - "\n", - "\n", - "\n", - "f-07->d-05\n", - "\n", - "\n", - "\n", - "\n", - "d-04\n", - "\n", - "d-04\n", - "\n", - "\n", - "d-04->f-18\n", - "\n", - "\n", - "\n", - "\n", - "f-24->d-04\n", - "\n", - "\n", - "\n", - "\n", - "d-07\n", - "\n", - "d-07\n", - "\n", - "\n", - "p-07\n", - "\n", - "p-07\n", - "\n", - "\n", - "f-18->p-07\n", - "\n", - "\n", - "\n", - "\n", - "v-07\n", - "\n", - "v-07\n", - "\n", - "\n", - "p-07->v-07\n", - "\n", - "\n", - "\n", - "\n", - "v-07->d-07\n", - "\n", - "\n", - "\n", - "\n", - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "q_code = np.array([0, 0, 0, -1, -1, -1, -1, 1])\n", - "\n", - "y_pred = m_small.predict(X_test, q_code=q_code, prediction_algorithm=\"it-new\")\n", - "m_small.show_q_diagram()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0., 1., 0., 1., 0., 0., 1.,\n", - " 0., 1., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0., 1.,\n", - " 0., 0., 0., 1., 0., 0., 0., 0., 1., 0., 0., 0., 1., 0., 0., 0., 1.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 0., 1., 0., 0., 0.,\n", - " 0., 1., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 1., 1.,\n", - " 0., 1., 0., 1., 1., 0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 1., 0., 0., 0., 0., 1., 0., 1., 0., 0., 1., 0., 1., 0.,\n", - " 0., 1., 0., 1., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 1., 0.,\n", - " 0., 1., 0., 1., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 1., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 1.])" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y_pred" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## RW" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['d-01', 'd-02', 'd-03', 'd-07', 'd-06', 'f-06']\n", - "{1, 2, 3, 7} {6}\n", - "['d-00', 'd-04', 'd-06', 'd-07', 'f-10', 'p-07', 'v-07']\n", - "{0, 4, 6} {7}\n", - "['d-00', 'd-01', 'd-04', 'd-06', 'd-07', 'd-03', 'f-33']\n", - "{0, 1, 4, 6, 7} {3}\n", - "['d-00', 'd-01', 'd-03', 'd-05', 'd-06', 'd-07', 'f-29', 'p-07', 'v-07']\n", - "{0, 1, 3, 5, 6} {7}\n" - ] - }, - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "G\n", - "\n", - "\n", - "d-00\n", - "\n", - "d-00\n", - "\n", - "\n", - "c-00\n", - "\n", - "c-00\n", - "\n", - "\n", - "d-00->c-00\n", - "\n", - "\n", - "\n", - "\n", - "c-01\n", - "\n", - "c-01\n", - "\n", - "\n", - "d-00->c-01\n", - "\n", - "\n", - "\n", - "\n", - "d-02\n", - "\n", - "d-02\n", - "\n", - "\n", - "d-02->c-00\n", - "\n", - "\n", - "\n", - "\n", - "d-07\n", - "\n", - "d-07\n", - "\n", - "\n", - "p-07\n", - "\n", - "p-07\n", - "\n", - "\n", - "c-00->p-07\n", - "\n", - "\n", - "\n", - "\n", - "v-07\n", - "\n", - "v-07\n", - "\n", - "\n", - "p-07->v-07\n", - "\n", - "\n", - "\n", - "\n", - "v-07->d-07\n", - "\n", - "\n", - "\n", - "\n", - "c-01->p-07\n", - "\n", - "\n", - "\n", - "\n", - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "q_code = np.array([0, -1, 0, -1, -1, -1, -1, 1])\n", - "y_pred = m_small.predict(X_test, q_code=q_code, prediction_algorithm=\"rw-new\", max_steps=2, nb_walks=2, random_state=601)\n", - "m_small.show_q_diagram()" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "NodeView(('d-02', 'd-06', 'f-06', 'I(d-01)', 'I(d-03)', 'I(d-07)', 'd-00', 'd-07', 'f-10', 'p-07', 'v-07', 'I(d-04)'))" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m_small.q_diagrams[0].nodes()" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "NodeView(('d-00', 'd-03', 'f-33', 'I(d-06)', 'I(d-01)', 'I(d-07)', 'I(d-04)', 'd-07', 'f-29', 'p-07', 'v-07', 'I(d-05)'))" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m_small.q_diagrams[1].nodes()" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[0.25423729, 0.74576271],\n", - " [0.25423729, 0.74576271],\n", - " [0.25423729, 0.74576271],\n", - " [0. , 1. ],\n", - " [0. , 1. ],\n", - " [0.25423729, 0.74576271],\n", - " [0. , 1. ],\n", - " [0. , 1. ],\n", - " [0.25423729, 0.74576271],\n", - " [0.25423729, 0.74576271]])" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m_small.q_models[0].predict_proba.compute()[:10]" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[1. , 0. ],\n", - " [1. , 0. ],\n", - " [1. , 0. ],\n", - " [0.36904762, 0.63095238],\n", - " [0.36904762, 0.63095238],\n", - " [1. , 0. ],\n", - " [0.36904762, 0.63095238],\n", - " [0.36904762, 0.63095238],\n", - " [1. , 0. ],\n", - " [1. , 0. ]])" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m_small.q_models[1].predict_proba.compute()[:10]" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[1.25423729, 0.74576271],\n", - " [1.25423729, 0.74576271],\n", - " [1.25423729, 0.74576271],\n", - " [0.36904762, 1.63095238],\n", - " [0.36904762, 1.63095238],\n", - " [1.25423729, 0.74576271],\n", - " [0.36904762, 1.63095238],\n", - " [0.36904762, 1.63095238],\n", - " [1.25423729, 0.74576271],\n", - " [1.25423729, 0.74576271]])" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m_small.q_model.predict_proba.compute()[:10]" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0., 0., 0., 1., 1., 0., 1., 1., 0., 0., 1., 1., 1., 1., 1., 1., 1.,\n", - " 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1., 0., 1.,\n", - " 1., 1., 0., 1., 1., 0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 0., 1.,\n", - " 1., 0., 1., 1., 0., 1., 0., 1., 1., 1., 1., 1., 1., 0., 1., 1., 0.,\n", - " 0., 0., 1., 1., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 1.,\n", - " 0., 1., 0., 0., 1., 0., 1., 1., 0., 1., 1., 0., 1., 0., 0., 1., 1.,\n", - " 1., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 0., 1., 1., 0.,\n", - " 1., 0., 1., 1., 1., 1., 0., 1., 0., 0., 1., 1., 0., 1., 0., 1., 0.,\n", - " 0., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 0., 0., 0., 0., 1., 1.,\n", - " 1., 1., 1., 1., 1., 0., 1., 0., 0., 1., 1., 0., 1., 1., 0., 1., 1.,\n", - " 1., 0., 1., 0., 1., 1., 1., 1., 0., 1., 1., 1., 1., 0., 1., 1., 1.,\n", - " 1., 1., 1., 0., 1., 1., 1., 1., 0., 1., 1., 1., 1.])" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y_pred" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Recursion" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "cm = CompositeModel(m_small.q_diagram)\n", - "types = m_small._get_types(m_small.metadata)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0., 0., 0., 1., 1., 0., 1., 1., 0., 0., 1., 1., 1., 1., 1., 1., 1.,\n", - " 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1., 0., 1.,\n", - " 1., 1., 0., 1., 1., 0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 0., 1.,\n", - " 1., 0., 1., 1., 0., 1., 0., 1., 1., 1., 1., 1., 1., 0., 1., 1., 0.,\n", - " 0., 0., 1., 1., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 1.,\n", - " 0., 1., 0., 0., 1., 0., 1., 1., 0., 1., 1., 0., 1., 0., 0., 1., 1.,\n", - " 1., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 0., 1., 1., 0.,\n", - " 1., 0., 1., 1., 1., 1., 0., 1., 0., 0., 1., 1., 0., 1., 0., 1., 0.,\n", - " 0., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 0., 0., 0., 0., 1., 1.,\n", - " 1., 1., 1., 1., 1., 0., 1., 0., 0., 1., 1., 0., 1., 1., 0., 1., 1.,\n", - " 1., 0., 1., 0., 1., 1., 1., 1., 0., 1., 1., 1., 1., 0., 1., 1., 1.,\n", - " 1., 1., 1., 0., 1., 1., 1., 1., 0., 1., 1., 1., 1.])" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cm.predict.compute()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'kind': 'data',\n", - " 'idx': 7,\n", - " 'tgt': [7],\n", - " 'type': 'nominal',\n", - " 'shape': '\"circle\"',\n", - " 'dask': Delayed('select-570b82a9-dca6-48a0-9034-186b3a60980e')}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m_small.q_diagram.nodes['d-07']" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "g1 = model_to_graph(cm, types, idx=99, composition=True)\n", - "g2 = model_to_graph(cm, types, idx=100, composition=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def collapse_graph(g, types, idx=0):\n", - " dask_inference_algorithm(g, X=None, sorted_nodes=None)\n", - " cm = CompositeModel(g_walk)\n", - " return model_to_graph(cm, types, idx=idx, composition=True)\n", - "\n", - "def filter_nodes(g):\n", - " sorted_nodes = list(nx.topological_sort(g))\n", - " filtered_nodes = []\n", - " for n in reversed(sorted_nodes):\n", - " if g.nodes[n][\"kind\"] == 'model': break\n", - " filtered_nodes.append(n)\n", - " filtered_nodes = list(reversed(filtered_nodes))\n", - " return filtered_nodes" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def merge_walks(walks):\n", - " g = compose_all(walks)\n", - " filtered_nodes = filter_nodes(g)\n", - "\n", - " dask_inference_algorithm(g, sorted_nodes=filtered_nodes)\n", - " return g" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'collapse_walk' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mwalks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mcollapse_walk\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg_walk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtypes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0midx\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0midx\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0midx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg_walk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mm_small\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mq_diagram\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmerge_walks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwalks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mwalks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mcollapse_walk\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg_walk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtypes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0midx\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0midx\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0midx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg_walk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mm_small\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mq_diagram\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmerge_walks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwalks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'collapse_walk' is not defined" - ] - } - ], - "source": [ - "walks = [collapse_walk(g_walk, types, idx=idx+100) for idx, g_walk in enumerate([m_small.q_diagram]*20)]\n", - "g = merge_walks(walks)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "g.nodes['p-07']['dask'].compute()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "o = g1.nodes['c-99']\n", - "o" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for n,d in m_small.q_diagram.nodes(data=True):\n", - " if d.get(\"function\", None) is not None:\n", - " print(n)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "g = compose_all([g1,g2])\n", - "g.nodes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sorted_nodes = list(nx.topological_sort(g))\n", - "sorted_nodes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "g.nodes['c-99']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "filtered_nodes = []\n", - "for n in reversed(sorted_nodes):\n", - " if g.nodes[n][\"kind\"] == 'model': break\n", - " filtered_nodes.append(n)\n", - "filtered_nodes = list(reversed(filtered_nodes))\n", - "filtered_nodes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "functions = dask_inference_algorithm(g, sorted_nodes=filtered_nodes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "g.nodes['p-07'][\"dask\"].compute()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "functions['p-07'].compute()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.4" - }, - "toc-autonumbering": true, - "toc-showcode": false, - "toc-showtags": false - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/implementation/sel-algo.ipynb b/note/implementation/sel-algo.ipynb deleted file mode 100644 index 0bb85f3..0000000 --- a/note/implementation/sel-algo.ipynb +++ /dev/null @@ -1,260 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Selection Algorithm" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "import numpy as np\n", - "\n", - "from mercs.algo.selection import _set_missing, _ensure_desc_atts, _set_nb_targets\n", - "\n", - "TARG_ENCODING = 1" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "def _nb_models_and_deficit(nb_targets, potential_targets):\n", - " \n", - " nb_potential_targets = potential_targets.shape[0]\n", - " \n", - " nb_models_with_regular_nb_targets = nb_potential_targets // nb_targets\n", - " nb_leftover_targets = nb_potential_targets % nb_targets\n", - " \n", - " if nb_leftover_targets:\n", - " nb_models = nb_models_with_regular_nb_targets + 1\n", - " deficit = nb_targets - nb_leftover_targets\n", - " else:\n", - " nb_models = nb_models_with_regular_nb_targets\n", - " deficit = 0\n", - " \n", - " return nb_models, deficit\n", - "\n", - "def _init(nb_models, nb_attributes):\n", - " return np.zeros((nb_models, nb_attributes), dtype=int) \n", - "\n", - "def _target_sets(potential_targets, nb_targets, nb_models, deficit):\n", - " np.random.shuffle(potential_targets)\n", - " choices = np.r_[potential_targets, potential_targets[:deficit]]\n", - " \n", - " return np.random.choice(choices, replace=False, size=(nb_models, nb_targets))\n", - "\n", - "def _set_targets(m_codes, target_sets):\n", - " \n", - " row_idx = np.arange(m_codes.shape[0]).reshape(-1,1)\n", - " col_idx = target_sets\n", - " \n", - " m_codes[row_idx, col_idx] = TARG_ENCODING\n", - " return m_codes\n", - "\n", - "\n", - "def _single_iteration_random_selection(nb_attributes, nb_targets, fraction_missing, potential_targets):\n", - " nb_models, deficit = _nb_models_and_deficit(nb_targets, potential_targets)\n", - "\n", - " # Init\n", - " m_codes = _init(nb_models, nb_attributes)\n", - "\n", - " target_sets = _target_sets(potential_targets, nb_targets, nb_models, deficit)\n", - "\n", - " m_codes = _set_targets(m_codes, target_sets)\n", - " m_codes = _set_missing(m_codes, fraction_missing)\n", - " m_codes.astype(int)\n", - " return m_codes" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "def base_selection_algorithm(metadata, nb_targets=1, nb_iterations=1, random_state=997):\n", - " m_codes = random_selection_algorithm(metadata, nb_targets=nb_targets, nb_iterations=nb_iterations, fraction_missing=0., random_state=random_state)\n", - " return m_codes" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "def random_selection_algorithm(metadata, nb_targets=1, nb_iterations=1, fraction_missing=0.2, random_state=997):\n", - " \n", - " # Init\n", - " np.random.seed(random_state)\n", - " nb_attributes = metadata[\"n_attributes\"]\n", - " nb_targets = _set_nb_targets(nb_targets, nb_attributes)\n", - "\n", - " codes = []\n", - " for attribute_kind in {'nominal_attributes', 'numeric_attributes'}:\n", - " potential_targets = np.array(list(metadata[attribute_kind]))\n", - " for iterations in range(nb_iterations):\n", - " m_codes = _single_iteration_random_selection(nb_attributes, nb_targets, fraction_missing, potential_targets)\n", - " codes.append(m_codes)\n", - "\n", - " m_codes = np.vstack(codes)\n", - " \n", - " m_codes = ensure_desc_atts(m_codes)\n", - " return m_codes" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'n_attributes': 10,\n", - " 'nominal_attributes': {0},\n", - " 'numeric_attributes': {7, 8, 9}}" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "metadata" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "metadata={'n_attributes': 10,\n", - " 'nominal_attributes': {0,1,2,3,4,5,6},\n", - " 'numeric_attributes': {7, 8, 9}}" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[0., 0., 0., 0., 0., 0., 0., 1., 0., 1.],\n", - " [0., 0., 0., 0., 0., 0., 0., 0., 1., 1.],\n", - " [0., 0., 0., 1., 0., 1., 0., 0., 0., 0.],\n", - " [0., 0., 1., 0., 0., 0., 1., 0., 0., 0.],\n", - " [0., 0., 1., 0., 1., 0., 0., 0., 0., 0.],\n", - " [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.]])" - ] - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m_codes = base_selection_algorithm(metadata, nb_targets=2, nb_iterations=1, random_state=3)\n", - "m_codes" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([7, 8, 9, 0, 2, 5, 1, 4, 6, 0, 3, 4])" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.where(m_codes==1)[1]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/implementation/shap-demo.ipynb b/note/implementation/shap-demo.ipynb deleted file mode 100644 index 8d059c4..0000000 --- a/note/implementation/shap-demo.ipynb +++ /dev/null @@ -1,451 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Testing Shap Values" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Preliminaries" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "import shap\n", - "from mercs import Mercs\n", - "import numpy as np\n", - "import pandas as pd" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Setup" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "Collapsed": "false", - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(800, 8)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n", - "Setting feature_perturbation = \"tree_path_dependent\" because no background data was given.\n" - ] - } - ], - "source": [ - "from mercs.tests.setup import RANDOM_STATE, default_dataset\n", - "\n", - "train, test = default_dataset()\n", - "print(train.shape)\n", - "\n", - "q_code = np.array([-1, -1, -1, -1, 0, 0, 0, 1])\n", - "m_basic = Mercs(\n", - " random_state=RANDOM_STATE,\n", - " prediction_algorithm=\"it\",\n", - " evaluation_algorithm=\"dummy\",\n", - " selection_algorithm=\"random\",\n", - " stepsize=0.1,\n", - " nb_iterations=10,\n", - " fraction_missing=0.4,\n", - " max_depth=4,\n", - " calculation_method_feature_importances=\"shap\",\n", - ")\n", - "\n", - "m_basic.fit(train, nominal_attributes={7})\n", - "y_pred_01 = m_basic.predict(test, q_code=q_code)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "dt = m_basic.m_list[0].model\n", - "desc_ids, targ_ids = m_basic.m_list[0].desc_ids, m_basic.m_list[0].targ_ids" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "G\n", - "\n", - "\n", - "('D', 5)\n", - "\n", - "('D', 5)\n", - "\n", - "\n", - "('M', 36)\n", - "\n", - "('M', 36)\n", - "\n", - "\n", - "('D', 5)->('M', 36)\n", - "\n", - "\n", - "\n", - "\n", - "('M', 75)\n", - "\n", - "('M', 75)\n", - "\n", - "\n", - "('D', 5)->('M', 75)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 1)\n", - "\n", - "('D', 1)\n", - "\n", - "\n", - "('M', 36)->('D', 1)\n", - "\n", - "\n", - "\n", - "\n", - "('M', 14)\n", - "\n", - "('M', 14)\n", - "\n", - "\n", - "('D', 1)->('M', 14)\n", - "\n", - "\n", - "\n", - "\n", - "('M', 28)\n", - "\n", - "('M', 28)\n", - "\n", - "\n", - "('D', 1)->('M', 28)\n", - "\n", - "\n", - "\n", - "\n", - "('M', 70)\n", - "\n", - "('M', 70)\n", - "\n", - "\n", - "('D', 1)->('M', 70)\n", - "\n", - "\n", - "\n", - "\n", - "('M', 79)\n", - "\n", - "('M', 79)\n", - "\n", - "\n", - "('D', 1)->('M', 79)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 3)\n", - "\n", - "('D', 3)\n", - "\n", - "\n", - "('M', 14)->('D', 3)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 4)\n", - "\n", - "('D', 4)\n", - "\n", - "\n", - "('D', 4)->('M', 14)\n", - "\n", - "\n", - "\n", - "\n", - "('M', 74)\n", - "\n", - "('M', 74)\n", - "\n", - "\n", - "('D', 4)->('M', 74)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 4)->('M', 75)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 6)\n", - "\n", - "('D', 6)\n", - "\n", - "\n", - "('D', 6)->('M', 14)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 6)->('M', 28)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 6)->('M', 74)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 6)->('M', 75)\n", - "\n", - "\n", - "\n", - "\n", - "('I', 7)\n", - "\n", - "('I', 7)\n", - "\n", - "\n", - "('I', 7)->('M', 14)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 0)\n", - "\n", - "('D', 0)\n", - "\n", - "\n", - "('M', 28)->('D', 0)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 3)->('M', 70)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 3)->('M', 74)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 3)->('M', 75)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 3)->('M', 79)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 0)->('M', 70)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 0)->('M', 75)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 0)->('M', 79)\n", - "\n", - "\n", - "\n", - "\n", - "('D', 7)\n", - "\n", - "('D', 7)\n", - "\n", - "\n", - "('M', 70)->('D', 7)\n", - "\n", - "\n", - "\n", - "\n", - "('M', 74)->('D', 7)\n", - "\n", - "\n", - "\n", - "\n", - "('M', 75)->('D', 7)\n", - "\n", - "\n", - "\n", - "\n", - "('M', 79)->('D', 7)\n", - "\n", - "\n", - "\n", - "\n", - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "m_basic.show_q_diagram()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "j-rwrf", - "language": "python", - "name": "j-rwrf" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - }, - "toc-autonumbering": true - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/integrations/Untitled.ipynb b/note/integrations/Untitled.ipynb deleted file mode 100644 index be924c9..0000000 --- a/note/integrations/Untitled.ipynb +++ /dev/null @@ -1,312 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test on Large StarAI DS\n", - "\n", - "Sanity check to assess performance and to make sure I do not make mortal mistakes." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import mercs\n", - "import numpy as np\n", - "\n", - "import os\n", - "import pandas as pd\n", - "\n", - "from mercs.core import Mercs\n", - "from os.path import dirname" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Setup" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "root = dirname(dirname(os.getcwd()))\n", - "data = os.path.join(root, 'data', 'step-01')\n", - "\n", - "ds = 'ad'\n", - "fns = ['{}-train.csv'.format(ds), '{}-test.csv'.format(ds)]\n", - "\n", - "train = pd.read_csv(os.path.join(data, fns[0]), header=None).values\n", - "test = pd.read_csv(os.path.join(data,fns[1]), header=None).values" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "clf = Mercs(\n", - " max_depth=16,\n", - " selection_algorithm=\"random\",\n", - " fraction_missing=0.3,\n", - " nb_targets=4,\n", - " nb_iterations=4,\n", - " n_jobs=8,\n", - " verbose=1,\n", - " inference_algorithm=\"dask\",\n", - " max_steps=8,\n", - " prediction_algorithm=\"it\",\n", - " random_state=800\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "nominal_attributes = set(range(train.shape[1]))" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/cw/dtailocal/repos/mercs/src/mercs/algo/induction.py:100: UserWarning: \n", - " Training is being parallellized using Joblib. Number of jobs = 8\n", - " \n", - " warnings.warn(msg)\n", - "[Parallel(n_jobs=8)]: Using backend LokyBackend with 8 concurrent workers.\n", - "[Parallel(n_jobs=8)]: Done 34 tasks | elapsed: 4.1s\n", - "[Parallel(n_jobs=8)]: Done 184 tasks | elapsed: 7.7s\n", - "[Parallel(n_jobs=8)]: Done 434 tasks | elapsed: 13.3s\n", - "[Parallel(n_jobs=8)]: Done 784 tasks | elapsed: 21.6s\n", - "[Parallel(n_jobs=8)]: Done 1234 tasks | elapsed: 32.1s\n", - "[Parallel(n_jobs=8)]: Done 1556 out of 1556 | elapsed: 39.3s finished\n" - ] - } - ], - "source": [ - "clf.fit(train, nominal_attributes=nominal_attributes)" - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [ - "import dill as pkl\n", - "\n", - "with open('file-all.pkl', 'wb') as f:\n", - " pkl.dump(clf, f)\n", - " \n", - "del clf.m_list\n", - "\n", - "with open('file-nomodels.pkl', 'wb') as f:\n", - " pkl.dump(clf, f)\n", - " \n", - "del clf.m_codes\n", - "\n", - "with open('file-nocodes.pkl', 'wb') as f:\n", - " pkl.dump(clf, f)\n", - " \n", - "del clf.m_fimps\n", - "del clf.m_score\n", - "\n", - "with open('file-nonothing.pkl', 'wb') as f:\n", - " pkl.dump(clf, f)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "from joblib import dump, load\n", - "import blosc\n", - "import dill as pkl" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "with open('dill.pkl', 'wb') as f:\n", - " pkl.dump(clf, f, protocol=4) " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "30 s ± 540 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" - ] - } - ], - "source": [ - "dump(clf, 'model.lz4', compress='lz4') " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "clf.m_codes = blosc.pack_array(clf.m_codes)\n", - "clf.m_score = blosc.pack_array(clf.m_score)\n", - "clf.m_fimps = blosc.pack_array(clf.m_fimps)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "%timeit clf = load('model.lz4') " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "with open('dill.pkl', 'wb') as f:\n", - " pkl.dump(clf, f, protocol=4) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.4" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/integrations/graph-tool.ipynb b/note/integrations/graph-tool.ipynb deleted file mode 100644 index 31dbb2c..0000000 --- a/note/integrations/graph-tool.ipynb +++ /dev/null @@ -1,476 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/elia/miniconda3/envs/mercs/lib/python3.7/site-packages/graph_tool/all.py:40: RuntimeWarning: Error importing draw module, proceeding nevertheless: /home/elia/miniconda3/envs/mercs/lib/python3.7/site-packages/graph_tool/draw/libgraph_tool_draw.so: undefined symbol: _ZN5Cairo7Context9show_textERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE\n", - " warnings.warn(msg, RuntimeWarning)\n" - ] - } - ], - "source": [ - "from graph_tool.all import *" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0, 1])" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "g = Graph()\n", - "v1 = g.add_vertex()\n", - "v2 = g.add_vertex()\n", - "e = g.add_edge(v1, v2)\n", - "\n", - "g.get_vertices()" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])" - ] - }, - "execution_count": 82, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "g = Graph()\n", - "v1 = g.add_vertex()\n", - "v2 = g.add_vertex()\n", - "\n", - "e = g.add_edge(v1, v2)\n", - "\n", - "e = g.add_edge(3,10)\n", - "\n", - "g.get_vertices()" - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n", - " 17, 18, 19, 20, 21])" - ] - }, - "execution_count": 83, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "g.add_vertex(11)\n", - "g.get_vertices()" - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 1\n", - "3 10\n" - ] - } - ], - "source": [ - "for e in g.edges():\n", - " print(e.source(), e.target())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "130 µs ± 300 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "g = Graph()\n", - "v1 = g.add_vertex(10**4)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "v1 = g.add_vertex()\n", - "v2 = g.add_vertex()" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "g.vertex(8)" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "g.get_vertices()" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "g.vertex(7)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n" - ] - } - ], - "source": [ - "print(v1.out_degree())" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3 8\n" - ] - } - ], - "source": [ - "print(e.source(), e.target())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Add Edges" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "g = Graph()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "idx = g.new_vertex_property(\"int\")\n", - "kind = g.new_vertex_property(\"string\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v2" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "kind = \"M\"" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "26.2 ns ± 0.182 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "kind == 'M'" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "model=True" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "17.5 ns ± 0.0705 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "model " - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "metadata": {}, - "outputs": [], - "source": [ - "g = Graph()\n", - "nb_iterations = 2\n", - "nb_attributes = 10**1\n", - "nb_models = nb_iterations * nb_attributes\n", - "\n", - "nb_vertices = nb_attributes + nb_models\n", - "\n", - "g = Graph()\n", - "v = g.add_vertex(nb_vertices)\n", - "\n", - "idx = g.new_vertex_property(\"int\")\n", - "kind = g.new_vertex_property(\"string\")\n", - "\n", - "\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for m_idx, m in m_list" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'NoneType' object does not support item assignment", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mkind\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mnb_attributes\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'data'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'NoneType' object does not support item assignment" - ] - } - ], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for attribute in range(nb_attributes):\n", - " \n", - " pass\n", - "\n", - "for model in range(nb_models):\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.4" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/integrations/model.lz4 b/note/integrations/model.lz4 deleted file mode 100644 index 22d39da..0000000 Binary files a/note/integrations/model.lz4 and /dev/null differ diff --git a/note/integrations/test-new.ipynb b/note/integrations/test-new.ipynb deleted file mode 100644 index 2121852..0000000 --- a/note/integrations/test-new.ipynb +++ /dev/null @@ -1,700 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Towards Scalability\n", - "\n", - "Integration test of some more recent innovations in MERCS in order to make it scale to datasets in the region of 10**3 attributes." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Prelims" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "import mercs\n", - "import numpy as np\n", - "from mercs.tests import load_iris, default_dataset\n", - "from mercs.core import Mercs" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Setup" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Sandbox" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Fit" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "train, test = default_dataset(n_features=100)\n", - "\n", - "clf = Mercs(\n", - " max_depth=8,\n", - " selection_algorithm=\"random\",\n", - " fraction_missing=0.3,\n", - " nb_targets=5,\n", - " nb_iterations=40,\n", - " n_jobs=8,\n", - " verbose=1,\n", - " inference_algorithm=\"ndask\",\n", - " max_steps=8,\n", - " prediction_algorithm=\"vit\",\n", - " random_state=800\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/cw/dtailocal/repos/mercs/src/mercs/algo/induction.py:100: UserWarning: \n", - " Training is being parallellized using Joblib. Number of jobs = 8\n", - " \n", - " warnings.warn(msg)\n", - "[Parallel(n_jobs=8)]: Using backend LokyBackend with 8 concurrent workers.\n", - "[Parallel(n_jobs=8)]: Done 34 tasks | elapsed: 2.1s\n", - "[Parallel(n_jobs=8)]: Done 569 tasks | elapsed: 5.1s\n", - "[Parallel(n_jobs=8)]: Done 825 out of 840 | elapsed: 6.5s remaining: 0.1s\n", - "[Parallel(n_jobs=8)]: Done 840 out of 840 | elapsed: 6.6s finished\n" - ] - } - ], - "source": [ - "clf.fit(train, nominal_attributes={train.shape[1]-1})" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "## Predict\n", - "\n", - "Now the more challeging part." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n", - " -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],\n", - " dtype=int8)" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q_code = np.zeros(test.shape[1], dtype=np.int8)\n", - "q_code[-2:] = 1\n", - "\n", - "percentage_missing = 0.2\n", - "\n", - "q_code[0:int(q_code.shape[0]*percentage_missing)] = -1\n", - "q_code" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "y_pred = clf.predict(test, q_code=q_code, beta=True, prediction_algorithm=\"vmi\", max_steps=1,) " - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 0.78222369, 1. ],\n", - " [-0.89673495, 0. ],\n", - " [-0.06850258, 0. ],\n", - " [-0.05679976, 1. ],\n", - " [-0.22353182, 0. ],\n", - " [-0.76430179, 1. ],\n", - " [-1.10348502, 0. ],\n", - " [-0.28936421, 1. ],\n", - " [-1.15360028, 1. ],\n", - " [ 0.03813297, 1. ],\n", - " [ 0.59157194, 1. ],\n", - " [ 0.29846669, 1. ],\n", - " [ 0.59923386, 0. ],\n", - " [ 0.09757691, 1. ],\n", - " [-0.59856471, 1. ],\n", - " [-0.79036176, 1. ],\n", - " [-1.00834355, 1. ],\n", - " [-1.04441468, 1. ],\n", - " [-0.61165098, 1. ],\n", - " [-0.24555098, 1. ],\n", - " [-0.06088563, 0. ],\n", - " [-1.40852268, 1. ],\n", - " [-1.0692894 , 1. ],\n", - " [ 0.37180343, 0. ],\n", - " [ 1.08615256, 0. ],\n", - " [-0.03411427, 1. ],\n", - " [-1.75818665, 0. ],\n", - " [-0.42872755, 1. ],\n", - " [ 0.36558583, 1. ],\n", - " [ 0.21909573, 0. ],\n", - " [-1.26062667, 0. ],\n", - " [-0.41296943, 0. ],\n", - " [-1.38000115, 1. ],\n", - " [-0.06750432, 1. ],\n", - " [-0.32418396, 1. ],\n", - " [-0.84691259, 1. ],\n", - " [ 0.23633529, 1. ],\n", - " [-0.51343523, 1. ],\n", - " [ 0.01720975, 1. ],\n", - " [-0.36993461, 1. ],\n", - " [ 0.13509558, 1. ],\n", - " [-1.15505503, 1. ],\n", - " [-1.45321989, 1. ],\n", - " [-1.02017282, 0. ],\n", - " [-0.78510503, 0. ],\n", - " [-1.18381206, 1. ],\n", - " [ 0.43571509, 0. ],\n", - " [-0.85542363, 1. ],\n", - " [ 0.32223517, 1. ],\n", - " [-1.0199901 , 0. ],\n", - " [-1.66021904, 1. ],\n", - " [-0.09065894, 1. ],\n", - " [-1.37781072, 1. ],\n", - " [ 0.03810618, 0. ],\n", - " [ 0.15830078, 0. ],\n", - " [-0.656651 , 1. ],\n", - " [-0.62087789, 1. ],\n", - " [-0.45145377, 1. ],\n", - " [-0.40964684, 1. ],\n", - " [ 0.16735808, 1. ],\n", - " [-1.07164533, 0. ],\n", - " [-0.06218102, 0. ],\n", - " [-1.55719567, 0. ],\n", - " [ 0.3372086 , 1. ],\n", - " [-0.83372312, 1. ],\n", - " [-0.82442625, 1. ],\n", - " [-0.44360045, 1. ],\n", - " [-0.46113149, 1. ],\n", - " [ 0.58297965, 1. ],\n", - " [ 0.04000177, 0. ],\n", - " [-0.99345831, 1. ],\n", - " [ 0.01651564, 1. ],\n", - " [ 0.76618876, 1. ],\n", - " [-0.06496794, 0. ],\n", - " [-1.25620281, 1. ],\n", - " [ 1.08992882, 1. ],\n", - " [ 0.05082718, 1. ],\n", - " [-0.70420845, 1. ],\n", - " [-1.52868669, 1. ],\n", - " [ 0.62088711, 1. ],\n", - " [-0.80347568, 1. ],\n", - " [-0.07364662, 1. ],\n", - " [-0.03901716, 1. ],\n", - " [ 0.16442425, 0. ],\n", - " [-0.98736971, 1. ],\n", - " [ 0.17350695, 1. ],\n", - " [-0.14001513, 1. ],\n", - " [-0.59811736, 1. ],\n", - " [-0.61795932, 1. ],\n", - " [-0.067497 , 1. ],\n", - " [-1.23238026, 1. ],\n", - " [-0.73409582, 1. ],\n", - " [-0.98203947, 1. ],\n", - " [-0.81089918, 1. ],\n", - " [ 0.11376562, 0. ],\n", - " [ 0.36072286, 1. ],\n", - " [ 0.9607412 , 1. ],\n", - " [-0.56097665, 1. ],\n", - " [ 0.8879336 , 1. ],\n", - " [-0.85020893, 1. ],\n", - " [ 0.73209591, 1. ],\n", - " [-0.32624944, 0. ],\n", - " [-1.30259268, 0. ],\n", - " [-1.02317241, 0. ],\n", - " [-0.67499782, 1. ],\n", - " [-0.75751466, 1. ],\n", - " [ 0.90513073, 1. ],\n", - " [-0.52735608, 1. ],\n", - " [-0.54169916, 1. ],\n", - " [-1.65142336, 1. ],\n", - " [-0.93349407, 1. ],\n", - " [-2.0316855 , 1. ],\n", - " [-1.92459021, 1. ],\n", - " [ 0.93205277, 0. ],\n", - " [-1.23128023, 0. ],\n", - " [-0.52736975, 1. ],\n", - " [-0.88944396, 1. ],\n", - " [-0.94558913, 1. ],\n", - " [-1.16965929, 1. ],\n", - " [-1.07832203, 0. ],\n", - " [-0.82005146, 1. ],\n", - " [-0.49049199, 0. ],\n", - " [-0.17153448, 0. ],\n", - " [ 0.21423027, 1. ],\n", - " [-0.69868058, 0. ],\n", - " [-0.29140465, 1. ],\n", - " [-0.03472607, 1. ],\n", - " [-0.99600737, 1. ],\n", - " [-1.65613853, 0. ],\n", - " [ 0.09270531, 1. ],\n", - " [-0.68452901, 0. ],\n", - " [-0.16316563, 1. ],\n", - " [-1.18748988, 1. ],\n", - " [ 0.21362135, 1. ],\n", - " [-0.24717124, 1. ],\n", - " [-0.632377 , 1. ],\n", - " [-0.879852 , 0. ],\n", - " [-0.14656575, 1. ],\n", - " [-0.09767858, 0. ],\n", - " [ 0.36558618, 1. ],\n", - " [-0.08375614, 0. ],\n", - " [-1.32037254, 1. ],\n", - " [-1.22574522, 1. ],\n", - " [-0.48991448, 0. ],\n", - " [-2.73684732, 1. ],\n", - " [ 0.01985179, 0. ],\n", - " [-0.33262198, 0. ],\n", - " [-0.46504179, 1. ],\n", - " [-0.27590124, 1. ],\n", - " [-0.54826423, 0. ],\n", - " [ 0.02761413, 0. ],\n", - " [-0.77421254, 1. ],\n", - " [-0.21998746, 1. ],\n", - " [-0.22918546, 1. ],\n", - " [-0.53721223, 1. ],\n", - " [-0.75381215, 0. ],\n", - " [-0.85706808, 0. ],\n", - " [-0.88592476, 1. ],\n", - " [-1.73919695, 1. ],\n", - " [-0.14375774, 0. ],\n", - " [ 0.64187012, 1. ],\n", - " [-0.68633368, 1. ],\n", - " [ 0.51465454, 1. ],\n", - " [-0.09431125, 0. ],\n", - " [-0.2388311 , 0. ],\n", - " [ 0.60194721, 0. ],\n", - " [-0.57424475, 1. ],\n", - " [-0.94566151, 1. ],\n", - " [ 0.3273643 , 1. ],\n", - " [-1.07504528, 1. ],\n", - " [-0.92897274, 1. ],\n", - " [-0.64351959, 1. ],\n", - " [-0.79355682, 0. ],\n", - " [ 0.84560998, 0. ],\n", - " [-0.58465472, 0. ],\n", - " [-0.35827277, 1. ],\n", - " [-0.70708553, 0. ],\n", - " [-1.19345954, 1. ],\n", - " [-0.83742782, 1. ],\n", - " [-0.69150403, 1. ],\n", - " [-0.05957894, 0. ],\n", - " [ 0.21415265, 1. ],\n", - " [-1.11886039, 1. ],\n", - " [-1.98958909, 0. ],\n", - " [-1.01892537, 0. ],\n", - " [-0.40495935, 1. ],\n", - " [-0.28335642, 1. ],\n", - " [-0.9391406 , 0. ],\n", - " [-1.21697055, 1. ],\n", - " [ 0.4963024 , 1. ],\n", - " [-0.55565745, 1. ],\n", - " [-0.56864623, 1. ],\n", - " [-0.27016526, 1. ],\n", - " [-0.21916498, 0. ],\n", - " [-0.79170822, 1. ],\n", - " [-0.05464455, 1. ],\n", - " [-1.33064308, 1. ],\n", - " [ 0.42660666, 0. ],\n", - " [ 0.72274139, 1. ],\n", - " [-0.55135625, 1. ]])" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y_pred" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "Collapsed": "false" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1,\n", - " 0, 0, -1, 0, 0, -1], dtype=int8)" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "clf.m_codes[clf.m_sel, -1]" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "y_pred = clf.predict(test, q_code=q_code, beta=True, prediction_algorithm=\"vit\", max_steps=3,) \n", - "\n", - "#y_true = test[:, -1]\n", - "#from sklearn.metrics import f1_score\n", - "#f1_score(y_true, y_pred)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "clf.m_sel" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "clf.m_sel" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "clf.q_diagram.node[('D', 100)][\"dask_proba\"].compute()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "clf.q_diagram.node[('D', 97)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "clf.q_diagram.node[('D', 97)][\"dask\"].compute()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "from sklearn.metrics import f1_score" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "%debug" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "clf.m_sel" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Graph-Tool\n", - "\n", - "Towards scalable graph representation. **ONE MORE TIME WITH FEELING**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "from mercs.graph.gt import build_graph, build_diagram\n", - "from mercs.algo.turbo_inference import inference_algorithm\n", - "\n", - "from mercs.utils.encoding import code_to_query" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "m_list = clf.m_list\n", - "m_codes = clf.m_codes\n", - "q_code = clf.q_code\n", - "m_sel = clf.m_sel\n", - "\n", - "_, q_targ, _ = code_to_query(clf.q_code)" - ] - }, - { - "cell_type": "raw", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "%%timeit\n", - "g = build_graph(clf.m_codes, clf.m_list)\n", - "g" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "g = build_graph(clf.m_codes, clf.m_list)\n", - "clf.g = g" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "data_nodes = [(k, idx) for k, idx in clf.g.v_map if k=='D' if idx > 2000]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "data_nodes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "%%prun\n", - "clf.q_diagram = build_diagram(clf.g, clf.m_list, clf.m_sel, clf.q_code, prune=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "Collapsed": "false" - }, - "outputs": [], - "source": [ - "%%prun\n", - "clf.dask = inference_algorithm(clf.q_diagram, clf.m_list, clf.i_list, test, clf.metadata.get('nominal_attributes'))\n", - "\n", - "v_idx = clf.g.v_map[('D', q_targ[0])]\n", - "clf.dask[v_idx].compute()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.9" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/model-size/sizes.ipynb b/note/model-size/sizes.ipynb deleted file mode 100644 index 2a8e603..0000000 --- a/note/model-size/sizes.ipynb +++ /dev/null @@ -1,5286 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Model diagnosis" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import dill as pkl" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fn_mod = 'original.pkl'" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "with open(fn_mod, \"rb\") as f:\n", - " clf = pkl.load(f)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "clf" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['FI',\n", - " '__class__',\n", - " '__delattr__',\n", - " '__dict__',\n", - " '__dir__',\n", - " '__doc__',\n", - " '__eq__',\n", - " '__format__',\n", - " '__ge__',\n", - " '__getattribute__',\n", - " '__gt__',\n", - " '__hash__',\n", - " '__init__',\n", - " '__init_subclass__',\n", - " '__le__',\n", - " '__lt__',\n", - " '__module__',\n", - " '__ne__',\n", - " '__new__',\n", - " '__reduce__',\n", - " '__reduce_ex__',\n", - " '__repr__',\n", - " '__setattr__',\n", - " '__sizeof__',\n", - " '__str__',\n", - " '__subclasshook__',\n", - " '__weakref__',\n", - " '_add_ids',\n", - " '_add_imputer_function',\n", - " '_check_xgb_single_target',\n", - " '_default_config',\n", - " '_default_metadata',\n", - " '_default_q_code',\n", - " '_dummy_array',\n", - " '_extra_checks_on_config',\n", - " '_filter_X',\n", - " '_fit_imputer',\n", - " '_get_q_model',\n", - " '_get_types',\n", - " '_is_nominal',\n", - " '_is_numeric',\n", - " '_overlapping_indices',\n", - " '_parse_kwargs',\n", - " '_reconfig_prediction',\n", - " '_update_config',\n", - " '_update_dictionary',\n", - " '_update_fi',\n", - " '_update_g_list',\n", - " '_update_metadata',\n", - " '_update_t_codes',\n", - " 'classifier_algorithm',\n", - " 'classifier_algorithms',\n", - " 'clf_cfg',\n", - " 'configuration',\n", - " 'configuration_prefixes',\n", - " 'delimiter',\n", - " 'fi',\n", - " 'filter_nodes',\n", - " 'fit',\n", - " 'g_list',\n", - " 'i_list',\n", - " 'induction_algorithm',\n", - " 'inf_cfg',\n", - " 'inference_algorithm',\n", - " 'inference_algorithms',\n", - " 'm_codes',\n", - " 'm_list',\n", - " 'merge_models',\n", - " 'metadata',\n", - " 'model_data',\n", - " 'prd_cfg',\n", - " 'predict',\n", - " 'prediction_algorithm',\n", - " 'prediction_algorithms',\n", - " 'q_code',\n", - " 'q_compose',\n", - " 'q_desc_ids',\n", - " 'q_diagram',\n", - " 'q_methods',\n", - " 'q_targ_ids',\n", - " 'random_state',\n", - " 'regressor_algorithm',\n", - " 'regressor_algorithms',\n", - " 'rgr_cfg',\n", - " 'save_diagram',\n", - " 'sel_cfg',\n", - " 'selection_algorithm',\n", - " 'selection_algorithms',\n", - " 'show_q_diagram',\n", - " 't_codes',\n", - " 'targ_ids']" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dir(clf)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "\n", - "data = (clf.m_codes.astype(np.int8), clf.t_codes.astype(np.int8), (clf.fi*100).astype(np.int8))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "clf.fi * 100" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "fn_data = 'datadump_bettertypes.pkl'\n", - "with open(fn_data, 'wb') as f:\n", - " pkl.dump(data, f)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "graphs = clf.g_list" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "fn_grph = 'graphdump.pkl'\n", - "with open(fn_grph, 'wb') as f:\n", - " pkl.dump(graphs, f)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "5.746368" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sum([d.nbytes for d in data])/(10**6)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "fn = 'modeldump.pkl'\n", - "with open(fn , 'wb') as f:\n", - " pkl.dump(clf.m_list, f)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n" - ] - } - ], - "source": [ - "for g in graphs:\n", - " for n in g.nodes():\n", - " if g.nodes[n].get('src', False):\n", - " print(\"did adapt\")\n", - " g.nodes[n]['src'] = None" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "fn = 'graphdump_without_models.pkl'\n", - "with open(fn, 'wb') as f:\n", - " pkl.dump(graphs, f)" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'kind': 'model',\n", - " 'idx': 0,\n", - " 'mod': None,\n", - " 'src': [0,\n", - " 1,\n", - " 2,\n", - " 3,\n", - " 4,\n", - " 5,\n", - " 6,\n", - " 7,\n", - " 8,\n", - " 9,\n", - " 10,\n", - " 11,\n", - " 12,\n", - " 13,\n", - " 14,\n", - " 15,\n", - " 16,\n", - " 17,\n", - " 18,\n", - " 19,\n", - " 20,\n", - " 21,\n", - " 22,\n", - " 23,\n", - " 24,\n", - " 25,\n", - " 26,\n", - " 27,\n", - " 28,\n", - " 29,\n", - " 30,\n", - " 31,\n", - " 32,\n", - " 33,\n", - " 34,\n", - " 35,\n", - " 36,\n", - " 37,\n", - " 38,\n", - " 39,\n", - " 40,\n", - " 41,\n", - " 42,\n", - " 43,\n", - " 44,\n", - " 45,\n", - " 46,\n", - " 47,\n", - " 48,\n", - " 49,\n", - " 50,\n", - " 51,\n", - " 52,\n", - " 53,\n", - " 54,\n", - " 55,\n", - " 56,\n", - " 57,\n", - " 58,\n", - " 59,\n", - " 60,\n", - " 61,\n", - " 62,\n", - " 63,\n", - " 64,\n", - " 65,\n", - " 66,\n", - " 67,\n", - " 68,\n", - " 69,\n", - " 70,\n", - " 71,\n", - " 72,\n", - " 73,\n", - " 74,\n", - " 75,\n", - " 76,\n", - " 77,\n", - " 78,\n", - " 79,\n", - " 80,\n", - " 81,\n", - " 82,\n", - " 83,\n", - " 84,\n", - " 85,\n", - " 86,\n", - " 87,\n", - " 88,\n", - " 89,\n", - " 90,\n", - " 91,\n", - " 92,\n", - " 93,\n", - " 94,\n", - " 95,\n", - " 96,\n", - " 97,\n", - " 98,\n", - " 99,\n", - " 100,\n", - " 101,\n", - " 102,\n", - " 103,\n", - " 104,\n", - " 105,\n", - " 106,\n", - " 107,\n", - " 108,\n", - " 109,\n", - " 110,\n", - " 111,\n", - " 112,\n", - " 113,\n", - " 114,\n", - " 115,\n", - " 116,\n", - " 117,\n", - " 118,\n", - " 119,\n", - " 120,\n", - " 122,\n", - " 123,\n", - " 124,\n", - " 125,\n", - " 126,\n", - " 127,\n", - " 128,\n", - " 129,\n", - " 130,\n", - " 131,\n", - " 132,\n", - " 133,\n", - " 134,\n", - " 135,\n", - " 136,\n", - " 137,\n", - " 138,\n", - " 139,\n", - " 140,\n", - " 141,\n", - " 142,\n", - " 143,\n", - " 144,\n", - " 145,\n", - " 146,\n", - " 147,\n", - " 148,\n", - " 149,\n", - " 150,\n", - " 151,\n", - " 152,\n", - " 153,\n", - " 154,\n", - " 155,\n", - " 156,\n", - " 157,\n", - " 158,\n", - " 159,\n", - " 160,\n", - " 161,\n", - " 162,\n", - " 163,\n", - " 164,\n", - " 165,\n", - " 166,\n", - " 167,\n", - " 168,\n", - " 169,\n", - " 170,\n", - " 171,\n", - " 172,\n", - " 173,\n", - " 174,\n", - " 175,\n", - " 176,\n", - " 177,\n", - " 178,\n", - " 179,\n", - " 180,\n", - " 181,\n", - " 182,\n", - " 183,\n", - " 184,\n", - " 185,\n", - " 186,\n", - " 187,\n", - " 188,\n", - " 189,\n", - " 190,\n", - " 191,\n", - " 192,\n", - " 193,\n", - " 194,\n", - " 195,\n", - " 196,\n", - " 197,\n", - " 198,\n", - " 199,\n", - " 200,\n", - " 201,\n", - " 202,\n", - " 203,\n", - " 204,\n", - " 205,\n", - " 206,\n", - " 207,\n", - " 208,\n", - " 209,\n", - " 210,\n", - " 211,\n", - " 212,\n", - " 213,\n", - " 214,\n", - " 215,\n", - " 216,\n", - " 217,\n", - " 218,\n", - " 219,\n", - " 220,\n", - " 221,\n", - " 222,\n", - " 223,\n", - " 224,\n", - " 225,\n", - " 226,\n", - " 227,\n", - " 228,\n", - " 229,\n", - " 230,\n", - " 231,\n", - " 232,\n", - " 233,\n", - " 234,\n", - " 235,\n", - " 236,\n", - " 237,\n", - " 238,\n", - " 239,\n", - " 240,\n", - " 241,\n", - " 242,\n", - " 243,\n", - " 244,\n", - " 245,\n", - " 246,\n", - " 247,\n", - " 248,\n", - " 249,\n", - " 250,\n", - " 251,\n", - " 252,\n", - " 253,\n", - " 254,\n", - " 255,\n", - " 256,\n", - " 257,\n", - " 258,\n", - " 259,\n", - " 260,\n", - " 261,\n", - " 262,\n", - " 263,\n", - " 264,\n", - " 265,\n", - " 266,\n", - " 267,\n", - " 268,\n", - " 269,\n", - " 270,\n", - " 271,\n", - " 272,\n", - " 273,\n", - " 274,\n", - " 275,\n", - " 276,\n", - " 277,\n", - " 278,\n", - " 279,\n", - " 280,\n", - " 281,\n", - " 282,\n", - " 283,\n", - " 284,\n", - " 285,\n", - " 286,\n", - " 287,\n", - " 288,\n", - " 289,\n", - " 290,\n", - " 291,\n", - " 292,\n", - " 293,\n", - " 294,\n", - " 295,\n", - " 296,\n", - " 297,\n", - " 298,\n", - " 299,\n", - " 300,\n", - " 301,\n", - " 302,\n", - " 303,\n", - " 304,\n", - " 305,\n", - " 306,\n", - " 307,\n", - " 308,\n", - " 309,\n", - " 310,\n", - " 311,\n", - " 312,\n", - " 313,\n", - " 314,\n", - " 315,\n", - " 316,\n", - " 317,\n", - " 318,\n", - " 319,\n", - " 320,\n", - " 321,\n", - " 322,\n", - " 323,\n", - " 324,\n", - " 325,\n", - " 326,\n", - " 327,\n", - " 328,\n", - " 329,\n", - " 330,\n", - " 331,\n", - " 332,\n", - " 333,\n", - " 334,\n", - " 335,\n", - " 336,\n", - " 337,\n", - " 338,\n", - " 339,\n", - " 340,\n", - " 341,\n", - " 342,\n", - " 343,\n", - " 344,\n", - " 345,\n", - " 346,\n", - " 347,\n", - " 348,\n", - " 349,\n", - " 350,\n", - " 351,\n", - " 352,\n", - " 353,\n", - " 354,\n", - " 355,\n", - " 356,\n", - " 357,\n", - " 358,\n", - " 359,\n", - " 360,\n", - " 361,\n", - " 362,\n", - " 363,\n", - " 364,\n", - " 365,\n", - " 366,\n", - " 367,\n", - " 368,\n", - " 369,\n", - " 370,\n", - " 371,\n", - " 372,\n", - " 373,\n", - " 374,\n", - " 375,\n", - " 376,\n", - " 377,\n", - " 378,\n", - " 379,\n", - " 380,\n", - " 381,\n", - " 382,\n", - " 383,\n", - " 384,\n", - " 385,\n", - " 386,\n", - " 387,\n", - " 388,\n", - " 389,\n", - " 390,\n", - " 391,\n", - " 392,\n", - " 393,\n", - " 394,\n", - " 395,\n", - " 396,\n", - " 397,\n", - " 398,\n", - " 399,\n", - " 400,\n", - " 401,\n", - " 402,\n", - " 403,\n", - " 404,\n", - " 405,\n", - " 406,\n", - " 407,\n", - " 408,\n", - " 409,\n", - " 410,\n", - " 411,\n", - " 412,\n", - " 413,\n", - " 414,\n", - " 415,\n", - " 416,\n", - " 417,\n", - " 418,\n", - " 419,\n", - " 420,\n", - " 421,\n", - " 422,\n", - " 423,\n", - " 424,\n", - " 425,\n", - " 426,\n", - " 427,\n", - " 428,\n", - " 429,\n", - " 430,\n", - " 431,\n", - " 432,\n", - " 433,\n", - " 434,\n", - " 435,\n", - " 436,\n", - " 437,\n", - " 438,\n", - " 439,\n", - " 440,\n", - " 441,\n", - " 442,\n", - " 443,\n", - " 444,\n", - " 445,\n", - " 446,\n", - " 447,\n", - " 448,\n", - " 449,\n", - " 450,\n", - " 451,\n", - " 452,\n", - " 453,\n", - " 454,\n", - " 455,\n", - " 456,\n", - " 457,\n", - " 458,\n", - " 459,\n", - " 460,\n", - " 461,\n", - " 462,\n", - " 463,\n", - " 464,\n", - " 465,\n", - " 466,\n", - " 467,\n", - " 468,\n", - " 469,\n", - " 470,\n", - " 471,\n", - " 472,\n", - " 473,\n", - " 474,\n", - " 475,\n", - " 476,\n", - " 477,\n", - " 478,\n", - " 479,\n", - " 480,\n", - " 481,\n", - " 482,\n", - " 483,\n", - " 484,\n", - " 485,\n", - " 486,\n", - " 487,\n", - " 488,\n", - " 489,\n", - " 490,\n", - " 491,\n", - " 492,\n", - " 493,\n", - " 494,\n", - " 495,\n", - " 496,\n", - " 497,\n", - " 498,\n", - " 499,\n", - " 500,\n", - " 501,\n", - " 502,\n", - " 503,\n", - " 504,\n", - " 505,\n", - " 506,\n", - " 507,\n", - " 508,\n", - " 509,\n", - " 510,\n", - " 511,\n", - " 512,\n", - " 513,\n", - " 514,\n", - " 515,\n", - " 516,\n", - " 517,\n", - " 518,\n", - " 519,\n", - " 520,\n", - " 521,\n", - " 522,\n", - " 523,\n", - " 524,\n", - " 525,\n", - " 526,\n", - " 527,\n", - " 528,\n", - " 529,\n", - " 530,\n", - " 531,\n", - " 532,\n", - " 533,\n", - " 534,\n", - " 535,\n", - " 536,\n", - " 537,\n", - " 538,\n", - " 539,\n", - " 540,\n", - " 541,\n", - " 542,\n", - " 543,\n", - " 544,\n", - " 545,\n", - " 546,\n", - " 547,\n", - " 548,\n", - " 549,\n", - " 550,\n", - " 551,\n", - " 552,\n", - " 553,\n", - " 554,\n", - " 555,\n", - " 556,\n", - " 557,\n", - " 558,\n", - " 559,\n", - " 560,\n", - " 561,\n", - " 562,\n", - " 563,\n", - " 564,\n", - " 565,\n", - " 566,\n", - " 567,\n", - " 568,\n", - " 569,\n", - " 570,\n", - " 571,\n", - " 572,\n", - " 573,\n", - " 574,\n", - " 575,\n", - " 576,\n", - " 577,\n", - " 578,\n", - " 579,\n", - " 580,\n", - " 581,\n", - " 582,\n", - " 583,\n", - " 584,\n", - " 585,\n", - " 586,\n", - " 587,\n", - " 588,\n", - " 589,\n", - " 590,\n", - " 591,\n", - " 592,\n", - " 593,\n", - " 594,\n", - " 595,\n", - " 596,\n", - " 597,\n", - " 598,\n", - " 599,\n", - " 600,\n", - " 601,\n", - " 602,\n", - " 603,\n", - " 604,\n", - " 605,\n", - " 606,\n", - " 607,\n", - " 608,\n", - " 609,\n", - " 610,\n", - " 611,\n", - " 612,\n", - " 613,\n", - " 614,\n", - " 615,\n", - " 616,\n", - " 617,\n", - " 618,\n", - " 619,\n", - " 620,\n", - " 621,\n", - " 622,\n", - " 623,\n", - " 624,\n", - " 625,\n", - " 626,\n", - " 627,\n", - " 628,\n", - " 629,\n", - " 630,\n", - " 631,\n", - " 632,\n", - " 633,\n", - " 634,\n", - " 635,\n", - " 636,\n", - " 637,\n", - " 638,\n", - " 639,\n", - " 640,\n", - " 641,\n", - " 642,\n", - " 643,\n", - " 644,\n", - " 645,\n", - " 646,\n", - " 647,\n", - " 648,\n", - " 649,\n", - " 650,\n", - " 651,\n", - " 652,\n", - " 653,\n", - " 654,\n", - " 655,\n", - " 656,\n", - " 657,\n", - " 658,\n", - " 659,\n", - " 660,\n", - " 661,\n", - " 662,\n", - " 663,\n", - " 664,\n", - " 665,\n", - " 666,\n", - " 667,\n", - " 668,\n", - " 669,\n", - " 670,\n", - " 671,\n", - " 672,\n", - " 673,\n", - " 674,\n", - " 675,\n", - " 676,\n", - " 677,\n", - " 678,\n", - " 679,\n", - " 680,\n", - " 681,\n", - " 682,\n", - " 683,\n", - " 684,\n", - " 685,\n", - " 686,\n", - " 687,\n", - " 688,\n", - " 689,\n", - " 690,\n", - " 691,\n", - " 692,\n", - " 693,\n", - " 694,\n", - " 695,\n", - " 696,\n", - " 697,\n", - " 698,\n", - " 699,\n", - " 700,\n", - " 701,\n", - " 702,\n", - " 703,\n", - " 704,\n", - " 705,\n", - " 706,\n", - " 707,\n", - " 708,\n", - " 709,\n", - " 710,\n", - " 711,\n", - " 712,\n", - " 713,\n", - " 714,\n", - " 715,\n", - " 716,\n", - " 717,\n", - " 718,\n", - " 719,\n", - " 720,\n", - " 721,\n", - " 722,\n", - " 723,\n", - " 724,\n", - " 725,\n", - " 726,\n", - " 727,\n", - " 728,\n", - " 729,\n", - " 730,\n", - " 731,\n", - " 732,\n", - " 733,\n", - " 734,\n", - " 735,\n", - " 736,\n", - " 737,\n", - " 738,\n", - " 739,\n", - " 740,\n", - " 741,\n", - " 742,\n", - " 743,\n", - " 744,\n", - " 745,\n", - " 746,\n", - " 747,\n", - " 748,\n", - " 749,\n", - " 750,\n", - " 751,\n", - " 752,\n", - " 753,\n", - " 754,\n", - " 755,\n", - " 756,\n", - " 757,\n", - " 758,\n", - " 759,\n", - " 760,\n", - " 761,\n", - " 762,\n", - " 763,\n", - " 764,\n", - " 765,\n", - " 766,\n", - " 767,\n", - " 768,\n", - " 769,\n", - " 770,\n", - " 771,\n", - " 772,\n", - " 773,\n", - " 774,\n", - " 775,\n", - " 776,\n", - " 777,\n", - " 778,\n", - " 779,\n", - " 780,\n", - " 781,\n", - " 782,\n", - " 783,\n", - " 784,\n", - " 785,\n", - " 786,\n", - " 787,\n", - " 788,\n", - " 789,\n", - " 790,\n", - " 791,\n", - " 792,\n", - " 793,\n", - " 794,\n", - " 795,\n", - " 796,\n", - " 797,\n", - " 798,\n", - " 799,\n", - " 800,\n", - " 801,\n", - " 802,\n", - " 803,\n", - " 804,\n", - " 805,\n", - " 806,\n", - " 807,\n", - " 808,\n", - " 809,\n", - " 810,\n", - " 811,\n", - " 812,\n", - " 813,\n", - " 814,\n", - " 815,\n", - " 816,\n", - " 817,\n", - " 818,\n", - " 819,\n", - " 820,\n", - " 821,\n", - " 822,\n", - " 823,\n", - " 824,\n", - " 825,\n", - " 826,\n", - " 827,\n", - " 828,\n", - " 829,\n", - " 830,\n", - " 831,\n", - " 832,\n", - " 833,\n", - " 834,\n", - " 835,\n", - " 836,\n", - " 837,\n", - " 838,\n", - " 839,\n", - " 840,\n", - " 841,\n", - " 842,\n", - " 843,\n", - " 844,\n", - " 845,\n", - " 846,\n", - " 847,\n", - " 848,\n", - " 849,\n", - " 850,\n", - " 851,\n", - " 852,\n", - " 853,\n", - " 854,\n", - " 855,\n", - " 856,\n", - " 857,\n", - " 858,\n", - " 859,\n", - " 860,\n", - " 861,\n", - " 862,\n", - " 863,\n", - " 864,\n", - " 865,\n", - " 866,\n", - " 867,\n", - " 868,\n", - " 869,\n", - " 870,\n", - " 871,\n", - " 872,\n", - " 873,\n", - " 874,\n", - " 875,\n", - " 876,\n", - " 877,\n", - " 878,\n", - " 879,\n", - " 880,\n", - " 881,\n", - " 882,\n", - " 883,\n", - " 884,\n", - " 885,\n", - " 886,\n", - " 887,\n", - " 888,\n", - " 889,\n", - " 890,\n", - " 891,\n", - " 892,\n", - " 893,\n", - " 894,\n", - " 895,\n", - " 896,\n", - " 897,\n", - " 898,\n", - " 899,\n", - " 900,\n", - " 901,\n", - " 902,\n", - " 903,\n", - " 904,\n", - " 905,\n", - " 906,\n", - " 907,\n", - " 908,\n", - " 909,\n", - " 910,\n", - " 911,\n", - " 912,\n", - " 913,\n", - " 914,\n", - " 915,\n", - " 916,\n", - " 917,\n", - " 918,\n", - " 919,\n", - " 920,\n", - " 921,\n", - " 922,\n", - " 923,\n", - " 924,\n", - " 925,\n", - " 926,\n", - " 927,\n", - " 928,\n", - " 929,\n", - " 930,\n", - " 931,\n", - " 932,\n", - " 933,\n", - " 934,\n", - " 935,\n", - " 936,\n", - " 937,\n", - " 938,\n", - " 939,\n", - " 940,\n", - " 941,\n", - " 942,\n", - " 943,\n", - " 944,\n", - " 945,\n", - " 946,\n", - " 947,\n", - " 948,\n", - " 949,\n", - " 950,\n", - " 951,\n", - " 952,\n", - " 953,\n", - " 954,\n", - " 955,\n", - " 956,\n", - " 957,\n", - " 958,\n", - " 959,\n", - " 960,\n", - " 961,\n", - " 962,\n", - " 963,\n", - " 964,\n", - " 965,\n", - " 966,\n", - " 967,\n", - " 968,\n", - " 969,\n", - " 970,\n", - " 971,\n", - " 972,\n", - " 973,\n", - " 974,\n", - " 975,\n", - " 976,\n", - " 977,\n", - " 978,\n", - " 979,\n", - " 980,\n", - " 981,\n", - " 982,\n", - " 983,\n", - " 984,\n", - " 985,\n", - " 986,\n", - " 987,\n", - " 988,\n", - " 989,\n", - " 990,\n", - " 991,\n", - " 992,\n", - " 993,\n", - " 994,\n", - " 995,\n", - " 996,\n", - " 997,\n", - " 998,\n", - " 999,\n", - " 1000,\n", - " ...],\n", - " 'tgt': [121],\n", - " 'out': 'nominal',\n", - " 'predict': ,\n", - " 'predict_proba': ,\n", - " 'shape': '\"square\"',\n", - " 'width': '1'}" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "graphs[0].nodes['f-00']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Results:\n", - "\n", - " - Naive dump = 520 mb\n", - "\n", - " - Numpy matrices = 46 mb\n", - " - Graphs = 480 mb\n", - " - Models = 60 mb\n", - " - Graphs without models = 480 mb\n", - " - Graphs without models and functions = 480 mb\n", - " - Graphs without models, functions and large arrays = 470 mb" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "from mercs.graph import compose_all" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'kind': 'model',\n", - " 'idx': 0,\n", - " 'mod': DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=4,\n", - " max_features=None, max_leaf_nodes=None,\n", - " min_impurity_decrease=0.0, min_impurity_split=None,\n", - " min_samples_leaf=1, min_samples_split=2,\n", - " min_weight_fraction_leaf=0.0, presort=False,\n", - " random_state=7796, splitter='best'),\n", - " 'src': [0,\n", - " 1,\n", - " 2,\n", - " 3,\n", - " 4,\n", - " 5,\n", - " 6,\n", - " 7,\n", - " 8,\n", - " 9,\n", - " 10,\n", - " 11,\n", - " 12,\n", - " 13,\n", - " 14,\n", - " 15,\n", - " 16,\n", - " 17,\n", - " 18,\n", - " 19,\n", - " 20,\n", - " 21,\n", - " 22,\n", - " 23,\n", - " 24,\n", - " 25,\n", - " 26,\n", - " 27,\n", - " 28,\n", - " 29,\n", - " 30,\n", - " 31,\n", - " 32,\n", - " 33,\n", - " 34,\n", - " 35,\n", - " 36,\n", - " 37,\n", - " 38,\n", - " 39,\n", - " 40,\n", - " 41,\n", - " 42,\n", - " 43,\n", - " 44,\n", - " 45,\n", - " 46,\n", - " 47,\n", - " 48,\n", - " 49,\n", - " 50,\n", - " 51,\n", - " 52,\n", - " 53,\n", - " 54,\n", - " 55,\n", - " 56,\n", - " 57,\n", - " 58,\n", - " 59,\n", - " 60,\n", - " 61,\n", - " 62,\n", - " 63,\n", - " 64,\n", - " 65,\n", - " 66,\n", - " 67,\n", - " 68,\n", - " 69,\n", - " 70,\n", - " 71,\n", - " 72,\n", - " 73,\n", - " 74,\n", - " 75,\n", - " 76,\n", - " 77,\n", - " 78,\n", - " 79,\n", - " 80,\n", - " 81,\n", - " 82,\n", - " 83,\n", - " 84,\n", - " 85,\n", - " 86,\n", - " 87,\n", - " 88,\n", - " 89,\n", - " 90,\n", - " 91,\n", - " 92,\n", - " 93,\n", - " 94,\n", - " 95,\n", - " 96,\n", - " 97,\n", - " 98,\n", - " 99,\n", - " 100,\n", - " 101,\n", - " 102,\n", - " 103,\n", - " 104,\n", - " 105,\n", - " 106,\n", - " 107,\n", - " 108,\n", - " 109,\n", - " 110,\n", - " 111,\n", - " 112,\n", - " 113,\n", - " 114,\n", - " 115,\n", - " 116,\n", - " 117,\n", - " 118,\n", - " 119,\n", - " 120,\n", - " 122,\n", - " 123,\n", - " 124,\n", - " 125,\n", - " 126,\n", - " 127,\n", - " 128,\n", - " 129,\n", - " 130,\n", - " 131,\n", - " 132,\n", - " 133,\n", - " 134,\n", - " 135,\n", - " 136,\n", - " 137,\n", - " 138,\n", - " 139,\n", - " 140,\n", - " 141,\n", - " 142,\n", - " 143,\n", - " 144,\n", - " 145,\n", - " 146,\n", - " 147,\n", - " 148,\n", - " 149,\n", - " 150,\n", - " 151,\n", - " 152,\n", - " 153,\n", - " 154,\n", - " 155,\n", - " 156,\n", - " 157,\n", - " 158,\n", - " 159,\n", - " 160,\n", - " 161,\n", - " 162,\n", - " 163,\n", - " 164,\n", - " 165,\n", - " 166,\n", - " 167,\n", - " 168,\n", - " 169,\n", - " 170,\n", - " 171,\n", - " 172,\n", - " 173,\n", - " 174,\n", - " 175,\n", - " 176,\n", - " 177,\n", - " 178,\n", - " 179,\n", - " 180,\n", - " 181,\n", - " 182,\n", - " 183,\n", - " 184,\n", - " 185,\n", - " 186,\n", - " 187,\n", - " 188,\n", - " 189,\n", - " 190,\n", - " 191,\n", - " 192,\n", - " 193,\n", - " 194,\n", - " 195,\n", - " 196,\n", - " 197,\n", - " 198,\n", - " 199,\n", - " 200,\n", - " 201,\n", - " 202,\n", - " 203,\n", - " 204,\n", - " 205,\n", - " 206,\n", - " 207,\n", - " 208,\n", - " 209,\n", - " 210,\n", - " 211,\n", - " 212,\n", - " 213,\n", - " 214,\n", - " 215,\n", - " 216,\n", - " 217,\n", - " 218,\n", - " 219,\n", - " 220,\n", - " 221,\n", - " 222,\n", - " 223,\n", - " 224,\n", - " 225,\n", - " 226,\n", - " 227,\n", - " 228,\n", - " 229,\n", - " 230,\n", - " 231,\n", - " 232,\n", - " 233,\n", - " 234,\n", - " 235,\n", - " 236,\n", - " 237,\n", - " 238,\n", - " 239,\n", - " 240,\n", - " 241,\n", - " 242,\n", - " 243,\n", - " 244,\n", - " 245,\n", - " 246,\n", - " 247,\n", - " 248,\n", - " 249,\n", - " 250,\n", - " 251,\n", - " 252,\n", - " 253,\n", - " 254,\n", - " 255,\n", - " 256,\n", - " 257,\n", - " 258,\n", - " 259,\n", - " 260,\n", - " 261,\n", - " 262,\n", - " 263,\n", - " 264,\n", - " 265,\n", - " 266,\n", - " 267,\n", - " 268,\n", - " 269,\n", - " 270,\n", - " 271,\n", - " 272,\n", - " 273,\n", - " 274,\n", - " 275,\n", - " 276,\n", - " 277,\n", - " 278,\n", - " 279,\n", - " 280,\n", - " 281,\n", - " 282,\n", - " 283,\n", - " 284,\n", - " 285,\n", - " 286,\n", - " 287,\n", - " 288,\n", - " 289,\n", - " 290,\n", - " 291,\n", - " 292,\n", - " 293,\n", - " 294,\n", - " 295,\n", - " 296,\n", - " 297,\n", - " 298,\n", - " 299,\n", - " 300,\n", - " 301,\n", - " 302,\n", - " 303,\n", - " 304,\n", - " 305,\n", - " 306,\n", - " 307,\n", - " 308,\n", - " 309,\n", - " 310,\n", - " 311,\n", - " 312,\n", - " 313,\n", - " 314,\n", - " 315,\n", - " 316,\n", - " 317,\n", - " 318,\n", - " 319,\n", - " 320,\n", - " 321,\n", - " 322,\n", - " 323,\n", - " 324,\n", - " 325,\n", - " 326,\n", - " 327,\n", - " 328,\n", - " 329,\n", - " 330,\n", - " 331,\n", - " 332,\n", - " 333,\n", - " 334,\n", - " 335,\n", - " 336,\n", - " 337,\n", - " 338,\n", - " 339,\n", - " 340,\n", - " 341,\n", - " 342,\n", - " 343,\n", - " 344,\n", - " 345,\n", - " 346,\n", - " 347,\n", - " 348,\n", - " 349,\n", - " 350,\n", - " 351,\n", - " 352,\n", - " 353,\n", - " 354,\n", - " 355,\n", - " 356,\n", - " 357,\n", - " 358,\n", - " 359,\n", - " 360,\n", - " 361,\n", - " 362,\n", - " 363,\n", - " 364,\n", - " 365,\n", - " 366,\n", - " 367,\n", - " 368,\n", - " 369,\n", - " 370,\n", - " 371,\n", - " 372,\n", - " 373,\n", - " 374,\n", - " 375,\n", - " 376,\n", - " 377,\n", - " 378,\n", - " 379,\n", - " 380,\n", - " 381,\n", - " 382,\n", - " 383,\n", - " 384,\n", - " 385,\n", - " 386,\n", - " 387,\n", - " 388,\n", - " 389,\n", - " 390,\n", - " 391,\n", - " 392,\n", - " 393,\n", - " 394,\n", - " 395,\n", - " 396,\n", - " 397,\n", - " 398,\n", - " 399,\n", - " 400,\n", - " 401,\n", - " 402,\n", - " 403,\n", - " 404,\n", - " 405,\n", - " 406,\n", - " 407,\n", - " 408,\n", - " 409,\n", - " 410,\n", - " 411,\n", - " 412,\n", - " 413,\n", - " 414,\n", - " 415,\n", - " 416,\n", - " 417,\n", - " 418,\n", - " 419,\n", - " 420,\n", - " 421,\n", - " 422,\n", - " 423,\n", - " 424,\n", - " 425,\n", - " 426,\n", - " 427,\n", - " 428,\n", - " 429,\n", - " 430,\n", - " 431,\n", - " 432,\n", - " 433,\n", - " 434,\n", - " 435,\n", - " 436,\n", - " 437,\n", - " 438,\n", - " 439,\n", - " 440,\n", - " 441,\n", - " 442,\n", - " 443,\n", - " 444,\n", - " 445,\n", - " 446,\n", - " 447,\n", - " 448,\n", - " 449,\n", - " 450,\n", - " 451,\n", - " 452,\n", - " 453,\n", - " 454,\n", - " 455,\n", - " 456,\n", - " 457,\n", - " 458,\n", - " 459,\n", - " 460,\n", - " 461,\n", - " 462,\n", - " 463,\n", - " 464,\n", - " 465,\n", - " 466,\n", - " 467,\n", - " 468,\n", - " 469,\n", - " 470,\n", - " 471,\n", - " 472,\n", - " 473,\n", - " 474,\n", - " 475,\n", - " 476,\n", - " 477,\n", - " 478,\n", - " 479,\n", - " 480,\n", - " 481,\n", - " 482,\n", - " 483,\n", - " 484,\n", - " 485,\n", - " 486,\n", - " 487,\n", - " 488,\n", - " 489,\n", - " 490,\n", - " 491,\n", - " 492,\n", - " 493,\n", - " 494,\n", - " 495,\n", - " 496,\n", - " 497,\n", - " 498,\n", - " 499,\n", - " 500,\n", - " 501,\n", - " 502,\n", - " 503,\n", - " 504,\n", - " 505,\n", - " 506,\n", - " 507,\n", - " 508,\n", - " 509,\n", - " 510,\n", - " 511,\n", - " 512,\n", - " 513,\n", - " 514,\n", - " 515,\n", - " 516,\n", - " 517,\n", - " 518,\n", - " 519,\n", - " 520,\n", - " 521,\n", - " 522,\n", - " 523,\n", - " 524,\n", - " 525,\n", - " 526,\n", - " 527,\n", - " 528,\n", - " 529,\n", - " 530,\n", - " 531,\n", - " 532,\n", - " 533,\n", - " 534,\n", - " 535,\n", - " 536,\n", - " 537,\n", - " 538,\n", - " 539,\n", - " 540,\n", - " 541,\n", - " 542,\n", - " 543,\n", - " 544,\n", - " 545,\n", - " 546,\n", - " 547,\n", - " 548,\n", - " 549,\n", - " 550,\n", - " 551,\n", - " 552,\n", - " 553,\n", - " 554,\n", - " 555,\n", - " 556,\n", - " 557,\n", - " 558,\n", - " 559,\n", - " 560,\n", - " 561,\n", - " 562,\n", - " 563,\n", - " 564,\n", - " 565,\n", - " 566,\n", - " 567,\n", - " 568,\n", - " 569,\n", - " 570,\n", - " 571,\n", - " 572,\n", - " 573,\n", - " 574,\n", - " 575,\n", - " 576,\n", - " 577,\n", - " 578,\n", - " 579,\n", - " 580,\n", - " 581,\n", - " 582,\n", - " 583,\n", - " 584,\n", - " 585,\n", - " 586,\n", - " 587,\n", - " 588,\n", - " 589,\n", - " 590,\n", - " 591,\n", - " 592,\n", - " 593,\n", - " 594,\n", - " 595,\n", - " 596,\n", - " 597,\n", - " 598,\n", - " 599,\n", - " 600,\n", - " 601,\n", - " 602,\n", - " 603,\n", - " 604,\n", - " 605,\n", - " 606,\n", - " 607,\n", - " 608,\n", - " 609,\n", - " 610,\n", - " 611,\n", - " 612,\n", - " 613,\n", - " 614,\n", - " 615,\n", - " 616,\n", - " 617,\n", - " 618,\n", - " 619,\n", - " 620,\n", - " 621,\n", - " 622,\n", - " 623,\n", - " 624,\n", - " 625,\n", - " 626,\n", - " 627,\n", - " 628,\n", - " 629,\n", - " 630,\n", - " 631,\n", - " 632,\n", - " 633,\n", - " 634,\n", - " 635,\n", - " 636,\n", - " 637,\n", - " 638,\n", - " 639,\n", - " 640,\n", - " 641,\n", - " 642,\n", - " 643,\n", - " 644,\n", - " 645,\n", - " 646,\n", - " 647,\n", - " 648,\n", - " 649,\n", - " 650,\n", - " 651,\n", - " 652,\n", - " 653,\n", - " 654,\n", - " 655,\n", - " 656,\n", - " 657,\n", - " 658,\n", - " 659,\n", - " 660,\n", - " 661,\n", - " 662,\n", - " 663,\n", - " 664,\n", - " 665,\n", - " 666,\n", - " 667,\n", - " 668,\n", - " 669,\n", - " 670,\n", - " 671,\n", - " 672,\n", - " 673,\n", - " 674,\n", - " 675,\n", - " 676,\n", - " 677,\n", - " 678,\n", - " 679,\n", - " 680,\n", - " 681,\n", - " 682,\n", - " 683,\n", - " 684,\n", - " 685,\n", - " 686,\n", - " 687,\n", - " 688,\n", - " 689,\n", - " 690,\n", - " 691,\n", - " 692,\n", - " 693,\n", - " 694,\n", - " 695,\n", - " 696,\n", - " 697,\n", - " 698,\n", - " 699,\n", - " 700,\n", - " 701,\n", - " 702,\n", - " 703,\n", - " 704,\n", - " 705,\n", - " 706,\n", - " 707,\n", - " 708,\n", - " 709,\n", - " 710,\n", - " 711,\n", - " 712,\n", - " 713,\n", - " 714,\n", - " 715,\n", - " 716,\n", - " 717,\n", - " 718,\n", - " 719,\n", - " 720,\n", - " 721,\n", - " 722,\n", - " 723,\n", - " 724,\n", - " 725,\n", - " 726,\n", - " 727,\n", - " 728,\n", - " 729,\n", - " 730,\n", - " 731,\n", - " 732,\n", - " 733,\n", - " 734,\n", - " 735,\n", - " 736,\n", - " 737,\n", - " 738,\n", - " 739,\n", - " 740,\n", - " 741,\n", - " 742,\n", - " 743,\n", - " 744,\n", - " 745,\n", - " 746,\n", - " 747,\n", - " 748,\n", - " 749,\n", - " 750,\n", - " 751,\n", - " 752,\n", - " 753,\n", - " 754,\n", - " 755,\n", - " 756,\n", - " 757,\n", - " 758,\n", - " 759,\n", - " 760,\n", - " 761,\n", - " 762,\n", - " 763,\n", - " 764,\n", - " 765,\n", - " 766,\n", - " 767,\n", - " 768,\n", - " 769,\n", - " 770,\n", - " 771,\n", - " 772,\n", - " 773,\n", - " 774,\n", - " 775,\n", - " 776,\n", - " 777,\n", - " 778,\n", - " 779,\n", - " 780,\n", - " 781,\n", - " 782,\n", - " 783,\n", - " 784,\n", - " 785,\n", - " 786,\n", - " 787,\n", - " 788,\n", - " 789,\n", - " 790,\n", - " 791,\n", - " 792,\n", - " 793,\n", - " 794,\n", - " 795,\n", - " 796,\n", - " 797,\n", - " 798,\n", - " 799,\n", - " 800,\n", - " 801,\n", - " 802,\n", - " 803,\n", - " 804,\n", - " 805,\n", - " 806,\n", - " 807,\n", - " 808,\n", - " 809,\n", - " 810,\n", - " 811,\n", - " 812,\n", - " 813,\n", - " 814,\n", - " 815,\n", - " 816,\n", - " 817,\n", - " 818,\n", - " 819,\n", - " 820,\n", - " 821,\n", - " 822,\n", - " 823,\n", - " 824,\n", - " 825,\n", - " 826,\n", - " 827,\n", - " 828,\n", - " 829,\n", - " 830,\n", - " 831,\n", - " 832,\n", - " 833,\n", - " 834,\n", - " 835,\n", - " 836,\n", - " 837,\n", - " 838,\n", - " 839,\n", - " 840,\n", - " 841,\n", - " 842,\n", - " 843,\n", - " 844,\n", - " 845,\n", - " 846,\n", - " 847,\n", - " 848,\n", - " 849,\n", - " 850,\n", - " 851,\n", - " 852,\n", - " 853,\n", - " 854,\n", - " 855,\n", - " 856,\n", - " 857,\n", - " 858,\n", - " 859,\n", - " 860,\n", - " 861,\n", - " 862,\n", - " 863,\n", - " 864,\n", - " 865,\n", - " 866,\n", - " 867,\n", - " 868,\n", - " 869,\n", - " 870,\n", - " 871,\n", - " 872,\n", - " 873,\n", - " 874,\n", - " 875,\n", - " 876,\n", - " 877,\n", - " 878,\n", - " 879,\n", - " 880,\n", - " 881,\n", - " 882,\n", - " 883,\n", - " 884,\n", - " 885,\n", - " 886,\n", - " 887,\n", - " 888,\n", - " 889,\n", - " 890,\n", - " 891,\n", - " 892,\n", - " 893,\n", - " 894,\n", - " 895,\n", - " 896,\n", - " 897,\n", - " 898,\n", - " 899,\n", - " 900,\n", - " 901,\n", - " 902,\n", - " 903,\n", - " 904,\n", - " 905,\n", - " 906,\n", - " 907,\n", - " 908,\n", - " 909,\n", - " 910,\n", - " 911,\n", - " 912,\n", - " 913,\n", - " 914,\n", - " 915,\n", - " 916,\n", - " 917,\n", - " 918,\n", - " 919,\n", - " 920,\n", - " 921,\n", - " 922,\n", - " 923,\n", - " 924,\n", - " 925,\n", - " 926,\n", - " 927,\n", - " 928,\n", - " 929,\n", - " 930,\n", - " 931,\n", - " 932,\n", - " 933,\n", - " 934,\n", - " 935,\n", - " 936,\n", - " 937,\n", - " 938,\n", - " 939,\n", - " 940,\n", - " 941,\n", - " 942,\n", - " 943,\n", - " 944,\n", - " 945,\n", - " 946,\n", - " 947,\n", - " 948,\n", - " 949,\n", - " 950,\n", - " 951,\n", - " 952,\n", - " 953,\n", - " 954,\n", - " 955,\n", - " 956,\n", - " 957,\n", - " 958,\n", - " 959,\n", - " 960,\n", - " 961,\n", - " 962,\n", - " 963,\n", - " 964,\n", - " 965,\n", - " 966,\n", - " 967,\n", - " 968,\n", - " 969,\n", - " 970,\n", - " 971,\n", - " 972,\n", - " 973,\n", - " 974,\n", - " 975,\n", - " 976,\n", - " 977,\n", - " 978,\n", - " 979,\n", - " 980,\n", - " 981,\n", - " 982,\n", - " 983,\n", - " 984,\n", - " 985,\n", - " 986,\n", - " 987,\n", - " 988,\n", - " 989,\n", - " 990,\n", - " 991,\n", - " 992,\n", - " 993,\n", - " 994,\n", - " 995,\n", - " 996,\n", - " 997,\n", - " 998,\n", - " 999,\n", - " 1000,\n", - " ...],\n", - " 'tgt': [121],\n", - " 'out': 'nominal',\n", - " 'predict': ,\n", - " 'predict_proba': ,\n", - " 'shape': '\"square\"',\n", - " 'width': '1'}" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "clf.g_list[0].nodes['f-00']" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4.53 s ± 231 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "g_all = compose_all(clf.g_list)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n", - "did adapt\n" - ] - } - ], - "source": [ - "for n in g_all.nodes():\n", - " if g_all.nodes[n].get('src', False):\n", - " print(\"did adapt\")\n", - " g_all.nodes[n]['src'] = None" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "fn = 'joint_graph.pkl'\n", - "with open(fn, 'wb') as f:\n", - " pkl.dump(g_all, f)" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[1, 0, 0, 0],\n", - " [0, 1, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0]], dtype=int8)" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.diag([1,1,0,0]).astype(np.int8)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.(diag)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.4" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/tests/test-test.ipynb b/note/tests/test-test.ipynb deleted file mode 100644 index 756fb37..0000000 --- a/note/tests/test-test.ipynb +++ /dev/null @@ -1,59 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "Collapsed": "false" - }, - "source": [ - "# Test-Test\n", - "\n", - "Testing my testing workflow" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def test_numeric(a, b):\n", - " assert a > b" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "test_numeric(5, 2)\n", - "\n", - "test_numeric(8, 2)\n", - "\n", - "test_numeric(8, 2)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/tutorial/quickstart.ipynb b/note/tutorial/quickstart.ipynb deleted file mode 100644 index 02e5a7f..0000000 --- a/note/tutorial/quickstart.ipynb +++ /dev/null @@ -1,1016 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Quickstart" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": "false" - }, - "source": [ - "## Preliminaries" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": "false" - }, - "source": [ - "### Imports" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/cw/dtaijupiter/NoCsBack/dtai/elia/mercs/src/mercs/core/Mercs.py:25: UserWarning: xgboost not found, you cannot use this as an underlying learner.\n", - " warnings.warn(\"xgboost not found, you cannot use this as an underlying learner.\")\n", - "/cw/dtaijupiter/NoCsBack/dtai/elia/mercs/src/mercs/core/Mercs.py:32: UserWarning: lightgbm not found, you cannot use this as an underlying learner.\n", - " warnings.warn(\"lightgbm not found, you cannot use this as an underlying learner.\")\n", - "/cw/dtaijupiter/NoCsBack/dtai/elia/mercs/src/mercs/core/Mercs.py:39: UserWarning: catboost not found, you cannot use this as an underlying learner.\n", - " warnings.warn(\"catboost not found, you cannot use this as an underlying learner.\")\n", - "/cw/dtaijupiter/NoCsBack/dtai/elia/mercs/src/mercs/core/Mercs.py:46: UserWarning: wekalearn not found, you cannot use this as an underlying learner.\n", - " warnings.warn(\"wekalearn not found, you cannot use this as an underlying learner.\")\n", - "/cw/dtaijupiter/NoCsBack/dtai/elia/mercs/src/mercs/algo/induction.py:25: UserWarning: xgboost not found, you cannot use this as an underlying learner.\n", - " warnings.warn(\"xgboost not found, you cannot use this as an underlying learner.\")\n", - "/cw/dtaijupiter/NoCsBack/dtai/elia/mercs/src/mercs/algo/induction.py:32: UserWarning: lightgbm not found, you cannot use this as an underlying learner.\n", - " warnings.warn(\"lightgbm not found, you cannot use this as an underlying learner.\")\n", - "/cw/dtaijupiter/NoCsBack/dtai/elia/mercs/src/mercs/algo/induction.py:39: UserWarning: catboost not found, you cannot use this as an underlying learner.\n", - " warnings.warn(\"catboost not found, you cannot use this as an underlying learner.\")\n", - "/cw/dtaijupiter/NoCsBack/dtai/elia/mercs/src/mercs/algo/induction.py:46: UserWarning: wekalearn not found, you cannot use this as an underlying learner.\n", - " warnings.warn(\"wekalearn not found, you cannot use this as an underlying learner.\")\n", - "/cw/dtaijupiter/NoCsBack/dtai/elia/mercs/src/mercs/composition/CanonicalModel.py:12: UserWarning: catboost not found, you cannot use this as an underlying learner.\n", - " warnings.warn(\"catboost not found, you cannot use this as an underlying learner.\")\n" - ] - } - ], - "source": [ - "import mercs\n", - "import numpy as np\n", - "from mercs.tests import load_iris, default_dataset\n", - "from mercs.core import Mercs\n", - "\n", - "import pandas as pd" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": "false" - }, - "source": [ - "## Fit\n", - "\n", - "Here a small MERCS testdrive for what I suppose you'll need. First, let us generate a basic dataset. Some utility-functions are integrated in MERCS so that goes like this" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
0123
0-0.8789990.372105-0.1776630.0
1-1.007950-0.196467-1.2711231.0
20.3433410.209659-0.4462800.0
3-2.361662-0.600424-1.3015220.0
4-2.1235070.246505-1.3233880.0
\n", - "
" - ], - "text/plain": [ - " 0 1 2 3\n", - "0 -0.878999 0.372105 -0.177663 0.0\n", - "1 -1.007950 -0.196467 -1.271123 1.0\n", - "2 0.343341 0.209659 -0.446280 0.0\n", - "3 -2.361662 -0.600424 -1.301522 0.0\n", - "4 -2.123507 0.246505 -1.323388 0.0" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "train, test = default_dataset(n_features=3)\n", - "\n", - "df = pd.DataFrame(train)\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
0123
count800.000000800.000000800.000000800.000000
mean-0.0265560.023105-0.0323200.495000
std1.4146830.9826091.3510520.500288
min-4.543441-3.019512-3.8369290.000000
25%-1.074982-0.629842-1.0407690.000000
50%-0.2378250.000368-0.1808850.000000
75%0.9727480.6684191.0052001.000000
max4.0202623.9262383.9946441.000000
\n", - "
" - ], - "text/plain": [ - " 0 1 2 3\n", - "count 800.000000 800.000000 800.000000 800.000000\n", - "mean -0.026556 0.023105 -0.032320 0.495000\n", - "std 1.414683 0.982609 1.351052 0.500288\n", - "min -4.543441 -3.019512 -3.836929 0.000000\n", - "25% -1.074982 -0.629842 -1.040769 0.000000\n", - "50% -0.237825 0.000368 -0.180885 0.000000\n", - "75% 0.972748 0.668419 1.005200 1.000000\n", - "max 4.020262 3.926238 3.994644 1.000000" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": "false" - }, - "source": [ - "Now let's train a MERCS model. To know what options you have, come talk to me or dig in the code. For induction, `nb_targets` and `nb_iterations` matter most. Number of targets speaks for itself, number of iterations manages the amount of trees _for each target_. With `n_jobs` you can do multi-core learning (with joblib, really basic, but works fine on single machine), that makes stuff faster. `fraction_missing` sets the amount of attributes that is missing for a tree. However, this parameter only has an effect if you use the `random` selection algorithm. The alternative is the `base` algorithm, which selects targets, and uses all the rest as input." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [], - "source": [ - "clf = Mercs(\n", - " max_depth=4,\n", - " selection_algorithm=\"random\",\n", - " fraction_missing=0.6,\n", - " nb_targets=2,\n", - " nb_iterations=2,\n", - " n_jobs=1,\n", - " verbose=1,\n", - " inference_algorithm=\"own\",\n", - " max_steps=8,\n", - " prediction_algorithm=\"it\",\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": "false" - }, - "source": [ - "You have to specify the nominal attributes yourself. This determines whether a regressor or a classifier is learned for that target. MERCS takes care of grouping targets such that no mixed sets are created." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{3}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nominal_ids = {train.shape[1]-1}\n", - "nominal_ids" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [], - "source": [ - "clf.fit(train, nominal_attributes=nominal_ids)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": "false" - }, - "source": [ - "So, now we have learned trees with two targets, but only a single target was nominal. If MERCS worked well, it should have learned single-target classifiers (for attribute 4) and multi-target regressors for all other target sets." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - " Model with index: 0\n", - " DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None,\n", - " max_leaf_nodes=None, min_impurity_decrease=0.0,\n", - " min_impurity_split=None, min_samples_leaf=1,\n", - " min_samples_split=2, min_weight_fraction_leaf=0.0,\n", - " presort=False, random_state=121958, splitter='best')\n", - " \n", - "\n", - " Model with index: 1\n", - " DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None,\n", - " max_leaf_nodes=None, min_impurity_decrease=0.0,\n", - " min_impurity_split=None, min_samples_leaf=1,\n", - " min_samples_split=2, min_weight_fraction_leaf=0.0,\n", - " presort=False, random_state=671155, splitter='best')\n", - " \n", - "\n", - " Model with index: 2\n", - " DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None,\n", - " max_leaf_nodes=None, min_impurity_decrease=0.0,\n", - " min_impurity_split=None, min_samples_leaf=1,\n", - " min_samples_split=2, min_weight_fraction_leaf=0.0,\n", - " presort=False, random_state=131932, splitter='best')\n", - " \n", - "\n", - " Model with index: 3\n", - " DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None,\n", - " max_leaf_nodes=None, min_impurity_decrease=0.0,\n", - " min_impurity_split=None, min_samples_leaf=1,\n", - " min_samples_split=2, min_weight_fraction_leaf=0.0,\n", - " presort=False, random_state=365838, splitter='best')\n", - " \n", - "\n", - " Model with index: 4\n", - " DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=4,\n", - " max_features=None, max_leaf_nodes=None,\n", - " min_impurity_decrease=0.0, min_impurity_split=None,\n", - " min_samples_leaf=1, min_samples_split=2,\n", - " min_weight_fraction_leaf=0.0, presort=False,\n", - " random_state=259178, splitter='best')\n", - " \n", - "\n", - " Model with index: 5\n", - " DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=4,\n", - " max_features=None, max_leaf_nodes=None,\n", - " min_impurity_decrease=0.0, min_impurity_split=None,\n", - " min_samples_leaf=1, min_samples_split=2,\n", - " min_weight_fraction_leaf=0.0, presort=False,\n", - " random_state=644167, splitter='best')\n", - " \n" - ] - } - ], - "source": [ - "for idx, m in enumerate(clf.m_list):\n", - " msg = \"\"\"\n", - " Model with index: {}\n", - " {}\n", - " \"\"\".format(idx, m.model)\n", - " print(msg)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": "false" - }, - "source": [ - "So, that looks good already. Let's examine up close." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 0, 1, 1, -1],\n", - " [ 1, 1, 0, 0],\n", - " [ 1, 1, -1, 0],\n", - " [ 1, 0, 1, -1],\n", - " [ 0, -1, -1, 1],\n", - " [-1, 0, -1, 1]])" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "clf.m_codes" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": "false" - }, - "source": [ - "That's the matrix that summarizes everything. This can be dense to parse, and there's alternatives to gain insights, for instance;" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - " Tree with id: 0\n", - " has source attributes: [0]\n", - " has target attributes: [1, 2],\n", - " and predicts numeric attributes\n", - " \n", - "\n", - " Tree with id: 1\n", - " has source attributes: [2, 3]\n", - " has target attributes: [0, 1],\n", - " and predicts numeric attributes\n", - " \n", - "\n", - " Tree with id: 2\n", - " has source attributes: [3]\n", - " has target attributes: [0, 1],\n", - " and predicts numeric attributes\n", - " \n", - "\n", - " Tree with id: 3\n", - " has source attributes: [1]\n", - " has target attributes: [0, 2],\n", - " and predicts numeric attributes\n", - " \n", - "\n", - " Tree with id: 4\n", - " has source attributes: [0]\n", - " has target attributes: [3],\n", - " and predicts nominal attributes\n", - " \n", - "\n", - " Tree with id: 5\n", - " has source attributes: [1]\n", - " has target attributes: [3],\n", - " and predicts nominal attributes\n", - " \n" - ] - } - ], - "source": [ - "for m_idx, m in enumerate(clf.m_list):\n", - " msg = \"\"\"\n", - " Tree with id: {}\n", - " has source attributes: {}\n", - " has target attributes: {},\n", - " and predicts {} attributes\n", - " \"\"\".format(m_idx, m.desc_ids, m.targ_ids, m.out_kind)\n", - " print(msg)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": "false" - }, - "source": [ - "And that concludes my quick tour of how to fit with MERCS." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": "false" - }, - "source": [ - "## Prediction\n", - "\n", - "First, we generate a query." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Query code is: [0 0 0 1]\n" - ] - }, - { - "data": { - "text/plain": [ - "array([0., 0., 0., 1., 0., 0., 1., 1., 1., 1.])" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Single target\n", - "q_code=np.zeros(clf.m_codes[0].shape[0], dtype=int)\n", - "q_code[-1:] = 1\n", - "print(\"Query code is: {}\".format(q_code))\n", - "\n", - "y_pred = clf.predict(test, q_code=q_code)\n", - "y_pred[:10]" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "G\n", - "\n", - "\n", - "\n", - "('D', 0)\n", - "\n", - "('D', 0)\n", - "\n", - "\n", - "\n", - "('M', 4)\n", - "\n", - "('M', 4)\n", - "\n", - "\n", - "\n", - "('D', 0)->('M', 4)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 3)\n", - "\n", - "('D', 3)\n", - "\n", - "\n", - "\n", - "('M', 4)->('D', 3)\n", - "\n", - "\n", - "\n", - "\n", - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "clf.show_q_diagram()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Query code is: [0 0 1 1]\n" - ] - }, - { - "data": { - "text/plain": [ - "array([[ 0.15161875, 0. ],\n", - " [-0.07064853, 0. ],\n", - " [ 0.15161875, 0. ],\n", - " [ 0.21392281, 1. ],\n", - " [ 0.03979332, 0. ],\n", - " [-0.20459606, 0. ],\n", - " [ 0.21392281, 1. ],\n", - " [-0.20459606, 1. ],\n", - " [-0.31503791, 1. ],\n", - " [-0.17568144, 1. ]])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Multi-target\n", - "q_code=np.zeros(clf.m_codes[0].shape[0], dtype=int)\n", - "q_code[-2:] = 1\n", - "print(\"Query code is: {}\".format(q_code))\n", - "\n", - "y_pred = clf.predict(test, q_code=q_code)\n", - "y_pred[:10]" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "G\n", - "\n", - "\n", - "\n", - "('D', 0)\n", - "\n", - "('D', 0)\n", - "\n", - "\n", - "\n", - "('M', 4)\n", - "\n", - "('M', 4)\n", - "\n", - "\n", - "\n", - "('D', 0)->('M', 4)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('M', 0)\n", - "\n", - "('M', 0)\n", - "\n", - "\n", - "\n", - "('D', 0)->('M', 0)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 3)\n", - "\n", - "('D', 3)\n", - "\n", - "\n", - "\n", - "('M', 4)->('D', 3)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 2)\n", - "\n", - "('D', 2)\n", - "\n", - "\n", - "\n", - "('M', 0)->('D', 2)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 1)\n", - "\n", - "('D', 1)\n", - "\n", - "\n", - "\n", - "('M', 3)\n", - "\n", - "('M', 3)\n", - "\n", - "\n", - "\n", - "('D', 1)->('M', 3)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('M', 3)->('D', 2)\n", - "\n", - "\n", - "\n", - "\n", - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "clf.show_q_diagram()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Query code is: [-1 -1 0 1]\n" - ] - }, - { - "data": { - "text/plain": [ - "array([0., 0., 0., 0., 0., 0., 0., 1., 1., 0.])" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Missing attributes\n", - "q_code=np.zeros(clf.m_codes[0].shape[0], dtype=int)\n", - "q_code[-1:] = 1\n", - "q_code[:2] = -1\n", - "print(\"Query code is: {}\".format(q_code))\n", - "\n", - "y_pred = clf.predict(test, q_code=q_code)\n", - "y_pred[:10]" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "G\n", - "\n", - "\n", - "\n", - "('D', 2)\n", - "\n", - "('D', 2)\n", - "\n", - "\n", - "\n", - "('M', 1)\n", - "\n", - "('M', 1)\n", - "\n", - "\n", - "\n", - "('D', 2)->('M', 1)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 0)\n", - "\n", - "('D', 0)\n", - "\n", - "\n", - "\n", - "('M', 1)->('D', 0)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('I', 3)\n", - "\n", - "('I', 3)\n", - "\n", - "\n", - "\n", - "('I', 3)->('M', 1)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('M', 4)\n", - "\n", - "('M', 4)\n", - "\n", - "\n", - "\n", - "('D', 0)->('M', 4)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('D', 3)\n", - "\n", - "('D', 3)\n", - "\n", - "\n", - "\n", - "('M', 4)->('D', 3)\n", - "\n", - "\n", - "\n", - "\n", - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "clf.show_q_diagram()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "rwrf", - "language": "python", - "name": "rwrf" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/vector-prediction/composite-model-generation.ipynb b/note/vector-prediction/composite-model-generation.ipynb deleted file mode 100644 index f8b373e..0000000 --- a/note/vector-prediction/composite-model-generation.ipynb +++ /dev/null @@ -1,309 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import networkx as nx\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import mercs" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from mercs.utils import code_to_query\n", - "\n", - "from mercs.graph.q_diagram import build_diagram" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Preliminaries\n", - "\n", - "Getting a very basic mercs model on my hands to test with." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 0, 0, -1, -1, 1],\n", - " [ 1, -1, 0, 0, 1],\n", - " [-1, -1, 1, -1, 0],\n", - " [-1, -1, 0, 1, 0]])" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m_codes = [\n", - " [ 0, 0,-1,-1 ,1],\n", - " [1,-1, 0, 0, 1],\n", - " [-1,-1, 1,-1, 0],\n", - " [-1,-1, 0, 1, 0] \n", - "]\n", - "\n", - "m_codes = np.array(m_codes)\n", - "m_codes" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "class model():\n", - " def __init__(self, m_code):\n", - " self.desc_ids = set(np.where(m_code==0)[0])\n", - " self.targ_ids = set(np.where(m_code==1)[0])\n", - " return" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{0, 1}" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m_list = [model(m_code) for m_code in m_codes]\n", - "m_list[0].desc_ids" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "from functools import reduce" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Algorithm" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Single-Layer Model" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "m_sel = [np.array([0,1])]\n", - "q_code = np.array([1, 0, 0, 0, 1])\n", - "\n", - "\n", - "#g.nodes()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "75.7 µs ± 1.04 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "g = build_diagram(m_list, m_sel, q_code, g=None, prune=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "g = build_diagram(m_list, m_sel, q_code, g=None, prune=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "NodeView((('I', 0), ('D', 0), ('D', 3), ('M', 1), ('D', 1), ('M', 0), ('D', 2), ('D', 4)))" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "g.nodes" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 1)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m for n, idx in :\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" - ] - } - ], - "source": [ - "for n, idx in :\n", - " print(n)\n", - " print(idx)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "g.predecessors(('D', 4))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "g.remove_nodes_from" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(nx.topological_sort(g))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nx.ancestors(g, ('M', 1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Change inputs in dask is still absolutely crucial. But this network way of viewing ML as a whole could be a very, very cool idea. Especially if you want the problem to be treated recursively. Please persist in your efforts. In the end, the idea would be to do ML on an unprecendented scale, decentralized yet coordinated." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Inference" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "g.in_degree()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "g.add_nodes_from([('elia', dict(last='van woplutte'))])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "g.nodes(data=True)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.4" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/vector-prediction/inference-better.ipynb b/note/vector-prediction/inference-better.ipynb deleted file mode 100644 index b993bac..0000000 --- a/note/vector-prediction/inference-better.ipynb +++ /dev/null @@ -1,521 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Inference Algorithm" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import networkx as nx\n", - "from dask import delayed\n", - "\n", - "from mercs.composition import o" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Setup" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "check = lambda k,n: k=='D'" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "dataset='iris'\n", - "kind='train'\n", - "separator='-'\n", - "extension='csv'" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'iris-train.csv'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "filename = separator.join([dataset, kind])+\".{}\".format(extension)\n", - "filename" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "a = np.ndarray([1,2,3])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Function" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def inference_algorithm(g, data):\n", - "\n", - " data_node = lambda x: isinstance(x, int)\n", - " model_node = lambda x: x.startswith(\"M\")\n", - " imputation_node = lambda x: x.startswith(\"I\")\n", - "\n", - " nodes = list(nx.topological_sort(g))\n", - "\n", - " g_desc_ids = list(g.desc_ids)\n", - "\n", - " for n in nodes:\n", - " if data_node(n):\n", - " if g.in_degree(n) == 0:\n", - " dask_input_data_node(g, n, g_desc_ids, data)\n", - " elif g.in_degree(n) == 1:\n", - " dask_single_data_node(g, n, m_list)\n", - " elif g.in_degree(n) > 1:\n", - " if n[1] in nominal_ids:\n", - " dask_nominal_data_node(g, n, m_list)\n", - " else:\n", - " dask_numeric_data_node(g, n, m_list)\n", - " elif model_node(n):\n", - " f[n] = dask_model_node(g, n)\n", - " elif imputation_node(n):\n", - " f[n] = dask_imputation_node(g, n)\n", - " else:\n", - " raise ValueError(\"Did not recognize node kind of {}\".format(node_name))\n", - "\n", - " return\n", - "\n", - "\n", - "def dask_input_data_node(g, node, g_desc_ids, data):\n", - " g.node[node][\"dask\"] = delayed(_select_numeric(g_desc_ids.index(idx)))(data)\n", - " return\n", - "\n", - "\n", - "def dask_model_node(g, node, m_list):\n", - " # Collect input data\n", - " parent_functions = _get_parents_of_model_node(g, node)\n", - " collector = delayed(np.stack)(parent_functions, axis=1)\n", - "\n", - " # Convert function\n", - " g.node[node][\"dask\"] = delayed(m_list[node[1]].predict)(collector)\n", - "\n", - " if hasattr(m_list[node[1]], \"predict_proba\"):\n", - " g.node[node][\"dask_proba\"] = delayed(node[\"predict_proba\"])(collector)\n", - "\n", - " return\n", - "\n", - "\n", - "def dask_imputation_node(g, node, i_list, nb_rows):\n", - "\n", - " f1 = _dummy_array\n", - " f2 = i_list[node[1]].transform\n", - " f = o(f2, f1)\n", - "\n", - " g.node[node][\"dask\"] = delayed(f)(nb_rows)\n", - " return\n", - "\n", - "\n", - "def dask_single_data_node(g, node, m_list):\n", - " # Single output to recover from model, I do not have to merge or anything.\n", - " idx, parent_functions = _get_parents_of_numeric_data_node(g, m_list, node)[0]\n", - " g.node[node][\"dask\"] = delayed(_select_numeric(idx))(parent_functions)\n", - " return\n", - "\n", - "\n", - "def dask_nominal_data_node(g, node, m_list):\n", - " idx_cls_fnc = _get_parents_of_nominal_data_node(g, m_list, node)\n", - " classes = np.unique(np.hstack([c for _, c, _ in idx_cls_fnc]))\n", - "\n", - " # Reduce\n", - " parent_functions = []\n", - " for idx, c, fnc in idx_cls_fnc:\n", - " f1 = delayed(_select_nominal(idx))(fnc)\n", - " if len(c) < len(classes):\n", - " f2 = delayed(_pad_proba(c, classes))(f1)\n", - " parent_functions.append(f2)\n", - " else:\n", - " parent_functions.append(f1)\n", - "\n", - " f3 = delayed(partial(np.sum, axis=0))(parent_functions)\n", - "\n", - " # Vote\n", - " def vote(X):\n", - " return classes.take(np.argmax(X, axis=1), axis=0)\n", - "\n", - " g.node[node][\"dask\"] = delayed(vote)(f3)\n", - " return\n", - "\n", - "\n", - "def dask_numeric_data_node(g, node, m_list):\n", - " idx_fnc = _get_parents_of_numeric_data_node(g, m_list, node)\n", - "\n", - " parent_functions = [delayed(_select_numeric(idx))(fnc) for idx, fnc in idx_fnc]\n", - " g.node[node][\"dask\"] = delayed(partial(np.mean, axis=0))(parent_functions)\n", - " return" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def _get_parents_of_model_node(g, node):\n", - " parent_functions = {a: g.nodes[(m, a)][\"dask\"] for m, a in g.predecessors(node)}\n", - " parent_functions = [v for k, v in sorted(parent_functions.items())]\n", - " return parent_functions\n", - "\n", - "\n", - "def _get_parents_of_numeric_data_node(g, m_list, node):\n", - "\n", - " rel_idx = lambda p_idx, n_idx: list(m_list[p_idx].targ_ids).index(n_idx)\n", - "\n", - " parents = ((m, p_idx) for m, p_idx in g.predecessors(node))\n", - "\n", - " idx_fnc = [\n", - " (rel_idx(p_idx, node[1]), g.node[(m, p_idx)][\"dask\"]) for m, p_idx in parents\n", - " ]\n", - "\n", - " return idx_fnc\n", - "\n", - "\n", - "def _get_parents_of_nominal_data_node(g, m_list, node):\n", - " rel_idx = lambda p_idx, n_idx: list(m_list[p_idx].targ_ids).index(n_idx)\n", - " classes = lambda p_idx, r_idx: m_list[p_idx].classes_[r_idx]\n", - "\n", - " parents = ((m, p_idx) for m, p_idx in g.predecessors(node))\n", - "\n", - " idx_fnc = (\n", - " (rel_idx(p_idx, node[1]), p_idx, g.node[(m, p_idx)][\"dask\"])\n", - " for m, p_idx in parents\n", - " )\n", - " idx_cls_fnc = [(r_idx, classes(p_idx, r_idx), f) for r_idx, p_idx, f in idx_cls_fnc]\n", - "\n", - " return idx_cls_fnc\n", - "\n", - "\n", - "def _dummy_array(nb_rows):\n", - " a = np.empty((nb_rows, 1))\n", - " a.fill(np.nan)\n", - " return a" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a = lambda x,y: x+y\n", - "a(3,2)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "969 µs ± 97.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "n_rows =10**6\n", - "a = np.empty((n_rows,1))\n", - "a[:]=np.nan\n", - "#a = a.reshape(-1,1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "934 µs ± 36 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "n_rows =10**6\n", - "a=np.full((n_rows, 1), np.nan)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Helpers\n", - "def _select_numeric(idx):\n", - " def select(X):\n", - " if a.ndim > 1:\n", - " return X[:, idx]\n", - " else:\n", - " return X\n", - "\n", - " return select" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "d = {300: 'd', 0: 'a', 1:'c'}" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[(0, 'a'), (1, 'c'), (300, 'd')]" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sorted(d.items())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "actions = dict()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "NODE_KINDS = dict(\n", - "I=\"imputation\",\n", - "M=\"model\",)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.4" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/note/vector-prediction/vector-prediction.ipynb b/note/vector-prediction/vector-prediction.ipynb deleted file mode 100644 index 015b53f..0000000 --- a/note/vector-prediction/vector-prediction.ipynb +++ /dev/null @@ -1,495 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Vector Prediction\n", - "\n", - "Vectorized Prediction algorithms for MERCS. We need that speed." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Imports" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from functools import partial\n", - "import numpy as np\n", - "import numba\n", - "\n", - "from mercs.utils import DESC_ENCODING, TARG_ENCODING, MISS_ENCODING, code_to_query, get_att_2d" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Functions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Helpers" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Strategies\n", - "def mi(m_codes, m_fimps, m_score, q_code, m_avl=None, random_state=997):\n", - "\n", - " # Init\n", - " a_src, a_tgt, _ = code_to_query(q_code)\n", - "\n", - " # Criterion\n", - " c_all = criterion(m_score, a_filter=a_tgt, m_filter=m_avl, aggregation=None)\n", - "\n", - " # Pick\n", - " m_sel = pick(c_all, thresholds=None)\n", - "\n", - " return m_sel\n", - "\n", - "\n", - "def mrai(\n", - " m_codes,\n", - " m_fimps,\n", - " m_score,\n", - " q_code=None,\n", - " a_src=None,\n", - " a_tgt=None,\n", - " m_avl=None,\n", - " init_threshold=1.0,\n", - " stepsize=0.1,\n", - " any_target=False,\n", - " stochastic=False,\n", - " thresholds=None,\n", - " random_state=997,\n", - "):\n", - " # Init\n", - " if m_avl is None:\n", - " m_avl = np.arange(m_codes.shape[0], dtype=np.int16)\n", - "\n", - " if thresholds is None:\n", - " thresholds = _init_thresholds(init_threshold, stepsize)\n", - "\n", - " if a_src is None or a_tgt is None:\n", - " a_src, a_tgt, _ = code_to_query(q_code, return_sets=True)\n", - "\n", - " # Criterion\n", - " c_src = criterion(m_fimps, a_filter=a_src, m_filter=m_avl, aggregation=True)\n", - " c_tgt = criterion(m_score, a_filter=a_tgt, m_filter=m_avl, aggregation=None)\n", - " c_all = c_src.reshape(-1, 1) * c_tgt + c_tgt\n", - "\n", - " # Pick\n", - " m_sel = pick(\n", - " c_all,\n", - " thresholds=thresholds,\n", - " any_target=any_target,\n", - " stochastic=stochastic,\n", - " random_state=random_state,\n", - " )\n", - "\n", - " return m_sel\n", - "\n", - "\n", - "def it(\n", - " m_codes,\n", - " m_fimps,\n", - " m_score,\n", - " q_code,\n", - " m_avl=None,\n", - " max_steps=4,\n", - " init_threshold=1.0,\n", - " stepsize=0.1,\n", - " random_state=997,\n", - "):\n", - " m_sel = []\n", - " thresholds = _init_thresholds(init_threshold, stepsize)\n", - " any_target = True\n", - " stochastic = False\n", - "\n", - " q_desc, q_targ, q_miss = code_to_query(q_code)\n", - " a_src = q_desc\n", - " a_tgt = np.hstack([q_targ, q_miss])\n", - "\n", - " if m_avl is None:\n", - " m_avl = np.arange(m_codes.shape[0], dtype=np.int16)\n", - "\n", - " for step in range(max_steps):\n", - "\n", - " # Check if this is our last chance\n", - " last = step + 1 == max_steps\n", - " if last:\n", - " any_target = False # Finish the job\n", - " a_tgt = np.setdiff1d(\n", - " q_targ, a_src\n", - " ) # Focus exclusively on non-predicted q_targ attributes.\n", - "\n", - " step_m_sel = mrai(\n", - " m_codes,\n", - " m_fimps,\n", - " m_score,\n", - " a_src=a_src,\n", - " a_tgt=a_tgt,\n", - " m_avl=m_avl,\n", - " stochastic=stochastic,\n", - " any_target=any_target,\n", - " thresholds=thresholds,\n", - " random_state=random_state,\n", - " )\n", - "\n", - " a_prd = get_att_2d(m_codes[step_m_sel, :], kind=\"targ\")\n", - " \n", - " a_src = np.union1d(a_src, a_prd)\n", - " a_tgt = np.setdiff1d(a_tgt, a_prd)\n", - "\n", - " m_avl = np.setdiff1d(m_avl, step_m_sel)\n", - " m_sel.append(step_m_sel)\n", - "\n", - " if _stopping_criterion_it(q_targ, a_src):\n", - " break\n", - "\n", - " if len(step_m_sel) == 0:\n", - " raise ValueError(\n", - " \"No progress was made. This indicates an impossible query.\"\n", - " )\n", - "\n", - " return m_sel\n", - "\n", - "\n", - "# MRAI-IT-RW Criterion\n", - "def criterion(m_matrix, m_filter, a_filter, aggregation=None):\n", - " \"\"\"\n", - " Typical usecase \n", - " \n", - " m_matrix = m_fimps\n", - " \n", - " m_filter = available models\n", - " a_filter = available attributes.\n", - " \n", - " \"\"\"\n", - " nb_rows = m_matrix.shape[0]\n", - " nb_cols = len(a_filter)\n", - " \n", - " c_matrix = np.zeros((nb_rows, nb_cols), dtype=np.float32)\n", - "\n", - " m_idx = a_filter + m_filter.reshape(-1, 1) * m_matrix.shape[1]\n", - " c_matrix[m_filter, :] = m_matrix.take(m_idx.flat).reshape(nb_rows, nb_cols)\n", - "\n", - " if aggregation is None:\n", - " return c_matrix\n", - " else:\n", - " return np.sum(c_matrix, axis=1).reshape(-1, 1).astype(np.float32)\n", - "\n", - "\n", - "# Picks\n", - "def pick(\n", - " criteria, thresholds=None, any_target=False, stochastic=False, random_state=997\n", - "):\n", - "\n", - " if thresholds is None:\n", - " return np.where(criteria >= 0)[0]\n", - " else:\n", - " m_sel = []\n", - "\n", - " picking_function = _stochastic_pick if stochastic else _greedy_pick\n", - "\n", - " if any_target:\n", - " criteria = np.max(criteria, axis=1).reshape(-1, 1)\n", - "\n", - " for c_idx in range(criteria.shape[1]):\n", - " m_sel.extend(\n", - " picking_function(\n", - " criteria[:, c_idx], thresholds=thresholds, random_state=random_state\n", - " )\n", - " )\n", - "\n", - " return np.unique(m_sel)\n", - "\n", - "\n", - "def _greedy_pick(c_all, thresholds=None, **kwargs):\n", - " for thr in thresholds:\n", - " m_sel = np.where(c_all > thr)[0]\n", - " if _stopping_criterion_greedy_pick(m_sel):\n", - " break\n", - " return m_sel\n", - "\n", - "\n", - "def _stochastic_pick(c_all, random_state=997, **kwargs):\n", - " np.random.seed(random_state)\n", - " norm = np.linalg.norm(c_all, 1)\n", - "\n", - " if norm > 0:\n", - " distribution = c_all / np.sum(c_all)\n", - " else:\n", - " distribution = np.full(len(c_all), 1 / len(c_all))\n", - "\n", - " draw = np.random.multinomial(1, distribution, size=1)\n", - " return np.where(draw == 1)[1]\n", - "\n", - "\n", - "# Stopping Criteria\n", - "def _stopping_criterion_it(q_targ, a_src):\n", - " return np.setdiff1d(q_targ, a_src).shape[0] == 0\n", - "\n", - "\n", - "def _stopping_criterion_greedy_pick(m_sel):\n", - " return len(m_sel) > 0\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# Helpers\n", - "def _init_thresholds(init_threshold, stepsize):\n", - " return np.arange(init_threshold, -stepsize, -stepsize, dtype=np.float32)" - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [ - "# Helpers\n", - "def _init_thresholds(init_threshold, stepsize):\n", - "\n", - " thresholds = (\n", - " np.round(np.arange(init_threshold, -stepsize, -stepsize), decimals=4) * 10 ** 4\n", - " )\n", - " return thresholds.astype(np.int16, copy=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Sandbox\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "def init_m_fimps_or_m_scores(m_codes, kind='m_fimps'):\n", - " \n", - " if kind in {'m_fimps'}:\n", - " value = DESC_ENCODING\n", - " elif kind in {'m_score'}:\n", - " value = TARG_ENCODING\n", - " \n", - " m_init = np.zeros(m_codes.shape)\n", - " m_init[np.where(m_codes == value)] = np.random.rand(len(m_init[np.where(m_codes == value)]))\n", - "\n", - " normalize(m_init, norm='l1', copy=False)\n", - " \n", - " #m_init = m_init*100\n", - " return m_init.astype(np.float32)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "rand() got an unexpected keyword argument 'dtype'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mm_fimps\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minit_m_fimps_or_m_scores\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm_codes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkind\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'm_fimps'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0mm_score\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minit_m_fimps_or_m_scores\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm_codes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkind\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'm_score'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36minit_m_fimps_or_m_scores\u001b[0;34m(m_codes, kind)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mm_init\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm_codes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0mm_init\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwhere\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm_codes\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrand\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm_init\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwhere\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm_codes\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat32\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mnormalize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm_init\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnorm\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'l1'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: rand() got an unexpected keyword argument 'dtype'" - ] - } - ], - "source": [ - "from sklearn.preprocessing import normalize\n", - "\n", - "nb_attributes = 1*10**3\n", - "nb_iterations = 2\n", - "\n", - "m_codes = np.random.randint(-1,2, size=(nb_iterations*nb_attributes, nb_attributes), dtype=np.int8)\n", - "q_code = np.random.randint(-1,2, nb_attributes, dtype=np.int8)\n", - "\n", - "\n", - "m_fimps = init_m_fimps_or_m_scores(m_codes, kind='m_fimps')\n", - "m_score = init_m_fimps_or_m_scores(m_codes, kind='m_score')\n", - "\n", - "#m_fimps, m_score\n", - "\n", - "msg = \"\"\"\n", - "m_codes:\n", - "{}\n", - "m_fimps:\n", - "{}\n", - "m_score:\n", - "{}\n", - "q_code:\n", - "{}\n", - "\"\"\".format(m_codes, m_fimps, m_score, q_code)\n", - "print(msg)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Tests" - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [ - "%%timeit\n", - "it(m_codes, m_fimps, m_score, q_code, m_avl=None)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6.33" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "6.33" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "unsupported operand type(s) for +: 'set' and 'int'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mget_ipython\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_cell_magic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'timeit'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m''\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'mrai(m_codes, m_fimps, m_score, q_code, m_avl=None)\\n'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/miniconda3/envs/mercs/lib/python3.7/site-packages/IPython/core/interactiveshell.py\u001b[0m in \u001b[0;36mrun_cell_magic\u001b[0;34m(self, magic_name, line, cell)\u001b[0m\n\u001b[1;32m 2357\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuiltin_trap\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2358\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mmagic_arg_s\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcell\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2359\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2360\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2361\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/mercs/lib/python3.7/site-packages/IPython/core/magic.py\u001b[0m in \u001b[0;36m\u001b[0;34m(f, *a, **k)\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[0;31m# but it's overkill for just that one bit of state.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmagic_deco\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 187\u001b[0;31m \u001b[0mcall\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/mercs/lib/python3.7/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n\u001b[1;32m 1156\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mindex\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1157\u001b[0m \u001b[0mnumber\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m \u001b[0;34m**\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1158\u001b[0;31m \u001b[0mtime_number\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtimer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1159\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtime_number\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0;36m0.2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1160\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/mercs/lib/python3.7/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, number)\u001b[0m\n\u001b[1;32m 167\u001b[0m \u001b[0mgc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdisable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 168\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 169\u001b[0;31m \u001b[0mtiming\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minner\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 170\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 171\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgcold\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36minner\u001b[0;34m(_it, _timer)\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mmrai\u001b[0;34m(m_codes, m_fimps, m_score, q_code, a_src, a_tgt, m_avl, init_threshold, stepsize, any_target, stochastic, thresholds, random_state)\u001b[0m\n\u001b[1;32m 40\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 41\u001b[0m \u001b[0;31m# Criterion\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 42\u001b[0;31m \u001b[0mc_src\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm_fimps\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma_filter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0ma_src\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm_filter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mm_avl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maggregation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 43\u001b[0m \u001b[0mc_tgt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm_score\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma_filter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0ma_tgt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm_filter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mm_avl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maggregation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 44\u001b[0m \u001b[0mc_all\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mc_src\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mc_tgt\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mc_tgt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mcriterion\u001b[0;34m(m_matrix, m_filter, a_filter, aggregation)\u001b[0m\n\u001b[1;32m 137\u001b[0m \u001b[0mc_matrix\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnb_rows\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnb_cols\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat32\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 138\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 139\u001b[0;31m \u001b[0mm_idx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma_filter\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mm_filter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mm_matrix\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 140\u001b[0m \u001b[0mc_matrix\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mm_filter\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mm_matrix\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtake\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm_idx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mflat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnb_rows\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnb_cols\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 141\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for +: 'set' and 'int'" - ] - } - ], - "source": [ - "%%timeit\n", - "mrai(m_codes, m_fimps, m_score, q_code, m_avl=None)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "38.9 ms ± 71.4 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "it(m_codes, m_fimps, m_score, q_code, m_avl=None)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "dtype('float64')" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a = np.random.rand(100,2)\n", - "a.dtype" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mercs", - "language": "python", - "name": "mercs" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.4" - }, - "toc-autonumbering": true - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..32b4ff4 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1948 @@ +[[package]] +category = "main" +description = "Disable App Nap on OS X 10.9" +marker = "sys_platform == \"darwin\" or platform_system == \"Darwin\"" +name = "appnope" +optional = false +python-versions = "*" +version = "0.1.0" + +[[package]] +category = "dev" +description = "The secure Argon2 password hashing algorithm." +name = "argon2-cffi" +optional = false +python-versions = "*" +version = "20.1.0" + +[package.dependencies] +cffi = ">=1.0.0" +six = "*" + +[package.extras] +dev = ["coverage (>=5.0.2)", "hypothesis", "pytest", "sphinx", "wheel", "pre-commit"] +docs = ["sphinx"] +tests = ["coverage (>=5.0.2)", "hypothesis", "pytest"] + +[[package]] +category = "dev" +description = "Atomic file writes." +marker = "sys_platform == \"win32\"" +name = "atomicwrites" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.4.0" + +[[package]] +category = "dev" +description = "Classes Without Boilerplate" +name = "attrs" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "19.3.0" + +[package.extras] +azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"] +dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"] +docs = ["sphinx", "zope.interface"] +tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] + +[[package]] +category = "main" +description = "Specifications for callback functions passed in to an API" +name = "backcall" +optional = false +python-versions = "*" +version = "0.2.0" + +[[package]] +category = "dev" +description = "An easy safelist-based HTML-sanitizing tool." +name = "bleach" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "3.1.5" + +[package.dependencies] +packaging = "*" +six = ">=1.9.0" +webencodings = "*" + +[[package]] +category = "main" +description = "Catboost Python Package" +name = "catboost" +optional = false +python-versions = "*" +version = "0.24" + +[package.dependencies] +graphviz = "*" +matplotlib = "*" +numpy = ">=1.16.0" +pandas = ">=0.24.0" +plotly = "*" +scipy = "*" +six = "*" + +[[package]] +category = "main" +description = "Python package for providing Mozilla's CA Bundle." +name = "certifi" +optional = false +python-versions = "*" +version = "2020.6.20" + +[[package]] +category = "dev" +description = "Foreign Function Interface for Python calling C code." +name = "cffi" +optional = false +python-versions = "*" +version = "1.14.2" + +[package.dependencies] +pycparser = "*" + +[[package]] +category = "dev" +description = "Universal encoding detector for Python 2 and 3" +name = "chardet" +optional = false +python-versions = "*" +version = "3.0.4" + +[[package]] +category = "dev" +description = "Composable command line interface toolkit" +name = "click" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "7.1.2" + +[[package]] +category = "main" +description = "Extended pickling support for Python objects" +name = "cloudpickle" +optional = false +python-versions = ">=3.5" +version = "1.5.0" + +[[package]] +category = "main" +description = "Cross-platform colored terminal text." +marker = "sys_platform == \"win32\"" +name = "colorama" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.4.3" + +[[package]] +category = "main" +description = "Composable style cycles" +name = "cycler" +optional = false +python-versions = "*" +version = "0.10.0" + +[package.dependencies] +six = "*" + +[[package]] +category = "main" +description = "Parallel PyData with Task Scheduling" +name = "dask" +optional = false +python-versions = ">=3.6" +version = "2.23.0" + +[package.dependencies] +pyyaml = "*" + +[package.dependencies.cloudpickle] +optional = true +version = ">=0.2.2" + +[package.dependencies.toolz] +optional = true +version = ">=0.8.2" + +[package.extras] +array = ["numpy (>=1.13.0)", "toolz (>=0.8.2)"] +bag = ["cloudpickle (>=0.2.2)", "fsspec (>=0.6.0)", "toolz (>=0.8.2)", "partd (>=0.3.10)"] +complete = ["bokeh (>=1.0.0)", "cloudpickle (>=0.2.2)", "distributed (>=2.0)", "fsspec (>=0.6.0)", "numpy (>=1.13.0)", "pandas (>=0.23.0)", "partd (>=0.3.10)", "toolz (>=0.8.2)"] +dataframe = ["numpy (>=1.13.0)", "pandas (>=0.23.0)", "toolz (>=0.8.2)", "partd (>=0.3.10)", "fsspec (>=0.6.0)"] +delayed = ["cloudpickle (>=0.2.2)", "toolz (>=0.8.2)"] +diagnostics = ["bokeh (>=1.0.0)"] +distributed = ["distributed (>=2.0)"] + +[[package]] +category = "main" +description = "Multi-target Random Forest implementation that can mix both classification and regression tasks." +name = "decision-tree-morfist" +optional = false +python-versions = ">=3.8.0,<4.0.0" +version = "0.3.3" + +[package.dependencies] +numba = ">=0.51.0,<0.52.0" +numpy = ">=1.19.1,<2.0.0" +scipy = ">=1.5.2,<2.0.0" + +[[package]] +category = "main" +description = "Decorators for Humans" +name = "decorator" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*" +version = "4.4.2" + +[[package]] +category = "dev" +description = "XML bomb protection for Python stdlib modules" +name = "defusedxml" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.6.0" + +[[package]] +category = "dev" +description = "Discover and load entry points from installed packages." +name = "entrypoints" +optional = false +python-versions = ">=2.7" +version = "0.3" + +[[package]] +category = "dev" +description = "Clean single-source support for Python 3 and 2" +name = "future" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +version = "0.18.2" + +[[package]] +category = "main" +description = "Simple Python interface for Graphviz" +name = "graphviz" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +version = "0.14.1" + +[package.extras] +dev = ["tox (>=3)", "flake8", "pep8-naming", "wheel", "twine"] +docs = ["sphinx (>=1.8)", "sphinx-rtd-theme"] +test = ["mock (>=3)", "pytest (>=4)", "pytest-mock (>=2)", "pytest-cov"] + +[[package]] +category = "dev" +description = "Internationalized Domain Names in Applications (IDNA)" +name = "idna" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.10" + +[[package]] +category = "dev" +description = "iniconfig: brain-dead simple config-ini parsing" +name = "iniconfig" +optional = false +python-versions = "*" +version = "1.0.1" + +[[package]] +category = "dev" +description = "IPython Kernel for Jupyter" +name = "ipykernel" +optional = false +python-versions = ">=3.5" +version = "5.3.4" + +[package.dependencies] +appnope = "*" +ipython = ">=5.0.0" +jupyter-client = "*" +tornado = ">=4.2" +traitlets = ">=4.1.0" + +[package.extras] +test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "nose"] + +[[package]] +category = "main" +description = "IPython: Productive Interactive Computing" +name = "ipython" +optional = false +python-versions = ">=3.7" +version = "7.17.0" + +[package.dependencies] +appnope = "*" +backcall = "*" +colorama = "*" +decorator = "*" +jedi = ">=0.10" +pexpect = "*" +pickleshare = "*" +prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" +pygments = "*" +setuptools = ">=18.5" +traitlets = ">=4.2" + +[package.extras] +all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.14)", "pygments", "qtconsole", "requests", "testpath"] +doc = ["Sphinx (>=1.3)"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["notebook", "ipywidgets"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.14)"] + +[[package]] +category = "main" +description = "Vestigial utilities from IPython" +name = "ipython-genutils" +optional = false +python-versions = "*" +version = "0.2.0" + +[[package]] +category = "main" +description = "An autocompletion tool for Python that can be used for text editors." +name = "jedi" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.17.2" + +[package.dependencies] +parso = ">=0.7.0,<0.8.0" + +[package.extras] +qa = ["flake8 (3.7.9)"] +testing = ["Django (<3.1)", "colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"] + +[[package]] +category = "dev" +description = "A very fast and expressive template engine." +name = "jinja2" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "2.11.2" + +[package.dependencies] +MarkupSafe = ">=0.23" + +[package.extras] +i18n = ["Babel (>=0.8)"] + +[[package]] +category = "main" +description = "Lightweight pipelining: using Python functions as pipeline jobs." +name = "joblib" +optional = false +python-versions = ">=3.6" +version = "0.16.0" + +[[package]] +category = "dev" +description = "A Python implementation of the JSON5 data format." +name = "json5" +optional = false +python-versions = "*" +version = "0.9.5" + +[package.extras] +dev = ["hypothesis"] + +[[package]] +category = "dev" +description = "An implementation of JSON Schema validation for Python" +name = "jsonschema" +optional = false +python-versions = "*" +version = "3.2.0" + +[package.dependencies] +attrs = ">=17.4.0" +pyrsistent = ">=0.14.0" +setuptools = "*" +six = ">=1.11.0" + +[package.extras] +format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] +format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] + +[[package]] +category = "dev" +description = "Jupyter protocol implementation and client libraries" +name = "jupyter-client" +optional = false +python-versions = ">=3.5" +version = "6.1.6" + +[package.dependencies] +jupyter-core = ">=4.6.0" +python-dateutil = ">=2.1" +pyzmq = ">=13" +tornado = ">=4.1" +traitlets = "*" + +[package.extras] +test = ["async-generator", "ipykernel", "ipython", "mock", "pytest", "pytest-asyncio", "pytest-timeout"] + +[[package]] +category = "dev" +description = "Jupyter core package. A base package on which Jupyter projects rely." +name = "jupyter-core" +optional = false +python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,!=3.4,>=2.7" +version = "4.6.3" + +[package.dependencies] +pywin32 = ">=1.0" +traitlets = "*" + +[[package]] +category = "dev" +description = "The JupyterLab notebook server extension." +name = "jupyterlab" +optional = false +python-versions = ">=3.5" +version = "2.2.4" + +[package.dependencies] +jinja2 = ">=2.10" +jupyterlab-server = ">=1.1.5,<2.0" +notebook = ">=4.3.1" +tornado = "<6.0.0 || >6.0.0,<6.0.1 || >6.0.1,<6.0.2 || >6.0.2" + +[package.extras] +docs = ["jsx-lexer", "recommonmark", "sphinx", "sphinx-rtd-theme", "sphinx-copybutton"] +test = ["pytest", "pytest-check-links", "requests", "wheel", "virtualenv"] + +[[package]] +category = "dev" +description = "JupyterLab Server" +name = "jupyterlab-server" +optional = false +python-versions = ">=3.5" +version = "1.2.0" + +[package.dependencies] +jinja2 = ">=2.10" +json5 = "*" +jsonschema = ">=3.0.1" +notebook = ">=4.2.0" +requests = "*" + +[package.extras] +test = ["pytest", "requests"] + +[[package]] +category = "main" +description = "A fast implementation of the Cassowary constraint solver" +name = "kiwisolver" +optional = false +python-versions = ">=3.6" +version = "1.2.0" + +[[package]] +category = "main" +description = "LightGBM Python Package" +name = "lightgbm" +optional = false +python-versions = "*" +version = "2.3.1" + +[package.dependencies] +numpy = "*" +scikit-learn = "*" +scipy = "*" + +[[package]] +category = "dev" +description = "Python LiveReload is an awesome tool for web developers" +name = "livereload" +optional = false +python-versions = "*" +version = "2.6.2" + +[package.dependencies] +six = "*" + +[package.dependencies.tornado] +python = ">=2.8" +version = "*" + +[[package]] +category = "main" +description = "lightweight wrapper around basic LLVM functionality" +name = "llvmlite" +optional = false +python-versions = ">=3.6" +version = "0.34.0" + +[[package]] +category = "dev" +description = "A Python implementation of Lunr.js" +name = "lunr" +optional = false +python-versions = "*" +version = "0.5.8" + +[package.dependencies] +future = ">=0.16.0" +six = ">=1.11.0" + +[package.dependencies.nltk] +optional = true +python = ">=2.8" +version = ">=3.2.5" + +[package.extras] +languages = ["nltk (>=3.2.5,<3.5)", "nltk (>=3.2.5)"] + +[[package]] +category = "dev" +description = "Python implementation of Markdown." +name = "markdown" +optional = false +python-versions = ">=3.5" +version = "3.2.2" + +[package.extras] +testing = ["coverage", "pyyaml"] + +[[package]] +category = "dev" +description = "Safely add untrusted strings to HTML/XML markup." +name = "markupsafe" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +version = "1.1.1" + +[[package]] +category = "main" +description = "Python plotting package" +name = "matplotlib" +optional = false +python-versions = ">=3.6" +version = "3.3.1" + +[package.dependencies] +certifi = ">=2020.06.20" +cycler = ">=0.10" +kiwisolver = ">=1.0.1" +numpy = ">=1.15" +pillow = ">=6.2.0" +pyparsing = ">=2.0.3,<2.0.4 || >2.0.4,<2.1.2 || >2.1.2,<2.1.6 || >2.1.6" +python-dateutil = ">=2.1" + +[[package]] +category = "dev" +description = "The fastest markdown parser in pure Python" +name = "mistune" +optional = false +python-versions = "*" +version = "0.8.4" + +[[package]] +category = "dev" +description = "Project documentation with Markdown." +name = "mkdocs" +optional = false +python-versions = ">=3.5" +version = "1.1.2" + +[package.dependencies] +Jinja2 = ">=2.10.1" +Markdown = ">=3.2.1" +PyYAML = ">=3.10" +click = ">=3.3" +livereload = ">=2.5.1" +tornado = ">=5.0" + +[package.dependencies.lunr] +extras = ["languages"] +version = "0.5.8" + +[[package]] +category = "dev" +description = "A Material Design theme for MkDocs" +name = "mkdocs-material" +optional = false +python-versions = "*" +version = "5.5.7" + +[package.dependencies] +Pygments = ">=2.4" +markdown = ">=3.2" +mkdocs = ">=1.1" +mkdocs-material-extensions = ">=1.0" +pymdown-extensions = ">=7.0" + +[[package]] +category = "dev" +description = "Extension pack for Python Markdown." +name = "mkdocs-material-extensions" +optional = false +python-versions = ">=3.5" +version = "1.0" + +[package.dependencies] +mkdocs-material = ">=5.0.0" + +[[package]] +category = "dev" +description = "More routines for operating on iterables, beyond itertools" +name = "more-itertools" +optional = false +python-versions = ">=3.5" +version = "8.4.0" + +[[package]] +category = "dev" +description = "Converting Jupyter Notebooks" +name = "nbconvert" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "5.6.1" + +[package.dependencies] +bleach = "*" +defusedxml = "*" +entrypoints = ">=0.2.2" +jinja2 = ">=2.4" +jupyter-core = "*" +mistune = ">=0.8.1,<2" +nbformat = ">=4.4" +pandocfilters = ">=1.4.1" +pygments = "*" +testpath = "*" +traitlets = ">=4.2" + +[package.extras] +all = ["pytest", "pytest-cov", "ipykernel", "jupyter-client (>=5.3.1)", "ipywidgets (>=7)", "pebble", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "sphinxcontrib-github-alt", "ipython", "mock"] +docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "sphinxcontrib-github-alt", "ipython", "jupyter-client (>=5.3.1)"] +execute = ["jupyter-client (>=5.3.1)"] +serve = ["tornado (>=4.0)"] +test = ["pytest", "pytest-cov", "ipykernel", "jupyter-client (>=5.3.1)", "ipywidgets (>=7)", "pebble", "mock"] + +[[package]] +category = "dev" +description = "The Jupyter Notebook format" +name = "nbformat" +optional = false +python-versions = ">=3.5" +version = "5.0.7" + +[package.dependencies] +ipython-genutils = "*" +jsonschema = ">=2.4,<2.5.0 || >2.5.0" +jupyter-core = "*" +traitlets = ">=4.1" + +[package.extras] +test = ["pytest", "pytest-cov", "testpath"] + +[[package]] +category = "main" +description = "Python package for creating and manipulating graphs and networks" +name = "networkx" +optional = false +python-versions = ">=3.5" +version = "2.4" + +[package.dependencies] +decorator = ">=4.3.0" + +[package.extras] +all = ["numpy", "scipy", "pandas", "matplotlib", "pygraphviz", "pydot", "pyyaml", "gdal", "lxml", "pytest"] +gdal = ["gdal"] +lxml = ["lxml"] +matplotlib = ["matplotlib"] +numpy = ["numpy"] +pandas = ["pandas"] +pydot = ["pydot"] +pygraphviz = ["pygraphviz"] +pytest = ["pytest"] +pyyaml = ["pyyaml"] +scipy = ["scipy"] + +[[package]] +category = "dev" +description = "Natural Language Toolkit" +marker = "python_version > \"2.7\"" +name = "nltk" +optional = false +python-versions = "*" +version = "3.5" + +[package.dependencies] +click = "*" +joblib = "*" +regex = "*" +tqdm = "*" + +[package.extras] +all = ["requests", "numpy", "python-crfsuite", "scikit-learn", "twython", "pyparsing", "scipy", "matplotlib", "gensim"] +corenlp = ["requests"] +machine_learning = ["gensim", "numpy", "python-crfsuite", "scikit-learn", "scipy"] +plot = ["matplotlib"] +tgrep = ["pyparsing"] +twitter = ["twython"] + +[[package]] +category = "dev" +description = "A web-based notebook environment for interactive computing" +name = "notebook" +optional = false +python-versions = ">=3.5" +version = "6.1.3" + +[package.dependencies] +Send2Trash = "*" +argon2-cffi = "*" +ipykernel = "*" +ipython-genutils = "*" +jinja2 = "*" +jupyter-client = ">=5.3.4" +jupyter-core = ">=4.6.1" +nbconvert = "*" +nbformat = "*" +prometheus-client = "*" +pyzmq = ">=17" +terminado = ">=0.8.3" +tornado = ">=5.0" +traitlets = ">=4.2.1" + +[package.extras] +docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt"] +test = ["nose", "coverage", "requests", "nose-warnings-filters", "nbval", "nose-exclude", "selenium", "pytest", "pytest-cov", "requests-unixsocket"] + +[[package]] +category = "main" +description = "compiling Python code using LLVM" +name = "numba" +optional = false +python-versions = ">=3.6" +version = "0.51.0" + +[package.dependencies] +llvmlite = ">=0.34.0.dev0,<0.35" +numpy = ">=1.15" +setuptools = "*" + +[[package]] +category = "main" +description = "NumPy is the fundamental package for array computing with Python." +name = "numpy" +optional = false +python-versions = ">=3.6" +version = "1.19.1" + +[[package]] +category = "dev" +description = "Core utilities for Python packages" +name = "packaging" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "20.4" + +[package.dependencies] +pyparsing = ">=2.0.2" +six = "*" + +[[package]] +category = "main" +description = "Powerful data structures for data analysis, time series, and statistics" +name = "pandas" +optional = false +python-versions = ">=3.6.1" +version = "1.1.0" + +[package.dependencies] +numpy = ">=1.15.4" +python-dateutil = ">=2.7.3" +pytz = ">=2017.2" + +[package.extras] +test = ["pytest (>=4.0.2)", "pytest-xdist", "hypothesis (>=3.58)"] + +[[package]] +category = "dev" +description = "Utilities for writing pandoc filters in python" +name = "pandocfilters" +optional = false +python-versions = "*" +version = "1.4.2" + +[[package]] +category = "main" +description = "A Python Parser" +name = "parso" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.7.1" + +[package.extras] +testing = ["docopt", "pytest (>=3.0.7)"] + +[[package]] +category = "main" +description = "Pexpect allows easy control of interactive console applications." +marker = "sys_platform != \"win32\"" +name = "pexpect" +optional = false +python-versions = "*" +version = "4.8.0" + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +category = "main" +description = "Tiny 'shelve'-like database with concurrency support" +name = "pickleshare" +optional = false +python-versions = "*" +version = "0.7.5" + +[[package]] +category = "main" +description = "Python Imaging Library (Fork)" +name = "pillow" +optional = false +python-versions = ">=3.5" +version = "7.2.0" + +[[package]] +category = "main" +description = "An open-source, interactive data visualization library for Python" +name = "plotly" +optional = false +python-versions = "*" +version = "4.9.0" + +[package.dependencies] +retrying = ">=1.3.3" +six = "*" + +[[package]] +category = "dev" +description = "plugin and hook calling mechanisms for python" +name = "pluggy" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.13.1" + +[package.extras] +dev = ["pre-commit", "tox"] + +[[package]] +category = "dev" +description = "Python client for the Prometheus monitoring system." +name = "prometheus-client" +optional = false +python-versions = "*" +version = "0.8.0" + +[package.extras] +twisted = ["twisted"] + +[[package]] +category = "main" +description = "Library for building powerful interactive command lines in Python" +name = "prompt-toolkit" +optional = false +python-versions = ">=3.6.1" +version = "3.0.6" + +[package.dependencies] +wcwidth = "*" + +[[package]] +category = "main" +description = "Run a subprocess in a pseudo terminal" +marker = "sys_platform != \"win32\" or os_name != \"nt\"" +name = "ptyprocess" +optional = false +python-versions = "*" +version = "0.6.0" + +[[package]] +category = "dev" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +name = "py" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.9.0" + +[[package]] +category = "dev" +description = "C parser in Python" +name = "pycparser" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.20" + +[[package]] +category = "main" +description = "Python interface to Graphviz's Dot" +name = "pydot" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.4.1" + +[package.dependencies] +pyparsing = ">=2.1.4" + +[[package]] +category = "main" +description = "Pygments is a syntax highlighting package written in Python." +name = "pygments" +optional = false +python-versions = ">=3.5" +version = "2.6.1" + +[[package]] +category = "dev" +description = "Extension pack for Python Markdown." +name = "pymdown-extensions" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +version = "8.0" + +[package.dependencies] +Markdown = ">=3.2" + +[[package]] +category = "main" +description = "Python parsing module" +name = "pyparsing" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +version = "2.4.7" + +[[package]] +category = "dev" +description = "Persistent/Functional/Immutable data structures" +name = "pyrsistent" +optional = false +python-versions = "*" +version = "0.16.0" + +[package.dependencies] +six = "*" + +[[package]] +category = "dev" +description = "pytest: simple powerful testing with Python" +name = "pytest" +optional = false +python-versions = ">=3.5" +version = "6.0.1" + +[package.dependencies] +atomicwrites = ">=1.0" +attrs = ">=17.4.0" +colorama = "*" +iniconfig = "*" +more-itertools = ">=4.0.0" +packaging = "*" +pluggy = ">=0.12,<1.0" +py = ">=1.8.2" +toml = "*" + +[package.extras] +checkqa_mypy = ["mypy (0.780)"] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +category = "main" +description = "Extensions to the standard Python datetime module" +name = "python-dateutil" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +version = "2.8.1" + +[package.dependencies] +six = ">=1.5" + +[[package]] +category = "main" +description = "World timezone definitions, modern and historical" +name = "pytz" +optional = false +python-versions = "*" +version = "2020.1" + +[[package]] +category = "dev" +description = "Python for Window Extensions" +marker = "sys_platform == \"win32\"" +name = "pywin32" +optional = false +python-versions = "*" +version = "228" + +[[package]] +category = "dev" +description = "Python bindings for the winpty library" +marker = "os_name == \"nt\"" +name = "pywinpty" +optional = false +python-versions = "*" +version = "0.5.7" + +[[package]] +category = "main" +description = "YAML parser and emitter for Python" +name = "pyyaml" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "5.3.1" + +[[package]] +category = "dev" +description = "Python bindings for 0MQ" +name = "pyzmq" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" +version = "19.0.2" + +[[package]] +category = "dev" +description = "Alternative regular expression module, to replace re." +marker = "python_version > \"2.7\"" +name = "regex" +optional = false +python-versions = "*" +version = "2020.7.14" + +[[package]] +category = "dev" +description = "Python HTTP for Humans." +name = "requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "2.24.0" + +[package.dependencies] +certifi = ">=2017.4.17" +chardet = ">=3.0.2,<4" +idna = ">=2.5,<3" +urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" + +[package.extras] +security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] +socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] + +[[package]] +category = "main" +description = "Retrying" +name = "retrying" +optional = false +python-versions = "*" +version = "1.3.3" + +[package.dependencies] +six = ">=1.7.0" + +[[package]] +category = "main" +description = "A set of python modules for machine learning and data mining" +name = "scikit-learn" +optional = false +python-versions = ">=3.6" +version = "0.23.2" + +[package.dependencies] +joblib = ">=0.11" +numpy = ">=1.13.3" +scipy = ">=0.19.1" +threadpoolctl = ">=2.0.0" + +[package.extras] +alldeps = ["numpy (>=1.13.3)", "scipy (>=0.19.1)"] + +[[package]] +category = "main" +description = "SciPy: Scientific Library for Python" +name = "scipy" +optional = false +python-versions = ">=3.6" +version = "1.5.2" + +[package.dependencies] +numpy = ">=1.14.5" + +[[package]] +category = "dev" +description = "Send file to trash natively under Mac OS X, Windows and Linux." +name = "send2trash" +optional = false +python-versions = "*" +version = "1.5.0" + +[[package]] +category = "main" +description = "A unified approach to explain the output of any machine learning model." +name = "shap" +optional = false +python-versions = "*" +version = "0.35.0" + +[package.dependencies] +numpy = "*" +pandas = "*" +scikit-learn = "*" +scipy = "*" +tqdm = ">4.25.0" + +[package.extras] +all = ["lime", "ipython", "matplotlib"] +others = ["lime"] +plots = ["matplotlib", "ipython"] + +[[package]] +category = "main" +description = "Python 2 and 3 compatibility utilities" +name = "six" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +version = "1.15.0" + +[[package]] +category = "dev" +description = "Terminals served to xterm.js using Tornado websockets" +name = "terminado" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.8.3" + +[package.dependencies] +ptyprocess = "*" +pywinpty = ">=0.5" +tornado = ">=4" + +[[package]] +category = "dev" +description = "Test utilities for code working with files and commands" +name = "testpath" +optional = false +python-versions = "*" +version = "0.4.4" + +[package.extras] +test = ["pathlib2"] + +[[package]] +category = "main" +description = "threadpoolctl" +name = "threadpoolctl" +optional = false +python-versions = ">=3.5" +version = "2.1.0" + +[[package]] +category = "dev" +description = "Python Library for Tom's Obvious, Minimal Language" +name = "toml" +optional = false +python-versions = "*" +version = "0.10.1" + +[[package]] +category = "main" +description = "List processing tools and functional utilities" +name = "toolz" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.10.0" + +[[package]] +category = "dev" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +name = "tornado" +optional = false +python-versions = ">= 3.5" +version = "6.0.4" + +[[package]] +category = "main" +description = "Fast, Extensible Progress Meter" +name = "tqdm" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*" +version = "4.48.2" + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] + +[[package]] +category = "main" +description = "Traitlets Python config system" +name = "traitlets" +optional = false +python-versions = "*" +version = "4.3.3" + +[package.dependencies] +decorator = "*" +ipython-genutils = "*" +six = "*" + +[package.extras] +test = ["pytest", "mock"] + +[[package]] +category = "dev" +description = "HTTP library with thread-safe connection pooling, file post, and more." +name = "urllib3" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +version = "1.25.10" + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"] +socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] + +[[package]] +category = "main" +description = "Measures the displayed width of unicode strings in a terminal" +name = "wcwidth" +optional = false +python-versions = "*" +version = "0.2.5" + +[[package]] +category = "dev" +description = "Character encoding aliases for legacy web content" +name = "webencodings" +optional = false +python-versions = "*" +version = "0.5.1" + +[metadata] +content-hash = "8b6a1eb27ecd2413d35b4e5a6d449a56dd824f87ae490f891de347b4d68e1c30" +lock-version = "1.0" +python-versions = "^3.8.0" + +[metadata.files] +appnope = [ + {file = "appnope-0.1.0-py2.py3-none-any.whl", hash = "sha256:5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0"}, + {file = "appnope-0.1.0.tar.gz", hash = "sha256:8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71"}, +] +argon2-cffi = [ + {file = "argon2-cffi-20.1.0.tar.gz", hash = "sha256:d8029b2d3e4b4cea770e9e5a0104dd8fa185c1724a0f01528ae4826a6d25f97d"}, + {file = "argon2_cffi-20.1.0-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:6ea92c980586931a816d61e4faf6c192b4abce89aa767ff6581e6ddc985ed003"}, + {file = "argon2_cffi-20.1.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:05a8ac07c7026542377e38389638a8a1e9b78f1cd8439cd7493b39f08dd75fbf"}, + {file = "argon2_cffi-20.1.0-cp27-cp27m-win32.whl", hash = "sha256:0bf066bc049332489bb2d75f69216416329d9dc65deee127152caeb16e5ce7d5"}, + {file = "argon2_cffi-20.1.0-cp27-cp27m-win_amd64.whl", hash = "sha256:57358570592c46c420300ec94f2ff3b32cbccd10d38bdc12dc6979c4a8484fbc"}, + {file = "argon2_cffi-20.1.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7d455c802727710e9dfa69b74ccaab04568386ca17b0ad36350b622cd34606fe"}, + {file = "argon2_cffi-20.1.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:b160416adc0f012fb1f12588a5e6954889510f82f698e23ed4f4fa57f12a0647"}, + {file = "argon2_cffi-20.1.0-cp35-cp35m-win32.whl", hash = "sha256:9bee3212ba4f560af397b6d7146848c32a800652301843df06b9e8f68f0f7361"}, + {file = "argon2_cffi-20.1.0-cp35-cp35m-win_amd64.whl", hash = "sha256:392c3c2ef91d12da510cfb6f9bae52512a4552573a9e27600bdb800e05905d2b"}, + {file = "argon2_cffi-20.1.0-cp36-cp36m-win32.whl", hash = "sha256:ba7209b608945b889457f949cc04c8e762bed4fe3fec88ae9a6b7765ae82e496"}, + {file = "argon2_cffi-20.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:da7f0445b71db6d3a72462e04f36544b0de871289b0bc8a7cc87c0f5ec7079fa"}, + {file = "argon2_cffi-20.1.0-cp37-abi3-macosx_10_6_intel.whl", hash = "sha256:cc0e028b209a5483b6846053d5fd7165f460a1f14774d79e632e75e7ae64b82b"}, + {file = "argon2_cffi-20.1.0-cp37-cp37m-win32.whl", hash = "sha256:18dee20e25e4be86680b178b35ccfc5d495ebd5792cd00781548d50880fee5c5"}, + {file = "argon2_cffi-20.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6678bb047373f52bcff02db8afab0d2a77d83bde61cfecea7c5c62e2335cb203"}, + {file = "argon2_cffi-20.1.0-cp38-cp38-win32.whl", hash = "sha256:77e909cc756ef81d6abb60524d259d959bab384832f0c651ed7dcb6e5ccdbb78"}, + {file = "argon2_cffi-20.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:9dfd5197852530294ecb5795c97a823839258dfd5eb9420233c7cfedec2058f2"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, + {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, +] +backcall = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] +bleach = [ + {file = "bleach-3.1.5-py2.py3-none-any.whl", hash = "sha256:2bce3d8fab545a6528c8fa5d9f9ae8ebc85a56da365c7f85180bfe96a35ef22f"}, + {file = "bleach-3.1.5.tar.gz", hash = "sha256:3c4c520fdb9db59ef139915a5db79f8b51bc2a7257ea0389f30c846883430a4b"}, +] +catboost = [ + {file = "catboost-0.24-cp27-none-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:8c9b30f3e28142c485980022837993c2d2a64dd8dc6023ebb7cece6d2771636a"}, + {file = "catboost-0.24-cp27-none-manylinux1_x86_64.whl", hash = "sha256:80db53141a0301b7c0a3e61b3f97a939d495f08d64b40070553a175912fa7019"}, + {file = "catboost-0.24-cp27-none-win_amd64.whl", hash = "sha256:da9a7683b5f01919b23b1768349778625fe36455e7d677853f0fa60b7fc28f29"}, + {file = "catboost-0.24-cp35-none-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:ae768cf78c5a67b3cf33f8271517ac44e6e2757d231af777d78a6ba3fbc3309f"}, + {file = "catboost-0.24-cp35-none-manylinux1_x86_64.whl", hash = "sha256:d52427351f6b7f7b2e761c2b192041d9511d597665b16b9253008ff1fc9a8e0d"}, + {file = "catboost-0.24-cp35-none-win_amd64.whl", hash = "sha256:8d872c0aec6f6c163a5515279280544d0b7617eaa6d4382d4cea772641e888ab"}, + {file = "catboost-0.24-cp36-none-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:e99b7a5de4750dfd56f284d70cac05c3f53856d3c8100824b4daecf8b898bd2b"}, + {file = "catboost-0.24-cp36-none-manylinux1_x86_64.whl", hash = "sha256:0c7c8a5f003d49807b72203e3bccd40f84f1e5aba2c05d9194a6535b33024a55"}, + {file = "catboost-0.24-cp36-none-win_amd64.whl", hash = "sha256:e78449bda9721d715e8a4a99a6c9afa408547acbb4b7708afe95f65fbb8722a6"}, + {file = "catboost-0.24-cp37-none-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:44a6240d9a4abfd287492a67cbac604641c143317a6b2df203b1c6efaf51b62e"}, + {file = "catboost-0.24-cp37-none-manylinux1_x86_64.whl", hash = "sha256:66f83cfb9e0f00abb41eea0fbf00bc7198a9a3b42c16fe5bf7b06b8b6086db70"}, + {file = "catboost-0.24-cp37-none-win_amd64.whl", hash = "sha256:02d297093baa57f8b36e6a8da32bfaac3b5381164ebfdfd4066109a73fd6d457"}, + {file = "catboost-0.24-cp38-none-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:756c1844e2e4db77d247389e46af962434b4572209d14adec1c3610547ff4b43"}, + {file = "catboost-0.24-cp38-none-manylinux1_x86_64.whl", hash = "sha256:3bfc1708ea9dc2bd24dd5216bc08723f67d63b41614022c7a813e249d250b956"}, + {file = "catboost-0.24-cp38-none-win_amd64.whl", hash = "sha256:4db2557dd2c98905b6ccfe17678e59e90185e3af5cd47d35ab4699f59f310c09"}, +] +certifi = [ + {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"}, + {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"}, +] +cffi = [ + {file = "cffi-1.14.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:da9d3c506f43e220336433dffe643fbfa40096d408cb9b7f2477892f369d5f82"}, + {file = "cffi-1.14.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23e44937d7695c27c66a54d793dd4b45889a81b35c0751ba91040fe825ec59c4"}, + {file = "cffi-1.14.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:0da50dcbccd7cb7e6c741ab7912b2eff48e85af217d72b57f80ebc616257125e"}, + {file = "cffi-1.14.2-cp27-cp27m-win32.whl", hash = "sha256:76ada88d62eb24de7051c5157a1a78fd853cca9b91c0713c2e973e4196271d0c"}, + {file = "cffi-1.14.2-cp27-cp27m-win_amd64.whl", hash = "sha256:15a5f59a4808f82d8ec7364cbace851df591c2d43bc76bcbe5c4543a7ddd1bf1"}, + {file = "cffi-1.14.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:e4082d832e36e7f9b2278bc774886ca8207346b99f278e54c9de4834f17232f7"}, + {file = "cffi-1.14.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:57214fa5430399dffd54f4be37b56fe22cedb2b98862550d43cc085fb698dc2c"}, + {file = "cffi-1.14.2-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:6843db0343e12e3f52cc58430ad559d850a53684f5b352540ca3f1bc56df0731"}, + {file = "cffi-1.14.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:577791f948d34d569acb2d1add5831731c59d5a0c50a6d9f629ae1cefd9ca4a0"}, + {file = "cffi-1.14.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8662aabfeab00cea149a3d1c2999b0731e70c6b5bac596d95d13f643e76d3d4e"}, + {file = "cffi-1.14.2-cp35-cp35m-win32.whl", hash = "sha256:837398c2ec00228679513802e3744d1e8e3cb1204aa6ad408b6aff081e99a487"}, + {file = "cffi-1.14.2-cp35-cp35m-win_amd64.whl", hash = "sha256:bf44a9a0141a082e89c90e8d785b212a872db793a0080c20f6ae6e2a0ebf82ad"}, + {file = "cffi-1.14.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:29c4688ace466a365b85a51dcc5e3c853c1d283f293dfcc12f7a77e498f160d2"}, + {file = "cffi-1.14.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:99cc66b33c418cd579c0f03b77b94263c305c389cb0c6972dac420f24b3bf123"}, + {file = "cffi-1.14.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:65867d63f0fd1b500fa343d7798fa64e9e681b594e0a07dc934c13e76ee28fb1"}, + {file = "cffi-1.14.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:ba7692341f25a19438647aae523532b537f5fac22c6dff04b5d986482ac1b87b"}, + {file = "cffi-1.14.2-cp36-cp36m-win32.whl", hash = "sha256:f5033952def24172e60493b68717792e3aebb387a8d186c43c020d9363ee7281"}, + {file = "cffi-1.14.2-cp36-cp36m-win_amd64.whl", hash = "sha256:7057613efefd36cacabbdbcef010e0a9c20a88fc07eb3e616019ea1692fa5df4"}, + {file = "cffi-1.14.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6539314d84c4d36f28d73adc1b45e9f4ee2a89cdc7e5d2b0a6dbacba31906798"}, + {file = "cffi-1.14.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:672b539db20fef6b03d6f7a14b5825d57c98e4026401fce838849f8de73fe4d4"}, + {file = "cffi-1.14.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:95e9094162fa712f18b4f60896e34b621df99147c2cee216cfa8f022294e8e9f"}, + {file = "cffi-1.14.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3e0642d1d754c19c084c867dedf7cadfc6c4bacc901c40f536843d87a90fab1d"}, + {file = "cffi-1.14.2-cp37-cp37m-win32.whl", hash = "sha256:b9aa9d8818c2e917fa2c105ad538e222a5bce59777133840b93134022a7ce650"}, + {file = "cffi-1.14.2-cp37-cp37m-win_amd64.whl", hash = "sha256:e4b9b7af398c32e408c00eb4e0d33ced2f9121fd9fb978e6c1b57edd014a7d15"}, + {file = "cffi-1.14.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e613514a82539fc48291d01933951a13ae93b6b444a88782480be32245ed4afa"}, + {file = "cffi-1.14.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:9b219511d8b64d3fa14261963933be34028ea0e57455baf6781fe399c2c3206c"}, + {file = "cffi-1.14.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:c0b48b98d79cf795b0916c57bebbc6d16bb43b9fc9b8c9f57f4cf05881904c75"}, + {file = "cffi-1.14.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3a0787cf473b8b0f0c73bc788b22e8842389b7f90b924aca30fb22bd74f8fc00"}, + {file = "cffi-1.14.2-cp38-cp38-win32.whl", hash = "sha256:15419020b0e812b40d96ec9d369b2bc8109cc3295eac6e013d3261343580cc7e"}, + {file = "cffi-1.14.2-cp38-cp38-win_amd64.whl", hash = "sha256:12a453e03124069b6896107ee133ae3ab04c624bb10683e1ed1c1663df17c13c"}, + {file = "cffi-1.14.2.tar.gz", hash = "sha256:ae8f34d50af2c2154035984b8b5fc5d9ed63f32fe615646ab435b05b132ca91b"}, +] +chardet = [ + {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, + {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, +] +click = [ + {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, + {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, +] +cloudpickle = [ + {file = "cloudpickle-1.5.0-py3-none-any.whl", hash = "sha256:994d503de22399a8a09091b091e3850509144ede72977ac475f323096eb72936"}, + {file = "cloudpickle-1.5.0.tar.gz", hash = "sha256:820c9245cebdec7257211cbe88745101d5d6a042bca11336d78ebd4897ddbc82"}, +] +colorama = [ + {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, + {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, +] +cycler = [ + {file = "cycler-0.10.0-py2.py3-none-any.whl", hash = "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d"}, + {file = "cycler-0.10.0.tar.gz", hash = "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8"}, +] +dask = [ + {file = "dask-2.23.0-py3-none-any.whl", hash = "sha256:638adf45e0cbe744c05531f2617259098f071f72c1b6cbefb66116632b93e56d"}, + {file = "dask-2.23.0.tar.gz", hash = "sha256:6f48f0e663762dd881625333412e3ac162055e7bcea121e1cabf84b88981a8f9"}, +] +decision-tree-morfist = [ + {file = "decision-tree-morfist-0.3.3.tar.gz", hash = "sha256:3699b44ae541c6209817a63c4066eacb9b3833e171d6d6c8236bd44679b9fc95"}, + {file = "decision_tree_morfist-0.3.3-py3-none-any.whl", hash = "sha256:e77a0b9d762d91daa82acfa8073a887d21d5b16d9600b6efac1877b3535874c5"}, +] +decorator = [ + {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, + {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, +] +defusedxml = [ + {file = "defusedxml-0.6.0-py2.py3-none-any.whl", hash = "sha256:6687150770438374ab581bb7a1b327a847dd9c5749e396102de3fad4e8a3ef93"}, + {file = "defusedxml-0.6.0.tar.gz", hash = "sha256:f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5"}, +] +entrypoints = [ + {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, + {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, +] +future = [ + {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, +] +graphviz = [ + {file = "graphviz-0.14.1-py2.py3-none-any.whl", hash = "sha256:088562ef6e3dad5e8dde9389caf4a84f768e65dcaa08238cfcdf36d2b30ccf61"}, + {file = "graphviz-0.14.1.zip", hash = "sha256:f5aad52a652c06825dcc5ee018d920fca26aef339386866094597fb3f2f222ce"}, +] +idna = [ + {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, + {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, +] +iniconfig = [ + {file = "iniconfig-1.0.1-py3-none-any.whl", hash = "sha256:80cf40c597eb564e86346103f609d74efce0f6b4d4f30ec8ce9e2c26411ba437"}, + {file = "iniconfig-1.0.1.tar.gz", hash = "sha256:e5f92f89355a67de0595932a6c6c02ab4afddc6fcdc0bfc5becd0d60884d3f69"}, +] +ipykernel = [ + {file = "ipykernel-5.3.4-py3-none-any.whl", hash = "sha256:d6fbba26dba3cebd411382bc484f7bc2caa98427ae0ddb4ab37fe8bfeb5c7dd3"}, + {file = "ipykernel-5.3.4.tar.gz", hash = "sha256:9b2652af1607986a1b231c62302d070bc0534f564c393a5d9d130db9abbbe89d"}, +] +ipython = [ + {file = "ipython-7.17.0-py3-none-any.whl", hash = "sha256:5a8f159ca8b22b9a0a1f2a28befe5ad2b703339afb58c2ffe0d7c8d7a3af5999"}, + {file = "ipython-7.17.0.tar.gz", hash = "sha256:b70974aaa2674b05eb86a910c02ed09956a33f2dd6c71afc60f0b128a77e7f28"}, +] +ipython-genutils = [ + {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, + {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, +] +jedi = [ + {file = "jedi-0.17.2-py2.py3-none-any.whl", hash = "sha256:98cc583fa0f2f8304968199b01b6b4b94f469a1f4a74c1560506ca2a211378b5"}, + {file = "jedi-0.17.2.tar.gz", hash = "sha256:86ed7d9b750603e4ba582ea8edc678657fb4007894a12bcf6f4bb97892f31d20"}, +] +jinja2 = [ + {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, + {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, +] +joblib = [ + {file = "joblib-0.16.0-py3-none-any.whl", hash = "sha256:d348c5d4ae31496b2aa060d6d9b787864dd204f9480baaa52d18850cb43e9f49"}, + {file = "joblib-0.16.0.tar.gz", hash = "sha256:8f52bf24c64b608bf0b2563e0e47d6fcf516abc8cfafe10cfd98ad66d94f92d6"}, +] +json5 = [ + {file = "json5-0.9.5-py2.py3-none-any.whl", hash = "sha256:af1a1b9a2850c7f62c23fde18be4749b3599fd302f494eebf957e2ada6b9e42c"}, + {file = "json5-0.9.5.tar.gz", hash = "sha256:703cfee540790576b56a92e1c6aaa6c4b0d98971dc358ead83812aa4d06bdb96"}, +] +jsonschema = [ + {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, + {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, +] +jupyter-client = [ + {file = "jupyter_client-6.1.6-py3-none-any.whl", hash = "sha256:7ad9aa91505786420d77edc5f9fb170d51050c007338ba8d196f603223fd3b3a"}, + {file = "jupyter_client-6.1.6.tar.gz", hash = "sha256:b360f8d4638bc577a4656e93f86298db755f915098dc763f6fc05da0c5d7a595"}, +] +jupyter-core = [ + {file = "jupyter_core-4.6.3-py2.py3-none-any.whl", hash = "sha256:a4ee613c060fe5697d913416fc9d553599c05e4492d58fac1192c9a6844abb21"}, + {file = "jupyter_core-4.6.3.tar.gz", hash = "sha256:394fd5dd787e7c8861741880bdf8a00ce39f95de5d18e579c74b882522219e7e"}, +] +jupyterlab = [ + {file = "jupyterlab-2.2.4-py3-none-any.whl", hash = "sha256:8f4cfebf81727f6bbfc59faa7ade38493a52015736f077f815488881315a6c92"}, + {file = "jupyterlab-2.2.4.tar.gz", hash = "sha256:e9d26c4c1cf4f7760dfa9ccd3fd5ea5027ae2767f22c7766dbb2fbb5e5dfcd4b"}, +] +jupyterlab-server = [ + {file = "jupyterlab_server-1.2.0-py3-none-any.whl", hash = "sha256:55d256077bf13e5bc9e8fbd5aac51bef82f6315111cec6b712b9a5ededbba924"}, + {file = "jupyterlab_server-1.2.0.tar.gz", hash = "sha256:5431d9dde96659364b7cc877693d5d21e7b80cea7ae3959ecc2b87518e5f5d8c"}, +] +kiwisolver = [ + {file = "kiwisolver-1.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:443c2320520eda0a5b930b2725b26f6175ca4453c61f739fef7a5847bd262f74"}, + {file = "kiwisolver-1.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:efcf3397ae1e3c3a4a0a0636542bcad5adad3b1dd3e8e629d0b6e201347176c8"}, + {file = "kiwisolver-1.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fccefc0d36a38c57b7bd233a9b485e2f1eb71903ca7ad7adacad6c28a56d62d2"}, + {file = "kiwisolver-1.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:be046da49fbc3aa9491cc7296db7e8d27bcf0c3d5d1a40259c10471b014e4e0c"}, + {file = "kiwisolver-1.2.0-cp36-none-win32.whl", hash = "sha256:60a78858580761fe611d22127868f3dc9f98871e6fdf0a15cc4203ed9ba6179b"}, + {file = "kiwisolver-1.2.0-cp36-none-win_amd64.whl", hash = "sha256:556da0a5f60f6486ec4969abbc1dd83cf9b5c2deadc8288508e55c0f5f87d29c"}, + {file = "kiwisolver-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cc095a4661bdd8a5742aaf7c10ea9fac142d76ff1770a0f84394038126d8fc7"}, + {file = "kiwisolver-1.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c955791d80e464da3b471ab41eb65cf5a40c15ce9b001fdc5bbc241170de58ec"}, + {file = "kiwisolver-1.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:603162139684ee56bcd57acc74035fceed7dd8d732f38c0959c8bd157f913fec"}, + {file = "kiwisolver-1.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:63f55f490b958b6299e4e5bdac66ac988c3d11b7fafa522800359075d4fa56d1"}, + {file = "kiwisolver-1.2.0-cp37-none-win32.whl", hash = "sha256:03662cbd3e6729f341a97dd2690b271e51a67a68322affab12a5b011344b973c"}, + {file = "kiwisolver-1.2.0-cp37-none-win_amd64.whl", hash = "sha256:4eadb361baf3069f278b055e3bb53fa189cea2fd02cb2c353b7a99ebb4477ef1"}, + {file = "kiwisolver-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c31bc3c8e903d60a1ea31a754c72559398d91b5929fcb329b1c3a3d3f6e72113"}, + {file = "kiwisolver-1.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:d52b989dc23cdaa92582ceb4af8d5bcc94d74b2c3e64cd6785558ec6a879793e"}, + {file = "kiwisolver-1.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:e586b28354d7b6584d8973656a7954b1c69c93f708c0c07b77884f91640b7657"}, + {file = "kiwisolver-1.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:38d05c9ecb24eee1246391820ed7137ac42a50209c203c908154782fced90e44"}, + {file = "kiwisolver-1.2.0-cp38-none-win32.whl", hash = "sha256:d069ef4b20b1e6b19f790d00097a5d5d2c50871b66d10075dab78938dc2ee2cf"}, + {file = "kiwisolver-1.2.0-cp38-none-win_amd64.whl", hash = "sha256:18d749f3e56c0480dccd1714230da0f328e6e4accf188dd4e6884bdd06bf02dd"}, + {file = "kiwisolver-1.2.0.tar.gz", hash = "sha256:247800260cd38160c362d211dcaf4ed0f7816afb5efe56544748b21d6ad6d17f"}, +] +lightgbm = [ + {file = "lightgbm-2.3.1-py2.py3-none-macosx_10_9_x86_64.macosx_10_10_x86_64.macosx_10_11_x86_64.macosx_10_12_x86_64.macosx_10_13_x86_64.macosx_10_14_x86_64.macosx_10_15_x86_64.whl", hash = "sha256:c35743f825af65bd96106d4df1ee36a5f0f2d1140e2ed2e98e6742a931771730"}, + {file = "lightgbm-2.3.1-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:d0c51c79cf34c6dc717fd6a1c1e5c73eb428ade51228fedd6e6ca26ed4756190"}, + {file = "lightgbm-2.3.1-py2.py3-none-win_amd64.whl", hash = "sha256:c6968efcc5c19f9867592f885edbfaf2d753f7fd8ce924453ac8b453dbf81f55"}, + {file = "lightgbm-2.3.1.tar.gz", hash = "sha256:bd1817be401e74c0d8b049e97ea2f35d2ce155cfa130119ce4195ea207bd6388"}, +] +livereload = [ + {file = "livereload-2.6.2.tar.gz", hash = "sha256:d1eddcb5c5eb8d2ca1fa1f750e580da624c0f7fcb734aa5780dc81b7dcbd89be"}, +] +llvmlite = [ + {file = "llvmlite-0.34.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:11342e5ac320c953590bdd9d0dec8c52f4b5252c4c6335ba25f1e7b9f91f9325"}, + {file = "llvmlite-0.34.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:5bdf0ce430adfaf938ced5844d12f80616eb8321b5b9edfc45ef84ada5c5242c"}, + {file = "llvmlite-0.34.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e08d9d2dc5a31636bfc6b516d2d7daba95632afa3419eb8730dc76a7951e9558"}, + {file = "llvmlite-0.34.0-cp36-cp36m-win32.whl", hash = "sha256:9ff1dcdad03be0cf953aca5fc8cffdca25ccee2ec9e8ec7e95571722cdc02d55"}, + {file = "llvmlite-0.34.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5acdc3c3c7ea0ef7a1a6b442272e05d695bc8492e5b07666135ed1cfbf4ab9d2"}, + {file = "llvmlite-0.34.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bb96989bc57a1ccb131e7a0e061d07b68139b6f81a98912345d53d9239e231e1"}, + {file = "llvmlite-0.34.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6d3f81992f52a94077e7b9b16497029daf5b5eebb2cce56f3c8345bbc9c6308e"}, + {file = "llvmlite-0.34.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d841248d1c630426c93e3eb3f8c45bca0dab77c09faeb7553b1a500220e362ce"}, + {file = "llvmlite-0.34.0-cp37-cp37m-win32.whl", hash = "sha256:408b15ffec30696406e821c89da010f1bb1eb0aa572be4561c98eb2536d610ab"}, + {file = "llvmlite-0.34.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5d1f370bf150db7239204f09cf6a0603292ea28bac984e69b167e16fe160d803"}, + {file = "llvmlite-0.34.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:132322bc084abf336c80dd106f9357978c8c085911fb656898d3be0d9ff057ea"}, + {file = "llvmlite-0.34.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:8f344102745fceba6eb5bf03c228bb290e9bc79157e9506a4a72878d636f9b3c"}, + {file = "llvmlite-0.34.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:05253f3f44fab0148276335b2c1b2c4a78143dfa78e6bafd7f937d6248f297cc"}, + {file = "llvmlite-0.34.0-cp38-cp38-win32.whl", hash = "sha256:28264f9e2b3df4135cbcfca5a91c5b0b31dd3fc02fa623b4bb13327f0cd4fc80"}, + {file = "llvmlite-0.34.0-cp38-cp38-win_amd64.whl", hash = "sha256:964f8f7a2184963cb3617d057c2382575953e488b7bb061b632ee014cfef110a"}, + {file = "llvmlite-0.34.0.tar.gz", hash = "sha256:f03ee0d19bca8f2fe922bb424a909d05c28411983b0c2bc58b020032a0d11f63"}, +] +lunr = [ + {file = "lunr-0.5.8-py2.py3-none-any.whl", hash = "sha256:aab3f489c4d4fab4c1294a257a30fec397db56f0a50273218ccc3efdbf01d6ca"}, + {file = "lunr-0.5.8.tar.gz", hash = "sha256:c4fb063b98eff775dd638b3df380008ae85e6cb1d1a24d1cd81a10ef6391c26e"}, +] +markdown = [ + {file = "Markdown-3.2.2-py3-none-any.whl", hash = "sha256:c467cd6233885534bf0fe96e62e3cf46cfc1605112356c4f9981512b8174de59"}, + {file = "Markdown-3.2.2.tar.gz", hash = "sha256:1fafe3f1ecabfb514a5285fca634a53c1b32a81cb0feb154264d55bf2ff22c17"}, +] +markupsafe = [ + {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, + {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, +] +matplotlib = [ + {file = "matplotlib-3.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:282f8a077a1217f9f2ac178596f27c1ae94abbc6e7b785e1b8f25e83918e9199"}, + {file = "matplotlib-3.3.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:83ae7261f4d5ab387be2caee29c4f499b1566f31c8ac97a0b8ab61afd9e3da92"}, + {file = "matplotlib-3.3.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1f9cf2b8500b833714a193cb24281153f5072d55b2e486009f1e81f0b7da3410"}, + {file = "matplotlib-3.3.1-cp36-cp36m-win32.whl", hash = "sha256:0dc15e1ad84ec06bf0c315e6c4c2cced13a21ce4c2b4955bb75097064a4b1e92"}, + {file = "matplotlib-3.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:ffbae66e2db70dc330cb3299525f97e1c0efdfc763e04e1a4e08f968c7ad21f0"}, + {file = "matplotlib-3.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88c6ab4a32a7447dad236b8371612aaba5c967d632ff11999e0478dd687f2c58"}, + {file = "matplotlib-3.3.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:cc2d6b47c8fee89da982a312b54949ec0cd6a7976a8cafb5b62dea6c9883a14d"}, + {file = "matplotlib-3.3.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:636c6330a7dcb18bac114dbeaff314fbbb0c11682f9a9601de69a50e331d18d7"}, + {file = "matplotlib-3.3.1-cp37-cp37m-win32.whl", hash = "sha256:73a493e340064e8fe03207d9333b68baca30d9f0da543ae4af6b6b4f13f0fe05"}, + {file = "matplotlib-3.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6739b6cd9278d5cb337df0bd4400ad37bbd04c6dc7aa2c65e1e83a02bc4cc6fd"}, + {file = "matplotlib-3.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:79f0c4730ad422ecb6bda814c9a9b375df36d6bd5a49eaa14e92e5f5e3e95ac3"}, + {file = "matplotlib-3.3.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e4d6d3afc454b4afc0d9d0ed52a8fa40a1b0d8f33c8e143e49a5833a7e32266b"}, + {file = "matplotlib-3.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:96a5e667308dbf45670370d9dffb974e73b15bac0df0b5f3fb0b0ac7a572290e"}, + {file = "matplotlib-3.3.1-cp38-cp38-win32.whl", hash = "sha256:bd8fceaa3494b531d43b6206966ba15705638137fc2dc5da5ee560cf9476867b"}, + {file = "matplotlib-3.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:1507c2a8e4662f6fa1d3ecc760782b158df8a3244ecc21c1d8dbb1cd0b3f872e"}, + {file = "matplotlib-3.3.1-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c3619ec2a5ead430a4536ebf8c77ea55d8ce36418919f831d35bc657ed5f27e"}, + {file = "matplotlib-3.3.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:9703bc00a94a94c4e94b2ea0fbfbc9d2bb21159733134639fd931b6606c5c47e"}, + {file = "matplotlib-3.3.1.tar.gz", hash = "sha256:87f53bcce90772f942c2db56736788b39332d552461a5cb13f05ff45c1680f0e"}, +] +mistune = [ + {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, + {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, +] +mkdocs = [ + {file = "mkdocs-1.1.2-py3-none-any.whl", hash = "sha256:096f52ff52c02c7e90332d2e53da862fde5c062086e1b5356a6e392d5d60f5e9"}, + {file = "mkdocs-1.1.2.tar.gz", hash = "sha256:f0b61e5402b99d7789efa032c7a74c90a20220a9c81749da06dbfbcbd52ffb39"}, +] +mkdocs-material = [ + {file = "mkdocs-material-5.5.7.tar.gz", hash = "sha256:6b7ecfba2da9bb0b3a0cc6a92ae543f034572ab56aba3814b6f03c30404d0410"}, + {file = "mkdocs_material-5.5.7-py2.py3-none-any.whl", hash = "sha256:c321fc3b3ab29ad291226aac1ec3523ae2acb3580097303bd45c34c24ece4b3f"}, +] +mkdocs-material-extensions = [ + {file = "mkdocs-material-extensions-1.0.tar.gz", hash = "sha256:17d7491e189af75700310b7ec33c6c48a22060b8b445001deca040cb60471cde"}, + {file = "mkdocs_material_extensions-1.0-py3-none-any.whl", hash = "sha256:09569c3694b5acc1e8334c9730e52b4bcde65fc9d613cc20e49af131ef1a9ca0"}, +] +more-itertools = [ + {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, + {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, +] +nbconvert = [ + {file = "nbconvert-5.6.1-py2.py3-none-any.whl", hash = "sha256:f0d6ec03875f96df45aa13e21fd9b8450c42d7e1830418cccc008c0df725fcee"}, + {file = "nbconvert-5.6.1.tar.gz", hash = "sha256:21fb48e700b43e82ba0e3142421a659d7739b65568cc832a13976a77be16b523"}, +] +nbformat = [ + {file = "nbformat-5.0.7-py3-none-any.whl", hash = "sha256:ea55c9b817855e2dfcd3f66d74857342612a60b1f09653440f4a5845e6e3523f"}, + {file = "nbformat-5.0.7.tar.gz", hash = "sha256:54d4d6354835a936bad7e8182dcd003ca3dc0cedfee5a306090e04854343b340"}, +] +networkx = [ + {file = "networkx-2.4-py3-none-any.whl", hash = "sha256:cdfbf698749a5014bf2ed9db4a07a5295df1d3a53bf80bf3cbd61edf9df05fa1"}, + {file = "networkx-2.4.tar.gz", hash = "sha256:f8f4ff0b6f96e4f9b16af6b84622597b5334bf9cae8cf9b2e42e7985d5c95c64"}, +] +nltk = [ + {file = "nltk-3.5.zip", hash = "sha256:845365449cd8c5f9731f7cb9f8bd6fd0767553b9d53af9eb1b3abf7700936b35"}, +] +notebook = [ + {file = "notebook-6.1.3-py3-none-any.whl", hash = "sha256:964cc40cff68e473f3778aef9266e867f7703cb4aebdfd250f334efe02f64c86"}, + {file = "notebook-6.1.3.tar.gz", hash = "sha256:9990d51b9931a31e681635899aeb198b4c4b41586a9e87fbfaaed1a71d0a05b6"}, +] +numba = [ + {file = "numba-0.51.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:1affe3d31485a7d92d6871332d7bbee0e0d285efa141b00865ed4ca97b63ea86"}, + {file = "numba-0.51.0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:d32fa103be636193e3448095e31f4be3846154ee4e0493c8a38c0fc37bc36d55"}, + {file = "numba-0.51.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:39ada7960a7b9318a09dc037d8256a11db23dfbe7b46c54b970481ab7215489a"}, + {file = "numba-0.51.0-cp36-cp36m-win32.whl", hash = "sha256:e622dbcbae54250724fe8a6e229adc5e6ad209a9b80acd64c76f3fec36afcbad"}, + {file = "numba-0.51.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ecd828afab28361a7345951ac535f6056083239c300024d1a0db9d94b6214872"}, + {file = "numba-0.51.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:e384b779b5be597bebd6bd2c42797e8a7847c267c9ceb3e31db8e3b0bc59ea1e"}, + {file = "numba-0.51.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:1bc53cb30eac255413464b2783ef1c727e42055bc24cbb8e3352852d1e2459a8"}, + {file = "numba-0.51.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:fe63774d562357498242f30ec0f400b690a328f18c1a76db7359c5ff1176e8e9"}, + {file = "numba-0.51.0-cp37-cp37m-win32.whl", hash = "sha256:6149c7251eb5ded3eef4cdefb5b98d0b34cb4359d1f59add4dfab4a6e2b4cc3f"}, + {file = "numba-0.51.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2c58654477c3d2c908574aa3b4ad1b97be71fe8a80320eafee2c032e71c09d15"}, + {file = "numba-0.51.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:38d39c31eadb7e05b62630449bb478d37cf336426ec9b75ed83b760844cf297d"}, + {file = "numba-0.51.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:4dd99aa674f448da6a79565ddd139d8f5bec66e6d882c88e88e5263066f2738d"}, + {file = "numba-0.51.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:95b155f6186533ca55a798fca9175311cedd859bb0a9e87bffd0a554da41ebf0"}, + {file = "numba-0.51.0-cp38-cp38-win32.whl", hash = "sha256:333535322edf2841ef42ff59f396f79ea6ae44a0738ff2cc8c257c8f0e6d32a5"}, + {file = "numba-0.51.0-cp38-cp38-win_amd64.whl", hash = "sha256:1287def88b1d5b04b6fcaec3f78d1d938df9554692f8d7c47dc78335db9976e6"}, + {file = "numba-0.51.0.tar.gz", hash = "sha256:da57ef00bc814bf54446fb3f8c0374557a7476e40279ceabefd9f12b05cc3c0c"}, +] +numpy = [ + {file = "numpy-1.19.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1cca51512299841bf69add3b75361779962f9cee7d9ee3bb446d5982e925b69"}, + {file = "numpy-1.19.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c9591886fc9cbe5532d5df85cb8e0cc3b44ba8ce4367bd4cf1b93dc19713da72"}, + {file = "numpy-1.19.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:cf1347450c0b7644ea142712619533553f02ef23f92f781312f6a3553d031fc7"}, + {file = "numpy-1.19.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:ed8a311493cf5480a2ebc597d1e177231984c818a86875126cfd004241a73c3e"}, + {file = "numpy-1.19.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3673c8b2b29077f1b7b3a848794f8e11f401ba0b71c49fbd26fb40b71788b132"}, + {file = "numpy-1.19.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:56ef7f56470c24bb67fb43dae442e946a6ce172f97c69f8d067ff8550cf782ff"}, + {file = "numpy-1.19.1-cp36-cp36m-win32.whl", hash = "sha256:aaf42a04b472d12515debc621c31cf16c215e332242e7a9f56403d814c744624"}, + {file = "numpy-1.19.1-cp36-cp36m-win_amd64.whl", hash = "sha256:082f8d4dd69b6b688f64f509b91d482362124986d98dc7dc5f5e9f9b9c3bb983"}, + {file = "numpy-1.19.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e4f6d3c53911a9d103d8ec9518190e52a8b945bab021745af4939cfc7c0d4a9e"}, + {file = "numpy-1.19.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:5b6885c12784a27e957294b60f97e8b5b4174c7504665333c5e94fbf41ae5d6a"}, + {file = "numpy-1.19.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1bc0145999e8cb8aed9d4e65dd8b139adf1919e521177f198529687dbf613065"}, + {file = "numpy-1.19.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:5a936fd51049541d86ccdeef2833cc89a18e4d3808fe58a8abeb802665c5af93"}, + {file = "numpy-1.19.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ef71a1d4fd4858596ae80ad1ec76404ad29701f8ca7cdcebc50300178db14dfc"}, + {file = "numpy-1.19.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b9792b0ac0130b277536ab8944e7b754c69560dac0415dd4b2dbd16b902c8954"}, + {file = "numpy-1.19.1-cp37-cp37m-win32.whl", hash = "sha256:b12e639378c741add21fbffd16ba5ad25c0a1a17cf2b6fe4288feeb65144f35b"}, + {file = "numpy-1.19.1-cp37-cp37m-win_amd64.whl", hash = "sha256:8343bf67c72e09cfabfab55ad4a43ce3f6bf6e6ced7acf70f45ded9ebb425055"}, + {file = "numpy-1.19.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e45f8e981a0ab47103181773cc0a54e650b2aef8c7b6cd07405d0fa8d869444a"}, + {file = "numpy-1.19.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:667c07063940e934287993366ad5f56766bc009017b4a0fe91dbd07960d0aba7"}, + {file = "numpy-1.19.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:480fdd4dbda4dd6b638d3863da3be82873bba6d32d1fc12ea1b8486ac7b8d129"}, + {file = "numpy-1.19.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:935c27ae2760c21cd7354402546f6be21d3d0c806fffe967f745d5f2de5005a7"}, + {file = "numpy-1.19.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:309cbcfaa103fc9a33ec16d2d62569d541b79f828c382556ff072442226d1968"}, + {file = "numpy-1.19.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7ed448ff4eaffeb01094959b19cbaf998ecdee9ef9932381420d514e446601cd"}, + {file = "numpy-1.19.1-cp38-cp38-win32.whl", hash = "sha256:de8b4a9b56255797cbddb93281ed92acbc510fb7b15df3f01bd28f46ebc4edae"}, + {file = "numpy-1.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:92feb989b47f83ebef246adabc7ff3b9a59ac30601c3f6819f8913458610bdcc"}, + {file = "numpy-1.19.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:e1b1dc0372f530f26a03578ac75d5e51b3868b9b76cd2facba4c9ee0eb252ab1"}, + {file = "numpy-1.19.1.zip", hash = "sha256:b8456987b637232602ceb4d663cb34106f7eb780e247d51a260b84760fd8f491"}, +] +packaging = [ + {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, + {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, +] +pandas = [ + {file = "pandas-1.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:47a03bfef80d6812c91ed6fae43f04f2fa80a4e1b82b35aa4d9002e39529e0b8"}, + {file = "pandas-1.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0210f8fe19c2667a3817adb6de2c4fd92b1b78e1975ca60c0efa908e0985cbdb"}, + {file = "pandas-1.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:35db623487f00d9392d8af44a24516d6cb9f274afaf73cfcfe180b9c54e007d2"}, + {file = "pandas-1.1.0-cp36-cp36m-win32.whl", hash = "sha256:4d1a806252001c5db7caecbe1a26e49a6c23421d85a700960f6ba093112f54a1"}, + {file = "pandas-1.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9f61cca5262840ff46ef857d4f5f65679b82188709d0e5e086a9123791f721c8"}, + {file = "pandas-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:182a5aeae319df391c3df4740bb17d5300dcd78034b17732c12e62e6dd79e4a4"}, + {file = "pandas-1.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:40ec0a7f611a3d00d3c666c4cceb9aa3f5bf9fbd81392948a93663064f527203"}, + {file = "pandas-1.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:16504f915f1ae424052f1e9b7cd2d01786f098fbb00fa4e0f69d42b22952d798"}, + {file = "pandas-1.1.0-cp37-cp37m-win32.whl", hash = "sha256:fc714895b6de6803ac9f661abb316853d0cd657f5d23985222255ad76ccedc25"}, + {file = "pandas-1.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a15835c8409d5edc50b4af93be3377b5dd3eb53517e7f785060df1f06f6da0e2"}, + {file = "pandas-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0bc440493cf9dc5b36d5d46bbd5508f6547ba68b02a28234cd8e81fdce42744d"}, + {file = "pandas-1.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:4b21d46728f8a6be537716035b445e7ef3a75dbd30bd31aa1b251323219d853e"}, + {file = "pandas-1.1.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0227e3a6e3a22c0e283a5041f1e3064d78fbde811217668bb966ed05386d8a7e"}, + {file = "pandas-1.1.0-cp38-cp38-win32.whl", hash = "sha256:ed60848caadeacecefd0b1de81b91beff23960032cded0ac1449242b506a3b3f"}, + {file = "pandas-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:60e20a4ab4d4fec253557d0fc9a4e4095c37b664f78c72af24860c8adcd07088"}, + {file = "pandas-1.1.0.tar.gz", hash = "sha256:b39508562ad0bb3f384b0db24da7d68a2608b9ddc85b1d931ccaaa92d5e45273"}, +] +pandocfilters = [ + {file = "pandocfilters-1.4.2.tar.gz", hash = "sha256:b3dd70e169bb5449e6bc6ff96aea89c5eea8c5f6ab5e207fc2f521a2cf4a0da9"}, +] +parso = [ + {file = "parso-0.7.1-py2.py3-none-any.whl", hash = "sha256:97218d9159b2520ff45eb78028ba8b50d2bc61dcc062a9682666f2dc4bd331ea"}, + {file = "parso-0.7.1.tar.gz", hash = "sha256:caba44724b994a8a5e086460bb212abc5a8bc46951bf4a9a1210745953622eb9"}, +] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] +pickleshare = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] +pillow = [ + {file = "Pillow-7.2.0-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae"}, + {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f"}, + {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38"}, + {file = "Pillow-7.2.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5"}, + {file = "Pillow-7.2.0-cp35-cp35m-win32.whl", hash = "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad"}, + {file = "Pillow-7.2.0-cp35-cp35m-win_amd64.whl", hash = "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f"}, + {file = "Pillow-7.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d"}, + {file = "Pillow-7.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233"}, + {file = "Pillow-7.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f"}, + {file = "Pillow-7.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8"}, + {file = "Pillow-7.2.0-cp36-cp36m-win32.whl", hash = "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a"}, + {file = "Pillow-7.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce"}, + {file = "Pillow-7.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4"}, + {file = "Pillow-7.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727"}, + {file = "Pillow-7.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b"}, + {file = "Pillow-7.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d"}, + {file = "Pillow-7.2.0-cp37-cp37m-win32.whl", hash = "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63"}, + {file = "Pillow-7.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1"}, + {file = "Pillow-7.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6"}, + {file = "Pillow-7.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9"}, + {file = "Pillow-7.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41"}, + {file = "Pillow-7.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8"}, + {file = "Pillow-7.2.0-cp38-cp38-win32.whl", hash = "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f"}, + {file = "Pillow-7.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6"}, + {file = "Pillow-7.2.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d"}, + {file = "Pillow-7.2.0.tar.gz", hash = "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626"}, +] +plotly = [ + {file = "plotly-4.9.0-py2.py3-none-any.whl", hash = "sha256:7c7b613af8def74f48b1298f08a49086bb9792104119feb4a137f737533021e1"}, + {file = "plotly-4.9.0.tar.gz", hash = "sha256:257f530ffd73754bd008454826905657b329053364597479bb9774437a396837"}, +] +pluggy = [ + {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, + {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, +] +prometheus-client = [ + {file = "prometheus_client-0.8.0-py2.py3-none-any.whl", hash = "sha256:983c7ac4b47478720db338f1491ef67a100b474e3bc7dafcbaefb7d0b8f9b01c"}, + {file = "prometheus_client-0.8.0.tar.gz", hash = "sha256:c6e6b706833a6bd1fd51711299edee907857be10ece535126a158f911ee80915"}, +] +prompt-toolkit = [ + {file = "prompt_toolkit-3.0.6-py3-none-any.whl", hash = "sha256:683397077a64cd1f750b71c05afcfc6612a7300cb6932666531e5a54f38ea564"}, + {file = "prompt_toolkit-3.0.6.tar.gz", hash = "sha256:7630ab85a23302839a0f26b31cc24f518e6155dea1ed395ea61b42c45941b6a6"}, +] +ptyprocess = [ + {file = "ptyprocess-0.6.0-py2.py3-none-any.whl", hash = "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"}, + {file = "ptyprocess-0.6.0.tar.gz", hash = "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0"}, +] +py = [ + {file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"}, + {file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"}, +] +pycparser = [ + {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, + {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, +] +pydot = [ + {file = "pydot-1.4.1-py2.py3-none-any.whl", hash = "sha256:67be714300c78fda5fd52f79ec994039e3f76f074948c67b5ff539b433ad354f"}, + {file = "pydot-1.4.1.tar.gz", hash = "sha256:d49c9d4dd1913beec2a997f831543c8cbd53e535b1a739e921642fe416235f01"}, +] +pygments = [ + {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, + {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, +] +pymdown-extensions = [ + {file = "pymdown-extensions-8.0.tar.gz", hash = "sha256:440b0db9823b89f9917482ce3ab3d32ac18e60f2e186770ac37836830d5e7256"}, + {file = "pymdown_extensions-8.0-py2.py3-none-any.whl", hash = "sha256:c3b18b719adc3a441c4edbcf691157998dbd333384a8e2caf0690985a6e586f0"}, +] +pyparsing = [ + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, +] +pyrsistent = [ + {file = "pyrsistent-0.16.0.tar.gz", hash = "sha256:28669905fe725965daa16184933676547c5bb40a5153055a8dee2a4bd7933ad3"}, +] +pytest = [ + {file = "pytest-6.0.1-py3-none-any.whl", hash = "sha256:8b6007800c53fdacd5a5c192203f4e531eb2a1540ad9c752e052ec0f7143dbad"}, + {file = "pytest-6.0.1.tar.gz", hash = "sha256:85228d75db9f45e06e57ef9bf4429267f81ac7c0d742cc9ed63d09886a9fe6f4"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, + {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, +] +pytz = [ + {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, + {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, +] +pywin32 = [ + {file = "pywin32-228-cp27-cp27m-win32.whl", hash = "sha256:37dc9935f6a383cc744315ae0c2882ba1768d9b06700a70f35dc1ce73cd4ba9c"}, + {file = "pywin32-228-cp27-cp27m-win_amd64.whl", hash = "sha256:11cb6610efc2f078c9e6d8f5d0f957620c333f4b23466931a247fb945ed35e89"}, + {file = "pywin32-228-cp35-cp35m-win32.whl", hash = "sha256:1f45db18af5d36195447b2cffacd182fe2d296849ba0aecdab24d3852fbf3f80"}, + {file = "pywin32-228-cp35-cp35m-win_amd64.whl", hash = "sha256:6e38c44097a834a4707c1b63efa9c2435f5a42afabff634a17f563bc478dfcc8"}, + {file = "pywin32-228-cp36-cp36m-win32.whl", hash = "sha256:ec16d44b49b5f34e99eb97cf270806fdc560dff6f84d281eb2fcb89a014a56a9"}, + {file = "pywin32-228-cp36-cp36m-win_amd64.whl", hash = "sha256:a60d795c6590a5b6baeacd16c583d91cce8038f959bd80c53bd9a68f40130f2d"}, + {file = "pywin32-228-cp37-cp37m-win32.whl", hash = "sha256:af40887b6fc200eafe4d7742c48417529a8702dcc1a60bf89eee152d1d11209f"}, + {file = "pywin32-228-cp37-cp37m-win_amd64.whl", hash = "sha256:00eaf43dbd05ba6a9b0080c77e161e0b7a601f9a3f660727a952e40140537de7"}, + {file = "pywin32-228-cp38-cp38-win32.whl", hash = "sha256:fa6ba028909cfc64ce9e24bcf22f588b14871980d9787f1e2002c99af8f1850c"}, + {file = "pywin32-228-cp38-cp38-win_amd64.whl", hash = "sha256:9b3466083f8271e1a5eb0329f4e0d61925d46b40b195a33413e0905dccb285e8"}, + {file = "pywin32-228-cp39-cp39-win32.whl", hash = "sha256:ed74b72d8059a6606f64842e7917aeee99159ebd6b8d6261c518d002837be298"}, + {file = "pywin32-228-cp39-cp39-win_amd64.whl", hash = "sha256:8319bafdcd90b7202c50d6014efdfe4fde9311b3ff15fd6f893a45c0868de203"}, +] +pywinpty = [ + {file = "pywinpty-0.5.7-cp27-cp27m-win32.whl", hash = "sha256:b358cb552c0f6baf790de375fab96524a0498c9df83489b8c23f7f08795e966b"}, + {file = "pywinpty-0.5.7-cp27-cp27m-win_amd64.whl", hash = "sha256:1e525a4de05e72016a7af27836d512db67d06a015aeaf2fa0180f8e6a039b3c2"}, + {file = "pywinpty-0.5.7-cp35-cp35m-win32.whl", hash = "sha256:2740eeeb59297593a0d3f762269b01d0285c1b829d6827445fcd348fb47f7e70"}, + {file = "pywinpty-0.5.7-cp35-cp35m-win_amd64.whl", hash = "sha256:33df97f79843b2b8b8bc5c7aaf54adec08cc1bae94ee99dfb1a93c7a67704d95"}, + {file = "pywinpty-0.5.7-cp36-cp36m-win32.whl", hash = "sha256:e854211df55d107f0edfda8a80b39dfc87015bef52a8fe6594eb379240d81df2"}, + {file = "pywinpty-0.5.7-cp36-cp36m-win_amd64.whl", hash = "sha256:dbd838de92de1d4ebf0dce9d4d5e4fc38d0b7b1de837947a18b57a882f219139"}, + {file = "pywinpty-0.5.7-cp37-cp37m-win32.whl", hash = "sha256:5fb2c6c6819491b216f78acc2c521b9df21e0f53b9a399d58a5c151a3c4e2a2d"}, + {file = "pywinpty-0.5.7-cp37-cp37m-win_amd64.whl", hash = "sha256:dd22c8efacf600730abe4a46c1388355ce0d4ab75dc79b15d23a7bd87bf05b48"}, + {file = "pywinpty-0.5.7-cp38-cp38-win_amd64.whl", hash = "sha256:8fc5019ff3efb4f13708bd3b5ad327589c1a554cb516d792527361525a7cb78c"}, + {file = "pywinpty-0.5.7.tar.gz", hash = "sha256:2d7e9c881638a72ffdca3f5417dd1563b60f603e1b43e5895674c2a1b01f95a0"}, +] +pyyaml = [ + {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, + {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, + {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, + {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, +] +pyzmq = [ + {file = "pyzmq-19.0.2-cp27-cp27m-macosx_10_9_intel.whl", hash = "sha256:59f1e54627483dcf61c663941d94c4af9bf4163aec334171686cdaee67974fe5"}, + {file = "pyzmq-19.0.2-cp27-cp27m-win32.whl", hash = "sha256:c36ffe1e5aa35a1af6a96640d723d0d211c5f48841735c2aa8d034204e87eb87"}, + {file = "pyzmq-19.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:0a422fc290d03958899743db091f8154958410fc76ce7ee0ceb66150f72c2c97"}, + {file = "pyzmq-19.0.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:c20dd60b9428f532bc59f2ef6d3b1029a28fc790d408af82f871a7db03e722ff"}, + {file = "pyzmq-19.0.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d46fb17f5693244de83e434648b3dbb4f4b0fec88415d6cbab1c1452b6f2ae17"}, + {file = "pyzmq-19.0.2-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:f1a25a61495b6f7bb986accc5b597a3541d9bd3ef0016f50be16dbb32025b302"}, + {file = "pyzmq-19.0.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:ab0d01148d13854de716786ca73701012e07dff4dfbbd68c4e06d8888743526e"}, + {file = "pyzmq-19.0.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:720d2b6083498a9281eaee3f2927486e9fe02cd16d13a844f2e95217f243efea"}, + {file = "pyzmq-19.0.2-cp35-cp35m-win32.whl", hash = "sha256:29d51279060d0a70f551663bc592418bcad7f4be4eea7b324f6dd81de05cb4c1"}, + {file = "pyzmq-19.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:5120c64646e75f6db20cc16b9a94203926ead5d633de9feba4f137004241221d"}, + {file = "pyzmq-19.0.2-cp36-cp36m-macosx_10_9_intel.whl", hash = "sha256:8a6ada5a3f719bf46a04ba38595073df8d6b067316c011180102ba2a1925f5b5"}, + {file = "pyzmq-19.0.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:fa411b1d8f371d3a49d31b0789eb6da2537dadbb2aef74a43aa99a78195c3f76"}, + {file = "pyzmq-19.0.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:00dca814469436455399660247d74045172955459c0bd49b54a540ce4d652185"}, + {file = "pyzmq-19.0.2-cp36-cp36m-win32.whl", hash = "sha256:046b92e860914e39612e84fa760fc3f16054d268c11e0e25dcb011fb1bc6a075"}, + {file = "pyzmq-19.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:99cc0e339a731c6a34109e5c4072aaa06d8e32c0b93dc2c2d90345dd45fa196c"}, + {file = "pyzmq-19.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e36f12f503511d72d9bdfae11cadbadca22ff632ff67c1b5459f69756a029c19"}, + {file = "pyzmq-19.0.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c40fbb2b9933369e994b837ee72193d6a4c35dfb9a7c573257ef7ff28961272c"}, + {file = "pyzmq-19.0.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5d9fc809aa8d636e757e4ced2302569d6e60e9b9c26114a83f0d9d6519c40493"}, + {file = "pyzmq-19.0.2-cp37-cp37m-win32.whl", hash = "sha256:3fa6debf4bf9412e59353defad1f8035a1e68b66095a94ead8f7a61ae90b2675"}, + {file = "pyzmq-19.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:73483a2caaa0264ac717af33d6fb3f143d8379e60a422730ee8d010526ce1913"}, + {file = "pyzmq-19.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:36ab114021c0cab1a423fe6689355e8f813979f2c750968833b318c1fa10a0fd"}, + {file = "pyzmq-19.0.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:8b66b94fe6243d2d1d89bca336b2424399aac57932858b9a30309803ffc28112"}, + {file = "pyzmq-19.0.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:654d3e06a4edc566b416c10293064732516cf8871a4522e0a2ba00cc2a2e600c"}, + {file = "pyzmq-19.0.2-cp38-cp38-win32.whl", hash = "sha256:276ad604bffd70992a386a84bea34883e696a6b22e7378053e5d3227321d9702"}, + {file = "pyzmq-19.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:09d24a80ccb8cbda1af6ed8eb26b005b6743e58e9290566d2a6841f4e31fa8e0"}, + {file = "pyzmq-19.0.2-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:c1a31cd42905b405530e92bdb70a8a56f048c8a371728b8acf9d746ecd4482c0"}, + {file = "pyzmq-19.0.2-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a7e7f930039ee0c4c26e4dfee015f20bd6919cd8b97c9cd7afbde2923a5167b6"}, + {file = "pyzmq-19.0.2.tar.gz", hash = "sha256:296540a065c8c21b26d63e3cea2d1d57902373b16e4256afe46422691903a438"}, +] +regex = [ + {file = "regex-2020.7.14-cp27-cp27m-win32.whl", hash = "sha256:e46d13f38cfcbb79bfdb2964b0fe12561fe633caf964a77a5f8d4e45fe5d2ef7"}, + {file = "regex-2020.7.14-cp27-cp27m-win_amd64.whl", hash = "sha256:6961548bba529cac7c07af2fd4d527c5b91bb8fe18995fed6044ac22b3d14644"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c50a724d136ec10d920661f1442e4a8b010a4fe5aebd65e0c2241ea41dbe93dc"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8a51f2c6d1f884e98846a0a9021ff6861bdb98457879f412fdc2b42d14494067"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9c568495e35599625f7b999774e29e8d6b01a6fb684d77dee1f56d41b11b40cd"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:51178c738d559a2d1071ce0b0f56e57eb315bcf8f7d4cf127674b533e3101f88"}, + {file = "regex-2020.7.14-cp36-cp36m-win32.whl", hash = "sha256:9eddaafb3c48e0900690c1727fba226c4804b8e6127ea409689c3bb492d06de4"}, + {file = "regex-2020.7.14-cp36-cp36m-win_amd64.whl", hash = "sha256:14a53646369157baa0499513f96091eb70382eb50b2c82393d17d7ec81b7b85f"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:1269fef3167bb52631ad4fa7dd27bf635d5a0790b8e6222065d42e91bede4162"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d0a5095d52b90ff38592bbdc2644f17c6d495762edf47d876049cfd2968fbccf"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4c037fd14c5f4e308b8370b447b469ca10e69427966527edcab07f52d88388f7"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bc3d98f621898b4a9bc7fecc00513eec8f40b5b83913d74ccb445f037d58cd89"}, + {file = "regex-2020.7.14-cp37-cp37m-win32.whl", hash = "sha256:46bac5ca10fb748d6c55843a931855e2727a7a22584f302dd9bb1506e69f83f6"}, + {file = "regex-2020.7.14-cp37-cp37m-win_amd64.whl", hash = "sha256:0dc64ee3f33cd7899f79a8d788abfbec168410be356ed9bd30bbd3f0a23a7204"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5ea81ea3dbd6767873c611687141ec7b06ed8bab43f68fad5b7be184a920dc99"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bbb332d45b32df41200380fff14712cb6093b61bd142272a10b16778c418e98e"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c11d6033115dc4887c456565303f540c44197f4fc1a2bfb192224a301534888e"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:75aaa27aa521a182824d89e5ab0a1d16ca207318a6b65042b046053cfc8ed07a"}, + {file = "regex-2020.7.14-cp38-cp38-win32.whl", hash = "sha256:d6cff2276e502b86a25fd10c2a96973fdb45c7a977dca2138d661417f3728341"}, + {file = "regex-2020.7.14-cp38-cp38-win_amd64.whl", hash = "sha256:7a2dd66d2d4df34fa82c9dc85657c5e019b87932019947faece7983f2089a840"}, + {file = "regex-2020.7.14.tar.gz", hash = "sha256:3a3af27a8d23143c49a3420efe5b3f8cf1a48c6fc8bc6856b03f638abc1833bb"}, +] +requests = [ + {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, + {file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"}, +] +retrying = [ + {file = "retrying-1.3.3.tar.gz", hash = "sha256:08c039560a6da2fe4f2c426d0766e284d3b736e355f8dd24b37367b0bb41973b"}, +] +scikit-learn = [ + {file = "scikit-learn-0.23.2.tar.gz", hash = "sha256:20766f515e6cd6f954554387dfae705d93c7b544ec0e6c6a5d8e006f6f7ef480"}, + {file = "scikit_learn-0.23.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:98508723f44c61896a4e15894b2016762a55555fbf09365a0bb1870ecbd442de"}, + {file = "scikit_learn-0.23.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a64817b050efd50f9abcfd311870073e500ae11b299683a519fbb52d85e08d25"}, + {file = "scikit_learn-0.23.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:daf276c465c38ef736a79bd79fc80a249f746bcbcae50c40945428f7ece074f8"}, + {file = "scikit_learn-0.23.2-cp36-cp36m-win32.whl", hash = "sha256:cb3e76380312e1f86abd20340ab1d5b3cc46a26f6593d3c33c9ea3e4c7134028"}, + {file = "scikit_learn-0.23.2-cp36-cp36m-win_amd64.whl", hash = "sha256:0a127cc70990d4c15b1019680bfedc7fec6c23d14d3719fdf9b64b22d37cdeca"}, + {file = "scikit_learn-0.23.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aa95c2f17d2f80534156215c87bee72b6aa314a7f8b8fe92a2d71f47280570d"}, + {file = "scikit_learn-0.23.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6c28a1d00aae7c3c9568f61aafeaad813f0f01c729bee4fd9479e2132b215c1d"}, + {file = "scikit_learn-0.23.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:da8e7c302003dd765d92a5616678e591f347460ac7b53e53d667be7dfe6d1b10"}, + {file = "scikit_learn-0.23.2-cp37-cp37m-win32.whl", hash = "sha256:d9a1ce5f099f29c7c33181cc4386660e0ba891b21a60dc036bf369e3a3ee3aec"}, + {file = "scikit_learn-0.23.2-cp37-cp37m-win_amd64.whl", hash = "sha256:914ac2b45a058d3f1338d7736200f7f3b094857758895f8667be8a81ff443b5b"}, + {file = "scikit_learn-0.23.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7671bbeddd7f4f9a6968f3b5442dac5f22bf1ba06709ef888cc9132ad354a9ab"}, + {file = "scikit_learn-0.23.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:d0dcaa54263307075cb93d0bee3ceb02821093b1b3d25f66021987d305d01dce"}, + {file = "scikit_learn-0.23.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5ce7a8021c9defc2b75620571b350acc4a7d9763c25b7593621ef50f3bd019a2"}, + {file = "scikit_learn-0.23.2-cp38-cp38-win32.whl", hash = "sha256:0d39748e7c9669ba648acf40fb3ce96b8a07b240db6888563a7cb76e05e0d9cc"}, + {file = "scikit_learn-0.23.2-cp38-cp38-win_amd64.whl", hash = "sha256:1b8a391de95f6285a2f9adffb7db0892718950954b7149a70c783dc848f104ea"}, +] +scipy = [ + {file = "scipy-1.5.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cca9fce15109a36a0a9f9cfc64f870f1c140cb235ddf27fe0328e6afb44dfed0"}, + {file = "scipy-1.5.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:1c7564a4810c1cd77fcdee7fa726d7d39d4e2695ad252d7c86c3ea9d85b7fb8f"}, + {file = "scipy-1.5.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:07e52b316b40a4f001667d1ad4eb5f2318738de34597bd91537851365b6c61f1"}, + {file = "scipy-1.5.2-cp36-cp36m-win32.whl", hash = "sha256:d56b10d8ed72ec1be76bf10508446df60954f08a41c2d40778bc29a3a9ad9bce"}, + {file = "scipy-1.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:8e28e74b97fc8d6aa0454989db3b5d36fc27e69cef39a7ee5eaf8174ca1123cb"}, + {file = "scipy-1.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6e86c873fe1335d88b7a4bfa09d021f27a9e753758fd75f3f92d714aa4093768"}, + {file = "scipy-1.5.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:a0afbb967fd2c98efad5f4c24439a640d39463282040a88e8e928db647d8ac3d"}, + {file = "scipy-1.5.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:eecf40fa87eeda53e8e11d265ff2254729d04000cd40bae648e76ff268885d66"}, + {file = "scipy-1.5.2-cp37-cp37m-win32.whl", hash = "sha256:315aa2165aca31375f4e26c230188db192ed901761390be908c9b21d8b07df62"}, + {file = "scipy-1.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:ec5fe57e46828d034775b00cd625c4a7b5c7d2e354c3b258d820c6c72212a6ec"}, + {file = "scipy-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fc98f3eac993b9bfdd392e675dfe19850cc8c7246a8fd2b42443e506344be7d9"}, + {file = "scipy-1.5.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a785409c0fa51764766840185a34f96a0a93527a0ff0230484d33a8ed085c8f8"}, + {file = "scipy-1.5.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0a0e9a4e58a4734c2eba917f834b25b7e3b6dc333901ce7784fd31aefbd37b2f"}, + {file = "scipy-1.5.2-cp38-cp38-win32.whl", hash = "sha256:dac09281a0eacd59974e24525a3bc90fa39b4e95177e638a31b14db60d3fa806"}, + {file = "scipy-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:92eb04041d371fea828858e4fff182453c25ae3eaa8782d9b6c32b25857d23bc"}, + {file = "scipy-1.5.2.tar.gz", hash = "sha256:066c513d90eb3fd7567a9e150828d39111ebd88d3e924cdfc9f8ce19ab6f90c9"}, +] +send2trash = [ + {file = "Send2Trash-1.5.0-py3-none-any.whl", hash = "sha256:f1691922577b6fa12821234aeb57599d887c4900b9ca537948d2dac34aea888b"}, + {file = "Send2Trash-1.5.0.tar.gz", hash = "sha256:60001cc07d707fe247c94f74ca6ac0d3255aabcb930529690897ca2a39db28b2"}, +] +shap = [ + {file = "shap-0.35.0-cp35-cp35m-win_amd64.whl", hash = "sha256:3f8d5e1bfc2f0e8b442370e4b8253430f7078fab21b7769e89969b1a0194c3f9"}, + {file = "shap-0.35.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ef9410e940396cb451039f7a1d639086e4e4e7c742faeb3fd8734e7b71cdf3d2"}, + {file = "shap-0.35.0.tar.gz", hash = "sha256:6b9a2a3636918b9cdce4d3c599786b38353fbdca49147b5407a75aee398b1018"}, +] +six = [ + {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, + {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, +] +terminado = [ + {file = "terminado-0.8.3-py2.py3-none-any.whl", hash = "sha256:a43dcb3e353bc680dd0783b1d9c3fc28d529f190bc54ba9a229f72fe6e7a54d7"}, + {file = "terminado-0.8.3.tar.gz", hash = "sha256:4804a774f802306a7d9af7322193c5390f1da0abb429e082a10ef1d46e6fb2c2"}, +] +testpath = [ + {file = "testpath-0.4.4-py2.py3-none-any.whl", hash = "sha256:bfcf9411ef4bf3db7579063e0546938b1edda3d69f4e1fb8756991f5951f85d4"}, + {file = "testpath-0.4.4.tar.gz", hash = "sha256:60e0a3261c149755f4399a1fff7d37523179a70fdc3abdf78de9fc2604aeec7e"}, +] +threadpoolctl = [ + {file = "threadpoolctl-2.1.0-py3-none-any.whl", hash = "sha256:38b74ca20ff3bb42caca8b00055111d74159ee95c4370882bbff2b93d24da725"}, + {file = "threadpoolctl-2.1.0.tar.gz", hash = "sha256:ddc57c96a38beb63db45d6c159b5ab07b6bced12c45a1f07b2b92f272aebfa6b"}, +] +toml = [ + {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, + {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, +] +toolz = [ + {file = "toolz-0.10.0.tar.gz", hash = "sha256:08fdd5ef7c96480ad11c12d472de21acd32359996f69a5259299b540feba4560"}, +] +tornado = [ + {file = "tornado-6.0.4-cp35-cp35m-win32.whl", hash = "sha256:5217e601700f24e966ddab689f90b7ea4bd91ff3357c3600fa1045e26d68e55d"}, + {file = "tornado-6.0.4-cp35-cp35m-win_amd64.whl", hash = "sha256:c98232a3ac391f5faea6821b53db8db461157baa788f5d6222a193e9456e1740"}, + {file = "tornado-6.0.4-cp36-cp36m-win32.whl", hash = "sha256:5f6a07e62e799be5d2330e68d808c8ac41d4a259b9cea61da4101b83cb5dc673"}, + {file = "tornado-6.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c952975c8ba74f546ae6de2e226ab3cc3cc11ae47baf607459a6728585bb542a"}, + {file = "tornado-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:2c027eb2a393d964b22b5c154d1a23a5f8727db6fda837118a776b29e2b8ebc6"}, + {file = "tornado-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:5618f72e947533832cbc3dec54e1dffc1747a5cb17d1fd91577ed14fa0dc081b"}, + {file = "tornado-6.0.4-cp38-cp38-win32.whl", hash = "sha256:22aed82c2ea340c3771e3babc5ef220272f6fd06b5108a53b4976d0d722bcd52"}, + {file = "tornado-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c58d56003daf1b616336781b26d184023ea4af13ae143d9dda65e31e534940b9"}, + {file = "tornado-6.0.4.tar.gz", hash = "sha256:0fe2d45ba43b00a41cd73f8be321a44936dc1aba233dee979f17a042b83eb6dc"}, +] +tqdm = [ + {file = "tqdm-4.48.2-py2.py3-none-any.whl", hash = "sha256:1a336d2b829be50e46b84668691e0a2719f26c97c62846298dd5ae2937e4d5cf"}, + {file = "tqdm-4.48.2.tar.gz", hash = "sha256:564d632ea2b9cb52979f7956e093e831c28d441c11751682f84c86fc46e4fd21"}, +] +traitlets = [ + {file = "traitlets-4.3.3-py2.py3-none-any.whl", hash = "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44"}, + {file = "traitlets-4.3.3.tar.gz", hash = "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"}, +] +urllib3 = [ + {file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"}, + {file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"}, +] +wcwidth = [ + {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, + {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..2197512 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,42 @@ +[tool.poetry] +name = "mercs" +version = "0.0.45" +description = "MERCS: Multi-Directional Ensembles of Regression and Classification treeS" +authors = ["Elia vw ", "Andrés Reverón Molina "] +license = "MIT" +repository = "https://github.com/eliavw/mercs" +readme = "README.md" +classifiers = [ + "Development Status :: 3 - Alpha", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + "Topic :: Software Development :: Libraries :: Python Modules" +] +packages = [ + { include = "mercs" }, +] + +[tool.poetry.dependencies] +python = "^3.8.0" +catboost = "^0.24" +dask = { version = "^2.23.0", extras = ["delayed"] } +decision-tree-morfist = "^0.3.3" +ipython = "^7.17.0" +joblib = "^0.16.0" +lightgbm = "^2.3.1" +networkx = "^2.4" +numpy = "^1.19.1" +pydot = "^1.4.1" +scikit-learn = "^0.23.2" +shap = "^0.35.0" + +[tool.poetry.dev-dependencies] +graphviz = "^0.14.1" +jupyterlab = "^2.2.4" +mkdocs = "^1.1.2" +mkdocs-material = "^5.5.6" +pandas = "^1.1.0" +pydot = "^1.4.1" +pytest = "^6.0.1" +setuptools = "^49.2.0" diff --git a/scripts/.gitkeep b/scripts/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index add0e02..0000000 --- a/setup.cfg +++ /dev/null @@ -1,67 +0,0 @@ -[metadata] -name = mercs -version = 0.0.37 -description = MERCS: Multi-Directional Ensembles of Regression and Classification treeS -author = Elia vw -author-email = elia.vw@gmail.com -license = mit -long-description = file: README.md -long-description-content-type = text/markdown -url = https://github.com/eliavw -project-urls = - Documentation = https://github.com/eliavw -platforms = any -classifiers = - Development Status :: 4 - Beta - Programming Language :: Python - -[options] -zip_safe = False -packages = find: -include_package_data = True -package_dir = - = src -install_requires = - numpy - scipy - pandas - networkx - scikit-learn - dask - toolz - tornado - pydot - ipython - shap -python_requires = - >= 3.6 - -[options.packages.find] -where = - src -exclude = - tests - -[options.extras_require] -testing = - pytest - -[test] -extras = True - -[tool:pytest] -addopts = - --verbose -norecursedirs = - dist - build -testpaths = - tests - -[aliases] -dists = bdist_wheel - -[devpi:upload] -no-vcs = 1 -formats = bdist_wheel - diff --git a/setup.py b/setup.py deleted file mode 100644 index 33ac66c..0000000 --- a/setup.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Setup file for mercs. - Use setup.cfg to configure your project. -""" -import sys - -from pkg_resources import VersionConflict, require -from setuptools import setup - -try: - require('setuptools>=38.3') -except VersionConflict: - print("Error: version of setuptools is too old (<38.3)!") - sys.exit(1) - - -if __name__ == "__main__": - setup() diff --git a/site/404.html b/site/404.html deleted file mode 100644 index f940443..0000000 --- a/site/404.html +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - mercs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
- - - - -
-
- - -
-
-
- -
-
-
- - - -
-
- -

404 - Not found

- - - - - - -
-
-
-
- - - - -
- - - - - - - - - - \ No newline at end of file diff --git a/site/assets/fonts/font-awesome.css b/site/assets/fonts/font-awesome.css deleted file mode 100644 index b476b53..0000000 --- a/site/assets/fonts/font-awesome.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url("specimen/FontAwesome.woff2") format("woff2"),url("specimen/FontAwesome.woff") format("woff"),url("specimen/FontAwesome.ttf") format("truetype")}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} \ No newline at end of file diff --git a/site/assets/fonts/material-icons.css b/site/assets/fonts/material-icons.css deleted file mode 100644 index d23d365..0000000 --- a/site/assets/fonts/material-icons.css +++ /dev/null @@ -1,13 +0,0 @@ -/*! - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy - * of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE - * DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - * SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND - * LIMITATIONS UNDER THE LICENSE. - */@font-face{font-family:"Material Icons";font-style:normal;font-weight:400;src:local("Material Icons"),local("MaterialIcons-Regular"),url("specimen/MaterialIcons-Regular.woff2") format("woff2"),url("specimen/MaterialIcons-Regular.woff") format("woff"),url("specimen/MaterialIcons-Regular.ttf") format("truetype")} \ No newline at end of file diff --git a/site/assets/fonts/specimen/FontAwesome.ttf b/site/assets/fonts/specimen/FontAwesome.ttf deleted file mode 100644 index 35acda2..0000000 Binary files a/site/assets/fonts/specimen/FontAwesome.ttf and /dev/null differ diff --git a/site/assets/fonts/specimen/FontAwesome.woff b/site/assets/fonts/specimen/FontAwesome.woff deleted file mode 100644 index 400014a..0000000 Binary files a/site/assets/fonts/specimen/FontAwesome.woff and /dev/null differ diff --git a/site/assets/fonts/specimen/FontAwesome.woff2 b/site/assets/fonts/specimen/FontAwesome.woff2 deleted file mode 100644 index 4d13fc6..0000000 Binary files a/site/assets/fonts/specimen/FontAwesome.woff2 and /dev/null differ diff --git a/site/assets/fonts/specimen/MaterialIcons-Regular.ttf b/site/assets/fonts/specimen/MaterialIcons-Regular.ttf deleted file mode 100644 index 7015564..0000000 Binary files a/site/assets/fonts/specimen/MaterialIcons-Regular.ttf and /dev/null differ diff --git a/site/assets/fonts/specimen/MaterialIcons-Regular.woff b/site/assets/fonts/specimen/MaterialIcons-Regular.woff deleted file mode 100644 index b648a3e..0000000 Binary files a/site/assets/fonts/specimen/MaterialIcons-Regular.woff and /dev/null differ diff --git a/site/assets/fonts/specimen/MaterialIcons-Regular.woff2 b/site/assets/fonts/specimen/MaterialIcons-Regular.woff2 deleted file mode 100644 index 9fa2112..0000000 Binary files a/site/assets/fonts/specimen/MaterialIcons-Regular.woff2 and /dev/null differ diff --git a/site/assets/images/favicon.png b/site/assets/images/favicon.png deleted file mode 100644 index 76d17f5..0000000 Binary files a/site/assets/images/favicon.png and /dev/null differ diff --git a/site/assets/images/icons/bitbucket.1b09e088.svg b/site/assets/images/icons/bitbucket.1b09e088.svg deleted file mode 100644 index cf58c14..0000000 --- a/site/assets/images/icons/bitbucket.1b09e088.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/assets/images/icons/github.f0b8504a.svg b/site/assets/images/icons/github.f0b8504a.svg deleted file mode 100644 index 3d13b19..0000000 --- a/site/assets/images/icons/github.f0b8504a.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/assets/images/icons/gitlab.6dd19c00.svg b/site/assets/images/icons/gitlab.6dd19c00.svg deleted file mode 100644 index 1d9fffa..0000000 --- a/site/assets/images/icons/gitlab.6dd19c00.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/assets/javascripts/application.c648116f.js b/site/assets/javascripts/application.c648116f.js deleted file mode 100644 index 1619f6e..0000000 --- a/site/assets/javascripts/application.c648116f.js +++ /dev/null @@ -1,6 +0,0 @@ -!function(e,t){for(var n in t)e[n]=t[n]}(window,function(n){var r={};function i(e){if(r[e])return r[e].exports;var t=r[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,i),t.l=!0,t.exports}return i.m=n,i.c=r,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)i.d(n,r,function(e){return t[e]}.bind(null,r));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=13)}([function(e,t,n){"use strict";var r={Listener:function(){function e(e,t,n){var r=this;this.els_=Array.prototype.slice.call("string"==typeof e?document.querySelectorAll(e):[].concat(e)),this.handler_="function"==typeof n?{update:n}:n,this.events_=[].concat(t),this.update_=function(e){return r.handler_.update(e)}}var t=e.prototype;return t.listen=function(){var n=this;this.els_.forEach(function(t){n.events_.forEach(function(e){t.addEventListener(e,n.update_,!1)})}),"function"==typeof this.handler_.setup&&this.handler_.setup()},t.unlisten=function(){var n=this;this.els_.forEach(function(t){n.events_.forEach(function(e){t.removeEventListener(e,n.update_)})}),"function"==typeof this.handler_.reset&&this.handler_.reset()},e}(),MatchMedia:function(e,t){this.handler_=function(e){e.matches?t.listen():t.unlisten()};var n=window.matchMedia(e);n.addListener(this.handler_),this.handler_(n)}},i={Shadow:function(){function e(e,t){var n="string"==typeof e?document.querySelector(e):e;if(!(n instanceof HTMLElement&&n.parentNode instanceof HTMLElement))throw new ReferenceError;if(this.el_=n.parentNode,!((n="string"==typeof t?document.querySelector(t):t)instanceof HTMLElement))throw new ReferenceError;this.header_=n,this.height_=0,this.active_=!1}var t=e.prototype;return t.setup=function(){for(var e=this.el_;e=e.previousElementSibling;){if(!(e instanceof HTMLElement))throw new ReferenceError;this.height_+=e.offsetHeight}this.update()},t.update=function(e){if(!e||"resize"!==e.type&&"orientationchange"!==e.type){var t=window.pageYOffset>=this.height_;t!==this.active_&&(this.header_.dataset.mdState=(this.active_=t)?"shadow":"")}else this.height_=0,this.setup()},t.reset=function(){this.header_.dataset.mdState="",this.height_=0,this.active_=!1},e}(),Title:function(){function e(e,t){var n="string"==typeof e?document.querySelector(e):e;if(!(n instanceof HTMLElement))throw new ReferenceError;if(this.el_=n,!((n="string"==typeof t?document.querySelector(t):t)instanceof HTMLHeadingElement))throw new ReferenceError;this.header_=n,this.active_=!1}var t=e.prototype;return t.setup=function(){var t=this;Array.prototype.forEach.call(this.el_.children,function(e){e.style.width=t.el_.offsetWidth-20+"px"})},t.update=function(e){var t=this,n=window.pageYOffset>=this.header_.offsetTop;n!==this.active_&&(this.el_.dataset.mdState=(this.active_=n)?"active":""),"resize"!==e.type&&"orientationchange"!==e.type||Array.prototype.forEach.call(this.el_.children,function(e){e.style.width=t.el_.offsetWidth-20+"px"})},t.reset=function(){this.el_.dataset.mdState="",this.el_.style.width="",this.active_=!1},e}()},o={Blur:function(){function e(e){this.els_="string"==typeof e?document.querySelectorAll(e):e,this.index_=0,this.offset_=window.pageYOffset,this.dir_=!1,this.anchors_=[].reduce.call(this.els_,function(e,t){var n=decodeURIComponent(t.hash);return e.concat(document.getElementById(n.substring(1))||[])},[])}var t=e.prototype;return t.setup=function(){this.update()},t.update=function(){var e=window.pageYOffset,t=this.offset_-e<0;if(this.dir_!==t&&(this.index_=this.index_=t?0:this.els_.length-1),0!==this.anchors_.length){if(this.offset_<=e)for(var n=this.index_+1;ne)){this.index_=r;break}0=this.offset_?"lock"!==this.el_.dataset.mdState&&(this.el_.dataset.mdState="lock"):"lock"===this.el_.dataset.mdState&&(this.el_.dataset.mdState="")},t.reset=function(){this.el_.dataset.mdState="",this.el_.style.height="",this.height_=0},e}()},c=n(6),l=n.n(c);var u={Adapter:{GitHub:function(o){var e,t;function n(e){var t;t=o.call(this,e)||this;var n=/^.+github\.com\/([^/]+)\/?([^/]+)?.*$/.exec(t.base_);if(n&&3===n.length){var r=n[1],i=n[2];t.base_="https://api.github.com/users/"+r+"/repos",t.name_=i}return t}return t=o,(e=n).prototype=Object.create(t.prototype),(e.prototype.constructor=e).__proto__=t,n.prototype.fetch_=function(){var i=this;return function n(r){return void 0===r&&(r=0),fetch(i.base_+"?per_page=30&page="+r).then(function(e){return e.json()}).then(function(e){if(!(e instanceof Array))throw new TypeError;if(i.name_){var t=e.find(function(e){return e.name===i.name_});return t||30!==e.length?t?[i.format_(t.stargazers_count)+" Stars",i.format_(t.forks_count)+" Forks"]:[]:n(r+1)}return[e.length+" Repositories"]})}()},n}(function(){function e(e){var t="string"==typeof e?document.querySelector(e):e;if(!(t instanceof HTMLAnchorElement))throw new ReferenceError;this.el_=t,this.base_=this.el_.href,this.salt_=this.hash_(this.base_)}var t=e.prototype;return t.fetch=function(){var n=this;return new Promise(function(t){var e=l.a.getJSON(n.salt_+".cache-source");void 0!==e?t(e):n.fetch_().then(function(e){l.a.set(n.salt_+".cache-source",e,{expires:1/96}),t(e)})})},t.fetch_=function(){throw new Error("fetch_(): Not implemented")},t.format_=function(e){return 1e4=this.el_.children[0].offsetTop+(5-this.height_);e!==this.active_&&(this.el_.dataset.mdState=(this.active_=e)?"hidden":"")},t.reset=function(){this.el_.dataset.mdState="",this.active_=!1},e}()};t.a={Event:r,Header:i,Nav:o,Search:a,Sidebar:s,Source:u,Tabs:f}},function(t,e,n){(function(e){t.exports=e.lunr=n(24)}).call(this,n(4))},function(e,d,h){"use strict";(function(t){var e=h(8),n=setTimeout;function c(e){return Boolean(e&&void 0!==e.length)}function r(){}function o(e){if(!(this instanceof o))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],f(e,this)}function i(n,r){for(;3===n._state;)n=n._value;0!==n._state?(n._handled=!0,o._immediateFn(function(){var e=1===n._state?r.onFulfilled:r.onRejected;if(null!==e){var t;try{t=e(n._value)}catch(e){return void s(r.promise,e)}a(r.promise,t)}else(1===n._state?a:s)(r.promise,n._value)})):n._deferreds.push(r)}function a(t,e){try{if(e===t)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var n=e.then;if(e instanceof o)return t._state=3,t._value=e,void l(t);if("function"==typeof n)return void f((r=n,i=e,function(){r.apply(i,arguments)}),t)}t._state=1,t._value=e,l(t)}catch(e){s(t,e)}var r,i}function s(e,t){e._state=2,e._value=t,l(e)}function l(e){2===e._state&&0===e._deferreds.length&&o._immediateFn(function(){e._handled||o._unhandledRejectionFn(e._value)});for(var t=0,n=e._deferreds.length;t"+n+""};this.stack_=[],r.forEach(function(e,t){var n,r=a.docs_.get(t),i=f.createElement("li",{class:"md-search-result__item"},f.createElement("a",{href:r.location,title:r.title,class:"md-search-result__link",tabindex:"-1"},f.createElement("article",{class:"md-search-result__article md-search-result__article--document"},f.createElement("h1",{class:"md-search-result__title"},{__html:r.title.replace(s,c)}),r.text.length?f.createElement("p",{class:"md-search-result__teaser"},{__html:r.text.replace(s,c)}):{}))),o=e.map(function(t){return function(){var e=a.docs_.get(t.ref);i.appendChild(f.createElement("a",{href:e.location,title:e.title,class:"md-search-result__link","data-md-rel":"anchor",tabindex:"-1"},f.createElement("article",{class:"md-search-result__article"},f.createElement("h1",{class:"md-search-result__title"},{__html:e.title.replace(s,c)}),e.text.length?f.createElement("p",{class:"md-search-result__teaser"},{__html:function(e,t){var n=t;if(e.length>n){for(;" "!==e[n]&&0<--n;);return e.substring(0,n)+"..."}return e}(e.text.replace(s,c),400)}):{})))}});(n=a.stack_).push.apply(n,[function(){return a.list_.appendChild(i)}].concat(o))});var o=this.el_.parentNode;if(!(o instanceof HTMLElement))throw new ReferenceError;for(;this.stack_.length&&o.offsetHeight>=o.scrollHeight-16;)this.stack_.shift()();var l=this.list_.querySelectorAll("[data-md-rel=anchor]");switch(Array.prototype.forEach.call(l,function(r){["click","keydown"].forEach(function(n){r.addEventListener(n,function(e){if("keydown"!==n||13===e.keyCode){var t=document.querySelector("[data-md-toggle=search]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t.checked&&(t.checked=!1,t.dispatchEvent(new CustomEvent("change"))),e.preventDefault(),setTimeout(function(){document.location.href=r.href},100)}})})}),r.size){case 0:this.meta_.textContent=this.message_.none;break;case 1:this.meta_.textContent=this.message_.one;break;default:this.meta_.textContent=this.message_.other.replace("#",r.size)}}}else{var u=function(e){a.docs_=e.reduce(function(e,t){var n,r,i,o=t.location.split("#"),a=o[0],s=o[1];return t.text=(n=t.text,r=document.createTextNode(n),(i=document.createElement("p")).appendChild(r),i.innerHTML),s&&(t.parent=e.get(a),t.parent&&!t.parent.done&&(t.parent.title=t.title,t.parent.text=t.text,t.parent.done=!0)),t.text=t.text.replace(/\n/g," ").replace(/\s+/g," ").replace(/\s+([,.:;!?])/g,function(e,t){return t}),t.parent&&t.parent.title===t.title||e.set(t.location,t),e},new Map);var i=a.docs_,o=a.lang_;a.stack_=[],a.index_=d()(function(){var e,t=this,n={"search.pipeline.trimmer":d.a.trimmer,"search.pipeline.stopwords":d.a.stopWordFilter},r=Object.keys(n).reduce(function(e,t){return h(t).match(/^false$/i)||e.push(n[t]),e},[]);this.pipeline.reset(),r&&(e=this.pipeline).add.apply(e,r),1===o.length&&"en"!==o[0]&&d.a[o[0]]?this.use(d.a[o[0]]):1=t.scrollHeight-16;)a.stack_.splice(0,10).forEach(function(e){return e()})})};setTimeout(function(){return"function"==typeof a.data_?a.data_().then(u):u(a.data_)},250)}},e}()}).call(this,r(3))},function(e,n,r){"use strict";(function(t){r.d(n,"a",function(){return e});var e=function(){function e(e){var t="string"==typeof e?document.querySelector(e):e;if(!(t instanceof HTMLElement))throw new ReferenceError;this.el_=t}return e.prototype.initialize=function(e){e.length&&this.el_.children.length&&this.el_.children[this.el_.children.length-1].appendChild(t.createElement("ul",{class:"md-source__facts"},e.map(function(e){return t.createElement("li",{class:"md-source__fact"},e)}))),this.el_.dataset.mdState="done"},e}()}).call(this,r(3))},,,function(e,n,c){"use strict";c.r(n),function(o){c.d(n,"app",function(){return t});c(14),c(15),c(16),c(17),c(18),c(19),c(20);var r=c(2),e=c(5),a=c.n(e),i=c(0);window.Promise=window.Promise||r.a;var s=function(e){var t=document.getElementsByName("lang:"+e)[0];if(!(t instanceof HTMLMetaElement))throw new ReferenceError;return t.content};var t={initialize:function(t){new i.a.Event.Listener(document,"DOMContentLoaded",function(){if(!(document.body instanceof HTMLElement))throw new ReferenceError;Modernizr.addTest("ios",function(){return!!navigator.userAgent.match(/(iPad|iPhone|iPod)/g)});var e=document.querySelectorAll("table:not([class])");if(Array.prototype.forEach.call(e,function(e){var t=o.createElement("div",{class:"md-typeset__scrollwrap"},o.createElement("div",{class:"md-typeset__table"}));e.nextSibling?e.parentNode.insertBefore(t,e.nextSibling):e.parentNode.appendChild(t),t.children[0].appendChild(e)}),a.a.isSupported()){var t=document.querySelectorAll(".codehilite > pre, pre > code");Array.prototype.forEach.call(t,function(e,t){var n="__code_"+t,r=o.createElement("button",{class:"md-clipboard",title:s("clipboard.copy"),"data-clipboard-target":"#"+n+" pre, #"+n+" code"},o.createElement("span",{class:"md-clipboard__message"})),i=e.parentNode;i.id=n,i.insertBefore(r,e)}),new a.a(".md-clipboard").on("success",function(e){var t=e.trigger.querySelector(".md-clipboard__message");if(!(t instanceof HTMLElement))throw new ReferenceError;e.clearSelection(),t.dataset.mdTimer&&clearTimeout(parseInt(t.dataset.mdTimer,10)),t.classList.add("md-clipboard__message--active"),t.innerHTML=s("clipboard.copied"),t.dataset.mdTimer=setTimeout(function(){t.classList.remove("md-clipboard__message--active"),t.dataset.mdTimer=""},2e3).toString()})}if(!Modernizr.details){var n=document.querySelectorAll("details > summary");Array.prototype.forEach.call(n,function(e){e.addEventListener("click",function(e){var t=e.target.parentNode;t.hasAttribute("open")?t.removeAttribute("open"):t.setAttribute("open","")})})}var r=function(){if(document.location.hash){var e=document.getElementById(document.location.hash.substring(1));if(!e)return;for(var t=e.parentNode;t&&!(t instanceof HTMLDetailsElement);)t=t.parentNode;if(t&&!t.open){t.open=!0;var n=location.hash;location.hash=" ",location.hash=n}}};if(window.addEventListener("hashchange",r),r(),Modernizr.ios){var i=document.querySelectorAll("[data-md-scrollfix]");Array.prototype.forEach.call(i,function(t){t.addEventListener("touchstart",function(){var e=t.scrollTop;0===e?t.scrollTop=1:e+t.offsetHeight===t.scrollHeight&&(t.scrollTop=e-1)})})}}).listen(),new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Header.Shadow("[data-md-component=container]","[data-md-component=header]")).listen(),new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Header.Title("[data-md-component=title]",".md-typeset h1")).listen(),document.querySelector("[data-md-component=hero]")&&new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Tabs.Toggle("[data-md-component=hero]")).listen(),document.querySelector("[data-md-component=tabs]")&&new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Tabs.Toggle("[data-md-component=tabs]")).listen(),new i.a.Event.MatchMedia("(min-width: 1220px)",new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Sidebar.Position("[data-md-component=navigation]","[data-md-component=header]"))),document.querySelector("[data-md-component=toc]")&&new i.a.Event.MatchMedia("(min-width: 960px)",new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Sidebar.Position("[data-md-component=toc]","[data-md-component=header]"))),new i.a.Event.MatchMedia("(min-width: 960px)",new i.a.Event.Listener(window,"scroll",new i.a.Nav.Blur("[data-md-component=toc] .md-nav__link")));var e=document.querySelectorAll("[data-md-component=collapsible]");Array.prototype.forEach.call(e,function(e){new i.a.Event.MatchMedia("(min-width: 1220px)",new i.a.Event.Listener(e.previousElementSibling,"click",new i.a.Nav.Collapse(e)))}),new i.a.Event.MatchMedia("(max-width: 1219px)",new i.a.Event.Listener("[data-md-component=navigation] [data-md-toggle]","change",new i.a.Nav.Scrolling("[data-md-component=navigation] nav"))),document.querySelector("[data-md-component=search]")&&(new i.a.Event.MatchMedia("(max-width: 959px)",new i.a.Event.Listener("[data-md-toggle=search]","change",new i.a.Search.Lock("[data-md-toggle=search]"))),new i.a.Event.Listener("[data-md-component=query]",["focus","keyup","change"],new i.a.Search.Result("[data-md-component=result]",function(){return fetch(t.url.base+"/search/search_index.json",{credentials:"same-origin"}).then(function(e){return e.json()}).then(function(e){return e.docs.map(function(e){return e.location=t.url.base+"/"+e.location,e})})})).listen(),new i.a.Event.Listener("[data-md-component=reset]","click",function(){setTimeout(function(){var e=document.querySelector("[data-md-component=query]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.focus()},10)}).listen(),new i.a.Event.Listener("[data-md-toggle=search]","change",function(e){setTimeout(function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=document.querySelector("[data-md-component=query]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t.focus()}},400,e.target)}).listen(),new i.a.Event.Listener("[data-md-component=query]","focus",function(){var e=document.querySelector("[data-md-toggle=search]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.checked||(e.checked=!0,e.dispatchEvent(new CustomEvent("change")))}).listen(),new i.a.Event.Listener(window,"keydown",function(e){var t=document.querySelector("[data-md-toggle=search]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;var n=document.querySelector("[data-md-component=query]");if(!(n instanceof HTMLInputElement))throw new ReferenceError;if(!(document.activeElement instanceof HTMLElement&&document.activeElement.isContentEditable||e.metaKey||e.ctrlKey))if(t.checked){if(13===e.keyCode){if(n===document.activeElement){e.preventDefault();var r=document.querySelector("[data-md-component=search] [href][data-md-state=active]");r instanceof HTMLLinkElement&&(window.location=r.getAttribute("href"),t.checked=!1,t.dispatchEvent(new CustomEvent("change")),n.blur())}}else if(9===e.keyCode||27===e.keyCode)t.checked=!1,t.dispatchEvent(new CustomEvent("change")),n.blur();else if(-1!==[8,37,39].indexOf(e.keyCode))n!==document.activeElement&&n.focus();else if(-1!==[38,40].indexOf(e.keyCode)){var i=e.keyCode,o=Array.prototype.slice.call(document.querySelectorAll("[data-md-component=query], [data-md-component=search] [href]")),a=o.find(function(e){if(!(e instanceof HTMLElement))throw new ReferenceError;return"active"===e.dataset.mdState});a&&(a.dataset.mdState="");var s=Math.max(0,(o.indexOf(a)+o.length+(38===i?-1:1))%o.length);return o[s]&&(o[s].dataset.mdState="active",o[s].focus()),e.preventDefault(),e.stopPropagation(),!1}}else if(document.activeElement&&!document.activeElement.form){if("TEXTAREA"===document.activeElement.tagName||"INPUT"===document.activeElement.tagName)return;70!==e.keyCode&&83!==e.keyCode||(n.focus(),e.preventDefault())}}).listen(),new i.a.Event.Listener(window,"keypress",function(){var e=document.querySelector("[data-md-toggle=search]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=document.querySelector("[data-md-component=query]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t!==document.activeElement&&t.focus()}}).listen()),new i.a.Event.Listener(document.body,"keydown",function(e){if(9===e.keyCode){var t=document.querySelectorAll("[data-md-component=navigation] .md-nav__link[for]:not([tabindex])");Array.prototype.forEach.call(t,function(e){e.offsetHeight&&(e.tabIndex=0)})}}).listen(),new i.a.Event.Listener(document.body,"mousedown",function(){var e=document.querySelectorAll("[data-md-component=navigation] .md-nav__link[tabindex]");Array.prototype.forEach.call(e,function(e){e.removeAttribute("tabIndex")})}).listen(),document.body.addEventListener("click",function(){"tabbing"===document.body.dataset.mdState&&(document.body.dataset.mdState="")}),new i.a.Event.MatchMedia("(max-width: 959px)",new i.a.Event.Listener("[data-md-component=navigation] [href^='#']","click",function(){var e=document.querySelector("[data-md-toggle=drawer]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.checked&&(e.checked=!1,e.dispatchEvent(new CustomEvent("change")))})),function(){var e=document.querySelector("[data-md-source]");if(!e)return r.a.resolve([]);if(!(e instanceof HTMLAnchorElement))throw new ReferenceError;switch(e.dataset.mdSource){case"github":return new i.a.Source.Adapter.GitHub(e).fetch();default:return r.a.resolve([])}}().then(function(t){var e=document.querySelectorAll("[data-md-source]");Array.prototype.forEach.call(e,function(e){new i.a.Source.Repository(e).initialize(t)})});var n=function(){var e=document.querySelectorAll("details");Array.prototype.forEach.call(e,function(e){e.setAttribute("open","")})};new i.a.Event.MatchMedia("print",{listen:n,unlisten:function(){}}),window.onbeforeprint=n}}}.call(this,c(3))},function(e,t,n){e.exports=n.p+"assets/images/icons/bitbucket.1b09e088.svg"},function(e,t,n){e.exports=n.p+"assets/images/icons/github.f0b8504a.svg"},function(e,t,n){e.exports=n.p+"assets/images/icons/gitlab.6dd19c00.svg"},function(e,t){e.exports="/home/travis/build/squidfunk/mkdocs-material/material/application.30686662.css"},function(e,t){e.exports="/home/travis/build/squidfunk/mkdocs-material/material/application-palette.a8b3c06d.css"},function(e,t){!function(){if("undefined"!=typeof window)try{var e=new window.CustomEvent("test",{cancelable:!0});if(e.preventDefault(),!0!==e.defaultPrevented)throw new Error("Could not prevent default")}catch(e){var t=function(e,t){var n,r;return(t=t||{}).bubbles=!!t.bubbles,t.cancelable=!!t.cancelable,(n=document.createEvent("CustomEvent")).initCustomEvent(e,t.bubbles,t.cancelable,t.detail),r=n.preventDefault,n.preventDefault=function(){r.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(e){this.defaultPrevented=!0}},n};t.prototype=window.Event.prototype,window.CustomEvent=t}}()},function(e,t,n){window.fetch||(window.fetch=n(7).default||n(7))},function(e,i,o){(function(e){var t=void 0!==e&&e||"undefined"!=typeof self&&self||window,n=Function.prototype.apply;function r(e,t){this._id=e,this._clearFn=t}i.setTimeout=function(){return new r(n.call(setTimeout,t,arguments),clearTimeout)},i.setInterval=function(){return new r(n.call(setInterval,t,arguments),clearInterval)},i.clearTimeout=i.clearInterval=function(e){e&&e.close()},r.prototype.unref=r.prototype.ref=function(){},r.prototype.close=function(){this._clearFn.call(t,this._id)},i.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},i.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},i._unrefActive=i.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;0<=t&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},o(22),i.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,i.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,o(4))},function(e,t,n){(function(e,p){!function(n,r){"use strict";if(!n.setImmediate){var i,o,t,a,e,s=1,c={},l=!1,u=n.document,f=Object.getPrototypeOf&&Object.getPrototypeOf(n);f=f&&f.setTimeout?f:n,i="[object process]"==={}.toString.call(n.process)?function(e){p.nextTick(function(){h(e)})}:function(){if(n.postMessage&&!n.importScripts){var e=!0,t=n.onmessage;return n.onmessage=function(){e=!1},n.postMessage("","*"),n.onmessage=t,e}}()?(a="setImmediate$"+Math.random()+"$",e=function(e){e.source===n&&"string"==typeof e.data&&0===e.data.indexOf(a)&&h(+e.data.slice(a.length))},n.addEventListener?n.addEventListener("message",e,!1):n.attachEvent("onmessage",e),function(e){n.postMessage(a+e,"*")}):n.MessageChannel?((t=new MessageChannel).port1.onmessage=function(e){h(e.data)},function(e){t.port2.postMessage(e)}):u&&"onreadystatechange"in u.createElement("script")?(o=u.documentElement,function(e){var t=u.createElement("script");t.onreadystatechange=function(){h(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):function(e){setTimeout(h,0,e)},f.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n=this.length)return D.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},D.QueryLexer.prototype.width=function(){return this.pos-this.start},D.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},D.QueryLexer.prototype.backup=function(){this.pos-=1},D.QueryLexer.prototype.acceptDigitRun=function(){for(var e,t;47<(t=(e=this.next()).charCodeAt(0))&&t<58;);e!=D.QueryLexer.EOS&&this.backup()},D.QueryLexer.prototype.more=function(){return this.pos=t&&(e=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,c.find_among_b(o,4)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e)}this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var e,r=c.cursor;return function(){var e,r=c.cursor+3;if(t=c.limit,0<=r&&r<=c.limit){for(i=r;;){if(e=c.cursor,c.in_grouping(d,97,248)){c.cursor=e;break}if((c.cursor=e)>=c.limit)return;c.cursor++}for(;!c.out_grouping(d,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(t=c.cursor)=t&&(r=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,e=c.find_among_b(s,32),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:c.in_grouping_b(u,97,229)&&c.slice_del()}}(),c.cursor=c.limit,l(),c.cursor=c.limit,function(){var e,r,i,n=c.limit-c.cursor;if(c.ket=c.cursor,c.eq_s_b(2,"st")&&(c.bra=c.cursor,c.eq_s_b(2,"ig")&&c.slice_del()),c.cursor=c.limit-n,c.cursor>=t&&(r=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,e=c.find_among_b(a,5),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del(),i=c.limit-c.cursor,l(),c.cursor=c.limit-i;break;case 2:c.slice_from("løs")}}(),c.cursor=c.limit,c.cursor>=t&&(e=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,c.out_grouping_b(d,97,248)?(c.bra=c.cursor,n=c.slice_to(n),c.limit_backward=e,c.eq_v_b(n)&&c.slice_del()):c.limit_backward=e),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); \ No newline at end of file diff --git a/site/assets/javascripts/lunr/lunr.de.js b/site/assets/javascripts/lunr/lunr.de.js deleted file mode 100644 index 1529892..0000000 --- a/site/assets/javascripts/lunr/lunr.de.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var _,p,r;e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWordFilter,e.de.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.de.stemmer))},e.de.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.de.trimmer=e.trimmerSupport.generateTrimmer(e.de.wordCharacters),e.Pipeline.registerFunction(e.de.trimmer,"trimmer-de"),e.de.stemmer=(_=e.stemmerSupport.Among,p=e.stemmerSupport.SnowballProgram,r=new function(){var r,n,i,s=[new _("",-1,6),new _("U",0,2),new _("Y",0,1),new _("ä",0,3),new _("ö",0,4),new _("ü",0,5)],o=[new _("e",-1,2),new _("em",-1,1),new _("en",-1,2),new _("ern",-1,1),new _("er",-1,1),new _("s",-1,3),new _("es",5,2)],c=[new _("en",-1,1),new _("er",-1,1),new _("st",-1,2),new _("est",2,1)],u=[new _("ig",-1,1),new _("lich",-1,1)],a=[new _("end",-1,1),new _("ig",-1,2),new _("ung",-1,1),new _("lich",-1,3),new _("isch",-1,2),new _("ik",-1,2),new _("heit",-1,3),new _("keit",-1,4)],t=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],d=[117,30,5],l=[117,30,4],m=new p;function h(e,r,n){return!(!m.eq_s(1,e)||(m.ket=m.cursor,!m.in_grouping(t,97,252)))&&(m.slice_from(r),m.cursor=n,!0)}function w(){for(;!m.in_grouping(t,97,252);){if(m.cursor>=m.limit)return!0;m.cursor++}for(;!m.out_grouping(t,97,252);){if(m.cursor>=m.limit)return!0;m.cursor++}return!1}function f(){return i<=m.cursor}function b(){return n<=m.cursor}this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var e=m.cursor;return function(){for(var e,r,n,i,s=m.cursor;;)if(e=m.cursor,m.bra=e,m.eq_s(1,"ß"))m.ket=m.cursor,m.slice_from("ss");else{if(e>=m.limit)break;m.cursor=e+1}for(m.cursor=s;;)for(r=m.cursor;;){if(n=m.cursor,m.in_grouping(t,97,252)){if(i=m.cursor,m.bra=i,h("u","U",n))break;if(m.cursor=i,h("y","Y",n))break}if(n>=m.limit)return m.cursor=r;m.cursor=n+1}}(),m.cursor=e,function(){i=m.limit,n=i;var e=m.cursor+3;0<=e&&e<=m.limit&&(r=e,w()||((i=m.cursor)=m.limit)return;m.cursor++}}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.de.stemmer,"stemmer-de"),e.de.stopWordFilter=e.generateStopWordFilter("aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über".split(" ")),e.Pipeline.registerFunction(e.de.stopWordFilter,"stopWordFilter-de")}}); \ No newline at end of file diff --git a/site/assets/javascripts/lunr/lunr.du.js b/site/assets/javascripts/lunr/lunr.du.js deleted file mode 100644 index 5263200..0000000 --- a/site/assets/javascripts/lunr/lunr.du.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var v,q,r;console.warn('[Lunr Languages] Please use the "nl" instead of the "du". The "nl" code is the standard code for Dutch language, and "du" will be removed in the next major versions.'),e.du=function(){this.pipeline.reset(),this.pipeline.add(e.du.trimmer,e.du.stopWordFilter,e.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.du.stemmer))},e.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.du.trimmer=e.trimmerSupport.generateTrimmer(e.du.wordCharacters),e.Pipeline.registerFunction(e.du.trimmer,"trimmer-du"),e.du.stemmer=(v=e.stemmerSupport.Among,q=e.stemmerSupport.SnowballProgram,r=new function(){var r,i,u,o=[new v("",-1,6),new v("á",0,1),new v("ä",0,1),new v("é",0,2),new v("ë",0,2),new v("í",0,3),new v("ï",0,3),new v("ó",0,4),new v("ö",0,4),new v("ú",0,5),new v("ü",0,5)],n=[new v("",-1,3),new v("I",0,2),new v("Y",0,1)],t=[new v("dd",-1,-1),new v("kk",-1,-1),new v("tt",-1,-1)],c=[new v("ene",-1,2),new v("se",-1,3),new v("en",-1,2),new v("heden",2,1),new v("s",-1,3)],a=[new v("end",-1,1),new v("ig",-1,2),new v("ing",-1,1),new v("lijk",-1,3),new v("baar",-1,4),new v("bar",-1,5)],l=[new v("aa",-1,-1),new v("ee",-1,-1),new v("oo",-1,-1),new v("uu",-1,-1)],m=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],d=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],f=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],_=new q;function s(e){return(_.cursor=e)>=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return r<=_.cursor}function g(){var e=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-e,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var e;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(e=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-e,_.slice_del(),u=!0,g())))}function k(){var e;b()&&(e=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-e,_.eq_s_b(3,"gem")||(_.cursor=_.limit-e,_.slice_del(),g())))}this.setCurrent=function(e){_.setCurrent(e)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var e=_.cursor;return function(){for(var e,r,i,n=_.cursor;;){if(_.bra=_.cursor,e=_.find_among(o,11))switch(_.ket=_.cursor,e){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(r=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=r);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=r;else if(s(r))break}else if(s(r))break}(),_.cursor=e,i=_.limit,r=i,w()||((i=_.cursor)<3&&(i=3),w()||(r=_.cursor)),_.limit_backward=e,_.cursor=_.limit,function(){var e,r,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,e=_.find_among_b(c,5))switch(_.bra=_.cursor,e){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(r=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-r,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,e=_.find_among_b(a,6))switch(_.bra=_.cursor,e){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var e;;)if(_.bra=_.cursor,e=_.find_among(n,3))switch(_.ket=_.cursor,e){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.du.stemmer,"stemmer-du"),e.du.stopWordFilter=e.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),e.Pipeline.registerFunction(e.du.stopWordFilter,"stopWordFilter-du")}}); \ No newline at end of file diff --git a/site/assets/javascripts/lunr/lunr.es.js b/site/assets/javascripts/lunr/lunr.es.js deleted file mode 100644 index 9de6c09..0000000 --- a/site/assets/javascripts/lunr/lunr.es.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var C,P,s;e.es=function(){this.pipeline.reset(),this.pipeline.add(e.es.trimmer,e.es.stopWordFilter,e.es.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.es.stemmer))},e.es.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.es.trimmer=e.trimmerSupport.generateTrimmer(e.es.wordCharacters),e.Pipeline.registerFunction(e.es.trimmer,"trimmer-es"),e.es.stemmer=(C=e.stemmerSupport.Among,P=e.stemmerSupport.SnowballProgram,s=new function(){var r,n,i,a=[new C("",-1,6),new C("á",0,1),new C("é",0,2),new C("í",0,3),new C("ó",0,4),new C("ú",0,5)],t=[new C("la",-1,-1),new C("sela",0,-1),new C("le",-1,-1),new C("me",-1,-1),new C("se",-1,-1),new C("lo",-1,-1),new C("selo",5,-1),new C("las",-1,-1),new C("selas",7,-1),new C("les",-1,-1),new C("los",-1,-1),new C("selos",10,-1),new C("nos",-1,-1)],o=[new C("ando",-1,6),new C("iendo",-1,6),new C("yendo",-1,7),new C("ándo",-1,2),new C("iéndo",-1,1),new C("ar",-1,6),new C("er",-1,6),new C("ir",-1,6),new C("ár",-1,3),new C("ér",-1,4),new C("ír",-1,5)],s=[new C("ic",-1,-1),new C("ad",-1,-1),new C("os",-1,-1),new C("iv",-1,1)],u=[new C("able",-1,1),new C("ible",-1,1),new C("ante",-1,1)],w=[new C("ic",-1,1),new C("abil",-1,1),new C("iv",-1,1)],c=[new C("ica",-1,1),new C("ancia",-1,2),new C("encia",-1,5),new C("adora",-1,2),new C("osa",-1,1),new C("ista",-1,1),new C("iva",-1,9),new C("anza",-1,1),new C("logía",-1,3),new C("idad",-1,8),new C("able",-1,1),new C("ible",-1,1),new C("ante",-1,2),new C("mente",-1,7),new C("amente",13,6),new C("ación",-1,2),new C("ución",-1,4),new C("ico",-1,1),new C("ismo",-1,1),new C("oso",-1,1),new C("amiento",-1,1),new C("imiento",-1,1),new C("ivo",-1,9),new C("ador",-1,2),new C("icas",-1,1),new C("ancias",-1,2),new C("encias",-1,5),new C("adoras",-1,2),new C("osas",-1,1),new C("istas",-1,1),new C("ivas",-1,9),new C("anzas",-1,1),new C("logías",-1,3),new C("idades",-1,8),new C("ables",-1,1),new C("ibles",-1,1),new C("aciones",-1,2),new C("uciones",-1,4),new C("adores",-1,2),new C("antes",-1,2),new C("icos",-1,1),new C("ismos",-1,1),new C("osos",-1,1),new C("amientos",-1,1),new C("imientos",-1,1),new C("ivos",-1,9)],m=[new C("ya",-1,1),new C("ye",-1,1),new C("yan",-1,1),new C("yen",-1,1),new C("yeron",-1,1),new C("yendo",-1,1),new C("yo",-1,1),new C("yas",-1,1),new C("yes",-1,1),new C("yais",-1,1),new C("yamos",-1,1),new C("yó",-1,1)],l=[new C("aba",-1,2),new C("ada",-1,2),new C("ida",-1,2),new C("ara",-1,2),new C("iera",-1,2),new C("ía",-1,2),new C("aría",5,2),new C("ería",5,2),new C("iría",5,2),new C("ad",-1,2),new C("ed",-1,2),new C("id",-1,2),new C("ase",-1,2),new C("iese",-1,2),new C("aste",-1,2),new C("iste",-1,2),new C("an",-1,2),new C("aban",16,2),new C("aran",16,2),new C("ieran",16,2),new C("ían",16,2),new C("arían",20,2),new C("erían",20,2),new C("irían",20,2),new C("en",-1,1),new C("asen",24,2),new C("iesen",24,2),new C("aron",-1,2),new C("ieron",-1,2),new C("arán",-1,2),new C("erán",-1,2),new C("irán",-1,2),new C("ado",-1,2),new C("ido",-1,2),new C("ando",-1,2),new C("iendo",-1,2),new C("ar",-1,2),new C("er",-1,2),new C("ir",-1,2),new C("as",-1,2),new C("abas",39,2),new C("adas",39,2),new C("idas",39,2),new C("aras",39,2),new C("ieras",39,2),new C("ías",39,2),new C("arías",45,2),new C("erías",45,2),new C("irías",45,2),new C("es",-1,1),new C("ases",49,2),new C("ieses",49,2),new C("abais",-1,2),new C("arais",-1,2),new C("ierais",-1,2),new C("íais",-1,2),new C("aríais",55,2),new C("eríais",55,2),new C("iríais",55,2),new C("aseis",-1,2),new C("ieseis",-1,2),new C("asteis",-1,2),new C("isteis",-1,2),new C("áis",-1,2),new C("éis",-1,1),new C("aréis",64,2),new C("eréis",64,2),new C("iréis",64,2),new C("ados",-1,2),new C("idos",-1,2),new C("amos",-1,2),new C("ábamos",70,2),new C("áramos",70,2),new C("iéramos",70,2),new C("íamos",70,2),new C("aríamos",74,2),new C("eríamos",74,2),new C("iríamos",74,2),new C("emos",-1,1),new C("aremos",78,2),new C("eremos",78,2),new C("iremos",78,2),new C("ásemos",78,2),new C("iésemos",78,2),new C("imos",-1,2),new C("arás",-1,2),new C("erás",-1,2),new C("irás",-1,2),new C("ís",-1,2),new C("ará",-1,2),new C("erá",-1,2),new C("irá",-1,2),new C("aré",-1,2),new C("eré",-1,2),new C("iré",-1,2),new C("ió",-1,2)],d=[new C("a",-1,1),new C("e",-1,2),new C("o",-1,1),new C("os",-1,1),new C("á",-1,1),new C("é",-1,2),new C("í",-1,1),new C("ó",-1,1)],b=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,4,10],f=new P;function _(){if(f.out_grouping(b,97,252)){for(;!f.in_grouping(b,97,252);){if(f.cursor>=f.limit)return!0;f.cursor++}return!1}return!0}function h(){var e,s=f.cursor;if(function(){if(f.in_grouping(b,97,252)){var e=f.cursor;if(_()){if(f.cursor=e,!f.in_grouping(b,97,252))return!0;for(;!f.out_grouping(b,97,252);){if(f.cursor>=f.limit)return!0;f.cursor++}}return!1}return!0}()){if(f.cursor=s,!f.out_grouping(b,97,252))return;if(e=f.cursor,_()){if(f.cursor=e,!f.in_grouping(b,97,252)||f.cursor>=f.limit)return;f.cursor++}}i=f.cursor}function v(){for(;!f.in_grouping(b,97,252);){if(f.cursor>=f.limit)return!1;f.cursor++}for(;!f.out_grouping(b,97,252);){if(f.cursor>=f.limit)return!1;f.cursor++}return!0}function p(){return i<=f.cursor}function g(){return r<=f.cursor}function k(e,s){if(!g())return!0;f.slice_del(),f.ket=f.cursor;var r=f.find_among_b(e,s);return r&&(f.bra=f.cursor,1==r&&g()&&f.slice_del()),!1}function y(e){return!g()||(f.slice_del(),f.ket=f.cursor,f.eq_s_b(2,e)&&(f.bra=f.cursor,g()&&f.slice_del()),!1)}function q(){var e;if(f.ket=f.cursor,e=f.find_among_b(c,46)){switch(f.bra=f.cursor,e){case 1:if(!g())return!1;f.slice_del();break;case 2:if(y("ic"))return!1;break;case 3:if(!g())return!1;f.slice_from("log");break;case 4:if(!g())return!1;f.slice_from("u");break;case 5:if(!g())return!1;f.slice_from("ente");break;case 6:if(!(n<=f.cursor))return!1;f.slice_del(),f.ket=f.cursor,(e=f.find_among_b(s,4))&&(f.bra=f.cursor,g()&&(f.slice_del(),1==e&&(f.ket=f.cursor,f.eq_s_b(2,"at")&&(f.bra=f.cursor,g()&&f.slice_del()))));break;case 7:if(k(u,3))return!1;break;case 8:if(k(w,3))return!1;break;case 9:if(y("at"))return!1}return!0}return!1}this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var e,s=f.cursor;return e=f.cursor,i=f.limit,r=n=i,h(),f.cursor=e,v()&&(n=f.cursor,v()&&(r=f.cursor)),f.limit_backward=s,f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,f.find_among_b(t,13)&&(f.bra=f.cursor,(e=f.find_among_b(o,11))&&p()))switch(e){case 1:f.bra=f.cursor,f.slice_from("iendo");break;case 2:f.bra=f.cursor,f.slice_from("ando");break;case 3:f.bra=f.cursor,f.slice_from("ar");break;case 4:f.bra=f.cursor,f.slice_from("er");break;case 5:f.bra=f.cursor,f.slice_from("ir");break;case 6:f.slice_del();break;case 7:f.eq_s_b(1,"u")&&f.slice_del()}}(),f.cursor=f.limit,q()||(f.cursor=f.limit,function(){var e,s;if(f.cursor>=i&&(s=f.limit_backward,f.limit_backward=i,f.ket=f.cursor,e=f.find_among_b(m,12),f.limit_backward=s,e)){if(f.bra=f.cursor,1==e){if(!f.eq_s_b(1,"u"))return!1;f.slice_del()}return!0}return!1}()||(f.cursor=f.limit,function(){var e,s,r,n;if(f.cursor>=i&&(s=f.limit_backward,f.limit_backward=i,f.ket=f.cursor,e=f.find_among_b(l,96),f.limit_backward=s,e))switch(f.bra=f.cursor,e){case 1:r=f.limit-f.cursor,f.eq_s_b(1,"u")?(n=f.limit-f.cursor,f.eq_s_b(1,"g")?f.cursor=f.limit-n:f.cursor=f.limit-r):f.cursor=f.limit-r,f.bra=f.cursor;case 2:f.slice_del()}}())),f.cursor=f.limit,function(){var e,s;if(f.ket=f.cursor,e=f.find_among_b(d,8))switch(f.bra=f.cursor,e){case 1:p()&&f.slice_del();break;case 2:p()&&(f.slice_del(),f.ket=f.cursor,f.eq_s_b(1,"u")&&(f.bra=f.cursor,s=f.limit-f.cursor,f.eq_s_b(1,"g")&&(f.cursor=f.limit-s,p()&&f.slice_del())))}}(),f.cursor=f.limit_backward,function(){for(var e;;){if(f.bra=f.cursor,e=f.find_among(a,6))switch(f.ket=f.cursor,e){case 1:f.slice_from("a");continue;case 2:f.slice_from("e");continue;case 3:f.slice_from("i");continue;case 4:f.slice_from("o");continue;case 5:f.slice_from("u");continue;case 6:if(f.cursor>=f.limit)break;f.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return s.setCurrent(e),s.stem(),s.getCurrent()}):(s.setCurrent(e),s.stem(),s.getCurrent())}),e.Pipeline.registerFunction(e.es.stemmer,"stemmer-es"),e.es.stopWordFilter=e.generateStopWordFilter("a al algo algunas algunos ante antes como con contra cual cuando de del desde donde durante e el ella ellas ellos en entre era erais eran eras eres es esa esas ese eso esos esta estaba estabais estaban estabas estad estada estadas estado estados estamos estando estar estaremos estará estarán estarás estaré estaréis estaría estaríais estaríamos estarían estarías estas este estemos esto estos estoy estuve estuviera estuvierais estuvieran estuvieras estuvieron estuviese estuvieseis estuviesen estuvieses estuvimos estuviste estuvisteis estuviéramos estuviésemos estuvo está estábamos estáis están estás esté estéis estén estés fue fuera fuerais fueran fueras fueron fuese fueseis fuesen fueses fui fuimos fuiste fuisteis fuéramos fuésemos ha habida habidas habido habidos habiendo habremos habrá habrán habrás habré habréis habría habríais habríamos habrían habrías habéis había habíais habíamos habían habías han has hasta hay haya hayamos hayan hayas hayáis he hemos hube hubiera hubierais hubieran hubieras hubieron hubiese hubieseis hubiesen hubieses hubimos hubiste hubisteis hubiéramos hubiésemos hubo la las le les lo los me mi mis mucho muchos muy más mí mía mías mío míos nada ni no nos nosotras nosotros nuestra nuestras nuestro nuestros o os otra otras otro otros para pero poco por porque que quien quienes qué se sea seamos sean seas seremos será serán serás seré seréis sería seríais seríamos serían serías seáis sido siendo sin sobre sois somos son soy su sus suya suyas suyo suyos sí también tanto te tendremos tendrá tendrán tendrás tendré tendréis tendría tendríais tendríamos tendrían tendrías tened tenemos tenga tengamos tengan tengas tengo tengáis tenida tenidas tenido tenidos teniendo tenéis tenía teníais teníamos tenían tenías ti tiene tienen tienes todo todos tu tus tuve tuviera tuvierais tuvieran tuvieras tuvieron tuviese tuvieseis tuviesen tuvieses tuvimos tuviste tuvisteis tuviéramos tuviésemos tuvo tuya tuyas tuyo tuyos tú un una uno unos vosotras vosotros vuestra vuestras vuestro vuestros y ya yo él éramos".split(" ")),e.Pipeline.registerFunction(e.es.stopWordFilter,"stopWordFilter-es")}}); \ No newline at end of file diff --git a/site/assets/javascripts/lunr/lunr.fi.js b/site/assets/javascripts/lunr/lunr.fi.js deleted file mode 100644 index 2f9bf5a..0000000 --- a/site/assets/javascripts/lunr/lunr.fi.js +++ /dev/null @@ -1 +0,0 @@ -!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var v,C,e;i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWordFilter,i.fi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(i.fi.stemmer))},i.fi.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",i.fi.trimmer=i.trimmerSupport.generateTrimmer(i.fi.wordCharacters),i.Pipeline.registerFunction(i.fi.trimmer,"trimmer-fi"),i.fi.stemmer=(v=i.stemmerSupport.Among,C=i.stemmerSupport.SnowballProgram,e=new function(){var n,t,l,o,r=[new v("pa",-1,1),new v("sti",-1,2),new v("kaan",-1,1),new v("han",-1,1),new v("kin",-1,1),new v("hän",-1,1),new v("kään",-1,1),new v("ko",-1,1),new v("pä",-1,1),new v("kö",-1,1)],s=[new v("lla",-1,-1),new v("na",-1,-1),new v("ssa",-1,-1),new v("ta",-1,-1),new v("lta",3,-1),new v("sta",3,-1)],a=[new v("llä",-1,-1),new v("nä",-1,-1),new v("ssä",-1,-1),new v("tä",-1,-1),new v("ltä",3,-1),new v("stä",3,-1)],u=[new v("lle",-1,-1),new v("ine",-1,-1)],c=[new v("nsa",-1,3),new v("mme",-1,3),new v("nne",-1,3),new v("ni",-1,2),new v("si",-1,1),new v("an",-1,4),new v("en",-1,6),new v("än",-1,5),new v("nsä",-1,3)],i=[new v("aa",-1,-1),new v("ee",-1,-1),new v("ii",-1,-1),new v("oo",-1,-1),new v("uu",-1,-1),new v("ää",-1,-1),new v("öö",-1,-1)],m=[new v("a",-1,8),new v("lla",0,-1),new v("na",0,-1),new v("ssa",0,-1),new v("ta",0,-1),new v("lta",4,-1),new v("sta",4,-1),new v("tta",4,9),new v("lle",-1,-1),new v("ine",-1,-1),new v("ksi",-1,-1),new v("n",-1,7),new v("han",11,1),new v("den",11,-1,q),new v("seen",11,-1,j),new v("hen",11,2),new v("tten",11,-1,q),new v("hin",11,3),new v("siin",11,-1,q),new v("hon",11,4),new v("hän",11,5),new v("hön",11,6),new v("ä",-1,8),new v("llä",22,-1),new v("nä",22,-1),new v("ssä",22,-1),new v("tä",22,-1),new v("ltä",26,-1),new v("stä",26,-1),new v("ttä",26,9)],w=[new v("eja",-1,-1),new v("mma",-1,1),new v("imma",1,-1),new v("mpa",-1,1),new v("impa",3,-1),new v("mmi",-1,1),new v("immi",5,-1),new v("mpi",-1,1),new v("impi",7,-1),new v("ejä",-1,-1),new v("mmä",-1,1),new v("immä",10,-1),new v("mpä",-1,1),new v("impä",12,-1)],_=[new v("i",-1,-1),new v("j",-1,-1)],k=[new v("mma",-1,1),new v("imma",0,-1)],b=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],e=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],f=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],h=new C;function p(){for(var i;i=h.cursor,!h.in_grouping(d,97,246);){if((h.cursor=i)>=h.limit)return!0;h.cursor++}for(h.cursor=i;!h.out_grouping(d,97,246);){if(h.cursor>=h.limit)return!0;h.cursor++}return!1}function g(){var i,e;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(r,10)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(!h.in_grouping_b(f,97,246))return;break;case 2:if(!(l<=h.cursor))return}h.slice_del()}else h.limit_backward=e}function j(){return h.find_among_b(i,7)}function q(){return h.eq_s_b(1,"i")&&h.in_grouping_b(e,97,246)}this.setCurrent=function(i){h.setCurrent(i)},this.getCurrent=function(){return h.getCurrent()},this.stem=function(){var i,e=h.cursor;return o=h.limit,l=o,p()||(o=h.cursor,p()||(l=h.cursor)),n=!1,h.limit_backward=e,h.cursor=h.limit,g(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(c,9))switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:r=h.limit-h.cursor,h.eq_s_b(1,"k")||(h.cursor=h.limit-r,h.slice_del());break;case 2:h.slice_del(),h.ket=h.cursor,h.eq_s_b(3,"kse")&&(h.bra=h.cursor,h.slice_from("ksi"));break;case 3:h.slice_del();break;case 4:h.find_among_b(s,6)&&h.slice_del();break;case 5:h.find_among_b(a,6)&&h.slice_del();break;case 6:h.find_among_b(u,2)&&h.slice_del()}else h.limit_backward=e}(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(m,30)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(!h.eq_s_b(1,"a"))return;break;case 2:case 9:if(!h.eq_s_b(1,"e"))return;break;case 3:if(!h.eq_s_b(1,"i"))return;break;case 4:if(!h.eq_s_b(1,"o"))return;break;case 5:if(!h.eq_s_b(1,"ä"))return;break;case 6:if(!h.eq_s_b(1,"ö"))return;break;case 7:if(r=h.limit-h.cursor,!j()&&(h.cursor=h.limit-r,!h.eq_s_b(2,"ie"))){h.cursor=h.limit-r;break}if(h.cursor=h.limit-r,h.cursor<=h.limit_backward){h.cursor=h.limit-r;break}h.cursor--,h.bra=h.cursor;break;case 8:if(!h.in_grouping_b(d,97,246)||!h.out_grouping_b(d,97,246))return}h.slice_del(),n=!0}else h.limit_backward=e}(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=l)if(e=h.limit_backward,h.limit_backward=l,h.ket=h.cursor,i=h.find_among_b(w,14)){if(h.bra=h.cursor,h.limit_backward=e,1==i){if(r=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-r}h.slice_del()}else h.limit_backward=e}(),h.cursor=h.limit,h.cursor=(n?h.cursor>=o&&(i=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.find_among_b(_,2)?(h.bra=h.cursor,h.limit_backward=i,h.slice_del()):h.limit_backward=i):(h.cursor=h.limit,function(){var i,e,r,n,t,s;if(h.cursor>=o){if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.eq_s_b(1,"t")&&(h.bra=h.cursor,r=h.limit-h.cursor,h.in_grouping_b(d,97,246)&&(h.cursor=h.limit-r,h.slice_del(),h.limit_backward=e,n=h.limit-h.cursor,h.cursor>=l&&(h.cursor=l,t=h.limit_backward,h.limit_backward=h.cursor,h.cursor=h.limit-n,h.ket=h.cursor,i=h.find_among_b(k,2))))){if(h.bra=h.cursor,h.limit_backward=t,1==i){if(s=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-s}return h.slice_del()}h.limit_backward=e}}()),h.limit),function(){var i,e,r,n;if(h.cursor>=o){for(i=h.limit_backward,h.limit_backward=o,e=h.limit-h.cursor,j()&&(h.cursor=h.limit-e,h.ket=h.cursor,h.cursor>h.limit_backward&&(h.cursor--,h.bra=h.cursor,h.slice_del())),h.cursor=h.limit-e,h.ket=h.cursor,h.in_grouping_b(b,97,228)&&(h.bra=h.cursor,h.out_grouping_b(d,97,246)&&h.slice_del()),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"j")&&(h.bra=h.cursor,r=h.limit-h.cursor,h.eq_s_b(1,"o")?h.slice_del():(h.cursor=h.limit-r,h.eq_s_b(1,"u")&&h.slice_del())),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"o")&&(h.bra=h.cursor,h.eq_s_b(1,"j")&&h.slice_del()),h.cursor=h.limit-e,h.limit_backward=i;;){if(n=h.limit-h.cursor,h.out_grouping_b(d,97,246)){h.cursor=h.limit-n;break}if(h.cursor=h.limit-n,h.cursor<=h.limit_backward)return;h.cursor--}h.ket=h.cursor,h.cursor>h.limit_backward&&(h.cursor--,h.bra=h.cursor,t=h.slice_to(),h.eq_v_b(t)&&h.slice_del())}}(),!0}},function(i){return"function"==typeof i.update?i.update(function(i){return e.setCurrent(i),e.stem(),e.getCurrent()}):(e.setCurrent(i),e.stem(),e.getCurrent())}),i.Pipeline.registerFunction(i.fi.stemmer,"stemmer-fi"),i.fi.stopWordFilter=i.generateStopWordFilter("ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli".split(" ")),i.Pipeline.registerFunction(i.fi.stopWordFilter,"stopWordFilter-fi")}}); \ No newline at end of file diff --git a/site/assets/javascripts/lunr/lunr.fr.js b/site/assets/javascripts/lunr/lunr.fr.js deleted file mode 100644 index 078d0ca..0000000 --- a/site/assets/javascripts/lunr/lunr.fr.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,y,s;e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWordFilter,e.fr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.fr.stemmer))},e.fr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.fr.trimmer=e.trimmerSupport.generateTrimmer(e.fr.wordCharacters),e.Pipeline.registerFunction(e.fr.trimmer,"trimmer-fr"),e.fr.stemmer=(r=e.stemmerSupport.Among,y=e.stemmerSupport.SnowballProgram,s=new function(){var s,i,t,n=[new r("col",-1,-1),new r("par",-1,-1),new r("tap",-1,-1)],u=[new r("",-1,4),new r("I",0,1),new r("U",0,2),new r("Y",0,3)],o=[new r("iqU",-1,3),new r("abl",-1,3),new r("Ièr",-1,4),new r("ièr",-1,4),new r("eus",-1,2),new r("iv",-1,1)],c=[new r("ic",-1,2),new r("abil",-1,1),new r("iv",-1,3)],a=[new r("iqUe",-1,1),new r("atrice",-1,2),new r("ance",-1,1),new r("ence",-1,5),new r("logie",-1,3),new r("able",-1,1),new r("isme",-1,1),new r("euse",-1,11),new r("iste",-1,1),new r("ive",-1,8),new r("if",-1,8),new r("usion",-1,4),new r("ation",-1,2),new r("ution",-1,4),new r("ateur",-1,2),new r("iqUes",-1,1),new r("atrices",-1,2),new r("ances",-1,1),new r("ences",-1,5),new r("logies",-1,3),new r("ables",-1,1),new r("ismes",-1,1),new r("euses",-1,11),new r("istes",-1,1),new r("ives",-1,8),new r("ifs",-1,8),new r("usions",-1,4),new r("ations",-1,2),new r("utions",-1,4),new r("ateurs",-1,2),new r("ments",-1,15),new r("ements",30,6),new r("issements",31,12),new r("ités",-1,7),new r("ment",-1,15),new r("ement",34,6),new r("issement",35,12),new r("amment",34,13),new r("emment",34,14),new r("aux",-1,10),new r("eaux",39,9),new r("eux",-1,1),new r("ité",-1,7)],l=[new r("ira",-1,1),new r("ie",-1,1),new r("isse",-1,1),new r("issante",-1,1),new r("i",-1,1),new r("irai",4,1),new r("ir",-1,1),new r("iras",-1,1),new r("ies",-1,1),new r("îmes",-1,1),new r("isses",-1,1),new r("issantes",-1,1),new r("îtes",-1,1),new r("is",-1,1),new r("irais",13,1),new r("issais",13,1),new r("irions",-1,1),new r("issions",-1,1),new r("irons",-1,1),new r("issons",-1,1),new r("issants",-1,1),new r("it",-1,1),new r("irait",21,1),new r("issait",21,1),new r("issant",-1,1),new r("iraIent",-1,1),new r("issaIent",-1,1),new r("irent",-1,1),new r("issent",-1,1),new r("iront",-1,1),new r("ît",-1,1),new r("iriez",-1,1),new r("issiez",-1,1),new r("irez",-1,1),new r("issez",-1,1)],w=[new r("a",-1,3),new r("era",0,2),new r("asse",-1,3),new r("ante",-1,3),new r("ée",-1,2),new r("ai",-1,3),new r("erai",5,2),new r("er",-1,2),new r("as",-1,3),new r("eras",8,2),new r("âmes",-1,3),new r("asses",-1,3),new r("antes",-1,3),new r("âtes",-1,3),new r("ées",-1,2),new r("ais",-1,3),new r("erais",15,2),new r("ions",-1,1),new r("erions",17,2),new r("assions",17,3),new r("erons",-1,2),new r("ants",-1,3),new r("és",-1,2),new r("ait",-1,3),new r("erait",23,2),new r("ant",-1,3),new r("aIent",-1,3),new r("eraIent",26,2),new r("èrent",-1,2),new r("assent",-1,3),new r("eront",-1,2),new r("ât",-1,3),new r("ez",-1,2),new r("iez",32,2),new r("eriez",33,2),new r("assiez",33,3),new r("erez",32,2),new r("é",-1,2)],f=[new r("e",-1,3),new r("Ière",0,2),new r("ière",0,2),new r("ion",-1,1),new r("Ier",-1,2),new r("ier",-1,2),new r("ë",-1,4)],m=[new r("ell",-1,-1),new r("eill",-1,-1),new r("enn",-1,-1),new r("onn",-1,-1),new r("ett",-1,-1)],_=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],b=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],d=new y;function k(e,r,s){return!(!d.eq_s(1,e)||(d.ket=d.cursor,!d.in_grouping(_,97,251)))&&(d.slice_from(r),d.cursor=s,!0)}function p(e,r,s){return!!d.eq_s(1,e)&&(d.ket=d.cursor,d.slice_from(r),d.cursor=s,!0)}function g(){for(;!d.in_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}for(;!d.out_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}return!1}function q(){return t<=d.cursor}function v(){return i<=d.cursor}function h(){return s<=d.cursor}function z(){if(!function(){var e,r;if(d.ket=d.cursor,e=d.find_among_b(a,43)){switch(d.bra=d.cursor,e){case 1:if(!h())return!1;d.slice_del();break;case 2:if(!h())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")&&(d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU"));break;case 3:if(!h())return!1;d.slice_from("log");break;case 4:if(!h())return!1;d.slice_from("u");break;case 5:if(!h())return!1;d.slice_from("ent");break;case 6:if(!q())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(o,6))switch(d.bra=d.cursor,e){case 1:h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&d.slice_del()));break;case 2:h()?d.slice_del():v()&&d.slice_from("eux");break;case 3:h()&&d.slice_del();break;case 4:q()&&d.slice_from("i")}break;case 7:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(c,3))switch(d.bra=d.cursor,e){case 1:h()?d.slice_del():d.slice_from("abl");break;case 2:h()?d.slice_del():d.slice_from("iqU");break;case 3:h()&&d.slice_del()}break;case 8:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")))){d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU");break}break;case 9:d.slice_from("eau");break;case 10:if(!v())return!1;d.slice_from("al");break;case 11:if(h())d.slice_del();else{if(!v())return!1;d.slice_from("eux")}break;case 12:if(!v()||!d.out_grouping_b(_,97,251))return!1;d.slice_del();break;case 13:return q()&&d.slice_from("ant"),!1;case 14:return q()&&d.slice_from("ent"),!1;case 15:return r=d.limit-d.cursor,d.in_grouping_b(_,97,251)&&q()&&(d.cursor=d.limit-r,d.slice_del()),!1}return!0}return!1}()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor=t){if(s=d.limit_backward,d.limit_backward=t,d.ket=d.cursor,e=d.find_among_b(f,7))switch(d.bra=d.cursor,e){case 1:if(h()){if(i=d.limit-d.cursor,!d.eq_s_b(1,"s")&&(d.cursor=d.limit-i,!d.eq_s_b(1,"t")))break;d.slice_del()}break;case 2:d.slice_from("i");break;case 3:d.slice_del();break;case 4:d.eq_s_b(2,"gu")&&d.slice_del()}d.limit_backward=s}}();d.cursor=d.limit,d.ket=d.cursor,d.eq_s_b(1,"Y")?(d.bra=d.cursor,d.slice_from("i")):(d.cursor=d.limit,d.eq_s_b(1,"ç")&&(d.bra=d.cursor,d.slice_from("c")))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var e,r=d.cursor;return function(){for(var e,r;;){if(e=d.cursor,d.in_grouping(_,97,251)){if(d.bra=d.cursor,r=d.cursor,k("u","U",e))continue;if(d.cursor=r,k("i","I",e))continue;if(d.cursor=r,p("y","Y",e))continue}if(d.cursor=e,!k("y","Y",d.bra=e)){if(d.cursor=e,d.eq_s(1,"q")&&(d.bra=d.cursor,p("u","U",e)))continue;if((d.cursor=e)>=d.limit)return;d.cursor++}}}(),d.cursor=r,function(){var e=d.cursor;if(t=d.limit,s=i=t,d.in_grouping(_,97,251)&&d.in_grouping(_,97,251)&&d.cursor=d.limit){d.cursor=t;break}d.cursor++}while(!d.in_grouping(_,97,251))}t=d.cursor,d.cursor=e,g()||(i=d.cursor,g()||(s=d.cursor))}(),d.limit_backward=r,d.cursor=d.limit,z(),d.cursor=d.limit,e=d.limit-d.cursor,d.find_among_b(m,5)&&(d.cursor=d.limit-e,d.ket=d.cursor,d.cursor>d.limit_backward&&(d.cursor--,d.bra=d.cursor,d.slice_del())),d.cursor=d.limit,function(){for(var e,r=1;d.out_grouping_b(_,97,251);)r--;if(r<=0){if(d.ket=d.cursor,e=d.limit-d.cursor,!d.eq_s_b(1,"é")&&(d.cursor=d.limit-e,!d.eq_s_b(1,"è")))return;d.bra=d.cursor,d.slice_from("e")}}(),d.cursor=d.limit_backward,function(){for(var e,r;r=d.cursor,d.bra=r,e=d.find_among(u,4);)switch(d.ket=d.cursor,e){case 1:d.slice_from("i");break;case 2:d.slice_from("u");break;case 3:d.slice_from("y");break;case 4:if(d.cursor>=d.limit)return;d.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return s.setCurrent(e),s.stem(),s.getCurrent()}):(s.setCurrent(e),s.stem(),s.getCurrent())}),e.Pipeline.registerFunction(e.fr.stemmer,"stemmer-fr"),e.fr.stopWordFilter=e.generateStopWordFilter("ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" ")),e.Pipeline.registerFunction(e.fr.stopWordFilter,"stopWordFilter-fr")}}); \ No newline at end of file diff --git a/site/assets/javascripts/lunr/lunr.hu.js b/site/assets/javascripts/lunr/lunr.hu.js deleted file mode 100644 index 56a4b0d..0000000 --- a/site/assets/javascripts/lunr/lunr.hu.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var p,_,n;e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWordFilter,e.hu.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hu.stemmer))},e.hu.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.hu.trimmer=e.trimmerSupport.generateTrimmer(e.hu.wordCharacters),e.Pipeline.registerFunction(e.hu.trimmer,"trimmer-hu"),e.hu.stemmer=(p=e.stemmerSupport.Among,_=e.stemmerSupport.SnowballProgram,n=new function(){var r,i=[new p("cs",-1,-1),new p("dzs",-1,-1),new p("gy",-1,-1),new p("ly",-1,-1),new p("ny",-1,-1),new p("sz",-1,-1),new p("ty",-1,-1),new p("zs",-1,-1)],n=[new p("á",-1,1),new p("é",-1,2)],a=[new p("bb",-1,-1),new p("cc",-1,-1),new p("dd",-1,-1),new p("ff",-1,-1),new p("gg",-1,-1),new p("jj",-1,-1),new p("kk",-1,-1),new p("ll",-1,-1),new p("mm",-1,-1),new p("nn",-1,-1),new p("pp",-1,-1),new p("rr",-1,-1),new p("ccs",-1,-1),new p("ss",-1,-1),new p("zzs",-1,-1),new p("tt",-1,-1),new p("vv",-1,-1),new p("ggy",-1,-1),new p("lly",-1,-1),new p("nny",-1,-1),new p("tty",-1,-1),new p("ssz",-1,-1),new p("zz",-1,-1)],t=[new p("al",-1,1),new p("el",-1,2)],e=[new p("ba",-1,-1),new p("ra",-1,-1),new p("be",-1,-1),new p("re",-1,-1),new p("ig",-1,-1),new p("nak",-1,-1),new p("nek",-1,-1),new p("val",-1,-1),new p("vel",-1,-1),new p("ul",-1,-1),new p("nál",-1,-1),new p("nél",-1,-1),new p("ból",-1,-1),new p("ról",-1,-1),new p("tól",-1,-1),new p("bõl",-1,-1),new p("rõl",-1,-1),new p("tõl",-1,-1),new p("ül",-1,-1),new p("n",-1,-1),new p("an",19,-1),new p("ban",20,-1),new p("en",19,-1),new p("ben",22,-1),new p("képpen",22,-1),new p("on",19,-1),new p("ön",19,-1),new p("képp",-1,-1),new p("kor",-1,-1),new p("t",-1,-1),new p("at",29,-1),new p("et",29,-1),new p("ként",29,-1),new p("anként",32,-1),new p("enként",32,-1),new p("onként",32,-1),new p("ot",29,-1),new p("ért",29,-1),new p("öt",29,-1),new p("hez",-1,-1),new p("hoz",-1,-1),new p("höz",-1,-1),new p("vá",-1,-1),new p("vé",-1,-1)],s=[new p("án",-1,2),new p("én",-1,1),new p("ánként",-1,3)],c=[new p("stul",-1,2),new p("astul",0,1),new p("ástul",0,3),new p("stül",-1,2),new p("estül",3,1),new p("éstül",3,4)],w=[new p("á",-1,1),new p("é",-1,2)],o=[new p("k",-1,7),new p("ak",0,4),new p("ek",0,6),new p("ok",0,5),new p("ák",0,1),new p("ék",0,2),new p("ök",0,3)],l=[new p("éi",-1,7),new p("áéi",0,6),new p("ééi",0,5),new p("é",-1,9),new p("ké",3,4),new p("aké",4,1),new p("eké",4,1),new p("oké",4,1),new p("áké",4,3),new p("éké",4,2),new p("öké",4,1),new p("éé",3,8)],u=[new p("a",-1,18),new p("ja",0,17),new p("d",-1,16),new p("ad",2,13),new p("ed",2,13),new p("od",2,13),new p("ád",2,14),new p("éd",2,15),new p("öd",2,13),new p("e",-1,18),new p("je",9,17),new p("nk",-1,4),new p("unk",11,1),new p("ánk",11,2),new p("énk",11,3),new p("ünk",11,1),new p("uk",-1,8),new p("juk",16,7),new p("ájuk",17,5),new p("ük",-1,8),new p("jük",19,7),new p("éjük",20,6),new p("m",-1,12),new p("am",22,9),new p("em",22,9),new p("om",22,9),new p("ám",22,10),new p("ém",22,11),new p("o",-1,18),new p("á",-1,19),new p("é",-1,20)],m=[new p("id",-1,10),new p("aid",0,9),new p("jaid",1,6),new p("eid",0,9),new p("jeid",3,6),new p("áid",0,7),new p("éid",0,8),new p("i",-1,15),new p("ai",7,14),new p("jai",8,11),new p("ei",7,14),new p("jei",10,11),new p("ái",7,12),new p("éi",7,13),new p("itek",-1,24),new p("eitek",14,21),new p("jeitek",15,20),new p("éitek",14,23),new p("ik",-1,29),new p("aik",18,26),new p("jaik",19,25),new p("eik",18,26),new p("jeik",21,25),new p("áik",18,27),new p("éik",18,28),new p("ink",-1,20),new p("aink",25,17),new p("jaink",26,16),new p("eink",25,17),new p("jeink",28,16),new p("áink",25,18),new p("éink",25,19),new p("aitok",-1,21),new p("jaitok",32,20),new p("áitok",-1,22),new p("im",-1,5),new p("aim",35,4),new p("jaim",36,1),new p("eim",35,4),new p("jeim",38,1),new p("áim",35,2),new p("éim",35,3)],k=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,52,14],f=new _;function b(){return r<=f.cursor}function d(){var e=f.limit-f.cursor;return!!f.find_among_b(a,23)&&(f.cursor=f.limit-e,!0)}function g(){if(f.cursor>f.limit_backward){f.cursor--,f.ket=f.cursor;var e=f.cursor-1;f.limit_backward<=e&&e<=f.limit&&(f.cursor=e,f.bra=e,f.slice_del())}}function h(){f.ket=f.cursor,f.find_among_b(e,44)&&(f.bra=f.cursor,b()&&(f.slice_del(),function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(n,2))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("a");break;case 2:f.slice_from("e")}}()))}this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var e=f.cursor;return function(){var e,n=f.cursor;if(r=f.limit,f.in_grouping(k,97,252))for(;;){if(e=f.cursor,f.out_grouping(k,97,252))return f.cursor=e,f.find_among(i,8)||(f.cursor=e)=f.limit)return r=e;f.cursor++}if(f.cursor=n,f.out_grouping(k,97,252)){for(;!f.in_grouping(k,97,252);){if(f.cursor>=f.limit)return;f.cursor++}r=f.cursor}}(),f.limit_backward=e,f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(t,2))&&(f.bra=f.cursor,b())){if((1==e||2==e)&&!d())return;f.slice_del(),g()}}(),f.cursor=f.limit,h(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(s,3))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("e");break;case 2:case 3:f.slice_from("a")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(c,6))&&(f.bra=f.cursor,b()))switch(e){case 1:case 2:f.slice_del();break;case 3:f.slice_from("a");break;case 4:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(w,2))&&(f.bra=f.cursor,b())){if((1==e||2==e)&&!d())return;f.slice_del(),g()}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(l,12))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 7:case 9:f.slice_del();break;case 2:case 5:case 8:f.slice_from("e");break;case 3:case 6:f.slice_from("a")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(u,31))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 7:case 8:case 9:case 12:case 13:case 16:case 17:case 18:f.slice_del();break;case 2:case 5:case 10:case 14:case 19:f.slice_from("a");break;case 3:case 6:case 11:case 15:case 20:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(m,42))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 5:case 6:case 9:case 10:case 11:case 14:case 15:case 16:case 17:case 20:case 21:case 24:case 25:case 26:case 29:f.slice_del();break;case 2:case 7:case 12:case 18:case 22:case 27:f.slice_from("a");break;case 3:case 8:case 13:case 19:case 23:case 28:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(o,7))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("a");break;case 2:f.slice_from("e");break;case 3:case 4:case 5:case 6:case 7:f.slice_del()}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.hu.stemmer,"stemmer-hu"),e.hu.stopWordFilter=e.generateStopWordFilter("a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amíg annak arra arról az azok azon azonban azt aztán azután azzal azért be belül benne bár cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyéb egész ehhez ekkor el ellen elsõ elég elõ elõször elõtt emilyen ennek erre ez ezek ezen ezt ezzel ezért fel felé hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismét ison itt jobban jó jól kell kellett keressünk keresztül ki kívül között közül legalább legyen lehet lehetett lenne lenni lesz lett maga magát majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miért most már más másik még míg nagy nagyobb nagyon ne nekem neki nem nincs néha néhány nélkül olyan ott pedig persze rá s saját sem semmi sok sokat sokkal szemben szerint szinte számára talán tehát teljes tovább továbbá több ugyanis utolsó után utána vagy vagyis vagyok valaki valami valamint való van vannak vele vissza viszont volna volt voltak voltam voltunk által általában át én éppen és így õ õk õket össze úgy új újabb újra".split(" ")),e.Pipeline.registerFunction(e.hu.stopWordFilter,"stopWordFilter-hu")}}); \ No newline at end of file diff --git a/site/assets/javascripts/lunr/lunr.it.js b/site/assets/javascripts/lunr/lunr.it.js deleted file mode 100644 index 50dddaa..0000000 --- a/site/assets/javascripts/lunr/lunr.it.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var z,P,r;e.it=function(){this.pipeline.reset(),this.pipeline.add(e.it.trimmer,e.it.stopWordFilter,e.it.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.it.stemmer))},e.it.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.it.trimmer=e.trimmerSupport.generateTrimmer(e.it.wordCharacters),e.Pipeline.registerFunction(e.it.trimmer,"trimmer-it"),e.it.stemmer=(z=e.stemmerSupport.Among,P=e.stemmerSupport.SnowballProgram,r=new function(){var o,t,s,a=[new z("",-1,7),new z("qu",0,6),new z("á",0,1),new z("é",0,2),new z("í",0,3),new z("ó",0,4),new z("ú",0,5)],u=[new z("",-1,3),new z("I",0,1),new z("U",0,2)],c=[new z("la",-1,-1),new z("cela",0,-1),new z("gliela",0,-1),new z("mela",0,-1),new z("tela",0,-1),new z("vela",0,-1),new z("le",-1,-1),new z("cele",6,-1),new z("gliele",6,-1),new z("mele",6,-1),new z("tele",6,-1),new z("vele",6,-1),new z("ne",-1,-1),new z("cene",12,-1),new z("gliene",12,-1),new z("mene",12,-1),new z("sene",12,-1),new z("tene",12,-1),new z("vene",12,-1),new z("ci",-1,-1),new z("li",-1,-1),new z("celi",20,-1),new z("glieli",20,-1),new z("meli",20,-1),new z("teli",20,-1),new z("veli",20,-1),new z("gli",20,-1),new z("mi",-1,-1),new z("si",-1,-1),new z("ti",-1,-1),new z("vi",-1,-1),new z("lo",-1,-1),new z("celo",31,-1),new z("glielo",31,-1),new z("melo",31,-1),new z("telo",31,-1),new z("velo",31,-1)],w=[new z("ando",-1,1),new z("endo",-1,1),new z("ar",-1,2),new z("er",-1,2),new z("ir",-1,2)],r=[new z("ic",-1,-1),new z("abil",-1,-1),new z("os",-1,-1),new z("iv",-1,1)],n=[new z("ic",-1,1),new z("abil",-1,1),new z("iv",-1,1)],i=[new z("ica",-1,1),new z("logia",-1,3),new z("osa",-1,1),new z("ista",-1,1),new z("iva",-1,9),new z("anza",-1,1),new z("enza",-1,5),new z("ice",-1,1),new z("atrice",7,1),new z("iche",-1,1),new z("logie",-1,3),new z("abile",-1,1),new z("ibile",-1,1),new z("usione",-1,4),new z("azione",-1,2),new z("uzione",-1,4),new z("atore",-1,2),new z("ose",-1,1),new z("ante",-1,1),new z("mente",-1,1),new z("amente",19,7),new z("iste",-1,1),new z("ive",-1,9),new z("anze",-1,1),new z("enze",-1,5),new z("ici",-1,1),new z("atrici",25,1),new z("ichi",-1,1),new z("abili",-1,1),new z("ibili",-1,1),new z("ismi",-1,1),new z("usioni",-1,4),new z("azioni",-1,2),new z("uzioni",-1,4),new z("atori",-1,2),new z("osi",-1,1),new z("anti",-1,1),new z("amenti",-1,6),new z("imenti",-1,6),new z("isti",-1,1),new z("ivi",-1,9),new z("ico",-1,1),new z("ismo",-1,1),new z("oso",-1,1),new z("amento",-1,6),new z("imento",-1,6),new z("ivo",-1,9),new z("ità",-1,8),new z("istà",-1,1),new z("istè",-1,1),new z("istì",-1,1)],l=[new z("isca",-1,1),new z("enda",-1,1),new z("ata",-1,1),new z("ita",-1,1),new z("uta",-1,1),new z("ava",-1,1),new z("eva",-1,1),new z("iva",-1,1),new z("erebbe",-1,1),new z("irebbe",-1,1),new z("isce",-1,1),new z("ende",-1,1),new z("are",-1,1),new z("ere",-1,1),new z("ire",-1,1),new z("asse",-1,1),new z("ate",-1,1),new z("avate",16,1),new z("evate",16,1),new z("ivate",16,1),new z("ete",-1,1),new z("erete",20,1),new z("irete",20,1),new z("ite",-1,1),new z("ereste",-1,1),new z("ireste",-1,1),new z("ute",-1,1),new z("erai",-1,1),new z("irai",-1,1),new z("isci",-1,1),new z("endi",-1,1),new z("erei",-1,1),new z("irei",-1,1),new z("assi",-1,1),new z("ati",-1,1),new z("iti",-1,1),new z("eresti",-1,1),new z("iresti",-1,1),new z("uti",-1,1),new z("avi",-1,1),new z("evi",-1,1),new z("ivi",-1,1),new z("isco",-1,1),new z("ando",-1,1),new z("endo",-1,1),new z("Yamo",-1,1),new z("iamo",-1,1),new z("avamo",-1,1),new z("evamo",-1,1),new z("ivamo",-1,1),new z("eremo",-1,1),new z("iremo",-1,1),new z("assimo",-1,1),new z("ammo",-1,1),new z("emmo",-1,1),new z("eremmo",54,1),new z("iremmo",54,1),new z("immo",-1,1),new z("ano",-1,1),new z("iscano",58,1),new z("avano",58,1),new z("evano",58,1),new z("ivano",58,1),new z("eranno",-1,1),new z("iranno",-1,1),new z("ono",-1,1),new z("iscono",65,1),new z("arono",65,1),new z("erono",65,1),new z("irono",65,1),new z("erebbero",-1,1),new z("irebbero",-1,1),new z("assero",-1,1),new z("essero",-1,1),new z("issero",-1,1),new z("ato",-1,1),new z("ito",-1,1),new z("uto",-1,1),new z("avo",-1,1),new z("evo",-1,1),new z("ivo",-1,1),new z("ar",-1,1),new z("ir",-1,1),new z("erà",-1,1),new z("irà",-1,1),new z("erò",-1,1),new z("irò",-1,1)],m=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2,1],f=[17,65,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2],v=[17],b=new P;function d(e,r,n){return!(!b.eq_s(1,e)||(b.ket=b.cursor,!b.in_grouping(m,97,249)))&&(b.slice_from(r),b.cursor=n,!0)}function _(e){if(b.cursor=e,!b.in_grouping(m,97,249))return!1;for(;!b.out_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}return!0}function g(){var e,r=b.cursor;if(!function(){if(b.in_grouping(m,97,249)){var e=b.cursor;if(b.out_grouping(m,97,249)){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return _(e);b.cursor++}return!0}return _(e)}return!1}()){if(b.cursor=r,!b.out_grouping(m,97,249))return;if(e=b.cursor,b.out_grouping(m,97,249)){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return b.cursor=e,void(b.in_grouping(m,97,249)&&b.cursor=b.limit)return;b.cursor++}s=b.cursor}function p(){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}for(;!b.out_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}return!0}function k(){return s<=b.cursor}function h(){return o<=b.cursor}function q(){var e;if(b.ket=b.cursor,!(e=b.find_among_b(i,51)))return!1;switch(b.bra=b.cursor,e){case 1:if(!h())return!1;b.slice_del();break;case 2:if(!h())return!1;b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"ic")&&(b.bra=b.cursor,h()&&b.slice_del());break;case 3:if(!h())return!1;b.slice_from("log");break;case 4:if(!h())return!1;b.slice_from("u");break;case 5:if(!h())return!1;b.slice_from("ente");break;case 6:if(!k())return!1;b.slice_del();break;case 7:if(!(t<=b.cursor))return!1;b.slice_del(),b.ket=b.cursor,(e=b.find_among_b(r,4))&&(b.bra=b.cursor,h()&&(b.slice_del(),1==e&&(b.ket=b.cursor,b.eq_s_b(2,"at")&&(b.bra=b.cursor,h()&&b.slice_del()))));break;case 8:if(!h())return!1;b.slice_del(),b.ket=b.cursor,(e=b.find_among_b(n,3))&&(b.bra=b.cursor,1==e&&h()&&b.slice_del());break;case 9:if(!h())return!1;b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"at")&&(b.bra=b.cursor,h()&&(b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"ic")&&(b.bra=b.cursor,h()&&b.slice_del())))}return!0}function C(){var e;e=b.limit-b.cursor,b.ket=b.cursor,b.in_grouping_b(f,97,242)&&(b.bra=b.cursor,k()&&(b.slice_del(),b.ket=b.cursor,b.eq_s_b(1,"i")&&(b.bra=b.cursor,k())))?b.slice_del():b.cursor=b.limit-e,b.ket=b.cursor,b.eq_s_b(1,"h")&&(b.bra=b.cursor,b.in_grouping_b(v,99,103)&&k()&&b.slice_del())}this.setCurrent=function(e){b.setCurrent(e)},this.getCurrent=function(){return b.getCurrent()},this.stem=function(){var e,r,n,i=b.cursor;return function(){for(var e,r,n,i,o=b.cursor;;){if(b.bra=b.cursor,e=b.find_among(a,7))switch(b.ket=b.cursor,e){case 1:b.slice_from("à");continue;case 2:b.slice_from("è");continue;case 3:b.slice_from("ì");continue;case 4:b.slice_from("ò");continue;case 5:b.slice_from("ù");continue;case 6:b.slice_from("qU");continue;case 7:if(b.cursor>=b.limit)break;b.cursor++;continue}break}for(b.cursor=o;;)for(r=b.cursor;;){if(n=b.cursor,b.in_grouping(m,97,249)){if(b.bra=b.cursor,i=b.cursor,d("u","U",n))break;if(b.cursor=i,d("i","I",n))break}if(b.cursor=n,b.cursor>=b.limit)return b.cursor=r;b.cursor++}}(),b.cursor=i,e=b.cursor,s=b.limit,o=t=s,g(),b.cursor=e,p()&&(t=b.cursor,p()&&(o=b.cursor)),b.limit_backward=i,b.cursor=b.limit,function(){var e;if(b.ket=b.cursor,b.find_among_b(c,37)&&(b.bra=b.cursor,(e=b.find_among_b(w,5))&&k()))switch(e){case 1:b.slice_del();break;case 2:b.slice_from("e")}}(),b.cursor=b.limit,q()||(b.cursor=b.limit,b.cursor>=s&&(n=b.limit_backward,b.limit_backward=s,b.ket=b.cursor,(r=b.find_among_b(l,87))&&(b.bra=b.cursor,1==r&&b.slice_del()),b.limit_backward=n)),b.cursor=b.limit,C(),b.cursor=b.limit_backward,function(){for(var e;b.bra=b.cursor,e=b.find_among(u,3);)switch(b.ket=b.cursor,e){case 1:b.slice_from("i");break;case 2:b.slice_from("u");break;case 3:if(b.cursor>=b.limit)return;b.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.it.stemmer,"stemmer-it"),e.it.stopWordFilter=e.generateStopWordFilter("a abbia abbiamo abbiano abbiate ad agl agli ai al all alla alle allo anche avemmo avendo avesse avessero avessi avessimo aveste avesti avete aveva avevamo avevano avevate avevi avevo avrai avranno avrebbe avrebbero avrei avremmo avremo avreste avresti avrete avrà avrò avuta avute avuti avuto c che chi ci coi col come con contro cui da dagl dagli dai dal dall dalla dalle dallo degl degli dei del dell della delle dello di dov dove e ebbe ebbero ebbi ed era erano eravamo eravate eri ero essendo faccia facciamo facciano facciate faccio facemmo facendo facesse facessero facessi facessimo faceste facesti faceva facevamo facevano facevate facevi facevo fai fanno farai faranno farebbe farebbero farei faremmo faremo fareste faresti farete farà farò fece fecero feci fosse fossero fossi fossimo foste fosti fu fui fummo furono gli ha hai hanno ho i il in io l la le lei li lo loro lui ma mi mia mie miei mio ne negl negli nei nel nell nella nelle nello noi non nostra nostre nostri nostro o per perché più quale quanta quante quanti quanto quella quelle quelli quello questa queste questi questo sarai saranno sarebbe sarebbero sarei saremmo saremo sareste saresti sarete sarà sarò se sei si sia siamo siano siate siete sono sta stai stando stanno starai staranno starebbe starebbero starei staremmo staremo stareste staresti starete starà starò stava stavamo stavano stavate stavi stavo stemmo stesse stessero stessi stessimo steste stesti stette stettero stetti stia stiamo stiano stiate sto su sua sue sugl sugli sui sul sull sulla sulle sullo suo suoi ti tra tu tua tue tuo tuoi tutti tutto un una uno vi voi vostra vostre vostri vostro è".split(" ")),e.Pipeline.registerFunction(e.it.stopWordFilter,"stopWordFilter-it")}}); \ No newline at end of file diff --git a/site/assets/javascripts/lunr/lunr.ja.js b/site/assets/javascripts/lunr/lunr.ja.js deleted file mode 100644 index 69f6202..0000000 --- a/site/assets/javascripts/lunr/lunr.ja.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(m){if(void 0===m)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===m.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var l="2"==m.version[0];m.ja=function(){this.pipeline.reset(),this.pipeline.add(m.ja.trimmer,m.ja.stopWordFilter,m.ja.stemmer),l?this.tokenizer=m.ja.tokenizer:(m.tokenizer&&(m.tokenizer=m.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=m.ja.tokenizer))};var j=new m.TinySegmenter;m.ja.tokenizer=function(e){var r,t,i,n,o,s,p,a,u;if(!arguments.length||null==e||null==e)return[];if(Array.isArray(e))return e.map(function(e){return l?new m.Token(e.toLowerCase()):e.toLowerCase()});for(r=(t=e.toString().toLowerCase().replace(/^\s+/,"")).length-1;0<=r;r--)if(/\S/.test(t.charAt(r))){t=t.substring(0,r+1);break}for(o=[],i=t.length,p=a=0;a<=i;a++)if(s=a-p,t.charAt(a).match(/\s/)||a==i){if(0=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return e<=_.cursor}function g(){var r=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-r,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var r;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.slice_del(),u=!0,g())))}function k(){var r;b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.eq_s_b(3,"gem")||(_.cursor=_.limit-r,_.slice_del(),g())))}this.setCurrent=function(r){_.setCurrent(r)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var r=_.cursor;return function(){for(var r,e,i,n=_.cursor;;){if(_.bra=_.cursor,r=_.find_among(o,11))switch(_.ket=_.cursor,r){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(e=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=e);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=e;else if(s(e))break}else if(s(e))break}(),_.cursor=r,i=_.limit,e=i,w()||((i=_.cursor)<3&&(i=3),w()||(e=_.cursor)),_.limit_backward=r,_.cursor=_.limit,function(){var r,e,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,r=_.find_among_b(c,5))switch(_.bra=_.cursor,r){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(e=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-e,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,r=_.find_among_b(a,6))switch(_.bra=_.cursor,r){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var r;;)if(_.bra=_.cursor,r=_.find_among(n,3))switch(_.ket=_.cursor,r){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(r){return"function"==typeof r.update?r.update(function(r){return e.setCurrent(r),e.stem(),e.getCurrent()}):(e.setCurrent(r),e.stem(),e.getCurrent())}),r.Pipeline.registerFunction(r.nl.stemmer,"stemmer-nl"),r.nl.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.nl.stopWordFilter,"stopWordFilter-nl")}}); \ No newline at end of file diff --git a/site/assets/javascripts/lunr/lunr.no.js b/site/assets/javascripts/lunr/lunr.no.js deleted file mode 100644 index 3d156b9..0000000 --- a/site/assets/javascripts/lunr/lunr.no.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,n,i;e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=(r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){var o,s,a=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],m=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],u=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],d=[119,125,149,1],c=new n;this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var e,r,n,i,t=c.cursor;return function(){var e,r=c.cursor+3;if(s=c.limit,0<=r||r<=c.limit){for(o=r;;){if(e=c.cursor,c.in_grouping(u,97,248)){c.cursor=e;break}if(e>=c.limit)return;c.cursor=e+1}for(;!c.out_grouping(u,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(s=c.cursor)=s&&(r=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,e=c.find_among_b(a,29),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:n=c.limit-c.cursor,c.in_grouping_b(d,98,122)?c.slice_del():(c.cursor=c.limit-n,c.eq_s_b(1,"k")&&c.out_grouping_b(u,97,248)&&c.slice_del());break;case 3:c.slice_from("er")}}(),c.cursor=c.limit,r=c.limit-c.cursor,c.cursor>=s&&(e=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,c.find_among_b(m,2)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e),c.cursor=c.limit,c.cursor>=s&&(i=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,(n=c.find_among_b(l,11))?(c.bra=c.cursor,c.limit_backward=i,1==n&&c.slice_del()):c.limit_backward=i),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); \ No newline at end of file diff --git a/site/assets/javascripts/lunr/lunr.pt.js b/site/assets/javascripts/lunr/lunr.pt.js deleted file mode 100644 index f50fc9f..0000000 --- a/site/assets/javascripts/lunr/lunr.pt.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var j,C,r;e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWordFilter,e.pt.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.pt.stemmer))},e.pt.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.pt.trimmer=e.trimmerSupport.generateTrimmer(e.pt.wordCharacters),e.Pipeline.registerFunction(e.pt.trimmer,"trimmer-pt"),e.pt.stemmer=(j=e.stemmerSupport.Among,C=e.stemmerSupport.SnowballProgram,r=new function(){var s,n,i,o=[new j("",-1,3),new j("ã",0,1),new j("õ",0,2)],a=[new j("",-1,3),new j("a~",0,1),new j("o~",0,2)],r=[new j("ic",-1,-1),new j("ad",-1,-1),new j("os",-1,-1),new j("iv",-1,1)],t=[new j("ante",-1,1),new j("avel",-1,1),new j("ível",-1,1)],u=[new j("ic",-1,1),new j("abil",-1,1),new j("iv",-1,1)],w=[new j("ica",-1,1),new j("ância",-1,1),new j("ência",-1,4),new j("ira",-1,9),new j("adora",-1,1),new j("osa",-1,1),new j("ista",-1,1),new j("iva",-1,8),new j("eza",-1,1),new j("logía",-1,2),new j("idade",-1,7),new j("ante",-1,1),new j("mente",-1,6),new j("amente",12,5),new j("ável",-1,1),new j("ível",-1,1),new j("ución",-1,3),new j("ico",-1,1),new j("ismo",-1,1),new j("oso",-1,1),new j("amento",-1,1),new j("imento",-1,1),new j("ivo",-1,8),new j("aça~o",-1,1),new j("ador",-1,1),new j("icas",-1,1),new j("ências",-1,4),new j("iras",-1,9),new j("adoras",-1,1),new j("osas",-1,1),new j("istas",-1,1),new j("ivas",-1,8),new j("ezas",-1,1),new j("logías",-1,2),new j("idades",-1,7),new j("uciones",-1,3),new j("adores",-1,1),new j("antes",-1,1),new j("aço~es",-1,1),new j("icos",-1,1),new j("ismos",-1,1),new j("osos",-1,1),new j("amentos",-1,1),new j("imentos",-1,1),new j("ivos",-1,8)],m=[new j("ada",-1,1),new j("ida",-1,1),new j("ia",-1,1),new j("aria",2,1),new j("eria",2,1),new j("iria",2,1),new j("ara",-1,1),new j("era",-1,1),new j("ira",-1,1),new j("ava",-1,1),new j("asse",-1,1),new j("esse",-1,1),new j("isse",-1,1),new j("aste",-1,1),new j("este",-1,1),new j("iste",-1,1),new j("ei",-1,1),new j("arei",16,1),new j("erei",16,1),new j("irei",16,1),new j("am",-1,1),new j("iam",20,1),new j("ariam",21,1),new j("eriam",21,1),new j("iriam",21,1),new j("aram",20,1),new j("eram",20,1),new j("iram",20,1),new j("avam",20,1),new j("em",-1,1),new j("arem",29,1),new j("erem",29,1),new j("irem",29,1),new j("assem",29,1),new j("essem",29,1),new j("issem",29,1),new j("ado",-1,1),new j("ido",-1,1),new j("ando",-1,1),new j("endo",-1,1),new j("indo",-1,1),new j("ara~o",-1,1),new j("era~o",-1,1),new j("ira~o",-1,1),new j("ar",-1,1),new j("er",-1,1),new j("ir",-1,1),new j("as",-1,1),new j("adas",47,1),new j("idas",47,1),new j("ias",47,1),new j("arias",50,1),new j("erias",50,1),new j("irias",50,1),new j("aras",47,1),new j("eras",47,1),new j("iras",47,1),new j("avas",47,1),new j("es",-1,1),new j("ardes",58,1),new j("erdes",58,1),new j("irdes",58,1),new j("ares",58,1),new j("eres",58,1),new j("ires",58,1),new j("asses",58,1),new j("esses",58,1),new j("isses",58,1),new j("astes",58,1),new j("estes",58,1),new j("istes",58,1),new j("is",-1,1),new j("ais",71,1),new j("eis",71,1),new j("areis",73,1),new j("ereis",73,1),new j("ireis",73,1),new j("áreis",73,1),new j("éreis",73,1),new j("íreis",73,1),new j("ásseis",73,1),new j("ésseis",73,1),new j("ísseis",73,1),new j("áveis",73,1),new j("íeis",73,1),new j("aríeis",84,1),new j("eríeis",84,1),new j("iríeis",84,1),new j("ados",-1,1),new j("idos",-1,1),new j("amos",-1,1),new j("áramos",90,1),new j("éramos",90,1),new j("íramos",90,1),new j("ávamos",90,1),new j("íamos",90,1),new j("aríamos",95,1),new j("eríamos",95,1),new j("iríamos",95,1),new j("emos",-1,1),new j("aremos",99,1),new j("eremos",99,1),new j("iremos",99,1),new j("ássemos",99,1),new j("êssemos",99,1),new j("íssemos",99,1),new j("imos",-1,1),new j("armos",-1,1),new j("ermos",-1,1),new j("irmos",-1,1),new j("ámos",-1,1),new j("arás",-1,1),new j("erás",-1,1),new j("irás",-1,1),new j("eu",-1,1),new j("iu",-1,1),new j("ou",-1,1),new j("ará",-1,1),new j("erá",-1,1),new j("irá",-1,1)],c=[new j("a",-1,1),new j("i",-1,1),new j("o",-1,1),new j("os",-1,1),new j("á",-1,1),new j("í",-1,1),new j("ó",-1,1)],l=[new j("e",-1,1),new j("ç",-1,2),new j("é",-1,1),new j("ê",-1,1)],f=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2],d=new C;function v(){if(d.out_grouping(f,97,250)){for(;!d.in_grouping(f,97,250);){if(d.cursor>=d.limit)return!0;d.cursor++}return!1}return!0}function p(){var e,r,s=d.cursor;if(d.in_grouping(f,97,250))if(e=d.cursor,v()){if(d.cursor=e,function(){if(d.in_grouping(f,97,250))for(;!d.out_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}return i=d.cursor,!0}())return}else i=d.cursor;if(d.cursor=s,d.out_grouping(f,97,250)){if(r=d.cursor,v()){if(d.cursor=r,!d.in_grouping(f,97,250)||d.cursor>=d.limit)return;d.cursor++}i=d.cursor}}function _(){for(;!d.in_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}for(;!d.out_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}return!0}function h(){return i<=d.cursor}function b(){return s<=d.cursor}function g(){var e;if(d.ket=d.cursor,!(e=d.find_among_b(w,45)))return!1;switch(d.bra=d.cursor,e){case 1:if(!b())return!1;d.slice_del();break;case 2:if(!b())return!1;d.slice_from("log");break;case 3:if(!b())return!1;d.slice_from("u");break;case 4:if(!b())return!1;d.slice_from("ente");break;case 5:if(!(n<=d.cursor))return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(r,4))&&(d.bra=d.cursor,b()&&(d.slice_del(),1==e&&(d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,b()&&d.slice_del()))));break;case 6:if(!b())return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(t,3))&&(d.bra=d.cursor,1==e&&b()&&d.slice_del());break;case 7:if(!b())return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(u,3))&&(d.bra=d.cursor,1==e&&b()&&d.slice_del());break;case 8:if(!b())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,b()&&d.slice_del());break;case 9:if(!h()||!d.eq_s_b(1,"e"))return!1;d.slice_from("ir")}return!0}function k(e,r){if(d.eq_s_b(1,e)){d.bra=d.cursor;var s=d.limit-d.cursor;if(d.eq_s_b(1,r))return d.cursor=d.limit-s,h()&&d.slice_del(),!1}return!0}function q(){if(!g()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor>=i){if(r=d.limit_backward,d.limit_backward=i,d.ket=d.cursor,e=d.find_among_b(m,120))return d.bra=d.cursor,1==e&&d.slice_del(),d.limit_backward=r,!0;d.limit_backward=r}return!1}()))return d.cursor=d.limit,d.ket=d.cursor,void((e=d.find_among_b(c,7))&&(d.bra=d.cursor,1==e&&h()&&d.slice_del()));var e;d.cursor=d.limit,d.ket=d.cursor,d.eq_s_b(1,"i")&&(d.bra=d.cursor,d.eq_s_b(1,"c")&&(d.cursor=d.limit,h()&&d.slice_del()))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var e,r=d.cursor;return function(){for(var e;;){if(d.bra=d.cursor,e=d.find_among(o,3))switch(d.ket=d.cursor,e){case 1:d.slice_from("a~");continue;case 2:d.slice_from("o~");continue;case 3:if(d.cursor>=d.limit)break;d.cursor++;continue}break}}(),d.cursor=r,e=d.cursor,i=d.limit,s=n=i,p(),d.cursor=e,_()&&(n=d.cursor,_()&&(s=d.cursor)),d.limit_backward=r,d.cursor=d.limit,q(),d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,e=d.find_among_b(l,4))switch(d.bra=d.cursor,e){case 1:h()&&(d.slice_del(),d.ket=d.cursor,d.limit,d.cursor,k("u","g")&&k("i","c"));break;case 2:d.slice_from("c")}}(),d.cursor=d.limit_backward,function(){for(var e;;){if(d.bra=d.cursor,e=d.find_among(a,3))switch(d.ket=d.cursor,e){case 1:d.slice_from("ã");continue;case 2:d.slice_from("õ");continue;case 3:if(d.cursor>=d.limit)break;d.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.pt.stemmer,"stemmer-pt"),e.pt.stopWordFilter=e.generateStopWordFilter("a ao aos aquela aquelas aquele aqueles aquilo as até com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivéramos estivéssemos estou está estávamos estão eu foi fomos for fora foram forem formos fosse fossem fui fôramos fôssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverá houverão houveríamos houvesse houvessem houvéramos houvéssemos há hão isso isto já lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa não nós o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam será serão seríamos seu seus somos sou sua suas são só também te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terá terão teríamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivéramos tivéssemos tu tua tuas tém tínhamos um uma você vocês vos à às éramos".split(" ")),e.Pipeline.registerFunction(e.pt.stopWordFilter,"stopWordFilter-pt")}}); \ No newline at end of file diff --git a/site/assets/javascripts/lunr/lunr.ro.js b/site/assets/javascripts/lunr/lunr.ro.js deleted file mode 100644 index b19627e..0000000 --- a/site/assets/javascripts/lunr/lunr.ro.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var h,z,i;e.ro=function(){this.pipeline.reset(),this.pipeline.add(e.ro.trimmer,e.ro.stopWordFilter,e.ro.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ro.stemmer))},e.ro.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.ro.trimmer=e.trimmerSupport.generateTrimmer(e.ro.wordCharacters),e.Pipeline.registerFunction(e.ro.trimmer,"trimmer-ro"),e.ro.stemmer=(h=e.stemmerSupport.Among,z=e.stemmerSupport.SnowballProgram,i=new function(){var r,n,t,a,o=[new h("",-1,3),new h("I",0,1),new h("U",0,2)],s=[new h("ea",-1,3),new h("aţia",-1,7),new h("aua",-1,2),new h("iua",-1,4),new h("aţie",-1,7),new h("ele",-1,3),new h("ile",-1,5),new h("iile",6,4),new h("iei",-1,4),new h("atei",-1,6),new h("ii",-1,4),new h("ului",-1,1),new h("ul",-1,1),new h("elor",-1,3),new h("ilor",-1,4),new h("iilor",14,4)],c=[new h("icala",-1,4),new h("iciva",-1,4),new h("ativa",-1,5),new h("itiva",-1,6),new h("icale",-1,4),new h("aţiune",-1,5),new h("iţiune",-1,6),new h("atoare",-1,5),new h("itoare",-1,6),new h("ătoare",-1,5),new h("icitate",-1,4),new h("abilitate",-1,1),new h("ibilitate",-1,2),new h("ivitate",-1,3),new h("icive",-1,4),new h("ative",-1,5),new h("itive",-1,6),new h("icali",-1,4),new h("atori",-1,5),new h("icatori",18,4),new h("itori",-1,6),new h("ători",-1,5),new h("icitati",-1,4),new h("abilitati",-1,1),new h("ivitati",-1,3),new h("icivi",-1,4),new h("ativi",-1,5),new h("itivi",-1,6),new h("icităi",-1,4),new h("abilităi",-1,1),new h("ivităi",-1,3),new h("icităţi",-1,4),new h("abilităţi",-1,1),new h("ivităţi",-1,3),new h("ical",-1,4),new h("ator",-1,5),new h("icator",35,4),new h("itor",-1,6),new h("ător",-1,5),new h("iciv",-1,4),new h("ativ",-1,5),new h("itiv",-1,6),new h("icală",-1,4),new h("icivă",-1,4),new h("ativă",-1,5),new h("itivă",-1,6)],u=[new h("ica",-1,1),new h("abila",-1,1),new h("ibila",-1,1),new h("oasa",-1,1),new h("ata",-1,1),new h("ita",-1,1),new h("anta",-1,1),new h("ista",-1,3),new h("uta",-1,1),new h("iva",-1,1),new h("ic",-1,1),new h("ice",-1,1),new h("abile",-1,1),new h("ibile",-1,1),new h("isme",-1,3),new h("iune",-1,2),new h("oase",-1,1),new h("ate",-1,1),new h("itate",17,1),new h("ite",-1,1),new h("ante",-1,1),new h("iste",-1,3),new h("ute",-1,1),new h("ive",-1,1),new h("ici",-1,1),new h("abili",-1,1),new h("ibili",-1,1),new h("iuni",-1,2),new h("atori",-1,1),new h("osi",-1,1),new h("ati",-1,1),new h("itati",30,1),new h("iti",-1,1),new h("anti",-1,1),new h("isti",-1,3),new h("uti",-1,1),new h("işti",-1,3),new h("ivi",-1,1),new h("ităi",-1,1),new h("oşi",-1,1),new h("ităţi",-1,1),new h("abil",-1,1),new h("ibil",-1,1),new h("ism",-1,3),new h("ator",-1,1),new h("os",-1,1),new h("at",-1,1),new h("it",-1,1),new h("ant",-1,1),new h("ist",-1,3),new h("ut",-1,1),new h("iv",-1,1),new h("ică",-1,1),new h("abilă",-1,1),new h("ibilă",-1,1),new h("oasă",-1,1),new h("ată",-1,1),new h("ită",-1,1),new h("antă",-1,1),new h("istă",-1,3),new h("ută",-1,1),new h("ivă",-1,1)],w=[new h("ea",-1,1),new h("ia",-1,1),new h("esc",-1,1),new h("ăsc",-1,1),new h("ind",-1,1),new h("ând",-1,1),new h("are",-1,1),new h("ere",-1,1),new h("ire",-1,1),new h("âre",-1,1),new h("se",-1,2),new h("ase",10,1),new h("sese",10,2),new h("ise",10,1),new h("use",10,1),new h("âse",10,1),new h("eşte",-1,1),new h("ăşte",-1,1),new h("eze",-1,1),new h("ai",-1,1),new h("eai",19,1),new h("iai",19,1),new h("sei",-1,2),new h("eşti",-1,1),new h("ăşti",-1,1),new h("ui",-1,1),new h("ezi",-1,1),new h("âi",-1,1),new h("aşi",-1,1),new h("seşi",-1,2),new h("aseşi",29,1),new h("seseşi",29,2),new h("iseşi",29,1),new h("useşi",29,1),new h("âseşi",29,1),new h("işi",-1,1),new h("uşi",-1,1),new h("âşi",-1,1),new h("aţi",-1,2),new h("eaţi",38,1),new h("iaţi",38,1),new h("eţi",-1,2),new h("iţi",-1,2),new h("âţi",-1,2),new h("arăţi",-1,1),new h("serăţi",-1,2),new h("aserăţi",45,1),new h("seserăţi",45,2),new h("iserăţi",45,1),new h("userăţi",45,1),new h("âserăţi",45,1),new h("irăţi",-1,1),new h("urăţi",-1,1),new h("ârăţi",-1,1),new h("am",-1,1),new h("eam",54,1),new h("iam",54,1),new h("em",-1,2),new h("asem",57,1),new h("sesem",57,2),new h("isem",57,1),new h("usem",57,1),new h("âsem",57,1),new h("im",-1,2),new h("âm",-1,2),new h("ăm",-1,2),new h("arăm",65,1),new h("serăm",65,2),new h("aserăm",67,1),new h("seserăm",67,2),new h("iserăm",67,1),new h("userăm",67,1),new h("âserăm",67,1),new h("irăm",65,1),new h("urăm",65,1),new h("ârăm",65,1),new h("au",-1,1),new h("eau",76,1),new h("iau",76,1),new h("indu",-1,1),new h("ându",-1,1),new h("ez",-1,1),new h("ească",-1,1),new h("ară",-1,1),new h("seră",-1,2),new h("aseră",84,1),new h("seseră",84,2),new h("iseră",84,1),new h("useră",84,1),new h("âseră",84,1),new h("iră",-1,1),new h("ură",-1,1),new h("âră",-1,1),new h("ează",-1,1)],i=[new h("a",-1,1),new h("e",-1,1),new h("ie",1,1),new h("i",-1,1),new h("ă",-1,1)],m=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,4],l=new z;function f(e,i){l.eq_s(1,e)&&(l.ket=l.cursor,l.in_grouping(m,97,259)&&l.slice_from(i))}function p(){if(l.out_grouping(m,97,259)){for(;!l.in_grouping(m,97,259);){if(l.cursor>=l.limit)return!0;l.cursor++}return!1}return!0}function d(){var e,i,r=l.cursor;if(l.in_grouping(m,97,259)){if(e=l.cursor,!p())return void(a=l.cursor);if(l.cursor=e,!function(){if(l.in_grouping(m,97,259))for(;!l.out_grouping(m,97,259);){if(l.cursor>=l.limit)return!0;l.cursor++}return!1}())return void(a=l.cursor)}l.cursor=r,l.out_grouping(m,97,259)&&(i=l.cursor,p()&&(l.cursor=i,l.in_grouping(m,97,259)&&l.cursor=l.limit)return!1;l.cursor++}for(;!l.out_grouping(m,97,259);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function v(){return t<=l.cursor}function _(){var e,i=l.limit-l.cursor;if(l.ket=l.cursor,(e=l.find_among_b(c,46))&&(l.bra=l.cursor,v())){switch(e){case 1:l.slice_from("abil");break;case 2:l.slice_from("ibil");break;case 3:l.slice_from("iv");break;case 4:l.slice_from("ic");break;case 5:l.slice_from("at");break;case 6:l.slice_from("it")}return r=!0,l.cursor=l.limit-i,!0}return!1}function g(){var e,i;for(r=!1;;)if(i=l.limit-l.cursor,!_()){l.cursor=l.limit-i;break}if(l.ket=l.cursor,(e=l.find_among_b(u,62))&&(l.bra=l.cursor,n<=l.cursor)){switch(e){case 1:l.slice_del();break;case 2:l.eq_s_b(1,"ţ")&&(l.bra=l.cursor,l.slice_from("t"));break;case 3:l.slice_from("ist")}r=!0}}function k(){var e;l.ket=l.cursor,(e=l.find_among_b(i,5))&&(l.bra=l.cursor,a<=l.cursor&&1==e&&l.slice_del())}this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){var e,i=l.cursor;return function(){for(var e,i;e=l.cursor,l.in_grouping(m,97,259)&&(i=l.cursor,l.bra=i,f("u","U"),l.cursor=i,f("i","I")),l.cursor=e,!(l.cursor>=l.limit);)l.cursor++}(),l.cursor=i,e=l.cursor,a=l.limit,n=t=a,d(),l.cursor=e,b()&&(t=l.cursor,b()&&(n=l.cursor)),l.limit_backward=i,l.cursor=l.limit,function(){var e,i;if(l.ket=l.cursor,(e=l.find_among_b(s,16))&&(l.bra=l.cursor,v()))switch(e){case 1:l.slice_del();break;case 2:l.slice_from("a");break;case 3:l.slice_from("e");break;case 4:l.slice_from("i");break;case 5:i=l.limit-l.cursor,l.eq_s_b(2,"ab")||(l.cursor=l.limit-i,l.slice_from("i"));break;case 6:l.slice_from("at");break;case 7:l.slice_from("aţi")}}(),l.cursor=l.limit,g(),l.cursor=l.limit,r||(l.cursor=l.limit,function(){var e,i,r;if(l.cursor>=a){if(i=l.limit_backward,l.limit_backward=a,l.ket=l.cursor,e=l.find_among_b(w,94))switch(l.bra=l.cursor,e){case 1:if(r=l.limit-l.cursor,!l.out_grouping_b(m,97,259)&&(l.cursor=l.limit-r,!l.eq_s_b(1,"u")))break;case 2:l.slice_del()}l.limit_backward=i}}(),l.cursor=l.limit),k(),l.cursor=l.limit_backward,function(){for(var e;;){if(l.bra=l.cursor,e=l.find_among(o,3))switch(l.ket=l.cursor,e){case 1:l.slice_from("i");continue;case 2:l.slice_from("u");continue;case 3:if(l.cursor>=l.limit)break;l.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.ro.stemmer,"stemmer-ro"),e.ro.stopWordFilter=e.generateStopWordFilter("acea aceasta această aceea acei aceia acel acela acele acelea acest acesta aceste acestea aceşti aceştia acolo acord acum ai aia aibă aici al ale alea altceva altcineva am ar are asemenea asta astea astăzi asupra au avea avem aveţi azi aş aşadar aţi bine bucur bună ca care caut ce cel ceva chiar cinci cine cineva contra cu cum cumva curând curînd când cât câte câtva câţi cînd cît cîte cîtva cîţi că căci cărei căror cărui către da dacă dar datorită dată dau de deci deja deoarece departe deşi din dinaintea dintr- dintre doi doilea două drept după dă ea ei el ele eram este eu eşti face fata fi fie fiecare fii fim fiu fiţi frumos fără graţie halbă iar ieri la le li lor lui lângă lîngă mai mea mei mele mereu meu mi mie mine mult multă mulţi mulţumesc mâine mîine mă ne nevoie nici nicăieri nimeni nimeri nimic nişte noastre noastră noi noroc nostru nouă noştri nu opt ori oricare orice oricine oricum oricând oricât oricînd oricît oriunde patra patru patrulea pe pentru peste pic poate pot prea prima primul prin puţin puţina puţină până pînă rog sa sale sau se spate spre sub sunt suntem sunteţi sută sînt sîntem sînteţi să săi său ta tale te timp tine toate toată tot totuşi toţi trei treia treilea tu tăi tău un una unde undeva unei uneia unele uneori unii unor unora unu unui unuia unul vi voastre voastră voi vostru vouă voştri vreme vreo vreun vă zece zero zi zice îi îl îmi împotriva în înainte înaintea încotro încât încît între întrucât întrucît îţi ăla ălea ăsta ăstea ăştia şapte şase şi ştiu ţi ţie".split(" ")),e.Pipeline.registerFunction(e.ro.stopWordFilter,"stopWordFilter-ro")}}); \ No newline at end of file diff --git a/site/assets/javascripts/lunr/lunr.ru.js b/site/assets/javascripts/lunr/lunr.ru.js deleted file mode 100644 index ac99248..0000000 --- a/site/assets/javascripts/lunr/lunr.ru.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var h,g,n;e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWordFilter,e.ru.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ru.stemmer))},e.ru.wordCharacters="Ѐ-҄҇-ԯᴫᵸⷠ-ⷿꙀ-ꚟ︮︯",e.ru.trimmer=e.trimmerSupport.generateTrimmer(e.ru.wordCharacters),e.Pipeline.registerFunction(e.ru.trimmer,"trimmer-ru"),e.ru.stemmer=(h=e.stemmerSupport.Among,g=e.stemmerSupport.SnowballProgram,n=new function(){var n,e,r=[new h("в",-1,1),new h("ив",0,2),new h("ыв",0,2),new h("вши",-1,1),new h("ивши",3,2),new h("ывши",3,2),new h("вшись",-1,1),new h("ившись",6,2),new h("ывшись",6,2)],t=[new h("ее",-1,1),new h("ие",-1,1),new h("ое",-1,1),new h("ые",-1,1),new h("ими",-1,1),new h("ыми",-1,1),new h("ей",-1,1),new h("ий",-1,1),new h("ой",-1,1),new h("ый",-1,1),new h("ем",-1,1),new h("им",-1,1),new h("ом",-1,1),new h("ым",-1,1),new h("его",-1,1),new h("ого",-1,1),new h("ему",-1,1),new h("ому",-1,1),new h("их",-1,1),new h("ых",-1,1),new h("ею",-1,1),new h("ою",-1,1),new h("ую",-1,1),new h("юю",-1,1),new h("ая",-1,1),new h("яя",-1,1)],w=[new h("ем",-1,1),new h("нн",-1,1),new h("вш",-1,1),new h("ивш",2,2),new h("ывш",2,2),new h("щ",-1,1),new h("ющ",5,1),new h("ующ",6,2)],i=[new h("сь",-1,1),new h("ся",-1,1)],u=[new h("ла",-1,1),new h("ила",0,2),new h("ыла",0,2),new h("на",-1,1),new h("ена",3,2),new h("ете",-1,1),new h("ите",-1,2),new h("йте",-1,1),new h("ейте",7,2),new h("уйте",7,2),new h("ли",-1,1),new h("или",10,2),new h("ыли",10,2),new h("й",-1,1),new h("ей",13,2),new h("уй",13,2),new h("л",-1,1),new h("ил",16,2),new h("ыл",16,2),new h("ем",-1,1),new h("им",-1,2),new h("ым",-1,2),new h("н",-1,1),new h("ен",22,2),new h("ло",-1,1),new h("ило",24,2),new h("ыло",24,2),new h("но",-1,1),new h("ено",27,2),new h("нно",27,1),new h("ет",-1,1),new h("ует",30,2),new h("ит",-1,2),new h("ыт",-1,2),new h("ют",-1,1),new h("уют",34,2),new h("ят",-1,2),new h("ны",-1,1),new h("ены",37,2),new h("ть",-1,1),new h("ить",39,2),new h("ыть",39,2),new h("ешь",-1,1),new h("ишь",-1,2),new h("ю",-1,2),new h("ую",44,2)],s=[new h("а",-1,1),new h("ев",-1,1),new h("ов",-1,1),new h("е",-1,1),new h("ие",3,1),new h("ье",3,1),new h("и",-1,1),new h("еи",6,1),new h("ии",6,1),new h("ами",6,1),new h("ями",6,1),new h("иями",10,1),new h("й",-1,1),new h("ей",12,1),new h("ией",13,1),new h("ий",12,1),new h("ой",12,1),new h("ам",-1,1),new h("ем",-1,1),new h("ием",18,1),new h("ом",-1,1),new h("ям",-1,1),new h("иям",21,1),new h("о",-1,1),new h("у",-1,1),new h("ах",-1,1),new h("ях",-1,1),new h("иях",26,1),new h("ы",-1,1),new h("ь",-1,1),new h("ю",-1,1),new h("ию",30,1),new h("ью",30,1),new h("я",-1,1),new h("ия",33,1),new h("ья",33,1)],o=[new h("ост",-1,1),new h("ость",-1,1)],c=[new h("ейше",-1,1),new h("н",-1,2),new h("ейш",-1,1),new h("ь",-1,3)],m=[33,65,8,232],l=new g;function f(){for(;!l.in_grouping(m,1072,1103);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function a(){for(;!l.out_grouping(m,1072,1103);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function p(e,n){var r,t;if(l.ket=l.cursor,r=l.find_among_b(e,n)){switch(l.bra=l.cursor,r){case 1:if(t=l.limit-l.cursor,!l.eq_s_b(1,"а")&&(l.cursor=l.limit-t,!l.eq_s_b(1,"я")))return!1;case 2:l.slice_del()}return!0}return!1}function d(e,n){var r;return l.ket=l.cursor,!!(r=l.find_among_b(e,n))&&(l.bra=l.cursor,1==r&&l.slice_del(),!0)}function _(){return!!d(t,26)&&(p(w,8),!0)}function b(){var e;l.ket=l.cursor,(e=l.find_among_b(o,2))&&(l.bra=l.cursor,n<=l.cursor&&1==e&&l.slice_del())}this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){return e=l.limit,n=e,f()&&(e=l.cursor,a()&&f()&&a()&&(n=l.cursor)),l.cursor=l.limit,!(l.cursor>3]&1<<(7&s))return this.cursor++,!0}return!1},in_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(s<=i&&t<=s&&r[(s-=t)>>3]&1<<(7&s))return this.cursor--,!0}return!1},out_grouping:function(r,t,i){if(this.cursor>3]&1<<(7&s)))return this.cursor++,!0}return!1},out_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(i>3]&1<<(7&s)))return this.cursor--,!0}return!1},eq_s:function(r,t){if(this.limit-this.cursor>1),a=0,f=u=(l=r[i]).s_size){if(this.cursor=e+l.s_size,!l.method)return l.result;var m=l.method();if(this.cursor=e+l.s_size,m)return l.result}if((i=l.substring_i)<0)return 0}},find_among_b:function(r,t){for(var i=0,s=t,e=this.cursor,n=this.limit_backward,u=0,o=0,h=!1;;){for(var c=i+(s-i>>1),a=0,f=u=(_=r[i]).s_size){if(this.cursor=e-_.s_size,!_.method)return _.result;var m=_.method();if(this.cursor=e-_.s_size,m)return _.result}if((i=_.substring_i)<0)return 0}},replace_s:function(r,t,i){var s=i.length-(t-r);return b=b.substring(0,r)+i+b.substring(t),this.limit+=s,this.cursor>=t?this.cursor+=s:this.cursor>r&&(this.cursor=r),s},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>b.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),b.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); \ No newline at end of file diff --git a/site/assets/javascripts/lunr/lunr.sv.js b/site/assets/javascripts/lunr/lunr.sv.js deleted file mode 100644 index 6daf5f9..0000000 --- a/site/assets/javascripts/lunr/lunr.sv.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,l,n;e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=(r=e.stemmerSupport.Among,l=e.stemmerSupport.SnowballProgram,n=new function(){var n,t,i=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],s=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],o=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],u=[119,127,149],m=new l;this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var e,r=m.cursor;return function(){var e,r=m.cursor+3;if(t=m.limit,0<=r||r<=m.limit){for(n=r;;){if(e=m.cursor,m.in_grouping(o,97,246)){m.cursor=e;break}if(m.cursor=e,m.cursor>=m.limit)return;m.cursor++}for(;!m.out_grouping(o,97,246);){if(m.cursor>=m.limit)return;m.cursor++}(t=m.cursor)=t&&(m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(i,37),m.limit_backward=r,e))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.in_grouping_b(u,98,121)&&m.slice_del()}}(),m.cursor=m.limit,e=m.limit_backward,m.cursor>=t&&(m.limit_backward=t,m.cursor=m.limit,m.find_among_b(s,7)&&(m.cursor=m.limit,m.ket=m.cursor,m.cursor>m.limit_backward&&(m.bra=--m.cursor,m.slice_del())),m.limit_backward=e),m.cursor=m.limit,function(){var e,r;if(m.cursor>=t){if(r=m.limit_backward,m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(a,5))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.slice_from("lös");break;case 3:m.slice_from("full")}m.limit_backward=r}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); \ No newline at end of file diff --git a/site/assets/javascripts/lunr/lunr.th.js b/site/assets/javascripts/lunr/lunr.th.js deleted file mode 100644 index ee8ef37..0000000 --- a/site/assets/javascripts/lunr/lunr.th.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(t){if(void 0===t)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===t.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==t.version[0];t.th=function(){this.pipeline.reset(),this.pipeline.add(t.th.trimmer),i?this.tokenizer=t.th.tokenizer:(t.tokenizer&&(t.tokenizer=t.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=t.th.tokenizer))},t.th.wordCharacters="[฀-๿]",t.th.trimmer=t.trimmerSupport.generateTrimmer(t.th.wordCharacters),t.Pipeline.registerFunction(t.th.trimmer,"trimmer-th");var n=t.wordcut;n.init(),t.th.tokenizer=function(e){if(!arguments.length||null==e||null==e)return[];if(Array.isArray(e))return e.map(function(e){return i?new t.Token(e):e});var r=e.toString().replace(/^\s+/,"");return n.cut(r).split("|")}}}); \ No newline at end of file diff --git a/site/assets/javascripts/lunr/lunr.tr.js b/site/assets/javascripts/lunr/lunr.tr.js deleted file mode 100644 index e8fb5a7..0000000 --- a/site/assets/javascripts/lunr/lunr.tr.js +++ /dev/null @@ -1 +0,0 @@ -!function(r,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var mr,dr,i;r.tr=function(){this.pipeline.reset(),this.pipeline.add(r.tr.trimmer,r.tr.stopWordFilter,r.tr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.tr.stemmer))},r.tr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.tr.trimmer=r.trimmerSupport.generateTrimmer(r.tr.wordCharacters),r.Pipeline.registerFunction(r.tr.trimmer,"trimmer-tr"),r.tr.stemmer=(mr=r.stemmerSupport.Among,dr=r.stemmerSupport.SnowballProgram,i=new function(){var t,r=[new mr("m",-1,-1),new mr("n",-1,-1),new mr("miz",-1,-1),new mr("niz",-1,-1),new mr("muz",-1,-1),new mr("nuz",-1,-1),new mr("müz",-1,-1),new mr("nüz",-1,-1),new mr("mız",-1,-1),new mr("nız",-1,-1)],i=[new mr("leri",-1,-1),new mr("ları",-1,-1)],e=[new mr("ni",-1,-1),new mr("nu",-1,-1),new mr("nü",-1,-1),new mr("nı",-1,-1)],n=[new mr("in",-1,-1),new mr("un",-1,-1),new mr("ün",-1,-1),new mr("ın",-1,-1)],u=[new mr("a",-1,-1),new mr("e",-1,-1)],o=[new mr("na",-1,-1),new mr("ne",-1,-1)],s=[new mr("da",-1,-1),new mr("ta",-1,-1),new mr("de",-1,-1),new mr("te",-1,-1)],c=[new mr("nda",-1,-1),new mr("nde",-1,-1)],l=[new mr("dan",-1,-1),new mr("tan",-1,-1),new mr("den",-1,-1),new mr("ten",-1,-1)],a=[new mr("ndan",-1,-1),new mr("nden",-1,-1)],m=[new mr("la",-1,-1),new mr("le",-1,-1)],d=[new mr("ca",-1,-1),new mr("ce",-1,-1)],f=[new mr("im",-1,-1),new mr("um",-1,-1),new mr("üm",-1,-1),new mr("ım",-1,-1)],b=[new mr("sin",-1,-1),new mr("sun",-1,-1),new mr("sün",-1,-1),new mr("sın",-1,-1)],w=[new mr("iz",-1,-1),new mr("uz",-1,-1),new mr("üz",-1,-1),new mr("ız",-1,-1)],_=[new mr("siniz",-1,-1),new mr("sunuz",-1,-1),new mr("sünüz",-1,-1),new mr("sınız",-1,-1)],k=[new mr("lar",-1,-1),new mr("ler",-1,-1)],p=[new mr("niz",-1,-1),new mr("nuz",-1,-1),new mr("nüz",-1,-1),new mr("nız",-1,-1)],g=[new mr("dir",-1,-1),new mr("tir",-1,-1),new mr("dur",-1,-1),new mr("tur",-1,-1),new mr("dür",-1,-1),new mr("tür",-1,-1),new mr("dır",-1,-1),new mr("tır",-1,-1)],y=[new mr("casına",-1,-1),new mr("cesine",-1,-1)],z=[new mr("di",-1,-1),new mr("ti",-1,-1),new mr("dik",-1,-1),new mr("tik",-1,-1),new mr("duk",-1,-1),new mr("tuk",-1,-1),new mr("dük",-1,-1),new mr("tük",-1,-1),new mr("dık",-1,-1),new mr("tık",-1,-1),new mr("dim",-1,-1),new mr("tim",-1,-1),new mr("dum",-1,-1),new mr("tum",-1,-1),new mr("düm",-1,-1),new mr("tüm",-1,-1),new mr("dım",-1,-1),new mr("tım",-1,-1),new mr("din",-1,-1),new mr("tin",-1,-1),new mr("dun",-1,-1),new mr("tun",-1,-1),new mr("dün",-1,-1),new mr("tün",-1,-1),new mr("dın",-1,-1),new mr("tın",-1,-1),new mr("du",-1,-1),new mr("tu",-1,-1),new mr("dü",-1,-1),new mr("tü",-1,-1),new mr("dı",-1,-1),new mr("tı",-1,-1)],h=[new mr("sa",-1,-1),new mr("se",-1,-1),new mr("sak",-1,-1),new mr("sek",-1,-1),new mr("sam",-1,-1),new mr("sem",-1,-1),new mr("san",-1,-1),new mr("sen",-1,-1)],v=[new mr("miş",-1,-1),new mr("muş",-1,-1),new mr("müş",-1,-1),new mr("mış",-1,-1)],q=[new mr("b",-1,1),new mr("c",-1,2),new mr("d",-1,3),new mr("ğ",-1,4)],C=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,8,0,0,0,0,0,0,1],P=[1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1],F=[65],S=[65],W=[["a",[1,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],97,305],["e",[17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130],101,252],["ı",[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],97,305],["i",[17],101,105],["o",F,111,117],["ö",S,246,252],["u",F,111,117]],L=new dr;function x(r,i,e){for(;;){var n=L.limit-L.cursor;if(L.in_grouping_b(r,i,e)){L.cursor=L.limit-n;break}if(L.cursor=L.limit-n,L.cursor<=L.limit_backward)return!1;L.cursor--}return!0}function A(){var r,i;r=L.limit-L.cursor,x(C,97,305);for(var e=0;eL.limit_backward&&(L.cursor--,e=L.limit-L.cursor,i()))?(L.cursor=L.limit-e,!0):(L.cursor=L.limit-n,r()?(L.cursor=L.limit-n,!1):(L.cursor=L.limit-n,!(L.cursor<=L.limit_backward)&&(L.cursor--,!!i()&&(L.cursor=L.limit-n,!0))))}function j(r){return E(r,function(){return L.in_grouping_b(C,97,305)})}function T(){return j(function(){return L.eq_s_b(1,"n")})}function Z(){return j(function(){return L.eq_s_b(1,"y")})}function B(){return L.find_among_b(r,10)&&E(function(){return L.in_grouping_b(P,105,305)},function(){return L.out_grouping_b(C,97,305)})}function D(){return A()&&L.in_grouping_b(P,105,305)&&j(function(){return L.eq_s_b(1,"s")})}function G(){return L.find_among_b(i,2)}function H(){return A()&&L.find_among_b(n,4)&&T()}function I(){return A()&&L.find_among_b(s,4)}function J(){return A()&&L.find_among_b(c,2)}function K(){return A()&&L.find_among_b(f,4)&&Z()}function M(){return A()&&L.find_among_b(b,4)}function N(){return A()&&L.find_among_b(w,4)&&Z()}function O(){return L.find_among_b(_,4)}function Q(){return A()&&L.find_among_b(k,2)}function R(){return A()&&L.find_among_b(g,8)}function U(){return A()&&L.find_among_b(z,32)&&Z()}function V(){return L.find_among_b(h,8)&&Z()}function X(){return A()&&L.find_among_b(v,4)&&Z()}function Y(){var r=L.limit-L.cursor;return!(X()||(L.cursor=L.limit-r,U()||(L.cursor=L.limit-r,V()||(L.cursor=L.limit-r,L.eq_s_b(3,"ken")&&Z()))))}function $(){if(L.find_among_b(y,2)){var r=L.limit-L.cursor;if(O()||(L.cursor=L.limit-r,Q()||(L.cursor=L.limit-r,K()||(L.cursor=L.limit-r,M()||(L.cursor=L.limit-r,N()||(L.cursor=L.limit-r))))),X())return!1}return!0}function rr(){if(!A()||!L.find_among_b(p,4))return!0;var r=L.limit-L.cursor;return!U()&&(L.cursor=L.limit-r,!V())}function ir(){var r,i,e,n=L.limit-L.cursor;if(L.ket=L.cursor,t=!0,Y()&&(L.cursor=L.limit-n,$()&&(L.cursor=L.limit-n,function(){if(Q()){L.bra=L.cursor,L.slice_del();var r=L.limit-L.cursor;return L.ket=L.cursor,R()||(L.cursor=L.limit-r,U()||(L.cursor=L.limit-r,V()||(L.cursor=L.limit-r,X()||(L.cursor=L.limit-r)))),t=!1}return!0}()&&(L.cursor=L.limit-n,rr()&&(L.cursor=L.limit-n,e=L.limit-L.cursor,!(O()||(L.cursor=L.limit-e,N()||(L.cursor=L.limit-e,M()||(L.cursor=L.limit-e,K()))))||(L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,X()||(L.cursor=L.limit-i),0)))))){if(L.cursor=L.limit-n,!R())return;L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,r=L.limit-L.cursor,O()||(L.cursor=L.limit-r,Q()||(L.cursor=L.limit-r,K()||(L.cursor=L.limit-r,M()||(L.cursor=L.limit-r,N()||(L.cursor=L.limit-r))))),X()||(L.cursor=L.limit-r)}L.bra=L.cursor,L.slice_del()}function er(){var r,i,e,n;if(L.ket=L.cursor,L.eq_s_b(2,"ki")){if(r=L.limit-L.cursor,I())return L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,Q()?(L.bra=L.cursor,L.slice_del(),er()):(L.cursor=L.limit-i,B()&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()))),!0;if(L.cursor=L.limit-r,H()){if(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,e=L.limit-L.cursor,G())L.bra=L.cursor,L.slice_del();else{if(L.cursor=L.limit-e,L.ket=L.cursor,!B()&&(L.cursor=L.limit-e,!D()&&(L.cursor=L.limit-e,!er())))return!0;L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())}return!0}if(L.cursor=L.limit-r,J()){if(n=L.limit-L.cursor,G())L.bra=L.cursor,L.slice_del();else if(L.cursor=L.limit-n,D())L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er());else if(L.cursor=L.limit-n,!er())return!1;return!0}}return!1}function nr(r){if(L.ket=L.cursor,!J()&&(L.cursor=L.limit-r,!A()||!L.find_among_b(o,2)))return!1;var i=L.limit-L.cursor;if(G())L.bra=L.cursor,L.slice_del();else if(L.cursor=L.limit-i,D())L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er());else if(L.cursor=L.limit-i,!er())return!1;return!0}function tr(r){if(L.ket=L.cursor,!(A()&&L.find_among_b(a,2)||(L.cursor=L.limit-r,A()&&L.find_among_b(e,4))))return!1;var i=L.limit-L.cursor;return!(!D()&&(L.cursor=L.limit-i,!G()))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()),!0)}function ur(){var r,i=L.limit-L.cursor;return L.ket=L.cursor,!!(H()||(L.cursor=L.limit-i,A()&&L.find_among_b(m,2)&&Z()))&&(L.bra=L.cursor,L.slice_del(),r=L.limit-L.cursor,L.ket=L.cursor,!(!Q()||(L.bra=L.cursor,L.slice_del(),!er()))||(L.cursor=L.limit-r,L.ket=L.cursor,(B()||(L.cursor=L.limit-r,D()||(L.cursor=L.limit-r,er())))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())),!0))}function or(){var r,i,e=L.limit-L.cursor;if(L.ket=L.cursor,!(I()||(L.cursor=L.limit-e,A()&&L.in_grouping_b(P,105,305)&&Z()||(L.cursor=L.limit-e,A()&&L.find_among_b(u,2)&&Z()))))return!1;if(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,r=L.limit-L.cursor,B())L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,Q()||(L.cursor=L.limit-i);else if(L.cursor=L.limit-r,!Q())return!0;return L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,er(),!0}function sr(){var r,i,e=L.limit-L.cursor;if(L.ket=L.cursor,Q())return L.bra=L.cursor,L.slice_del(),void er();if(L.cursor=L.limit-e,L.ket=L.cursor,A()&&L.find_among_b(d,2)&&T())if(L.bra=L.cursor,L.slice_del(),r=L.limit-L.cursor,L.ket=L.cursor,G())L.bra=L.cursor,L.slice_del();else{if(L.cursor=L.limit-r,L.ket=L.cursor,!B()&&(L.cursor=L.limit-r,!D())){if(L.cursor=L.limit-r,L.ket=L.cursor,!Q())return;if(L.bra=L.cursor,L.slice_del(),!er())return}L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())}else if(L.cursor=L.limit-e,!nr(e)&&(L.cursor=L.limit-e,!tr(e))){if(L.cursor=L.limit-e,L.ket=L.cursor,A()&&L.find_among_b(l,4))return L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,i=L.limit-L.cursor,void(B()?(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())):(L.cursor=L.limit-i,Q()?(L.bra=L.cursor,L.slice_del()):L.cursor=L.limit-i,er()));if(L.cursor=L.limit-e,!ur()){if(L.cursor=L.limit-e,G())return L.bra=L.cursor,void L.slice_del();L.cursor=L.limit-e,er()||(L.cursor=L.limit-e,or()||(L.cursor=L.limit-e,L.ket=L.cursor,(B()||(L.cursor=L.limit-e,D()))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()))))}}}function cr(r,i,e){if(L.cursor=L.limit-r,function(){for(;;){var r=L.limit-L.cursor;if(L.in_grouping_b(C,97,305)){L.cursor=L.limit-r;break}if(L.cursor=L.limit-r,L.cursor<=L.limit_backward)return!1;L.cursor--}return!0}()){var n=L.limit-L.cursor;if(!L.eq_s_b(1,i)&&(L.cursor=L.limit-n,!L.eq_s_b(1,e)))return!0;L.cursor=L.limit-r;var t=L.cursor;return L.insert(L.cursor,L.cursor,e),L.cursor=t,!1}return!0}function lr(r,i,e){for(;!L.eq_s(i,e);){if(L.cursor>=L.limit)return!0;L.cursor++}return i!=L.limit||(L.cursor=r,!1)}function ar(){var r,i,e=L.cursor;return!(!lr(r=L.cursor,2,"ad")||!lr(L.cursor=r,5,"soyad"))&&(L.limit_backward=e,L.cursor=L.limit,i=L.limit-L.cursor,(L.eq_s_b(1,"d")||(L.cursor=L.limit-i,L.eq_s_b(1,"g")))&&cr(i,"a","ı")&&cr(i,"e","i")&&cr(i,"o","u")&&cr(i,"ö","ü"),L.cursor=L.limit,function(){var r;if(L.ket=L.cursor,r=L.find_among_b(q,4))switch(L.bra=L.cursor,r){case 1:L.slice_from("p");break;case 2:L.slice_from("ç");break;case 3:L.slice_from("t");break;case 4:L.slice_from("k")}}(),!0)}this.setCurrent=function(r){L.setCurrent(r)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){return!!(function(){for(var r,i=L.cursor,e=2;;){for(r=L.cursor;!L.in_grouping(C,97,305);){if(L.cursor>=L.limit)return L.cursor=r,!(0e&&(this._events[n].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[n].length),"function"==typeof console.trace&&console.trace()));return this},r.prototype.once=function(n,t){if(!a(t))throw TypeError("listener must be a function");var e=!1;function r(){this.removeListener(n,r),e||(e=!0,t.apply(this,arguments))}return r.listener=t,this.on(n,r),this},r.prototype.removeListener=function(n,t){var e,r,i,o;if(!a(t))throw TypeError("listener must be a function");if(!this._events||!this._events[n])return this;if(i=(e=this._events[n]).length,r=-1,e===t||a(e.listener)&&e.listener===t)delete this._events[n],this._events.removeListener&&this.emit("removeListener",n,t);else if(c(e)){for(o=i;0this.maxLength)return i();if(!this.stat&&p(this.cache,o)){var t=this.cache[o];if(Array.isArray(t)&&(t="DIR"),!n||"DIR"===t)return i(null,t);if(n&&"FILE"===t)return i()}var e=this.statCache[o];if(void 0!==e){if(!1===e)return i(null,e);var s=e.isDirectory()?"DIR":"FILE";return n&&"FILE"===s?i():i(null,s,e)}var a=this,c=d("stat\0"+o,function(n,e){{if(e&&e.isSymbolicLink())return u.stat(o,function(n,t){n?a._stat2(r,o,null,e,i):a._stat2(r,o,n,t,i)});a._stat2(r,o,n,e,i)}});c&&u.lstat(o,c)},b.prototype._stat2=function(n,t,e,r,i){if(e)return this.statCache[t]=!1,i();var o="/"===n.slice(-1);if(this.statCache[t]=r,"/"===t.slice(-1)&&!r.isDirectory())return i(null,!1,r);var s=r.isDirectory()?"DIR":"FILE";return this.cache[t]=this.cache[t]||s,o&&"DIR"!==s?i():i(null,s,r)}}).call(this,_("_process"))},{"./common.js":15,"./sync.js":17,_process:24,assert:9,events:14,fs:12,inflight:18,inherits:19,minimatch:20,once:21,path:22,"path-is-absolute":23,util:28}],17:[function(e,r,n){(function(i){(r.exports=n).GlobSync=h;var s=e("fs"),c=e("minimatch"),g=(c.Minimatch,e("./glob.js").Glob,e("util"),e("path")),u=e("assert"),l=e("path-is-absolute"),t=e("./common.js"),o=(t.alphasort,t.alphasorti,t.setopts),a=t.ownProp,f=t.childrenIgnored;function n(n,t){if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");return new h(n,t).found}function h(n,t){if(!n)throw new Error("must provide pattern");if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");if(!(this instanceof h))return new h(n,t);if(o(this,n,t),this.noprocess)return this;var e=this.minimatch.set.length;this.matches=new Array(e);for(var r=0;rthis.maxLength)return!1;if(!this.stat&&a(this.cache,t)){var r=this.cache[t];if(Array.isArray(r)&&(r="DIR"),!e||"DIR"===r)return r;if(e&&"FILE"===r)return!1}var i=this.statCache[t];if(!i){var o;try{o=s.lstatSync(t)}catch(n){return!1}if(o.isSymbolicLink())try{i=s.statSync(t)}catch(n){i=o}else i=o}r=(this.statCache[t]=i).isDirectory()?"DIR":"FILE";return this.cache[t]=this.cache[t]||r,(!e||"DIR"===r)&&r},h.prototype._mark=function(n){return t.mark(this,n)},h.prototype._makeAbs=function(n){return t.makeAbs(this,n)}}).call(this,e("_process"))},{"./common.js":15,"./glob.js":16,_process:24,assert:9,fs:12,minimatch:20,path:22,"path-is-absolute":23,util:28}],18:[function(t,r,n){(function(s){var n=t("wrappy"),a=Object.create(null),e=t("once");r.exports=n(function(n,t){return a[n]?(a[n].push(t),null):(a[n]=[t],o=n,e(function n(){var t=a[o],e=t.length,r=function(n){for(var t=n.length,e=[],r=0;re?(t.splice(0,e),s.nextTick(function(){n.apply(null,r)})):delete a[o]}}));var o})}).call(this,t("_process"))},{_process:24,once:21,wrappy:29}],19:[function(n,t,e){"function"==typeof Object.create?t.exports=function(n,t){n.super_=t,n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(n,t){n.super_=t;var e=function(){};e.prototype=t.prototype,n.prototype=new e,n.prototype.constructor=n}},{}],20:[function(n,t,e){(t.exports=s).Minimatch=i;var u={sep:"/"};try{u=n("path")}catch(n){}var M=s.GLOBSTAR=i.GLOBSTAR={},r=n("brace-expansion"),C={"!":{open:"(?:(?!(?:",close:"))[^/]*?)"},"?":{open:"(?:",close:")?"},"+":{open:"(?:",close:")+"},"*":{open:"(?:",close:")*"},"@":{open:"(?:",close:")"}},P="[^/]",z=P+"*?",B="().*{}+?[]^$\\!".split("").reduce(function(n,t){return n[t]=!0,n},{});var l=/\/+/;function o(t,e){t=t||{},e=e||{};var r={};return Object.keys(e).forEach(function(n){r[n]=e[n]}),Object.keys(t).forEach(function(n){r[n]=t[n]}),r}function s(n,t,e){if("string"!=typeof t)throw new TypeError("glob pattern string required");return e||(e={}),!(!e.nocomment&&"#"===t.charAt(0))&&(""===t.trim()?""===n:new i(t,e).match(n))}function i(n,t){if(!(this instanceof i))return new i(n,t);if("string"!=typeof n)throw new TypeError("glob pattern string required");t||(t={}),n=n.trim(),"/"!==u.sep&&(n=n.split(u.sep).join("/")),this.options=t,this.set=[],this.pattern=n,this.regexp=null,this.negate=!1,this.comment=!1,this.empty=!1,this.make()}function a(n,t){if(t||(t=this instanceof i?this.options:{}),void 0===(n=void 0===n?this.pattern:n))throw new TypeError("undefined pattern");return t.nobrace||!n.match(/\{.*\}/)?[n]:r(n)}s.filter=function(r,i){return i=i||{},function(n,t,e){return s(n,r,i)}},s.defaults=function(r){if(!r||!Object.keys(r).length)return s;var i=s,n=function(n,t,e){return i.minimatch(n,t,o(r,e))};return n.Minimatch=function(n,t){return new i.Minimatch(n,o(r,t))},n},i.defaults=function(n){return n&&Object.keys(n).length?s.defaults(n).Minimatch:i},i.prototype.debug=function(){},i.prototype.make=function(){if(this._made)return;var n=this.pattern,t=this.options;if(!t.nocomment&&"#"===n.charAt(0))return void(this.comment=!0);if(!n)return void(this.empty=!0);this.parseNegate();var e=this.globSet=this.braceExpand();t.debug&&(this.debug=console.error);this.debug(this.pattern,e),e=this.globParts=e.map(function(n){return n.split(l)}),this.debug(this.pattern,e),e=e.map(function(n,t,e){return n.map(this.parse,this)},this),this.debug(this.pattern,e),e=e.filter(function(n){return-1===n.indexOf(!1)}),this.debug(this.pattern,e),this.set=e},i.prototype.parseNegate=function(){var n=this.pattern,t=!1,e=this.options,r=0;if(e.nonegate)return;for(var i=0,o=n.length;i>> no match, partial?",n,f,t,h),f!==s))}if("string"==typeof u?(c=r.nocase?l.toLowerCase()===u.toLowerCase():l===u,this.debug("string match",u,l,c)):(c=l.match(u),this.debug("pattern match",u,l,c)),!c)return!1}if(i===s&&o===a)return!0;if(i===s)return e;if(o===a)return i===s-1&&""===n[i];throw new Error("wtf?")}},{"brace-expansion":11,path:22}],21:[function(n,t,e){var r=n("wrappy");function i(n){var t=function(){return t.called?t.value:(t.called=!0,t.value=n.apply(this,arguments))};return t.called=!1,t}function o(n){var t=function(){if(t.called)throw new Error(t.onceError);return t.called=!0,t.value=n.apply(this,arguments)},e=n.name||"Function wrapped with `once`";return t.onceError=e+" shouldn't be called more than once",t.called=!1,t}t.exports=r(i),t.exports.strict=r(o),i.proto=i(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return i(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return o(this)},configurable:!0})})},{wrappy:29}],22:[function(n,t,u){(function(i){function o(n,t){for(var e=0,r=n.length-1;0<=r;r--){var i=n[r];"."===i?n.splice(r,1):".."===i?(n.splice(r,1),e++):e&&(n.splice(r,1),e--)}if(t)for(;e--;e)n.unshift("..");return n}var t=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,s=function(n){return t.exec(n).slice(1)};function a(n,t){if(n.filter)return n.filter(t);for(var e=[],r=0;r":">",'"':""","'":"'","`":"`"},D=d.invert(N),F=function(t){var e=function(n){return t[n]},n="(?:"+d.keys(t).join("|")+")",r=RegExp(n),i=RegExp(n,"g");return function(n){return n=null==n?"":""+n,r.test(n)?n.replace(i,e):n}};d.escape=F(N),d.unescape=F(D),d.result=function(n,t,e){var r=null==n?void 0:n[t];return void 0===r&&(r=e),d.isFunction(r)?r.call(n):r};var M=0;d.uniqueId=function(n){var t=++M+"";return n?n+t:t},d.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var C=/(.)^/,P={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},z=/\\|'|\r|\n|\u2028|\u2029/g,B=function(n){return"\\"+P[n]};d.template=function(o,n,t){!n&&t&&(n=t),n=d.defaults({},n,d.templateSettings);var e=RegExp([(n.escape||C).source,(n.interpolate||C).source,(n.evaluate||C).source].join("|")+"|$","g"),s=0,a="__p+='";o.replace(e,function(n,t,e,r,i){return a+=o.slice(s,i).replace(z,B),s=i+n.length,t?a+="'+\n((__t=("+t+"))==null?'':_.escape(__t))+\n'":e?a+="'+\n((__t=("+e+"))==null?'':__t)+\n'":r&&(a+="';\n"+r+"\n__p+='"),n}),a+="';\n",n.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{var r=new Function(n.variable||"obj","_",a)}catch(n){throw n.source=a,n}var i=function(n){return r.call(this,n,d)},c=n.variable||"obj";return i.source="function("+c+"){\n"+a+"}",i},d.chain=function(n){var t=d(n);return t._chain=!0,t};var U=function(n,t){return n._chain?d(t).chain():t};d.mixin=function(e){d.each(d.functions(e),function(n){var t=d[n]=e[n];d.prototype[n]=function(){var n=[this._wrapped];return i.apply(n,arguments),U(this,t.apply(d,n))}})},d.mixin(d),d.each(["pop","push","reverse","shift","sort","splice","unshift"],function(t){var e=r[t];d.prototype[t]=function(){var n=this._wrapped;return e.apply(n,arguments),"shift"!==t&&"splice"!==t||0!==n.length||delete n[0],U(this,n)}}),d.each(["concat","join","slice"],function(n){var t=r[n];d.prototype[n]=function(){return U(this,t.apply(this._wrapped,arguments))}}),d.prototype.value=function(){return this._wrapped},d.prototype.valueOf=d.prototype.toJSON=d.prototype.value,d.prototype.toString=function(){return""+this._wrapped}}).call(this)},{}],26:[function(n,t,e){arguments[4][19][0].apply(e,arguments)},{dup:19}],27:[function(n,t,e){t.exports=function(n){return n&&"object"==typeof n&&"function"==typeof n.copy&&"function"==typeof n.fill&&"function"==typeof n.readUInt8}},{}],28:[function(h,n,k){(function(r,i){var a=/%[sdj%]/g;k.format=function(n){if(!_(n)){for(var t=[],e=0;e.md-nav__link{color:inherit}button[data-md-color-primary=pink]{background-color:#e91e63}[data-md-color-primary=pink] .md-typeset a{color:#e91e63}[data-md-color-primary=pink] .md-header,[data-md-color-primary=pink] .md-hero{background-color:#e91e63}[data-md-color-primary=pink] .md-nav__link--active,[data-md-color-primary=pink] .md-nav__link:active{color:#e91e63}[data-md-color-primary=pink] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=purple]{background-color:#ab47bc}[data-md-color-primary=purple] .md-typeset a{color:#ab47bc}[data-md-color-primary=purple] .md-header,[data-md-color-primary=purple] .md-hero{background-color:#ab47bc}[data-md-color-primary=purple] .md-nav__link--active,[data-md-color-primary=purple] .md-nav__link:active{color:#ab47bc}[data-md-color-primary=purple] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=deep-purple]{background-color:#7e57c2}[data-md-color-primary=deep-purple] .md-typeset a{color:#7e57c2}[data-md-color-primary=deep-purple] .md-header,[data-md-color-primary=deep-purple] .md-hero{background-color:#7e57c2}[data-md-color-primary=deep-purple] .md-nav__link--active,[data-md-color-primary=deep-purple] .md-nav__link:active{color:#7e57c2}[data-md-color-primary=deep-purple] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=indigo]{background-color:#3f51b5}[data-md-color-primary=indigo] .md-typeset a{color:#3f51b5}[data-md-color-primary=indigo] .md-header,[data-md-color-primary=indigo] .md-hero{background-color:#3f51b5}[data-md-color-primary=indigo] .md-nav__link--active,[data-md-color-primary=indigo] .md-nav__link:active{color:#3f51b5}[data-md-color-primary=indigo] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=blue]{background-color:#2196f3}[data-md-color-primary=blue] .md-typeset a{color:#2196f3}[data-md-color-primary=blue] .md-header,[data-md-color-primary=blue] .md-hero{background-color:#2196f3}[data-md-color-primary=blue] .md-nav__link--active,[data-md-color-primary=blue] .md-nav__link:active{color:#2196f3}[data-md-color-primary=blue] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=light-blue]{background-color:#03a9f4}[data-md-color-primary=light-blue] .md-typeset a{color:#03a9f4}[data-md-color-primary=light-blue] .md-header,[data-md-color-primary=light-blue] .md-hero{background-color:#03a9f4}[data-md-color-primary=light-blue] .md-nav__link--active,[data-md-color-primary=light-blue] .md-nav__link:active{color:#03a9f4}[data-md-color-primary=light-blue] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=cyan]{background-color:#00bcd4}[data-md-color-primary=cyan] .md-typeset a{color:#00bcd4}[data-md-color-primary=cyan] .md-header,[data-md-color-primary=cyan] .md-hero{background-color:#00bcd4}[data-md-color-primary=cyan] .md-nav__link--active,[data-md-color-primary=cyan] .md-nav__link:active{color:#00bcd4}[data-md-color-primary=cyan] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=teal]{background-color:#009688}[data-md-color-primary=teal] .md-typeset a{color:#009688}[data-md-color-primary=teal] .md-header,[data-md-color-primary=teal] .md-hero{background-color:#009688}[data-md-color-primary=teal] .md-nav__link--active,[data-md-color-primary=teal] .md-nav__link:active{color:#009688}[data-md-color-primary=teal] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=green]{background-color:#4caf50}[data-md-color-primary=green] .md-typeset a{color:#4caf50}[data-md-color-primary=green] .md-header,[data-md-color-primary=green] .md-hero{background-color:#4caf50}[data-md-color-primary=green] .md-nav__link--active,[data-md-color-primary=green] .md-nav__link:active{color:#4caf50}[data-md-color-primary=green] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=light-green]{background-color:#7cb342}[data-md-color-primary=light-green] .md-typeset a{color:#7cb342}[data-md-color-primary=light-green] .md-header,[data-md-color-primary=light-green] .md-hero{background-color:#7cb342}[data-md-color-primary=light-green] .md-nav__link--active,[data-md-color-primary=light-green] .md-nav__link:active{color:#7cb342}[data-md-color-primary=light-green] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=lime]{background-color:#c0ca33}[data-md-color-primary=lime] .md-typeset a{color:#c0ca33}[data-md-color-primary=lime] .md-header,[data-md-color-primary=lime] .md-hero{background-color:#c0ca33}[data-md-color-primary=lime] .md-nav__link--active,[data-md-color-primary=lime] .md-nav__link:active{color:#c0ca33}[data-md-color-primary=lime] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=yellow]{background-color:#f9a825}[data-md-color-primary=yellow] .md-typeset a{color:#f9a825}[data-md-color-primary=yellow] .md-header,[data-md-color-primary=yellow] .md-hero{background-color:#f9a825}[data-md-color-primary=yellow] .md-nav__link--active,[data-md-color-primary=yellow] .md-nav__link:active{color:#f9a825}[data-md-color-primary=yellow] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=amber]{background-color:#ffa000}[data-md-color-primary=amber] .md-typeset a{color:#ffa000}[data-md-color-primary=amber] .md-header,[data-md-color-primary=amber] .md-hero{background-color:#ffa000}[data-md-color-primary=amber] .md-nav__link--active,[data-md-color-primary=amber] .md-nav__link:active{color:#ffa000}[data-md-color-primary=amber] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=orange]{background-color:#fb8c00}[data-md-color-primary=orange] .md-typeset a{color:#fb8c00}[data-md-color-primary=orange] .md-header,[data-md-color-primary=orange] .md-hero{background-color:#fb8c00}[data-md-color-primary=orange] .md-nav__link--active,[data-md-color-primary=orange] .md-nav__link:active{color:#fb8c00}[data-md-color-primary=orange] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=deep-orange]{background-color:#ff7043}[data-md-color-primary=deep-orange] .md-typeset a{color:#ff7043}[data-md-color-primary=deep-orange] .md-header,[data-md-color-primary=deep-orange] .md-hero{background-color:#ff7043}[data-md-color-primary=deep-orange] .md-nav__link--active,[data-md-color-primary=deep-orange] .md-nav__link:active{color:#ff7043}[data-md-color-primary=deep-orange] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=brown]{background-color:#795548}[data-md-color-primary=brown] .md-typeset a{color:#795548}[data-md-color-primary=brown] .md-header,[data-md-color-primary=brown] .md-hero{background-color:#795548}[data-md-color-primary=brown] .md-nav__link--active,[data-md-color-primary=brown] .md-nav__link:active{color:#795548}[data-md-color-primary=brown] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=grey]{background-color:#757575}[data-md-color-primary=grey] .md-typeset a{color:#757575}[data-md-color-primary=grey] .md-header,[data-md-color-primary=grey] .md-hero{background-color:#757575}[data-md-color-primary=grey] .md-nav__link--active,[data-md-color-primary=grey] .md-nav__link:active{color:#757575}[data-md-color-primary=grey] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=blue-grey]{background-color:#546e7a}[data-md-color-primary=blue-grey] .md-typeset a{color:#546e7a}[data-md-color-primary=blue-grey] .md-header,[data-md-color-primary=blue-grey] .md-hero{background-color:#546e7a}[data-md-color-primary=blue-grey] .md-nav__link--active,[data-md-color-primary=blue-grey] .md-nav__link:active{color:#546e7a}[data-md-color-primary=blue-grey] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=white]{box-shadow:inset 0 0 .05rem rgba(0,0,0,.54)}[data-md-color-primary=white] .md-header,[data-md-color-primary=white] .md-hero,button[data-md-color-primary=white]{background-color:#fff;color:rgba(0,0,0,.87)}[data-md-color-primary=white] .md-hero--expand{border-bottom:.05rem solid rgba(0,0,0,.07)}[data-md-color-primary=black] .md-header,[data-md-color-primary=black] .md-hero,button[data-md-color-primary=black]{background-color:#000}button[data-md-color-accent=red]{background-color:#ff1744}[data-md-color-accent=red] .md-typeset a:active,[data-md-color-accent=red] .md-typeset a:hover{color:#ff1744}[data-md-color-accent=red] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=red] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#ff1744}[data-md-color-accent=red] .md-nav__link:focus,[data-md-color-accent=red] .md-nav__link:hover,[data-md-color-accent=red] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=red] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=red] .md-typeset .md-clipboard:active:before,[data-md-color-accent=red] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=red] .md-typeset [id] .headerlink:focus,[data-md-color-accent=red] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=red] .md-typeset [id]:target .headerlink{color:#ff1744}[data-md-color-accent=red] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff1744}[data-md-color-accent=red] .md-search-result__link:hover,[data-md-color-accent=red] .md-search-result__link[data-md-state=active]{background-color:rgba(255,23,68,.1)}[data-md-color-accent=red] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff1744}[data-md-color-accent=red] .md-source-file:hover:before{background-color:#ff1744}button[data-md-color-accent=pink]{background-color:#f50057}[data-md-color-accent=pink] .md-typeset a:active,[data-md-color-accent=pink] .md-typeset a:hover{color:#f50057}[data-md-color-accent=pink] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=pink] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#f50057}[data-md-color-accent=pink] .md-nav__link:focus,[data-md-color-accent=pink] .md-nav__link:hover,[data-md-color-accent=pink] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=pink] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=pink] .md-typeset .md-clipboard:active:before,[data-md-color-accent=pink] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=pink] .md-typeset [id] .headerlink:focus,[data-md-color-accent=pink] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=pink] .md-typeset [id]:target .headerlink{color:#f50057}[data-md-color-accent=pink] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#f50057}[data-md-color-accent=pink] .md-search-result__link:hover,[data-md-color-accent=pink] .md-search-result__link[data-md-state=active]{background-color:rgba(245,0,87,.1)}[data-md-color-accent=pink] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#f50057}[data-md-color-accent=pink] .md-source-file:hover:before{background-color:#f50057}button[data-md-color-accent=purple]{background-color:#e040fb}[data-md-color-accent=purple] .md-typeset a:active,[data-md-color-accent=purple] .md-typeset a:hover{color:#e040fb}[data-md-color-accent=purple] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=purple] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#e040fb}[data-md-color-accent=purple] .md-nav__link:focus,[data-md-color-accent=purple] .md-nav__link:hover,[data-md-color-accent=purple] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=purple] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=purple] .md-typeset .md-clipboard:active:before,[data-md-color-accent=purple] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=purple] .md-typeset [id] .headerlink:focus,[data-md-color-accent=purple] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=purple] .md-typeset [id]:target .headerlink{color:#e040fb}[data-md-color-accent=purple] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#e040fb}[data-md-color-accent=purple] .md-search-result__link:hover,[data-md-color-accent=purple] .md-search-result__link[data-md-state=active]{background-color:rgba(224,64,251,.1)}[data-md-color-accent=purple] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#e040fb}[data-md-color-accent=purple] .md-source-file:hover:before{background-color:#e040fb}button[data-md-color-accent=deep-purple]{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-typeset a:active,[data-md-color-accent=deep-purple] .md-typeset a:hover{color:#7c4dff}[data-md-color-accent=deep-purple] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=deep-purple] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-nav__link:focus,[data-md-color-accent=deep-purple] .md-nav__link:hover,[data-md-color-accent=deep-purple] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=deep-purple] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=deep-purple] .md-typeset .md-clipboard:active:before,[data-md-color-accent=deep-purple] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=deep-purple] .md-typeset [id] .headerlink:focus,[data-md-color-accent=deep-purple] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=deep-purple] .md-typeset [id]:target .headerlink{color:#7c4dff}[data-md-color-accent=deep-purple] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-search-result__link:hover,[data-md-color-accent=deep-purple] .md-search-result__link[data-md-state=active]{background-color:rgba(124,77,255,.1)}[data-md-color-accent=deep-purple] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-source-file:hover:before{background-color:#7c4dff}button[data-md-color-accent=indigo]{background-color:#536dfe}[data-md-color-accent=indigo] .md-typeset a:active,[data-md-color-accent=indigo] .md-typeset a:hover{color:#536dfe}[data-md-color-accent=indigo] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=indigo] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#536dfe}[data-md-color-accent=indigo] .md-nav__link:focus,[data-md-color-accent=indigo] .md-nav__link:hover,[data-md-color-accent=indigo] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=indigo] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=indigo] .md-typeset .md-clipboard:active:before,[data-md-color-accent=indigo] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=indigo] .md-typeset [id] .headerlink:focus,[data-md-color-accent=indigo] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=indigo] .md-typeset [id]:target .headerlink{color:#536dfe}[data-md-color-accent=indigo] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}[data-md-color-accent=indigo] .md-search-result__link:hover,[data-md-color-accent=indigo] .md-search-result__link[data-md-state=active]{background-color:rgba(83,109,254,.1)}[data-md-color-accent=indigo] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}[data-md-color-accent=indigo] .md-source-file:hover:before{background-color:#536dfe}button[data-md-color-accent=blue]{background-color:#448aff}[data-md-color-accent=blue] .md-typeset a:active,[data-md-color-accent=blue] .md-typeset a:hover{color:#448aff}[data-md-color-accent=blue] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=blue] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#448aff}[data-md-color-accent=blue] .md-nav__link:focus,[data-md-color-accent=blue] .md-nav__link:hover,[data-md-color-accent=blue] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=blue] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=blue] .md-typeset .md-clipboard:active:before,[data-md-color-accent=blue] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=blue] .md-typeset [id] .headerlink:focus,[data-md-color-accent=blue] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=blue] .md-typeset [id]:target .headerlink{color:#448aff}[data-md-color-accent=blue] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#448aff}[data-md-color-accent=blue] .md-search-result__link:hover,[data-md-color-accent=blue] .md-search-result__link[data-md-state=active]{background-color:rgba(68,138,255,.1)}[data-md-color-accent=blue] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#448aff}[data-md-color-accent=blue] .md-source-file:hover:before{background-color:#448aff}button[data-md-color-accent=light-blue]{background-color:#0091ea}[data-md-color-accent=light-blue] .md-typeset a:active,[data-md-color-accent=light-blue] .md-typeset a:hover{color:#0091ea}[data-md-color-accent=light-blue] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=light-blue] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#0091ea}[data-md-color-accent=light-blue] .md-nav__link:focus,[data-md-color-accent=light-blue] .md-nav__link:hover,[data-md-color-accent=light-blue] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=light-blue] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=light-blue] .md-typeset .md-clipboard:active:before,[data-md-color-accent=light-blue] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=light-blue] .md-typeset [id] .headerlink:focus,[data-md-color-accent=light-blue] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=light-blue] .md-typeset [id]:target .headerlink{color:#0091ea}[data-md-color-accent=light-blue] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#0091ea}[data-md-color-accent=light-blue] .md-search-result__link:hover,[data-md-color-accent=light-blue] .md-search-result__link[data-md-state=active]{background-color:rgba(0,145,234,.1)}[data-md-color-accent=light-blue] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#0091ea}[data-md-color-accent=light-blue] .md-source-file:hover:before{background-color:#0091ea}button[data-md-color-accent=cyan]{background-color:#00b8d4}[data-md-color-accent=cyan] .md-typeset a:active,[data-md-color-accent=cyan] .md-typeset a:hover{color:#00b8d4}[data-md-color-accent=cyan] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=cyan] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#00b8d4}[data-md-color-accent=cyan] .md-nav__link:focus,[data-md-color-accent=cyan] .md-nav__link:hover,[data-md-color-accent=cyan] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=cyan] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=cyan] .md-typeset .md-clipboard:active:before,[data-md-color-accent=cyan] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=cyan] .md-typeset [id] .headerlink:focus,[data-md-color-accent=cyan] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=cyan] .md-typeset [id]:target .headerlink{color:#00b8d4}[data-md-color-accent=cyan] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00b8d4}[data-md-color-accent=cyan] .md-search-result__link:hover,[data-md-color-accent=cyan] .md-search-result__link[data-md-state=active]{background-color:rgba(0,184,212,.1)}[data-md-color-accent=cyan] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00b8d4}[data-md-color-accent=cyan] .md-source-file:hover:before{background-color:#00b8d4}button[data-md-color-accent=teal]{background-color:#00bfa5}[data-md-color-accent=teal] .md-typeset a:active,[data-md-color-accent=teal] .md-typeset a:hover{color:#00bfa5}[data-md-color-accent=teal] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=teal] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#00bfa5}[data-md-color-accent=teal] .md-nav__link:focus,[data-md-color-accent=teal] .md-nav__link:hover,[data-md-color-accent=teal] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=teal] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=teal] .md-typeset .md-clipboard:active:before,[data-md-color-accent=teal] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=teal] .md-typeset [id] .headerlink:focus,[data-md-color-accent=teal] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=teal] .md-typeset [id]:target .headerlink{color:#00bfa5}[data-md-color-accent=teal] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00bfa5}[data-md-color-accent=teal] .md-search-result__link:hover,[data-md-color-accent=teal] .md-search-result__link[data-md-state=active]{background-color:rgba(0,191,165,.1)}[data-md-color-accent=teal] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00bfa5}[data-md-color-accent=teal] .md-source-file:hover:before{background-color:#00bfa5}button[data-md-color-accent=green]{background-color:#00c853}[data-md-color-accent=green] .md-typeset a:active,[data-md-color-accent=green] .md-typeset a:hover{color:#00c853}[data-md-color-accent=green] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=green] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#00c853}[data-md-color-accent=green] .md-nav__link:focus,[data-md-color-accent=green] .md-nav__link:hover,[data-md-color-accent=green] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=green] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=green] .md-typeset .md-clipboard:active:before,[data-md-color-accent=green] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=green] .md-typeset [id] .headerlink:focus,[data-md-color-accent=green] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=green] .md-typeset [id]:target .headerlink{color:#00c853}[data-md-color-accent=green] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00c853}[data-md-color-accent=green] .md-search-result__link:hover,[data-md-color-accent=green] .md-search-result__link[data-md-state=active]{background-color:rgba(0,200,83,.1)}[data-md-color-accent=green] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00c853}[data-md-color-accent=green] .md-source-file:hover:before{background-color:#00c853}button[data-md-color-accent=light-green]{background-color:#64dd17}[data-md-color-accent=light-green] .md-typeset a:active,[data-md-color-accent=light-green] .md-typeset a:hover{color:#64dd17}[data-md-color-accent=light-green] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=light-green] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#64dd17}[data-md-color-accent=light-green] .md-nav__link:focus,[data-md-color-accent=light-green] .md-nav__link:hover,[data-md-color-accent=light-green] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=light-green] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=light-green] .md-typeset .md-clipboard:active:before,[data-md-color-accent=light-green] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=light-green] .md-typeset [id] .headerlink:focus,[data-md-color-accent=light-green] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=light-green] .md-typeset [id]:target .headerlink{color:#64dd17}[data-md-color-accent=light-green] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#64dd17}[data-md-color-accent=light-green] .md-search-result__link:hover,[data-md-color-accent=light-green] .md-search-result__link[data-md-state=active]{background-color:rgba(100,221,23,.1)}[data-md-color-accent=light-green] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#64dd17}[data-md-color-accent=light-green] .md-source-file:hover:before{background-color:#64dd17}button[data-md-color-accent=lime]{background-color:#aeea00}[data-md-color-accent=lime] .md-typeset a:active,[data-md-color-accent=lime] .md-typeset a:hover{color:#aeea00}[data-md-color-accent=lime] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=lime] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#aeea00}[data-md-color-accent=lime] .md-nav__link:focus,[data-md-color-accent=lime] .md-nav__link:hover,[data-md-color-accent=lime] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=lime] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=lime] .md-typeset .md-clipboard:active:before,[data-md-color-accent=lime] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=lime] .md-typeset [id] .headerlink:focus,[data-md-color-accent=lime] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=lime] .md-typeset [id]:target .headerlink{color:#aeea00}[data-md-color-accent=lime] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#aeea00}[data-md-color-accent=lime] .md-search-result__link:hover,[data-md-color-accent=lime] .md-search-result__link[data-md-state=active]{background-color:rgba(174,234,0,.1)}[data-md-color-accent=lime] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#aeea00}[data-md-color-accent=lime] .md-source-file:hover:before{background-color:#aeea00}button[data-md-color-accent=yellow]{background-color:#ffd600}[data-md-color-accent=yellow] .md-typeset a:active,[data-md-color-accent=yellow] .md-typeset a:hover{color:#ffd600}[data-md-color-accent=yellow] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=yellow] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#ffd600}[data-md-color-accent=yellow] .md-nav__link:focus,[data-md-color-accent=yellow] .md-nav__link:hover,[data-md-color-accent=yellow] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=yellow] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=yellow] .md-typeset .md-clipboard:active:before,[data-md-color-accent=yellow] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=yellow] .md-typeset [id] .headerlink:focus,[data-md-color-accent=yellow] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=yellow] .md-typeset [id]:target .headerlink{color:#ffd600}[data-md-color-accent=yellow] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffd600}[data-md-color-accent=yellow] .md-search-result__link:hover,[data-md-color-accent=yellow] .md-search-result__link[data-md-state=active]{background-color:rgba(255,214,0,.1)}[data-md-color-accent=yellow] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffd600}[data-md-color-accent=yellow] .md-source-file:hover:before{background-color:#ffd600}button[data-md-color-accent=amber]{background-color:#ffab00}[data-md-color-accent=amber] .md-typeset a:active,[data-md-color-accent=amber] .md-typeset a:hover{color:#ffab00}[data-md-color-accent=amber] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=amber] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#ffab00}[data-md-color-accent=amber] .md-nav__link:focus,[data-md-color-accent=amber] .md-nav__link:hover,[data-md-color-accent=amber] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=amber] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=amber] .md-typeset .md-clipboard:active:before,[data-md-color-accent=amber] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=amber] .md-typeset [id] .headerlink:focus,[data-md-color-accent=amber] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=amber] .md-typeset [id]:target .headerlink{color:#ffab00}[data-md-color-accent=amber] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffab00}[data-md-color-accent=amber] .md-search-result__link:hover,[data-md-color-accent=amber] .md-search-result__link[data-md-state=active]{background-color:rgba(255,171,0,.1)}[data-md-color-accent=amber] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffab00}[data-md-color-accent=amber] .md-source-file:hover:before{background-color:#ffab00}button[data-md-color-accent=orange]{background-color:#ff9100}[data-md-color-accent=orange] .md-typeset a:active,[data-md-color-accent=orange] .md-typeset a:hover{color:#ff9100}[data-md-color-accent=orange] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=orange] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#ff9100}[data-md-color-accent=orange] .md-nav__link:focus,[data-md-color-accent=orange] .md-nav__link:hover,[data-md-color-accent=orange] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=orange] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=orange] .md-typeset .md-clipboard:active:before,[data-md-color-accent=orange] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=orange] .md-typeset [id] .headerlink:focus,[data-md-color-accent=orange] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=orange] .md-typeset [id]:target .headerlink{color:#ff9100}[data-md-color-accent=orange] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff9100}[data-md-color-accent=orange] .md-search-result__link:hover,[data-md-color-accent=orange] .md-search-result__link[data-md-state=active]{background-color:rgba(255,145,0,.1)}[data-md-color-accent=orange] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff9100}[data-md-color-accent=orange] .md-source-file:hover:before{background-color:#ff9100}button[data-md-color-accent=deep-orange]{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-typeset a:active,[data-md-color-accent=deep-orange] .md-typeset a:hover{color:#ff6e40}[data-md-color-accent=deep-orange] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=deep-orange] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-nav__link:focus,[data-md-color-accent=deep-orange] .md-nav__link:hover,[data-md-color-accent=deep-orange] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=deep-orange] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=deep-orange] .md-typeset .md-clipboard:active:before,[data-md-color-accent=deep-orange] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=deep-orange] .md-typeset [id] .headerlink:focus,[data-md-color-accent=deep-orange] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=deep-orange] .md-typeset [id]:target .headerlink{color:#ff6e40}[data-md-color-accent=deep-orange] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-search-result__link:hover,[data-md-color-accent=deep-orange] .md-search-result__link[data-md-state=active]{background-color:rgba(255,110,64,.1)}[data-md-color-accent=deep-orange] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-source-file:hover:before{background-color:#ff6e40}@media only screen and (max-width:59.9375em){[data-md-color-primary=red] .md-nav__source{background-color:rgba(190,66,64,.9675)}[data-md-color-primary=pink] .md-nav__source{background-color:rgba(185,24,79,.9675)}[data-md-color-primary=purple] .md-nav__source{background-color:rgba(136,57,150,.9675)}[data-md-color-primary=deep-purple] .md-nav__source{background-color:rgba(100,69,154,.9675)}[data-md-color-primary=indigo] .md-nav__source{background-color:rgba(50,64,144,.9675)}[data-md-color-primary=blue] .md-nav__source{background-color:rgba(26,119,193,.9675)}[data-md-color-primary=light-blue] .md-nav__source{background-color:rgba(2,134,194,.9675)}[data-md-color-primary=cyan] .md-nav__source{background-color:rgba(0,150,169,.9675)}[data-md-color-primary=teal] .md-nav__source{background-color:rgba(0,119,108,.9675)}[data-md-color-primary=green] .md-nav__source{background-color:rgba(60,139,64,.9675)}[data-md-color-primary=light-green] .md-nav__source{background-color:rgba(99,142,53,.9675)}[data-md-color-primary=lime] .md-nav__source{background-color:rgba(153,161,41,.9675)}[data-md-color-primary=yellow] .md-nav__source{background-color:rgba(198,134,29,.9675)}[data-md-color-primary=amber] .md-nav__source{background-color:rgba(203,127,0,.9675)}[data-md-color-primary=orange] .md-nav__source{background-color:rgba(200,111,0,.9675)}[data-md-color-primary=deep-orange] .md-nav__source{background-color:rgba(203,89,53,.9675)}[data-md-color-primary=brown] .md-nav__source{background-color:rgba(96,68,57,.9675)}[data-md-color-primary=grey] .md-nav__source{background-color:rgba(93,93,93,.9675)}[data-md-color-primary=blue-grey] .md-nav__source{background-color:rgba(67,88,97,.9675)}[data-md-color-primary=white] .md-nav__source{background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.87)}[data-md-color-primary=black] .md-nav__source{background-color:#404040}}@media only screen and (max-width:76.1875em){html [data-md-color-primary=red] .md-nav--primary .md-nav__title--site{background-color:#ef5350}html [data-md-color-primary=pink] .md-nav--primary .md-nav__title--site{background-color:#e91e63}html [data-md-color-primary=purple] .md-nav--primary .md-nav__title--site{background-color:#ab47bc}html [data-md-color-primary=deep-purple] .md-nav--primary .md-nav__title--site{background-color:#7e57c2}html [data-md-color-primary=indigo] .md-nav--primary .md-nav__title--site{background-color:#3f51b5}html [data-md-color-primary=blue] .md-nav--primary .md-nav__title--site{background-color:#2196f3}html [data-md-color-primary=light-blue] .md-nav--primary .md-nav__title--site{background-color:#03a9f4}html [data-md-color-primary=cyan] .md-nav--primary .md-nav__title--site{background-color:#00bcd4}html [data-md-color-primary=teal] .md-nav--primary .md-nav__title--site{background-color:#009688}html [data-md-color-primary=green] .md-nav--primary .md-nav__title--site{background-color:#4caf50}html [data-md-color-primary=light-green] .md-nav--primary .md-nav__title--site{background-color:#7cb342}html [data-md-color-primary=lime] .md-nav--primary .md-nav__title--site{background-color:#c0ca33}html [data-md-color-primary=yellow] .md-nav--primary .md-nav__title--site{background-color:#f9a825}html [data-md-color-primary=amber] .md-nav--primary .md-nav__title--site{background-color:#ffa000}html [data-md-color-primary=orange] .md-nav--primary .md-nav__title--site{background-color:#fb8c00}html [data-md-color-primary=deep-orange] .md-nav--primary .md-nav__title--site{background-color:#ff7043}html [data-md-color-primary=brown] .md-nav--primary .md-nav__title--site{background-color:#795548}html [data-md-color-primary=grey] .md-nav--primary .md-nav__title--site{background-color:#757575}html [data-md-color-primary=blue-grey] .md-nav--primary .md-nav__title--site{background-color:#546e7a}html [data-md-color-primary=white] .md-nav--primary .md-nav__title--site{background-color:#fff;color:rgba(0,0,0,.87)}[data-md-color-primary=white] .md-hero{border-bottom:.05rem solid rgba(0,0,0,.07)}html [data-md-color-primary=black] .md-nav--primary .md-nav__title--site{background-color:#000}}@media only screen and (min-width:76.25em){[data-md-color-primary=red] .md-tabs{background-color:#ef5350}[data-md-color-primary=pink] .md-tabs{background-color:#e91e63}[data-md-color-primary=purple] .md-tabs{background-color:#ab47bc}[data-md-color-primary=deep-purple] .md-tabs{background-color:#7e57c2}[data-md-color-primary=indigo] .md-tabs{background-color:#3f51b5}[data-md-color-primary=blue] .md-tabs{background-color:#2196f3}[data-md-color-primary=light-blue] .md-tabs{background-color:#03a9f4}[data-md-color-primary=cyan] .md-tabs{background-color:#00bcd4}[data-md-color-primary=teal] .md-tabs{background-color:#009688}[data-md-color-primary=green] .md-tabs{background-color:#4caf50}[data-md-color-primary=light-green] .md-tabs{background-color:#7cb342}[data-md-color-primary=lime] .md-tabs{background-color:#c0ca33}[data-md-color-primary=yellow] .md-tabs{background-color:#f9a825}[data-md-color-primary=amber] .md-tabs{background-color:#ffa000}[data-md-color-primary=orange] .md-tabs{background-color:#fb8c00}[data-md-color-primary=deep-orange] .md-tabs{background-color:#ff7043}[data-md-color-primary=brown] .md-tabs{background-color:#795548}[data-md-color-primary=grey] .md-tabs{background-color:#757575}[data-md-color-primary=blue-grey] .md-tabs{background-color:#546e7a}[data-md-color-primary=white] .md-tabs{border-bottom:.05rem solid rgba(0,0,0,.07);background-color:#fff;color:rgba(0,0,0,.87)}[data-md-color-primary=black] .md-tabs{background-color:#000}}@media only screen and (min-width:60em){[data-md-color-primary=white] .md-search__input{background-color:rgba(0,0,0,.07)}[data-md-color-primary=white] .md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}[data-md-color-primary=white] .md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}[data-md-color-primary=white] .md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-color-primary=white] .md-search__input::-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-color-primary=white] .md-search__input::placeholder{color:rgba(0,0,0,.54)}[data-md-color-primary=black] .md-search__input{background-color:hsla(0,0%,100%,.3)}} \ No newline at end of file diff --git a/site/assets/stylesheets/application.30686662.css b/site/assets/stylesheets/application.30686662.css deleted file mode 100644 index 77e8a7e..0000000 --- a/site/assets/stylesheets/application.30686662.css +++ /dev/null @@ -1 +0,0 @@ -html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none}body{margin:0}hr{overflow:visible;box-sizing:content-box}a{-webkit-text-decoration-skip:objects}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}small,sub,sup{font-size:80%}sub,sup{position:relative;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}table{border-collapse:separate;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{margin:0;padding:0;border:0;outline-style:none;background:transparent;font-size:inherit}input{border:0;outline:0}.md-clipboard:before,.md-icon,.md-nav__button,.md-nav__link:after,.md-nav__title:before,.md-search-result__article--document:before,.md-source-file:before,.md-typeset .admonition>.admonition-title:before,.md-typeset .admonition>summary:before,.md-typeset .critic.comment:before,.md-typeset .footnote-backref,.md-typeset .task-list-control .task-list-indicator:before,.md-typeset details>.admonition-title:before,.md-typeset details>summary:before,.md-typeset summary:after{font-family:Material Icons;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;white-space:nowrap;speak:none;word-wrap:normal;direction:ltr}.md-content__icon,.md-footer-nav__button,.md-header-nav__button,.md-nav__button,.md-nav__title:before,.md-search-result__article--document:before{display:inline-block;margin:.2rem;padding:.4rem;font-size:1.2rem;cursor:pointer}.md-icon--arrow-back:before{content:""}.md-icon--arrow-forward:before{content:""}.md-icon--menu:before{content:""}.md-icon--search:before{content:""}[dir=rtl] .md-icon--arrow-back:before{content:""}[dir=rtl] .md-icon--arrow-forward:before{content:""}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,input{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","liga";font-feature-settings:"kern","liga";font-family:Helvetica Neue,Helvetica,Arial,sans-serif}code,kbd,pre{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern";font-feature-settings:"kern";font-family:Courier New,Courier,monospace}.md-typeset{font-size:.8rem;line-height:1.6;-webkit-print-color-adjust:exact}.md-typeset blockquote,.md-typeset ol,.md-typeset p,.md-typeset ul{margin:1em 0}.md-typeset h1{margin:0 0 2rem;color:rgba(0,0,0,.54);font-size:1.5625rem;line-height:1.3}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{margin:2rem 0 .8rem;font-size:1.25rem;line-height:1.4}.md-typeset h3{margin:1.6rem 0 .8rem;font-size:1rem;font-weight:400;letter-spacing:-.01em;line-height:1.5}.md-typeset h2+h3{margin-top:.8rem}.md-typeset h4{font-size:.8rem}.md-typeset h4,.md-typeset h5,.md-typeset h6{margin:.8rem 0;font-weight:700;letter-spacing:-.01em}.md-typeset h5,.md-typeset h6{color:rgba(0,0,0,.54);font-size:.64rem}.md-typeset h5{text-transform:uppercase}.md-typeset hr{margin:1.5em 0;border-bottom:.05rem dotted rgba(0,0,0,.26)}.md-typeset a{color:#3f51b5;word-break:break-word}.md-typeset a,.md-typeset a:before{-webkit-transition:color .125s;transition:color .125s}.md-typeset a:active,.md-typeset a:hover{color:#536dfe}.md-typeset code,.md-typeset pre{background-color:hsla(0,0%,92.5%,.5);color:#37474f;font-size:85%;direction:ltr}.md-typeset code{margin:0 .29412em;padding:.07353em 0;border-radius:.1rem;box-shadow:.29412em 0 0 hsla(0,0%,92.5%,.5),-.29412em 0 0 hsla(0,0%,92.5%,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{margin:0;background-color:transparent;box-shadow:none}.md-typeset a>code{margin:inherit;padding:inherit;border-radius:initial;background-color:inherit;color:inherit;box-shadow:none}.md-typeset pre{position:relative;margin:1em 0;border-radius:.1rem;line-height:1.4;-webkit-overflow-scrolling:touch}.md-typeset pre>code{display:block;margin:0;padding:.525rem .6rem;background-color:transparent;font-size:inherit;box-shadow:none;-webkit-box-decoration-break:slice;box-decoration-break:slice;overflow:auto}.md-typeset pre>code::-webkit-scrollbar{width:.2rem;height:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset kbd{padding:0 .29412em;border-radius:.15rem;border:.05rem solid #c9c9c9;border-bottom-color:#bcbcbc;background-color:#fcfcfc;color:#555;font-size:85%;box-shadow:0 .05rem 0 #b0b0b0;word-break:break-word}.md-typeset mark{margin:0 .25em;padding:.0625em 0;border-radius:.1rem;background-color:rgba(255,235,59,.5);box-shadow:.25em 0 0 rgba(255,235,59,.5),-.25em 0 0 rgba(255,235,59,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset abbr{border-bottom:.05rem dotted rgba(0,0,0,.54);text-decoration:none;cursor:help}.md-typeset small{opacity:.75}.md-typeset sub,.md-typeset sup{margin-left:.07812em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.07812em;margin-left:0}.md-typeset blockquote{padding-left:.6rem;border-left:.2rem solid rgba(0,0,0,.26);color:rgba(0,0,0,.54)}[dir=rtl] .md-typeset blockquote{padding-right:.6rem;padding-left:0;border-right:.2rem solid rgba(0,0,0,.26);border-left:initial}.md-typeset ul{list-style-type:disc}.md-typeset ol,.md-typeset ul{margin-left:.625em;padding:0}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em;margin-left:0}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em;margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em;margin-left:0}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin:.5em 0 .5em .625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em;margin-left:0}.md-typeset dd{margin:1em 0 1em 1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em;margin-left:0}.md-typeset iframe,.md-typeset img,.md-typeset svg{max-width:100%}.md-typeset table:not([class]){box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);display:inline-block;max-width:100%;border-radius:.1rem;font-size:.64rem;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{min-width:5rem;padding:.6rem .8rem;background-color:rgba(0,0,0,.54);color:#fff;vertical-align:top}.md-typeset table:not([class]) td{padding:.6rem .8rem;border-top:.05rem solid rgba(0,0,0,.07);vertical-align:top}.md-typeset table:not([class]) tr{-webkit-transition:background-color .125s;transition:background-color .125s}.md-typeset table:not([class]) tr:hover{background-color:rgba(0,0,0,.035);box-shadow:inset 0 .05rem 0 #fff}.md-typeset table:not([class]) tr:first-child td{border-top:0}.md-typeset table:not([class]) a{word-break:normal}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;-webkit-overflow-scrolling:touch}.md-typeset .md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}.md-typeset .md-typeset__table table{display:table;width:100%;margin:0;overflow:hidden}html{font-size:125%;overflow-x:hidden}body,html{height:100%}body{position:relative;font-size:.5rem}hr{display:block;height:.05rem;padding:0;border:0}.md-svg{display:none}.md-grid{max-width:61rem;margin-right:auto;margin-left:auto}.md-container,.md-main{overflow:auto}.md-container{display:table;width:100%;height:100%;padding-top:2.4rem;table-layout:fixed}.md-main{display:table-row;height:100%}.md-main__inner{height:100%;padding-top:1.5rem;padding-bottom:.05rem}.md-toggle{display:none}.md-overlay{position:fixed;top:0;width:0;height:0;-webkit-transition:width 0s .25s,height 0s .25s,opacity .25s;transition:width 0s .25s,height 0s .25s,opacity .25s;background-color:rgba(0,0,0,.54);opacity:0;z-index:3}.md-flex{display:table}.md-flex__cell{display:table-cell;position:relative;vertical-align:top}.md-flex__cell--shrink{width:0}.md-flex__cell--stretch{display:table;width:100%;table-layout:fixed}.md-flex__ellipsis{display:table-cell;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.md-skip{position:fixed;width:.05rem;height:.05rem;margin:.5rem;padding:.3rem .5rem;-webkit-transform:translateY(.4rem);transform:translateY(.4rem);border-radius:.1rem;background-color:rgba(0,0,0,.87);color:#fff;font-size:.64rem;opacity:0;overflow:hidden}.md-skip:focus{width:auto;height:auto;clip:auto;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1;z-index:10}@page{margin:25mm}.md-clipboard{position:absolute;top:.3rem;right:.3rem;width:1.4rem;height:1.4rem;border-radius:.1rem;font-size:.8rem;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-clipboard:before{-webkit-transition:color .25s,opacity .25s;transition:color .25s,opacity .25s;color:rgba(0,0,0,.07);content:"\E14D"}.codehilite:hover .md-clipboard:before,.md-typeset .highlight:hover .md-clipboard:before,pre:hover .md-clipboard:before{color:rgba(0,0,0,.54)}.md-clipboard:focus:before,.md-clipboard:hover:before{color:#536dfe}.md-clipboard__message{display:block;position:absolute;top:0;right:1.7rem;padding:.3rem .5rem;-webkit-transform:translateX(.4rem);transform:translateX(.4rem);-webkit-transition:opacity .175s,-webkit-transform .25s cubic-bezier(.9,.1,.9,0);transition:opacity .175s,-webkit-transform .25s cubic-bezier(.9,.1,.9,0);transition:transform .25s cubic-bezier(.9,.1,.9,0),opacity .175s;transition:transform .25s cubic-bezier(.9,.1,.9,0),opacity .175s,-webkit-transform .25s cubic-bezier(.9,.1,.9,0);border-radius:.1rem;background-color:rgba(0,0,0,.54);color:#fff;font-size:.64rem;white-space:nowrap;opacity:0;pointer-events:none}.md-clipboard__message--active{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1;pointer-events:auto}.md-clipboard__message:before{content:attr(aria-label)}.md-clipboard__message:after{display:block;position:absolute;top:50%;right:-.2rem;width:0;margin-top:-.2rem;border-color:transparent rgba(0,0,0,.54);border-style:solid;border-width:.2rem 0 .2rem .2rem;content:""}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}.md-content__inner:before{display:block;height:.4rem;content:""}.md-content__inner>:last-child{margin-bottom:0}.md-content__icon{position:relative;margin:.4rem 0;padding:0;float:right}.md-typeset .md-content__icon{color:rgba(0,0,0,.26)}.md-header{position:fixed;top:0;right:0;left:0;height:2.4rem;-webkit-transition:background-color .25s,color .25s;transition:background-color .25s,color .25s;background-color:#3f51b5;color:#fff;box-shadow:none;z-index:2;-webkit-backface-visibility:hidden;backface-visibility:hidden}.no-js .md-header{-webkit-transition:none;transition:none;box-shadow:none}.md-header[data-md-state=shadow]{-webkit-transition:background-color .25s,color .25s,box-shadow .25s;transition:background-color .25s,color .25s,box-shadow .25s;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2)}.md-header-nav{padding:0 .2rem}.md-header-nav__button{position:relative;-webkit-transition:opacity .25s;transition:opacity .25s;z-index:1}.md-header-nav__button:hover{opacity:.7}.md-header-nav__button.md-logo *{display:block}.no-js .md-header-nav__button.md-icon--search{display:none}.md-header-nav__topic{display:block;position:absolute;-webkit-transition:opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.md-header-nav__topic+.md-header-nav__topic{-webkit-transform:translateX(1.25rem);transform:translateX(1.25rem);-webkit-transition:opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);transition:opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);opacity:0;z-index:-1;pointer-events:none}[dir=rtl] .md-header-nav__topic+.md-header-nav__topic{-webkit-transform:translateX(-1.25rem);transform:translateX(-1.25rem)}.no-js .md-header-nav__topic{position:static}.no-js .md-header-nav__topic+.md-header-nav__topic{display:none}.md-header-nav__title{padding:0 1rem;font-size:.9rem;line-height:2.4rem}.md-header-nav__title[data-md-state=active] .md-header-nav__topic{-webkit-transform:translateX(-1.25rem);transform:translateX(-1.25rem);-webkit-transition:opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);transition:opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);opacity:0;z-index:-1;pointer-events:none}[dir=rtl] .md-header-nav__title[data-md-state=active] .md-header-nav__topic{-webkit-transform:translateX(1.25rem);transform:translateX(1.25rem)}.md-header-nav__title[data-md-state=active] .md-header-nav__topic+.md-header-nav__topic{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);opacity:1;z-index:0;pointer-events:auto}.md-header-nav__source{display:none}.md-hero{-webkit-transition:background .25s;transition:background .25s;background-color:#3f51b5;color:#fff;font-size:1rem;overflow:hidden}.md-hero__inner{margin-top:1rem;padding:.8rem .8rem .4rem;-webkit-transition:opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);-webkit-transition-delay:.1s;transition-delay:.1s}[data-md-state=hidden] .md-hero__inner{pointer-events:none;-webkit-transform:translateY(.625rem);transform:translateY(.625rem);-webkit-transition:opacity .1s 0s,-webkit-transform 0s .4s;transition:opacity .1s 0s,-webkit-transform 0s .4s;transition:transform 0s .4s,opacity .1s 0s;transition:transform 0s .4s,opacity .1s 0s,-webkit-transform 0s .4s;opacity:0}.md-hero--expand .md-hero__inner{margin-bottom:1.2rem}.md-footer-nav{background-color:rgba(0,0,0,.87);color:#fff}.md-footer-nav__inner{padding:.2rem;overflow:auto}.md-footer-nav__link{padding-top:1.4rem;padding-bottom:.4rem;-webkit-transition:opacity .25s;transition:opacity .25s}.md-footer-nav__link:hover{opacity:.7}.md-footer-nav__link--prev{width:25%;float:left}[dir=rtl] .md-footer-nav__link--prev{float:right}.md-footer-nav__link--next{width:75%;float:right;text-align:right}[dir=rtl] .md-footer-nav__link--next{float:left;text-align:left}.md-footer-nav__button{-webkit-transition:background .25s;transition:background .25s}.md-footer-nav__title{position:relative;padding:0 1rem;font-size:.9rem;line-height:2.4rem}.md-footer-nav__direction{position:absolute;right:0;left:0;margin-top:-1rem;padding:0 1rem;color:hsla(0,0%,100%,.7);font-size:.75rem}.md-footer-meta{background-color:rgba(0,0,0,.895)}.md-footer-meta__inner{padding:.2rem;overflow:auto}html .md-footer-meta.md-typeset a{color:hsla(0,0%,100%,.7)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:#fff}.md-footer-copyright{margin:0 .6rem;padding:.4rem 0;color:hsla(0,0%,100%,.3);font-size:.64rem}.md-footer-copyright__highlight{color:hsla(0,0%,100%,.7)}.md-footer-social{margin:0 .4rem;padding:.2rem 0 .6rem}.md-footer-social__link{display:inline-block;width:1.6rem;height:1.6rem;font-size:.8rem;text-align:center}.md-footer-social__link:before{line-height:1.9}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{display:block;padding:0 .6rem;font-weight:700;text-overflow:ellipsis;overflow:hidden}.md-nav__title:before{display:none;content:"\E5C4"}[dir=rtl] .md-nav__title:before{content:"\E5C8"}.md-nav__title .md-nav__button{display:none}.md-nav__list{margin:0;padding:0;list-style:none}.md-nav__item{padding:0 .6rem}.md-nav__item:last-child{padding-bottom:.6rem}.md-nav__item .md-nav__item{padding-right:0}[dir=rtl] .md-nav__item .md-nav__item{padding-right:.6rem;padding-left:0}.md-nav__item .md-nav__item:last-child{padding-bottom:0}.md-nav__button img{width:100%;height:auto}.md-nav__link{display:block;margin-top:.625em;-webkit-transition:color .125s;transition:color .125s;text-overflow:ellipsis;cursor:pointer;overflow:hidden}.md-nav__item--nested>.md-nav__link:after{content:"\E313"}html .md-nav__link[for=__toc],html .md-nav__link[for=__toc]+.md-nav__link:after,html .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__link[data-md-state=blur]{color:rgba(0,0,0,.54)}.md-nav__link--active,.md-nav__link:active{color:#3f51b5}.md-nav__item--nested>.md-nav__link{color:inherit}.md-nav__link:focus,.md-nav__link:hover{color:#536dfe}.md-nav__source,.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}.md-search__form{position:relative}.md-search__input{position:relative;padding:0 2.2rem 0 3.6rem;text-overflow:ellipsis;z-index:2}[dir=rtl] .md-search__input{padding:0 3.6rem 0 2.2rem}.md-search__input::-webkit-input-placeholder{-webkit-transition:color .25s cubic-bezier(.1,.7,.1,1);transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::-moz-placeholder{-webkit-transition:color .25s cubic-bezier(.1,.7,.1,1);transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input:-ms-input-placeholder{-webkit-transition:color .25s cubic-bezier(.1,.7,.1,1);transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::-ms-input-placeholder{-webkit-transition:color .25s cubic-bezier(.1,.7,.1,1);transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::placeholder{-webkit-transition:color .25s cubic-bezier(.1,.7,.1,1);transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::-webkit-input-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::-moz-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input:-ms-input-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::-ms-input-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::-ms-clear{display:none}.md-search__icon{position:absolute;-webkit-transition:color .25s cubic-bezier(.1,.7,.1,1),opacity .25s;transition:color .25s cubic-bezier(.1,.7,.1,1),opacity .25s;font-size:1.2rem;cursor:pointer;z-index:2}.md-search__icon:hover{opacity:.7}.md-search__icon[for=__search]{top:.3rem;left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem;left:auto}.md-search__icon[for=__search]:before{content:"\E8B6"}.md-search__icon[type=reset]{top:.3rem;right:.5rem;-webkit-transform:scale(.125);transform:scale(.125);-webkit-transition:opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1);transition:opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s;transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1);opacity:0}[dir=rtl] .md-search__icon[type=reset]{right:auto;left:.5rem}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]{-webkit-transform:scale(1);transform:scale(1);opacity:1}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]:hover{opacity:.7}.md-search__output{position:absolute;width:100%;border-radius:0 0 .1rem .1rem;overflow:hidden;z-index:1}.md-search__scrollwrap{height:100%;background-color:#fff;box-shadow:inset 0 .05rem 0 rgba(0,0,0,.07);overflow-y:auto;-webkit-overflow-scrolling:touch}.md-search-result{color:rgba(0,0,0,.87);word-break:break-word}.md-search-result__meta{padding:0 .8rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-size:.64rem;line-height:1.8rem}.md-search-result__list{margin:0;padding:0;border-top:.05rem solid rgba(0,0,0,.07);list-style:none}.md-search-result__item{box-shadow:0 -.05rem 0 rgba(0,0,0,.07)}.md-search-result__link{display:block;-webkit-transition:background .25s;transition:background .25s;outline:0;overflow:hidden}.md-search-result__link:hover,.md-search-result__link[data-md-state=active]{background-color:rgba(83,109,254,.1)}.md-search-result__link:hover .md-search-result__article:before,.md-search-result__link[data-md-state=active] .md-search-result__article:before{opacity:.7}.md-search-result__link:last-child .md-search-result__teaser{margin-bottom:.6rem}.md-search-result__article{position:relative;padding:0 .8rem;overflow:auto}.md-search-result__article--document:before{position:absolute;left:0;margin:.1rem;-webkit-transition:opacity .25s;transition:opacity .25s;color:rgba(0,0,0,.54);content:"\E880"}[dir=rtl] .md-search-result__article--document:before{right:0;left:auto}.md-search-result__article--document .md-search-result__title{margin:.55rem 0;font-size:.8rem;font-weight:400;line-height:1.4}.md-search-result__title{margin:.5em 0;font-size:.64rem;font-weight:700;line-height:1.4}.md-search-result__teaser{display:-webkit-box;max-height:1.65rem;margin:.5em 0;color:rgba(0,0,0,.54);font-size:.64rem;line-height:1.4;text-overflow:ellipsis;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2}.md-search-result em{font-style:normal;font-weight:700;text-decoration:underline}.md-sidebar{position:absolute;width:12.1rem;padding:1.2rem 0;overflow:hidden}.md-sidebar[data-md-state=lock]{position:fixed;top:2.4rem}.md-sidebar--secondary{display:none}.md-sidebar__scrollwrap{max-height:100%;margin:0 .2rem;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-sidebar__scrollwrap::-webkit-scrollbar{width:.2rem;height:.2rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}@-webkit-keyframes md-source__facts--done{0%{height:0}to{height:.65rem}}@keyframes md-source__facts--done{0%{height:0}to{height:.65rem}}@-webkit-keyframes md-source__fact--done{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes md-source__fact--done{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}.md-source{display:block;padding-right:.6rem;-webkit-transition:opacity .25s;transition:opacity .25s;font-size:.65rem;line-height:1.2;white-space:nowrap}[dir=rtl] .md-source{padding-right:0;padding-left:.6rem}.md-source:hover{opacity:.7}.md-source:after,.md-source__icon{display:inline-block;height:2.4rem;content:"";vertical-align:middle}.md-source__icon{width:2.4rem}.md-source__icon svg{width:1.2rem;height:1.2rem;margin-top:.6rem;margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem;margin-left:0}.md-source__icon+.md-source__repository{margin-left:-2rem;padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem;margin-left:0;padding-right:2rem;padding-left:0}.md-source__repository{display:inline-block;max-width:100%;margin-left:.6rem;font-weight:700;text-overflow:ellipsis;overflow:hidden;vertical-align:middle}.md-source__facts{margin:0;padding:0;font-size:.55rem;font-weight:700;list-style-type:none;opacity:.75;overflow:hidden}[data-md-state=done] .md-source__facts{-webkit-animation:md-source__facts--done .25s ease-in;animation:md-source__facts--done .25s ease-in}.md-source__fact{float:left}[dir=rtl] .md-source__fact{float:right}[data-md-state=done] .md-source__fact{-webkit-animation:md-source__fact--done .4s ease-out;animation:md-source__fact--done .4s ease-out}.md-source__fact:before{margin:0 .1rem;content:"\00B7"}.md-source__fact:first-child:before{display:none}.md-source-file{display:inline-block;margin:1em .5em 1em 0;padding-right:.25rem;border-radius:.1rem;background-color:rgba(0,0,0,.07);font-size:.64rem;list-style-type:none;cursor:pointer;overflow:hidden}.md-source-file:before{display:inline-block;margin-right:.25rem;padding:.25rem;background-color:rgba(0,0,0,.26);color:#fff;font-size:.8rem;content:"\E86F";vertical-align:middle}html .md-source-file{-webkit-transition:background .4s,color .4s,box-shadow .4s cubic-bezier(.4,0,.2,1);transition:background .4s,color .4s,box-shadow .4s cubic-bezier(.4,0,.2,1)}html .md-source-file:before{-webkit-transition:inherit;transition:inherit}html body .md-typeset .md-source-file{color:rgba(0,0,0,.54)}.md-source-file:hover{box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36)}.md-source-file:hover:before{background-color:#536dfe}.md-tabs{width:100%;-webkit-transition:background .25s;transition:background .25s;background-color:#3f51b5;color:#fff;overflow:auto}.md-tabs__list{margin:0 0 0 .2rem;padding:0;list-style:none;white-space:nowrap}.md-tabs__item{display:inline-block;height:2.4rem;padding-right:.6rem;padding-left:.6rem}.md-tabs__link{display:block;margin-top:.8rem;-webkit-transition:opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);font-size:.7rem;opacity:.7}.md-tabs__link--active,.md-tabs__link:hover{color:inherit;opacity:1}.md-tabs__item:nth-child(2) .md-tabs__link{-webkit-transition-delay:.02s;transition-delay:.02s}.md-tabs__item:nth-child(3) .md-tabs__link{-webkit-transition-delay:.04s;transition-delay:.04s}.md-tabs__item:nth-child(4) .md-tabs__link{-webkit-transition-delay:.06s;transition-delay:.06s}.md-tabs__item:nth-child(5) .md-tabs__link{-webkit-transition-delay:.08s;transition-delay:.08s}.md-tabs__item:nth-child(6) .md-tabs__link{-webkit-transition-delay:.1s;transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{-webkit-transition-delay:.12s;transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{-webkit-transition-delay:.14s;transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{-webkit-transition-delay:.16s;transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{-webkit-transition-delay:.18s;transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{-webkit-transition-delay:.2s;transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{-webkit-transition-delay:.22s;transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{-webkit-transition-delay:.24s;transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{-webkit-transition-delay:.26s;transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{-webkit-transition-delay:.28s;transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{-webkit-transition-delay:.3s;transition-delay:.3s}.md-tabs[data-md-state=hidden]{pointer-events:none}.md-tabs[data-md-state=hidden] .md-tabs__link{-webkit-transform:translateY(50%);transform:translateY(50%);-webkit-transition:color .25s,opacity .1s,-webkit-transform 0s .4s;transition:color .25s,opacity .1s,-webkit-transform 0s .4s;transition:color .25s,transform 0s .4s,opacity .1s;transition:color .25s,transform 0s .4s,opacity .1s,-webkit-transform 0s .4s;opacity:0}.md-typeset .admonition,.md-typeset details{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);position:relative;margin:1.5625em 0;padding:0 .6rem;border-left:.2rem solid #448aff;border-radius:.1rem;font-size:.64rem;overflow:auto}[dir=rtl] .md-typeset .admonition,[dir=rtl] .md-typeset details{border-right:.2rem solid #448aff;border-left:none}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin:1em 0}.md-typeset .admonition>.admonition-title,.md-typeset .admonition>summary,.md-typeset details>.admonition-title,.md-typeset details>summary{margin:0 -.6rem;padding:.4rem .6rem .4rem 2rem;border-bottom:.05rem solid rgba(68,138,255,.1);background-color:rgba(68,138,255,.1);font-weight:700}[dir=rtl] .md-typeset .admonition>.admonition-title,[dir=rtl] .md-typeset .admonition>summary,[dir=rtl] .md-typeset details>.admonition-title,[dir=rtl] .md-typeset details>summary{padding:.4rem 2rem .4rem .6rem}.md-typeset .admonition>.admonition-title:last-child,.md-typeset .admonition>summary:last-child,.md-typeset details>.admonition-title:last-child,.md-typeset details>summary:last-child{margin-bottom:0}.md-typeset .admonition>.admonition-title:before,.md-typeset .admonition>summary:before,.md-typeset details>.admonition-title:before,.md-typeset details>summary:before{position:absolute;left:.6rem;color:#448aff;font-size:1rem;content:"\E3C9"}[dir=rtl] .md-typeset .admonition>.admonition-title:before,[dir=rtl] .md-typeset .admonition>summary:before,[dir=rtl] .md-typeset details>.admonition-title:before,[dir=rtl] .md-typeset details>summary:before{right:.6rem;left:auto}.md-typeset .admonition.abstract,.md-typeset .admonition.summary,.md-typeset .admonition.tldr,.md-typeset details.abstract,.md-typeset details.summary,.md-typeset details.tldr{border-left-color:#00b0ff}[dir=rtl] .md-typeset .admonition.abstract,[dir=rtl] .md-typeset .admonition.summary,[dir=rtl] .md-typeset .admonition.tldr,[dir=rtl] .md-typeset details.abstract,[dir=rtl] .md-typeset details.summary,[dir=rtl] .md-typeset details.tldr{border-right-color:#00b0ff}.md-typeset .admonition.abstract>.admonition-title,.md-typeset .admonition.abstract>summary,.md-typeset .admonition.summary>.admonition-title,.md-typeset .admonition.summary>summary,.md-typeset .admonition.tldr>.admonition-title,.md-typeset .admonition.tldr>summary,.md-typeset details.abstract>.admonition-title,.md-typeset details.abstract>summary,.md-typeset details.summary>.admonition-title,.md-typeset details.summary>summary,.md-typeset details.tldr>.admonition-title,.md-typeset details.tldr>summary{border-bottom-color:rgba(0,176,255,.1);background-color:rgba(0,176,255,.1)}.md-typeset .admonition.abstract>.admonition-title:before,.md-typeset .admonition.abstract>summary:before,.md-typeset .admonition.summary>.admonition-title:before,.md-typeset .admonition.summary>summary:before,.md-typeset .admonition.tldr>.admonition-title:before,.md-typeset .admonition.tldr>summary:before,.md-typeset details.abstract>.admonition-title:before,.md-typeset details.abstract>summary:before,.md-typeset details.summary>.admonition-title:before,.md-typeset details.summary>summary:before,.md-typeset details.tldr>.admonition-title:before,.md-typeset details.tldr>summary:before{color:#00b0ff;content:""}.md-typeset .admonition.info,.md-typeset .admonition.todo,.md-typeset details.info,.md-typeset details.todo{border-left-color:#00b8d4}[dir=rtl] .md-typeset .admonition.info,[dir=rtl] .md-typeset .admonition.todo,[dir=rtl] .md-typeset details.info,[dir=rtl] .md-typeset details.todo{border-right-color:#00b8d4}.md-typeset .admonition.info>.admonition-title,.md-typeset .admonition.info>summary,.md-typeset .admonition.todo>.admonition-title,.md-typeset .admonition.todo>summary,.md-typeset details.info>.admonition-title,.md-typeset details.info>summary,.md-typeset details.todo>.admonition-title,.md-typeset details.todo>summary{border-bottom-color:rgba(0,184,212,.1);background-color:rgba(0,184,212,.1)}.md-typeset .admonition.info>.admonition-title:before,.md-typeset .admonition.info>summary:before,.md-typeset .admonition.todo>.admonition-title:before,.md-typeset .admonition.todo>summary:before,.md-typeset details.info>.admonition-title:before,.md-typeset details.info>summary:before,.md-typeset details.todo>.admonition-title:before,.md-typeset details.todo>summary:before{color:#00b8d4;content:""}.md-typeset .admonition.hint,.md-typeset .admonition.important,.md-typeset .admonition.tip,.md-typeset details.hint,.md-typeset details.important,.md-typeset details.tip{border-left-color:#00bfa5}[dir=rtl] .md-typeset .admonition.hint,[dir=rtl] .md-typeset .admonition.important,[dir=rtl] .md-typeset .admonition.tip,[dir=rtl] .md-typeset details.hint,[dir=rtl] .md-typeset details.important,[dir=rtl] .md-typeset details.tip{border-right-color:#00bfa5}.md-typeset .admonition.hint>.admonition-title,.md-typeset .admonition.hint>summary,.md-typeset .admonition.important>.admonition-title,.md-typeset .admonition.important>summary,.md-typeset .admonition.tip>.admonition-title,.md-typeset .admonition.tip>summary,.md-typeset details.hint>.admonition-title,.md-typeset details.hint>summary,.md-typeset details.important>.admonition-title,.md-typeset details.important>summary,.md-typeset details.tip>.admonition-title,.md-typeset details.tip>summary{border-bottom-color:rgba(0,191,165,.1);background-color:rgba(0,191,165,.1)}.md-typeset .admonition.hint>.admonition-title:before,.md-typeset .admonition.hint>summary:before,.md-typeset .admonition.important>.admonition-title:before,.md-typeset .admonition.important>summary:before,.md-typeset .admonition.tip>.admonition-title:before,.md-typeset .admonition.tip>summary:before,.md-typeset details.hint>.admonition-title:before,.md-typeset details.hint>summary:before,.md-typeset details.important>.admonition-title:before,.md-typeset details.important>summary:before,.md-typeset details.tip>.admonition-title:before,.md-typeset details.tip>summary:before{color:#00bfa5;content:""}.md-typeset .admonition.check,.md-typeset .admonition.done,.md-typeset .admonition.success,.md-typeset details.check,.md-typeset details.done,.md-typeset details.success{border-left-color:#00c853}[dir=rtl] .md-typeset .admonition.check,[dir=rtl] .md-typeset .admonition.done,[dir=rtl] .md-typeset .admonition.success,[dir=rtl] .md-typeset details.check,[dir=rtl] .md-typeset details.done,[dir=rtl] .md-typeset details.success{border-right-color:#00c853}.md-typeset .admonition.check>.admonition-title,.md-typeset .admonition.check>summary,.md-typeset .admonition.done>.admonition-title,.md-typeset .admonition.done>summary,.md-typeset .admonition.success>.admonition-title,.md-typeset .admonition.success>summary,.md-typeset details.check>.admonition-title,.md-typeset details.check>summary,.md-typeset details.done>.admonition-title,.md-typeset details.done>summary,.md-typeset details.success>.admonition-title,.md-typeset details.success>summary{border-bottom-color:rgba(0,200,83,.1);background-color:rgba(0,200,83,.1)}.md-typeset .admonition.check>.admonition-title:before,.md-typeset .admonition.check>summary:before,.md-typeset .admonition.done>.admonition-title:before,.md-typeset .admonition.done>summary:before,.md-typeset .admonition.success>.admonition-title:before,.md-typeset .admonition.success>summary:before,.md-typeset details.check>.admonition-title:before,.md-typeset details.check>summary:before,.md-typeset details.done>.admonition-title:before,.md-typeset details.done>summary:before,.md-typeset details.success>.admonition-title:before,.md-typeset details.success>summary:before{color:#00c853;content:""}.md-typeset .admonition.faq,.md-typeset .admonition.help,.md-typeset .admonition.question,.md-typeset details.faq,.md-typeset details.help,.md-typeset details.question{border-left-color:#64dd17}[dir=rtl] .md-typeset .admonition.faq,[dir=rtl] .md-typeset .admonition.help,[dir=rtl] .md-typeset .admonition.question,[dir=rtl] .md-typeset details.faq,[dir=rtl] .md-typeset details.help,[dir=rtl] .md-typeset details.question{border-right-color:#64dd17}.md-typeset .admonition.faq>.admonition-title,.md-typeset .admonition.faq>summary,.md-typeset .admonition.help>.admonition-title,.md-typeset .admonition.help>summary,.md-typeset .admonition.question>.admonition-title,.md-typeset .admonition.question>summary,.md-typeset details.faq>.admonition-title,.md-typeset details.faq>summary,.md-typeset details.help>.admonition-title,.md-typeset details.help>summary,.md-typeset details.question>.admonition-title,.md-typeset details.question>summary{border-bottom-color:rgba(100,221,23,.1);background-color:rgba(100,221,23,.1)}.md-typeset .admonition.faq>.admonition-title:before,.md-typeset .admonition.faq>summary:before,.md-typeset .admonition.help>.admonition-title:before,.md-typeset .admonition.help>summary:before,.md-typeset .admonition.question>.admonition-title:before,.md-typeset .admonition.question>summary:before,.md-typeset details.faq>.admonition-title:before,.md-typeset details.faq>summary:before,.md-typeset details.help>.admonition-title:before,.md-typeset details.help>summary:before,.md-typeset details.question>.admonition-title:before,.md-typeset details.question>summary:before{color:#64dd17;content:""}.md-typeset .admonition.attention,.md-typeset .admonition.caution,.md-typeset .admonition.warning,.md-typeset details.attention,.md-typeset details.caution,.md-typeset details.warning{border-left-color:#ff9100}[dir=rtl] .md-typeset .admonition.attention,[dir=rtl] .md-typeset .admonition.caution,[dir=rtl] .md-typeset .admonition.warning,[dir=rtl] .md-typeset details.attention,[dir=rtl] .md-typeset details.caution,[dir=rtl] .md-typeset details.warning{border-right-color:#ff9100}.md-typeset .admonition.attention>.admonition-title,.md-typeset .admonition.attention>summary,.md-typeset .admonition.caution>.admonition-title,.md-typeset .admonition.caution>summary,.md-typeset .admonition.warning>.admonition-title,.md-typeset .admonition.warning>summary,.md-typeset details.attention>.admonition-title,.md-typeset details.attention>summary,.md-typeset details.caution>.admonition-title,.md-typeset details.caution>summary,.md-typeset details.warning>.admonition-title,.md-typeset details.warning>summary{border-bottom-color:rgba(255,145,0,.1);background-color:rgba(255,145,0,.1)}.md-typeset .admonition.attention>.admonition-title:before,.md-typeset .admonition.attention>summary:before,.md-typeset .admonition.caution>.admonition-title:before,.md-typeset .admonition.caution>summary:before,.md-typeset .admonition.warning>.admonition-title:before,.md-typeset .admonition.warning>summary:before,.md-typeset details.attention>.admonition-title:before,.md-typeset details.attention>summary:before,.md-typeset details.caution>.admonition-title:before,.md-typeset details.caution>summary:before,.md-typeset details.warning>.admonition-title:before,.md-typeset details.warning>summary:before{color:#ff9100;content:""}.md-typeset .admonition.fail,.md-typeset .admonition.failure,.md-typeset .admonition.missing,.md-typeset details.fail,.md-typeset details.failure,.md-typeset details.missing{border-left-color:#ff5252}[dir=rtl] .md-typeset .admonition.fail,[dir=rtl] .md-typeset .admonition.failure,[dir=rtl] .md-typeset .admonition.missing,[dir=rtl] .md-typeset details.fail,[dir=rtl] .md-typeset details.failure,[dir=rtl] .md-typeset details.missing{border-right-color:#ff5252}.md-typeset .admonition.fail>.admonition-title,.md-typeset .admonition.fail>summary,.md-typeset .admonition.failure>.admonition-title,.md-typeset .admonition.failure>summary,.md-typeset .admonition.missing>.admonition-title,.md-typeset .admonition.missing>summary,.md-typeset details.fail>.admonition-title,.md-typeset details.fail>summary,.md-typeset details.failure>.admonition-title,.md-typeset details.failure>summary,.md-typeset details.missing>.admonition-title,.md-typeset details.missing>summary{border-bottom-color:rgba(255,82,82,.1);background-color:rgba(255,82,82,.1)}.md-typeset .admonition.fail>.admonition-title:before,.md-typeset .admonition.fail>summary:before,.md-typeset .admonition.failure>.admonition-title:before,.md-typeset .admonition.failure>summary:before,.md-typeset .admonition.missing>.admonition-title:before,.md-typeset .admonition.missing>summary:before,.md-typeset details.fail>.admonition-title:before,.md-typeset details.fail>summary:before,.md-typeset details.failure>.admonition-title:before,.md-typeset details.failure>summary:before,.md-typeset details.missing>.admonition-title:before,.md-typeset details.missing>summary:before{color:#ff5252;content:""}.md-typeset .admonition.danger,.md-typeset .admonition.error,.md-typeset details.danger,.md-typeset details.error{border-left-color:#ff1744}[dir=rtl] .md-typeset .admonition.danger,[dir=rtl] .md-typeset .admonition.error,[dir=rtl] .md-typeset details.danger,[dir=rtl] .md-typeset details.error{border-right-color:#ff1744}.md-typeset .admonition.danger>.admonition-title,.md-typeset .admonition.danger>summary,.md-typeset .admonition.error>.admonition-title,.md-typeset .admonition.error>summary,.md-typeset details.danger>.admonition-title,.md-typeset details.danger>summary,.md-typeset details.error>.admonition-title,.md-typeset details.error>summary{border-bottom-color:rgba(255,23,68,.1);background-color:rgba(255,23,68,.1)}.md-typeset .admonition.danger>.admonition-title:before,.md-typeset .admonition.danger>summary:before,.md-typeset .admonition.error>.admonition-title:before,.md-typeset .admonition.error>summary:before,.md-typeset details.danger>.admonition-title:before,.md-typeset details.danger>summary:before,.md-typeset details.error>.admonition-title:before,.md-typeset details.error>summary:before{color:#ff1744;content:""}.md-typeset .admonition.bug,.md-typeset details.bug{border-left-color:#f50057}[dir=rtl] .md-typeset .admonition.bug,[dir=rtl] .md-typeset details.bug{border-right-color:#f50057}.md-typeset .admonition.bug>.admonition-title,.md-typeset .admonition.bug>summary,.md-typeset details.bug>.admonition-title,.md-typeset details.bug>summary{border-bottom-color:rgba(245,0,87,.1);background-color:rgba(245,0,87,.1)}.md-typeset .admonition.bug>.admonition-title:before,.md-typeset .admonition.bug>summary:before,.md-typeset details.bug>.admonition-title:before,.md-typeset details.bug>summary:before{color:#f50057;content:""}.md-typeset .admonition.example,.md-typeset details.example{border-left-color:#651fff}[dir=rtl] .md-typeset .admonition.example,[dir=rtl] .md-typeset details.example{border-right-color:#651fff}.md-typeset .admonition.example>.admonition-title,.md-typeset .admonition.example>summary,.md-typeset details.example>.admonition-title,.md-typeset details.example>summary{border-bottom-color:rgba(101,31,255,.1);background-color:rgba(101,31,255,.1)}.md-typeset .admonition.example>.admonition-title:before,.md-typeset .admonition.example>summary:before,.md-typeset details.example>.admonition-title:before,.md-typeset details.example>summary:before{color:#651fff;content:""}.md-typeset .admonition.cite,.md-typeset .admonition.quote,.md-typeset details.cite,.md-typeset details.quote{border-left-color:#9e9e9e}[dir=rtl] .md-typeset .admonition.cite,[dir=rtl] .md-typeset .admonition.quote,[dir=rtl] .md-typeset details.cite,[dir=rtl] .md-typeset details.quote{border-right-color:#9e9e9e}.md-typeset .admonition.cite>.admonition-title,.md-typeset .admonition.cite>summary,.md-typeset .admonition.quote>.admonition-title,.md-typeset .admonition.quote>summary,.md-typeset details.cite>.admonition-title,.md-typeset details.cite>summary,.md-typeset details.quote>.admonition-title,.md-typeset details.quote>summary{border-bottom-color:hsla(0,0%,62%,.1);background-color:hsla(0,0%,62%,.1)}.md-typeset .admonition.cite>.admonition-title:before,.md-typeset .admonition.cite>summary:before,.md-typeset .admonition.quote>.admonition-title:before,.md-typeset .admonition.quote>summary:before,.md-typeset details.cite>.admonition-title:before,.md-typeset details.cite>summary:before,.md-typeset details.quote>.admonition-title:before,.md-typeset details.quote>summary:before{color:#9e9e9e;content:""}.codehilite .o,.codehilite .ow,.md-typeset .highlight .o,.md-typeset .highlight .ow{color:inherit}.codehilite .ge,.md-typeset .highlight .ge{color:#000}.codehilite .gr,.md-typeset .highlight .gr{color:#a00}.codehilite .gh,.md-typeset .highlight .gh{color:#999}.codehilite .go,.md-typeset .highlight .go{color:#888}.codehilite .gp,.md-typeset .highlight .gp{color:#555}.codehilite .gs,.md-typeset .highlight .gs{color:inherit}.codehilite .gu,.md-typeset .highlight .gu{color:#aaa}.codehilite .gt,.md-typeset .highlight .gt{color:#a00}.codehilite .gd,.md-typeset .highlight .gd{background-color:#fdd}.codehilite .gi,.md-typeset .highlight .gi{background-color:#dfd}.codehilite .k,.md-typeset .highlight .k{color:#3b78e7}.codehilite .kc,.md-typeset .highlight .kc{color:#a71d5d}.codehilite .kd,.codehilite .kn,.md-typeset .highlight .kd,.md-typeset .highlight .kn{color:#3b78e7}.codehilite .kp,.md-typeset .highlight .kp{color:#a71d5d}.codehilite .kr,.codehilite .kt,.md-typeset .highlight .kr,.md-typeset .highlight .kt{color:#3e61a2}.codehilite .c,.codehilite .cm,.md-typeset .highlight .c,.md-typeset .highlight .cm{color:#999}.codehilite .cp,.md-typeset .highlight .cp{color:#666}.codehilite .c1,.codehilite .ch,.codehilite .cs,.md-typeset .highlight .c1,.md-typeset .highlight .ch,.md-typeset .highlight .cs{color:#999}.codehilite .na,.codehilite .nb,.md-typeset .highlight .na,.md-typeset .highlight .nb{color:#c2185b}.codehilite .bp,.md-typeset .highlight .bp{color:#3e61a2}.codehilite .nc,.md-typeset .highlight .nc{color:#c2185b}.codehilite .no,.md-typeset .highlight .no{color:#3e61a2}.codehilite .nd,.codehilite .ni,.md-typeset .highlight .nd,.md-typeset .highlight .ni{color:#666}.codehilite .ne,.codehilite .nf,.md-typeset .highlight .ne,.md-typeset .highlight .nf{color:#c2185b}.codehilite .nl,.md-typeset .highlight .nl{color:#3b5179}.codehilite .nn,.md-typeset .highlight .nn{color:#ec407a}.codehilite .nt,.md-typeset .highlight .nt{color:#3b78e7}.codehilite .nv,.codehilite .vc,.codehilite .vg,.codehilite .vi,.md-typeset .highlight .nv,.md-typeset .highlight .vc,.md-typeset .highlight .vg,.md-typeset .highlight .vi{color:#3e61a2}.codehilite .nx,.md-typeset .highlight .nx{color:#ec407a}.codehilite .il,.codehilite .m,.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo,.md-typeset .highlight .il,.md-typeset .highlight .m,.md-typeset .highlight .mf,.md-typeset .highlight .mh,.md-typeset .highlight .mi,.md-typeset .highlight .mo{color:#e74c3c}.codehilite .s,.codehilite .sb,.codehilite .sc,.md-typeset .highlight .s,.md-typeset .highlight .sb,.md-typeset .highlight .sc{color:#0d904f}.codehilite .sd,.md-typeset .highlight .sd{color:#999}.codehilite .s2,.md-typeset .highlight .s2{color:#0d904f}.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sx,.md-typeset .highlight .se,.md-typeset .highlight .sh,.md-typeset .highlight .si,.md-typeset .highlight .sx{color:#183691}.codehilite .sr,.md-typeset .highlight .sr{color:#009926}.codehilite .s1,.codehilite .ss,.md-typeset .highlight .s1,.md-typeset .highlight .ss{color:#0d904f}.codehilite .err,.md-typeset .highlight .err{color:#a61717}.codehilite .w,.md-typeset .highlight .w{color:transparent}.codehilite .hll,.md-typeset .highlight .hll{display:block;margin:0 -.6rem;padding:0 .6rem;background-color:rgba(255,235,59,.5)}.md-typeset .codehilite,.md-typeset .highlight{position:relative;margin:1em 0;padding:0;border-radius:.1rem;background-color:hsla(0,0%,92.5%,.5);color:#37474f;line-height:1.4;-webkit-overflow-scrolling:touch}.md-typeset .codehilite code,.md-typeset .codehilite pre,.md-typeset .highlight code,.md-typeset .highlight pre{display:block;margin:0;padding:.525rem .6rem;background-color:transparent;overflow:auto;vertical-align:top}.md-typeset .codehilite code::-webkit-scrollbar,.md-typeset .codehilite pre::-webkit-scrollbar,.md-typeset .highlight code::-webkit-scrollbar,.md-typeset .highlight pre::-webkit-scrollbar{width:.2rem;height:.2rem}.md-typeset .codehilite code::-webkit-scrollbar-thumb,.md-typeset .codehilite pre::-webkit-scrollbar-thumb,.md-typeset .highlight code::-webkit-scrollbar-thumb,.md-typeset .highlight pre::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset .codehilite code::-webkit-scrollbar-thumb:hover,.md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,.md-typeset .highlight code::-webkit-scrollbar-thumb:hover,.md-typeset .highlight pre::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset pre.codehilite,.md-typeset pre.highlight{overflow:visible}.md-typeset pre.codehilite code,.md-typeset pre.highlight code{display:block;padding:.525rem .6rem;overflow:auto}.md-typeset .codehilitetable,.md-typeset .highlighttable{display:block;margin:1em 0;border-radius:.2em;font-size:.8rem;overflow:hidden}.md-typeset .codehilitetable tbody,.md-typeset .codehilitetable td,.md-typeset .highlighttable tbody,.md-typeset .highlighttable td{display:block;padding:0}.md-typeset .codehilitetable tr,.md-typeset .highlighttable tr{display:-webkit-box;display:flex}.md-typeset .codehilitetable .codehilite,.md-typeset .codehilitetable .highlight,.md-typeset .codehilitetable .linenodiv,.md-typeset .highlighttable .codehilite,.md-typeset .highlighttable .highlight,.md-typeset .highlighttable .linenodiv{margin:0;border-radius:0}.md-typeset .codehilitetable .linenodiv,.md-typeset .highlighttable .linenodiv{padding:.525rem .6rem}.md-typeset .codehilitetable .linenos,.md-typeset .highlighttable .linenos{background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.26);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-typeset .codehilitetable .linenos pre,.md-typeset .highlighttable .linenos pre{margin:0;padding:0;background-color:transparent;color:inherit;text-align:right}.md-typeset .codehilitetable .code,.md-typeset .highlighttable .code{-webkit-box-flex:1;flex:1;overflow:hidden}.md-typeset>.codehilitetable,.md-typeset>.highlighttable{box-shadow:none}.md-typeset [id^="fnref:"]{display:inline-block}.md-typeset [id^="fnref:"]:target{margin-top:-3.8rem;padding-top:3.8rem;pointer-events:none}.md-typeset [id^="fn:"]:before{display:none;height:0;content:""}.md-typeset [id^="fn:"]:target:before{display:block;margin-top:-3.5rem;padding-top:3.5rem;pointer-events:none}.md-typeset .footnote{color:rgba(0,0,0,.54);font-size:.64rem}.md-typeset .footnote ol{margin-left:0}.md-typeset .footnote li{-webkit-transition:color .25s;transition:color .25s}.md-typeset .footnote li:target{color:rgba(0,0,0,.87)}.md-typeset .footnote li :first-child{margin-top:0}.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{-webkit-transform:translateX(0);transform:translateX(0);opacity:1}.md-typeset .footnote li:hover .footnote-backref:hover,.md-typeset .footnote li:target .footnote-backref{color:#536dfe}.md-typeset .footnote-ref{display:inline-block;pointer-events:auto}.md-typeset .footnote-ref:before{display:inline;margin:0 .2em;border-left:.05rem solid rgba(0,0,0,.26);font-size:1.25em;content:"";vertical-align:-.25rem}.md-typeset .footnote-backref{display:inline-block;-webkit-transform:translateX(.25rem);transform:translateX(.25rem);-webkit-transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s,-webkit-transform .25s .125s;color:rgba(0,0,0,.26);font-size:0;opacity:0;vertical-align:text-bottom}[dir=rtl] .md-typeset .footnote-backref{-webkit-transform:translateX(-.25rem);transform:translateX(-.25rem)}.md-typeset .footnote-backref:before{display:inline-block;font-size:.8rem;content:"\E31B"}[dir=rtl] .md-typeset .footnote-backref:before{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.md-typeset .headerlink{display:inline-block;margin-left:.5rem;-webkit-transform:translateY(.25rem);transform:translateY(.25rem);-webkit-transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s,-webkit-transform .25s .25s;opacity:0}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem;margin-left:0}html body .md-typeset .headerlink{color:rgba(0,0,0,.26)}.md-typeset h1[id]:before{display:block;margin-top:-9px;padding-top:9px;content:""}.md-typeset h1[id]:target:before{margin-top:-3.45rem;padding-top:3.45rem}.md-typeset h1[id] .headerlink:focus,.md-typeset h1[id]:hover .headerlink,.md-typeset h1[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h1[id] .headerlink:focus,.md-typeset h1[id]:hover .headerlink:hover,.md-typeset h1[id]:target .headerlink{color:#536dfe}.md-typeset h2[id]:before{display:block;margin-top:-8px;padding-top:8px;content:""}.md-typeset h2[id]:target:before{margin-top:-3.4rem;padding-top:3.4rem}.md-typeset h2[id] .headerlink:focus,.md-typeset h2[id]:hover .headerlink,.md-typeset h2[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h2[id] .headerlink:focus,.md-typeset h2[id]:hover .headerlink:hover,.md-typeset h2[id]:target .headerlink{color:#536dfe}.md-typeset h3[id]:before{display:block;margin-top:-9px;padding-top:9px;content:""}.md-typeset h3[id]:target:before{margin-top:-3.45rem;padding-top:3.45rem}.md-typeset h3[id] .headerlink:focus,.md-typeset h3[id]:hover .headerlink,.md-typeset h3[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h3[id] .headerlink:focus,.md-typeset h3[id]:hover .headerlink:hover,.md-typeset h3[id]:target .headerlink{color:#536dfe}.md-typeset h4[id]:before{display:block;margin-top:-9px;padding-top:9px;content:""}.md-typeset h4[id]:target:before{margin-top:-3.45rem;padding-top:3.45rem}.md-typeset h4[id] .headerlink:focus,.md-typeset h4[id]:hover .headerlink,.md-typeset h4[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h4[id] .headerlink:focus,.md-typeset h4[id]:hover .headerlink:hover,.md-typeset h4[id]:target .headerlink{color:#536dfe}.md-typeset h5[id]:before{display:block;margin-top:-11px;padding-top:11px;content:""}.md-typeset h5[id]:target:before{margin-top:-3.55rem;padding-top:3.55rem}.md-typeset h5[id] .headerlink:focus,.md-typeset h5[id]:hover .headerlink,.md-typeset h5[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h5[id] .headerlink:focus,.md-typeset h5[id]:hover .headerlink:hover,.md-typeset h5[id]:target .headerlink{color:#536dfe}.md-typeset h6[id]:before{display:block;margin-top:-11px;padding-top:11px;content:""}.md-typeset h6[id]:target:before{margin-top:-3.55rem;padding-top:3.55rem}.md-typeset h6[id] .headerlink:focus,.md-typeset h6[id]:hover .headerlink,.md-typeset h6[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h6[id] .headerlink:focus,.md-typeset h6[id]:hover .headerlink:hover,.md-typeset h6[id]:target .headerlink{color:#536dfe}.md-typeset .MJXc-display{margin:.75em 0;padding:.75em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .MathJax_CHTML{outline:0}.md-typeset .critic.comment,.md-typeset del.critic,.md-typeset ins.critic{margin:0 .25em;padding:.0625em 0;border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:#fdd;box-shadow:.25em 0 0 #fdd,-.25em 0 0 #fdd}.md-typeset ins.critic{background-color:#dfd;box-shadow:.25em 0 0 #dfd,-.25em 0 0 #dfd}.md-typeset .critic.comment{background-color:hsla(0,0%,92.5%,.5);color:#37474f;box-shadow:.25em 0 0 hsla(0,0%,92.5%,.5),-.25em 0 0 hsla(0,0%,92.5%,.5)}.md-typeset .critic.comment:before{padding-right:.125em;color:rgba(0,0,0,.26);content:"\E0B7";vertical-align:-.125em}.md-typeset .critic.block{display:block;margin:1em 0;padding-right:.8rem;padding-left:.8rem;box-shadow:none}.md-typeset .critic.block :first-child{margin-top:.5em}.md-typeset .critic.block :last-child{margin-bottom:.5em}.md-typeset details{display:block;padding-top:0}.md-typeset details[open]>summary:after{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.md-typeset details:not([open]){padding-bottom:0}.md-typeset details:not([open])>summary{border-bottom:none}.md-typeset details summary{padding-right:2rem}[dir=rtl] .md-typeset details summary{padding-left:2rem}.no-details .md-typeset details:not([open])>*{display:none}.no-details .md-typeset details:not([open]) summary{display:block}.md-typeset summary{display:block;outline:none;cursor:pointer}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset summary:after{position:absolute;top:.4rem;right:.6rem;color:rgba(0,0,0,.26);font-size:1rem;content:"\E313"}[dir=rtl] .md-typeset summary:after{right:auto;left:.6rem}.md-typeset .emojione{width:1rem;vertical-align:text-top}.md-typeset code.codehilite,.md-typeset code.highlight{margin:0 .29412em;padding:.07353em 0}.md-typeset .superfences-content{display:none;-webkit-box-ordinal-group:100;order:99;width:100%;background-color:#fff}.md-typeset .superfences-content>*{margin:0;border-radius:0}.md-typeset .superfences-tabs{display:-webkit-box;display:flex;position:relative;flex-wrap:wrap;margin:1em 0;border:.05rem solid rgba(0,0,0,.07);border-radius:.2em}.md-typeset .superfences-tabs>input{display:none}.md-typeset .superfences-tabs>input:checked+label{font-weight:700}.md-typeset .superfences-tabs>input:checked+label+.superfences-content{display:block}.md-typeset .superfences-tabs>label{width:auto;padding:.6rem;-webkit-transition:color .125s;transition:color .125s;font-size:.64rem;cursor:pointer}html .md-typeset .superfences-tabs>label:hover{color:#536dfe}.md-typeset .task-list-item{position:relative;list-style-type:none}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em;left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em;left:auto}.md-typeset .task-list-control .task-list-indicator:before{position:absolute;top:.15em;left:-1.25em;color:rgba(0,0,0,.26);font-size:1.25em;content:"\E835";vertical-align:-.25em}[dir=rtl] .md-typeset .task-list-control .task-list-indicator:before{right:-1.25em;left:auto}.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator:before{content:"\E834"}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}@media print{.md-typeset a:after{color:rgba(0,0,0,.54);content:" [" attr(href) "]"}.md-typeset code,.md-typeset pre{white-space:pre-wrap}.md-typeset code{box-shadow:none;-webkit-box-decoration-break:initial;box-decoration-break:slice}.md-clipboard,.md-content__icon,.md-footer,.md-header,.md-sidebar,.md-tabs,.md-typeset .headerlink{display:none}}@media only screen and (max-width:44.9375em){.md-typeset pre{margin:1em -.8rem;border-radius:0}.md-typeset pre>code{padding:.525rem .8rem}.md-footer-nav__link--prev .md-footer-nav__title{display:none}.md-search-result__teaser{max-height:2.5rem;-webkit-line-clamp:3}.codehilite .hll,.md-typeset .highlight .hll{margin:0 -.8rem;padding:0 .8rem}.md-typeset>.codehilite,.md-typeset>.highlight{margin:1em -.8rem;border-radius:0}.md-typeset>.codehilite code,.md-typeset>.codehilite pre,.md-typeset>.highlight code,.md-typeset>.highlight pre{padding:.525rem .8rem}.md-typeset>.codehilitetable,.md-typeset>.highlighttable{margin:1em -.8rem;border-radius:0}.md-typeset>.codehilitetable .codehilite>code,.md-typeset>.codehilitetable .codehilite>pre,.md-typeset>.codehilitetable .highlight>code,.md-typeset>.codehilitetable .highlight>pre,.md-typeset>.codehilitetable .linenodiv,.md-typeset>.highlighttable .codehilite>code,.md-typeset>.highlighttable .codehilite>pre,.md-typeset>.highlighttable .highlight>code,.md-typeset>.highlighttable .highlight>pre,.md-typeset>.highlighttable .linenodiv{padding:.5rem .8rem}.md-typeset>p>.MJXc-display{margin:.75em -.8rem;padding:.25em .8rem}.md-typeset>.superfences-tabs{margin:1em -.8rem;border:0;border-top:.05rem solid rgba(0,0,0,.07);border-radius:0}.md-typeset>.superfences-tabs code,.md-typeset>.superfences-tabs pre{padding:.525rem .8rem}}@media only screen and (min-width:100em){html{font-size:137.5%}}@media only screen and (min-width:125em){html{font-size:150%}}@media only screen and (max-width:59.9375em){body[data-md-state=lock]{overflow:hidden}.ios body[data-md-state=lock] .md-container{display:none}html .md-nav__link[for=__toc]{display:block;padding-right:2.4rem}html .md-nav__link[for=__toc]:after{color:inherit;content:"\E8DE"}html .md-nav__link[for=__toc]+.md-nav__link{display:none}html .md-nav__link[for=__toc]~.md-nav{display:-webkit-box;display:flex}html [dir=rtl] .md-nav__link{padding-right:.8rem;padding-left:2.4rem}.md-nav__source{display:block;padding:0 .2rem;background-color:rgba(50,64,144,.9675);color:#fff}.md-search__overlay{position:absolute;top:.2rem;left:.2rem;width:1.8rem;height:1.8rem;-webkit-transform-origin:center;transform-origin:center;-webkit-transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:transform .3s .1s,opacity .2s .2s;transition:transform .3s .1s,opacity .2s .2s,-webkit-transform .3s .1s;border-radius:1rem;background-color:#fff;overflow:hidden;pointer-events:none}[dir=rtl] .md-search__overlay{right:.2rem;left:auto}[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transition:opacity .1s,-webkit-transform .4s;transition:opacity .1s,-webkit-transform .4s;transition:transform .4s,opacity .1s;transition:transform .4s,opacity .1s,-webkit-transform .4s;opacity:1}.md-search__inner{position:fixed;top:0;left:100%;width:100%;height:100%;-webkit-transform:translateX(5%);transform:translateX(5%);-webkit-transition:right 0s .3s,left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:right 0s .3s,left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:right 0s .3s,left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;transition:right 0s .3s,left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;opacity:0;z-index:2}[data-md-toggle=search]:checked~.md-header .md-search__inner{left:0;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:right 0s 0s,left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:right 0s 0s,left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:right 0s 0s,left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;transition:right 0s 0s,left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;opacity:1}[dir=rtl] [data-md-toggle=search]:checked~.md-header .md-search__inner{right:0;left:auto}html [dir=rtl] .md-search__inner{right:100%;left:auto;-webkit-transform:translateX(-5%);transform:translateX(-5%)}.md-search__input{width:100%;height:2.4rem;font-size:.9rem}.md-search__icon[for=__search]{top:.6rem;left:.8rem}.md-search__icon[for=__search][for=__search]:before{content:"\E5C4"}[dir=rtl] .md-search__icon[for=__search][for=__search]:before{content:"\E5C8"}.md-search__icon[type=reset]{top:.6rem;right:.8rem}.md-search__output{top:2.4rem;bottom:0}.md-search-result__article--document:before{display:none}}@media only screen and (max-width:76.1875em){[data-md-toggle=drawer]:checked~.md-overlay{width:100%;height:100%;-webkit-transition:width 0s,height 0s,opacity .25s;transition:width 0s,height 0s,opacity .25s;opacity:1}.md-header-nav__button.md-icon--home,.md-header-nav__button.md-logo{display:none}.md-hero__inner{margin-top:2.4rem;margin-bottom:1.2rem}.md-nav{background-color:#fff}.md-nav--primary,.md-nav--primary .md-nav{display:-webkit-box;display:flex;position:absolute;top:0;right:0;left:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;height:100%;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}html .md-nav--primary .md-nav__title{position:relative;height:5.6rem;padding:3rem .8rem .2rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-weight:400;line-height:2.4rem;white-space:nowrap;cursor:pointer}html .md-nav--primary .md-nav__title:before{display:block;position:absolute;top:.2rem;left:.2rem;width:2rem;height:2rem;color:rgba(0,0,0,.54)}html .md-nav--primary .md-nav__title~.md-nav__list{background-color:#fff;box-shadow:inset 0 .05rem 0 rgba(0,0,0,.07)}html .md-nav--primary .md-nav__title~.md-nav__list>.md-nav__item:first-child{border-top:0}html .md-nav--primary .md-nav__title--site{position:relative;background-color:#3f51b5;color:#fff}html .md-nav--primary .md-nav__title--site .md-nav__button{display:block;position:absolute;top:.2rem;left:.2rem;width:3.2rem;height:3.2rem;font-size:2.4rem}html .md-nav--primary .md-nav__title--site:before{display:none}html [dir=rtl] .md-nav--primary .md-nav__title--site .md-nav__button,html [dir=rtl] .md-nav--primary .md-nav__title:before{right:.2rem;left:auto}.md-nav--primary .md-nav__list{-webkit-box-flex:1;flex:1;overflow-y:auto}.md-nav--primary .md-nav__item{padding:0;border-top:.05rem solid rgba(0,0,0,.07)}[dir=rtl] .md-nav--primary .md-nav__item{padding:0}.md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:2.4rem}[dir=rtl] .md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:.8rem;padding-left:2.4rem}.md-nav--primary .md-nav__item--nested>.md-nav__link:after{content:"\E315"}[dir=rtl] .md-nav--primary .md-nav__item--nested>.md-nav__link:after{content:"\E314"}.md-nav--primary .md-nav__link{position:relative;margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link:after{position:absolute;top:50%;right:.6rem;margin-top:-.6rem;color:inherit;font-size:1.2rem}[dir=rtl] .md-nav--primary .md-nav__link:after{right:auto;left:.6rem}.md-nav--primary .md-nav--secondary .md-nav__link{position:static}.md-nav--primary .md-nav--secondary .md-nav{position:static;background-color:transparent}.md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem;padding-left:0}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem;padding-left:0}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem;padding-left:0}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem;padding-left:0}.md-nav__toggle~.md-nav{display:-webkit-box;display:flex;-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s;transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);opacity:0}[dir=rtl] .md-nav__toggle~.md-nav{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.no-csstransforms3d .md-nav__toggle~.md-nav{display:none}.md-nav__toggle:checked~.md-nav{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1}.no-csstransforms3d .md-nav__toggle:checked~.md-nav{display:-webkit-box;display:flex}.md-sidebar--primary{position:fixed;top:0;left:-12.1rem;width:12.1rem;height:100%;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);background-color:#fff;z-index:3}[dir=rtl] .md-sidebar--primary{right:-12.1rem;left:auto}.no-csstransforms3d .md-sidebar--primary{display:none}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4);-webkit-transform:translateX(12.1rem);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{-webkit-transform:translateX(-12.1rem);transform:translateX(-12.1rem)}.no-csstransforms3d [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{display:block}.md-sidebar--primary .md-sidebar__scrollwrap{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;margin:0}.md-tabs{display:none}}@media only screen and (min-width:60em){.md-content{margin-right:12.1rem}[dir=rtl] .md-content{margin-right:0;margin-left:12.1rem}.md-header-nav__button.md-icon--search{display:none}.md-header-nav__source{display:block;width:11.7rem;max-width:11.7rem;padding-right:.6rem}[dir=rtl] .md-header-nav__source{padding-right:0;padding-left:.6rem}.md-search{padding:.2rem}.md-search__overlay{position:fixed;top:0;left:0;width:0;height:0;-webkit-transition:width 0s .25s,height 0s .25s,opacity .25s;transition:width 0s .25s,height 0s .25s,opacity .25s;background-color:rgba(0,0,0,.54);cursor:pointer}[dir=rtl] .md-search__overlay{right:0;left:auto}[data-md-toggle=search]:checked~.md-header .md-search__overlay{width:100%;height:100%;-webkit-transition:width 0s,height 0s,opacity .25s;transition:width 0s,height 0s,opacity .25s;opacity:1}.md-search__inner{position:relative;width:11.5rem;margin-right:.8rem;padding:.1rem 0;float:right;-webkit-transition:width .25s cubic-bezier(.1,.7,.1,1);transition:width .25s cubic-bezier(.1,.7,.1,1)}[dir=rtl] .md-search__inner{margin-right:0;margin-left:.8rem;float:left}.md-search__form,.md-search__input{border-radius:.1rem}.md-search__input{width:100%;height:1.8rem;padding-left:2.2rem;-webkit-transition:background-color .25s cubic-bezier(.1,.7,.1,1),color .25s cubic-bezier(.1,.7,.1,1);transition:background-color .25s cubic-bezier(.1,.7,.1,1),color .25s cubic-bezier(.1,.7,.1,1);background-color:rgba(0,0,0,.26);color:inherit;font-size:.8rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input+.md-search__icon{color:inherit}.md-search__input::-webkit-input-placeholder{color:hsla(0,0%,100%,.7)}.md-search__input::-moz-placeholder{color:hsla(0,0%,100%,.7)}.md-search__input:-ms-input-placeholder{color:hsla(0,0%,100%,.7)}.md-search__input::-ms-input-placeholder{color:hsla(0,0%,100%,.7)}.md-search__input::placeholder{color:hsla(0,0%,100%,.7)}.md-search__input:hover{background-color:hsla(0,0%,100%,.12)}[data-md-toggle=search]:checked~.md-header .md-search__input{border-radius:.1rem .1rem 0 0;background-color:#fff;color:rgba(0,0,0,.87);text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__output{top:1.9rem;-webkit-transition:opacity .4s;transition:opacity .4s;opacity:0}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4);opacity:1}.md-search__scrollwrap{max-height:0}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap::-webkit-scrollbar{width:.2rem;height:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem;padding-left:0}.md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem;padding-left:.8rem}.md-sidebar--secondary{display:block;margin-left:100%;-webkit-transform:translate(-100%);transform:translate(-100%)}[dir=rtl] .md-sidebar--secondary{margin-right:100%;margin-left:0;-webkit-transform:translate(100%);transform:translate(100%)}}@media only screen and (min-width:76.25em){.md-content{margin-left:12.1rem}[dir=rtl] .md-content{margin-right:12.1rem}.md-content__inner{margin-right:1.2rem;margin-left:1.2rem}.md-header-nav__button.md-icon--menu{display:none}.md-nav[data-md-state=animate]{-webkit-transition:max-height .25s cubic-bezier(.86,0,.07,1);transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav__toggle~.md-nav{max-height:0;overflow:hidden}.no-js .md-nav__toggle~.md-nav{display:none}.md-nav[data-md-state=expand],.md-nav__toggle:checked~.md-nav{max-height:100%}.no-js .md-nav[data-md-state=expand],.no-js .md-nav__toggle:checked~.md-nav{display:block}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--nested>.md-nav__link:after{display:inline-block;-webkit-transform-origin:.45em .45em;transform-origin:.45em .45em;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;vertical-align:-.125em}.js .md-nav__item--nested>.md-nav__link:after{-webkit-transition:-webkit-transform .4s;transition:-webkit-transform .4s;transition:transform .4s;transition:transform .4s,-webkit-transform .4s}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link:after{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.md-search__inner{margin-right:1.2rem}[dir=rtl] .md-search__inner{margin-left:1.2rem}.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}.md-sidebar--secondary{margin-left:61rem}[dir=rtl] .md-sidebar--secondary{margin-right:61rem;margin-left:0}.md-tabs~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{font-size:0;visibility:hidden}.md-tabs--active~.md-main .md-nav--primary .md-nav__title{display:block;padding:0}.md-tabs--active~.md-main .md-nav--primary .md-nav__title--site{display:none}.no-js .md-tabs--active~.md-main .md-nav--primary .md-nav{display:block}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item{font-size:0;visibility:hidden}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{display:none;font-size:.7rem;overflow:auto;visibility:visible}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested>.md-nav__link{display:none}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--active{display:block}.md-tabs--active~.md-main .md-nav[data-md-level="1"]{max-height:none;overflow:visible}.md-tabs--active~.md-main .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-left:0}.md-tabs--active~.md-main .md-nav[data-md-level="1"] .md-nav .md-nav__title{display:none}}@media only screen and (min-width:45em){.md-footer-nav__link{width:50%}.md-footer-copyright{max-width:75%;float:left}[dir=rtl] .md-footer-copyright{float:right}.md-footer-social{padding:.6rem 0;float:right}[dir=rtl] .md-footer-social{float:left}}@media only screen and (max-width:29.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(45);transform:scale(45)}}@media only screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(60);transform:scale(60)}}@media only screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(75);transform:scale(75)}}@media only screen and (min-width:60em) and (max-width:76.1875em){.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}.md-search-result__teaser{max-height:2.5rem;-webkit-line-clamp:3}} \ No newline at end of file diff --git a/site/index.html b/site/index.html deleted file mode 100644 index aa2aa1e..0000000 --- a/site/index.html +++ /dev/null @@ -1,532 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - mercs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Skip to content - - - -
- -
- -
- - - - -
-
- - -
-
-
- -
-
-
- - -
-
-
- - -
-
-
- - -
-
- - - - - -

MERCS

-

MERCS stands for multi-directional ensembles of classification and regression trees. It is a novel ML-paradigm under active development at the DTAI-lab at KU Leuven.

-

Installation

-

Easy via pip;

-
pip install mercs
-
- -

Website

-

Cf. https://eliavw.github.io/mercs/

-

Tutorials

-

Cf. the quickstart section of the website, https://eliavw.github.io/mercs/quickstart.

-

Code

-

MERCS is fully open-source cf. our github-repository

-

Publications

-

MERCS is an active research project, hence we periodically publish our findings;

-

MERCS: Multi-Directional Ensembles of Regression and Classification Trees

-

Abstract -Learning a function f(X) that predicts Y from X is the archetypal Machine Learning (ML) problem. Typically, both sets of attributes (i.e., X,Y) have to be known before a model can be trained. When this is not the case, or when functions f(X) that predict Y from X are needed for varying X and Y, this may introduce significant overhead (separate learning runs for each function). In this paper, we explore the possibility of omitting the specification of X and Y at training time altogether, by learning a multi-directional, or versatile model, which will allow prediction of any Y from any X. Specifically, we introduce a decision tree-based paradigm that generalizes the well-known Random Forests approach to allow for multi-directionality. The result of these efforts is a novel method called MERCS: Multi-directional Ensembles of Regression and Classification treeS. Experiments show the viability of the approach.

-

Authors -Elia Van Wolputte, Evgeniya Korneva, Hendrik Blockeel

-

Open Access -A pdf version can be found at AAAI-publications

-

People

-

People involved in this project:

- - - - - - - - - - -
-
-
-
- - - - -
- - - - - - - - - - \ No newline at end of file diff --git a/site/quickstart/index.html b/site/quickstart/index.html deleted file mode 100644 index 2c0373e..0000000 --- a/site/quickstart/index.html +++ /dev/null @@ -1,862 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Quickstart - mercs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Skip to content - - - -
- -
- -
- - - - -
-
- - -
-
-
- -
-
-
- - -
-
-
- - -
-
-
- - -
-
- - - - - -

Quickstart

-

Preliminaries

-

Imports

-
import mercs
-import numpy as np
-from mercs.tests import load_iris, default_dataset
-from mercs.core import Mercs
-
-import pandas as pd
-
- -

Fit

-

Here a small MERCS testdrive for what I suppose you'll need. First, let us generate a basic dataset. Some utility-functions are integrated in MERCS so that goes like this

-
train, test = default_dataset(n_features=3)
-
-df = pd.DataFrame(train)
-df.head()
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0123
0-0.8789990.372105-0.1776630.0
1-1.007950-0.196467-1.2711231.0
20.3433410.209659-0.4462800.0
3-2.361662-0.600424-1.3015220.0
4-2.1235070.246505-1.3233880.0
-
- -
df.describe()
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0123
count800.000000800.000000800.000000800.000000
mean-0.0265560.023105-0.0323200.495000
std1.4146830.9826091.3510520.500288
min-4.543441-3.019512-3.8369290.000000
25%-1.074982-0.629842-1.0407690.000000
50%-0.2378250.000368-0.1808850.000000
75%0.9727480.6684191.0052001.000000
max4.0202623.9262383.9946441.000000
-
- -

Now let's train a MERCS model. To know what options you have, come talk to me or dig in the code. For induction, nb_targets and nb_iterations matter most. Number of targets speaks for itself, number of iterations manages the amount of trees for each target. With n_jobs you can do multi-core learning (with joblib, really basic, but works fine on single machine), that makes stuff faster. fraction_missing sets the amount of attributes that is missing for a tree. However, this parameter only has an effect if you use the random selection algorithm. The alternative is the base algorithm, which selects targets, and uses all the rest as input.

-
clf = Mercs(
-    max_depth=4,
-    selection_algorithm="random",
-    fraction_missing=0.6,
-    nb_targets=2,
-    nb_iterations=2,
-    n_jobs=1,
-    verbose=1,
-    inference_algorithm="own",
-    max_steps=8,
-    prediction_algorithm="it",
-)
-
- -

You have to specify the nominal attributes yourself. This determines whether a regressor or a classifier is learned for that target. MERCS takes care of grouping targets such that no mixed sets are created.

-
nominal_ids = {train.shape[1]-1}
-nominal_ids
-
- -
{3}
-
- - -
clf.fit(train, nominal_attributes=nominal_ids)
-
- -

So, now we have learned trees with two targets, but only a single target was nominal. If MERCS worked well, it should have learned single-target classifiers (for attribute 4) and multi-target regressors for all other target sets.

-
for idx, m in enumerate(clf.m_list):
-    msg = """
-    Model with index: {}
-    {}
-    """.format(idx, m.model)
-    print(msg)
-
- -
    Model with index: 0
-    DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None,
-                      max_leaf_nodes=None, min_impurity_decrease=0.0,
-                      min_impurity_split=None, min_samples_leaf=1,
-                      min_samples_split=2, min_weight_fraction_leaf=0.0,
-                      presort=False, random_state=121958, splitter='best')
-
-
-    Model with index: 1
-    DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None,
-                      max_leaf_nodes=None, min_impurity_decrease=0.0,
-                      min_impurity_split=None, min_samples_leaf=1,
-                      min_samples_split=2, min_weight_fraction_leaf=0.0,
-                      presort=False, random_state=671155, splitter='best')
-
-
-    Model with index: 2
-    DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None,
-                      max_leaf_nodes=None, min_impurity_decrease=0.0,
-                      min_impurity_split=None, min_samples_leaf=1,
-                      min_samples_split=2, min_weight_fraction_leaf=0.0,
-                      presort=False, random_state=131932, splitter='best')
-
-
-    Model with index: 3
-    DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None,
-                      max_leaf_nodes=None, min_impurity_decrease=0.0,
-                      min_impurity_split=None, min_samples_leaf=1,
-                      min_samples_split=2, min_weight_fraction_leaf=0.0,
-                      presort=False, random_state=365838, splitter='best')
-
-
-    Model with index: 4
-    DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=4,
-                       max_features=None, max_leaf_nodes=None,
-                       min_impurity_decrease=0.0, min_impurity_split=None,
-                       min_samples_leaf=1, min_samples_split=2,
-                       min_weight_fraction_leaf=0.0, presort=False,
-                       random_state=259178, splitter='best')
-
-
-    Model with index: 5
-    DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=4,
-                       max_features=None, max_leaf_nodes=None,
-                       min_impurity_decrease=0.0, min_impurity_split=None,
-                       min_samples_leaf=1, min_samples_split=2,
-                       min_weight_fraction_leaf=0.0, presort=False,
-                       random_state=644167, splitter='best')
-
- - -

So, that looks good already. Let's examine up close.

-
clf.m_codes
-
- -
array([[ 0,  1,  1, -1],
-       [ 1,  1,  0,  0],
-       [ 1,  1, -1,  0],
-       [ 1,  0,  1, -1],
-       [ 0, -1, -1,  1],
-       [-1,  0, -1,  1]])
-
- - -

That's the matrix that summarizes everything. This can be dense to parse, and there's alternatives to gain insights, for instance;

-
for m_idx, m in enumerate(clf.m_list):
-    msg = """
-    Tree with id:          {}
-    has source attributes: {}
-    has target attributes: {},
-    and predicts {} attributes
-    """.format(m_idx, m.desc_ids, m.targ_ids, m.out_kind)
-    print(msg)
-
- -
    Tree with id:          0
-    has source attributes: [0]
-    has target attributes: [1, 2],
-    and predicts numeric attributes
-
-
-    Tree with id:          1
-    has source attributes: [2, 3]
-    has target attributes: [0, 1],
-    and predicts numeric attributes
-
-
-    Tree with id:          2
-    has source attributes: [3]
-    has target attributes: [0, 1],
-    and predicts numeric attributes
-
-
-    Tree with id:          3
-    has source attributes: [1]
-    has target attributes: [0, 2],
-    and predicts numeric attributes
-
-
-    Tree with id:          4
-    has source attributes: [0]
-    has target attributes: [3],
-    and predicts nominal attributes
-
-
-    Tree with id:          5
-    has source attributes: [1]
-    has target attributes: [3],
-    and predicts nominal attributes
-
- - -

And that concludes my quick tour of how to fit with MERCS.

-

Prediction

-

First, we generate a query.

-
# Single target
-q_code=np.zeros(clf.m_codes[0].shape[0], dtype=int)
-q_code[-1:] = 1
-print("Query code is: {}".format(q_code))
-
-y_pred = clf.predict(test, q_code=q_code)
-y_pred[:10]
-
- -
Query code is: [0 0 0 1]
-
-
-
-
-
-array([0., 0., 0., 1., 0., 0., 1., 1., 1., 1.])
-
- - -
clf.show_q_diagram()
-
- -

svg

-
# Multi-target
-q_code=np.zeros(clf.m_codes[0].shape[0], dtype=int)
-q_code[-2:] = 1
-print("Query code is: {}".format(q_code))
-
-y_pred = clf.predict(test, q_code=q_code)
-y_pred[:10]
-
- -
Query code is: [0 0 1 1]
-
-
-
-
-
-array([[ 0.15161875,  0.        ],
-       [-0.07064853,  0.        ],
-       [ 0.15161875,  0.        ],
-       [ 0.21392281,  1.        ],
-       [ 0.03979332,  0.        ],
-       [-0.20459606,  0.        ],
-       [ 0.21392281,  1.        ],
-       [-0.20459606,  1.        ],
-       [-0.31503791,  1.        ],
-       [-0.17568144,  1.        ]])
-
- - -
clf.show_q_diagram()
-
- -

svg

-
# Missing attributes
-q_code=np.zeros(clf.m_codes[0].shape[0], dtype=int)
-q_code[-1:] = 1
-q_code[:2] = -1
-print("Query code is: {}".format(q_code))
-
-y_pred = clf.predict(test, q_code=q_code)
-y_pred[:10]
-
- -
Query code is: [-1 -1  0  1]
-
-
-
-
-
-array([0., 0., 0., 0., 0., 0., 0., 1., 1., 0.])
-
- - -
clf.show_q_diagram()
-
- -

svg

- - - - - - - - - -
-
-
-
- - - - -
- - - - - - - - - - \ No newline at end of file diff --git a/site/quickstart_files/quickstart_21_0.svg b/site/quickstart_files/quickstart_21_0.svg deleted file mode 100644 index 1310a53..0000000 --- a/site/quickstart_files/quickstart_21_0.svg +++ /dev/null @@ -1,36 +0,0 @@ - - -G - - - -('D', 0) - -('D', 0) - - - -('M', 4) - -('M', 4) - - - -('D', 0)->('M', 4) - - - - - -('D', 3) - -('D', 3) - - - -('M', 4)->('D', 3) - - - - - \ No newline at end of file diff --git a/site/quickstart_files/quickstart_22_0.svg b/site/quickstart_files/quickstart_22_0.svg deleted file mode 100644 index c7614a1..0000000 --- a/site/quickstart_files/quickstart_22_0.svg +++ /dev/null @@ -1,86 +0,0 @@ - - -G - - -('D', 1) - -('D', 1) - - -('M', 2) - -('M', 2) - - -('D', 1)->('M', 2) - - - - -('M', 0) - -('M', 0) - - -('D', 1)->('M', 0) - - - - -('D', 2) - -('D', 2) - - -('M', 2)->('D', 2) - - - - -('D', 3) - -('D', 3) - - -('D', 3)->('M', 2) - - - - -('M', 1) - -('M', 1) - - -('D', 3)->('M', 1) - - - - -('D', 2)->('M', 0) - - - - -('D', 2)->('M', 1) - - - - -('D', 4) - -('D', 4) - - -('M', 0)->('D', 4) - - - - -('M', 1)->('D', 4) - - - - - \ No newline at end of file diff --git a/site/quickstart_files/quickstart_23_0.svg b/site/quickstart_files/quickstart_23_0.svg deleted file mode 100644 index 7652a30..0000000 --- a/site/quickstart_files/quickstart_23_0.svg +++ /dev/null @@ -1,84 +0,0 @@ - - -G - - - -('D', 0) - -('D', 0) - - - -('M', 4) - -('M', 4) - - - -('D', 0)->('M', 4) - - - - - -('M', 0) - -('M', 0) - - - -('D', 0)->('M', 0) - - - - - -('D', 3) - -('D', 3) - - - -('M', 4)->('D', 3) - - - - - -('D', 2) - -('D', 2) - - - -('M', 0)->('D', 2) - - - - - -('D', 1) - -('D', 1) - - - -('M', 3) - -('M', 3) - - - -('D', 1)->('M', 3) - - - - - -('M', 3)->('D', 2) - - - - - \ No newline at end of file diff --git a/site/quickstart_files/quickstart_25_0.svg b/site/quickstart_files/quickstart_25_0.svg deleted file mode 100644 index 6ff7a51..0000000 --- a/site/quickstart_files/quickstart_25_0.svg +++ /dev/null @@ -1,72 +0,0 @@ - - -G - - - -('D', 2) - -('D', 2) - - - -('M', 1) - -('M', 1) - - - -('D', 2)->('M', 1) - - - - - -('D', 0) - -('D', 0) - - - -('M', 1)->('D', 0) - - - - - -('I', 3) - -('I', 3) - - - -('I', 3)->('M', 1) - - - - - -('M', 4) - -('M', 4) - - - -('D', 0)->('M', 4) - - - - - -('D', 3) - -('D', 3) - - - -('M', 4)->('D', 3) - - - - - \ No newline at end of file diff --git a/site/search/search_index.json b/site/search/search_index.json deleted file mode 100644 index d98ab39..0000000 --- a/site/search/search_index.json +++ /dev/null @@ -1 +0,0 @@ -{"config":{"lang":["en"],"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"MERCS \u00b6 MERCS stands for multi-directional ensembles of classification and regression trees . It is a novel ML-paradigm under active development at the DTAI-lab at KU Leuven . Installation \u00b6 Easy via pip; pip install mercs Website \u00b6 Cf. https://eliavw.github.io/mercs/ Tutorials \u00b6 Cf. the quickstart section of the website, https://eliavw.github.io/mercs/quickstart . Code \u00b6 MERCS is fully open-source cf. our github-repository Publications \u00b6 MERCS is an active research project, hence we periodically publish our findings; MERCS: Multi-Directional Ensembles of Regression and Classification Trees \u00b6 Abstract Learning a function f(X) that predicts Y from X is the archetypal Machine Learning (ML) problem. Typically, both sets of attributes (i.e., X,Y) have to be known before a model can be trained. When this is not the case, or when functions f(X) that predict Y from X are needed for varying X and Y, this may introduce significant overhead (separate learning runs for each function). In this paper, we explore the possibility of omitting the specification of X and Y at training time altogether, by learning a multi-directional, or versatile model, which will allow prediction of any Y from any X. Specifically, we introduce a decision tree-based paradigm that generalizes the well-known Random Forests approach to allow for multi-directionality. The result of these efforts is a novel method called MERCS: Multi-directional Ensembles of Regression and Classification treeS. Experiments show the viability of the approach. Authors Elia Van Wolputte, Evgeniya Korneva, Hendrik Blockeel Open Access A pdf version can be found at AAAI-publications People \u00b6 People involved in this project: Elia Van Wolputte Evgeniya Korneva Prof. Hendrik Blockeel","title":"MERCS"},{"location":"#mercs","text":"MERCS stands for multi-directional ensembles of classification and regression trees . It is a novel ML-paradigm under active development at the DTAI-lab at KU Leuven .","title":"MERCS"},{"location":"#installation","text":"Easy via pip; pip install mercs","title":"Installation"},{"location":"#website","text":"Cf. https://eliavw.github.io/mercs/","title":"Website"},{"location":"#tutorials","text":"Cf. the quickstart section of the website, https://eliavw.github.io/mercs/quickstart .","title":"Tutorials"},{"location":"#code","text":"MERCS is fully open-source cf. our github-repository","title":"Code"},{"location":"#publications","text":"MERCS is an active research project, hence we periodically publish our findings;","title":"Publications"},{"location":"#mercs-multi-directional-ensembles-of-regression-and-classification-trees","text":"Abstract Learning a function f(X) that predicts Y from X is the archetypal Machine Learning (ML) problem. Typically, both sets of attributes (i.e., X,Y) have to be known before a model can be trained. When this is not the case, or when functions f(X) that predict Y from X are needed for varying X and Y, this may introduce significant overhead (separate learning runs for each function). In this paper, we explore the possibility of omitting the specification of X and Y at training time altogether, by learning a multi-directional, or versatile model, which will allow prediction of any Y from any X. Specifically, we introduce a decision tree-based paradigm that generalizes the well-known Random Forests approach to allow for multi-directionality. The result of these efforts is a novel method called MERCS: Multi-directional Ensembles of Regression and Classification treeS. Experiments show the viability of the approach. Authors Elia Van Wolputte, Evgeniya Korneva, Hendrik Blockeel Open Access A pdf version can be found at AAAI-publications","title":"MERCS: Multi-Directional Ensembles of Regression and Classification Trees"},{"location":"#people","text":"People involved in this project: Elia Van Wolputte Evgeniya Korneva Prof. Hendrik Blockeel","title":"People"},{"location":"quickstart/","text":"Quickstart \u00b6 Preliminaries \u00b6 Imports \u00b6 import mercs import numpy as np from mercs.tests import load_iris , default_dataset from mercs.core import Mercs import pandas as pd Fit \u00b6 Here a small MERCS testdrive for what I suppose you'll need. First, let us generate a basic dataset. Some utility-functions are integrated in MERCS so that goes like this train , test = default_dataset ( n_features = 3 ) df = pd . DataFrame ( train ) df . head () .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } 0 1 2 3 0 -0.878999 0.372105 -0.177663 0.0 1 -1.007950 -0.196467 -1.271123 1.0 2 0.343341 0.209659 -0.446280 0.0 3 -2.361662 -0.600424 -1.301522 0.0 4 -2.123507 0.246505 -1.323388 0.0 df . describe () .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } 0 1 2 3 count 800.000000 800.000000 800.000000 800.000000 mean -0.026556 0.023105 -0.032320 0.495000 std 1.414683 0.982609 1.351052 0.500288 min -4.543441 -3.019512 -3.836929 0.000000 25% -1.074982 -0.629842 -1.040769 0.000000 50% -0.237825 0.000368 -0.180885 0.000000 75% 0.972748 0.668419 1.005200 1.000000 max 4.020262 3.926238 3.994644 1.000000 Now let's train a MERCS model. To know what options you have, come talk to me or dig in the code. For induction, nb_targets and nb_iterations matter most. Number of targets speaks for itself, number of iterations manages the amount of trees for each target . With n_jobs you can do multi-core learning (with joblib, really basic, but works fine on single machine), that makes stuff faster. fraction_missing sets the amount of attributes that is missing for a tree. However, this parameter only has an effect if you use the random selection algorithm. The alternative is the base algorithm, which selects targets, and uses all the rest as input. clf = Mercs ( max_depth = 4 , selection_algorithm = \"random\" , fraction_missing = 0.6 , nb_targets = 2 , nb_iterations = 2 , n_jobs = 1 , verbose = 1 , inference_algorithm = \"own\" , max_steps = 8 , prediction_algorithm = \"it\" , ) You have to specify the nominal attributes yourself. This determines whether a regressor or a classifier is learned for that target. MERCS takes care of grouping targets such that no mixed sets are created. nominal_ids = { train . shape [ 1 ] - 1 } nominal_ids {3} clf . fit ( train , nominal_attributes = nominal_ids ) So, now we have learned trees with two targets, but only a single target was nominal. If MERCS worked well, it should have learned single-target classifiers (for attribute 4) and multi-target regressors for all other target sets. for idx , m in enumerate ( clf . m_list ): msg = \"\"\" Model with index: {} {} \"\"\" . format ( idx , m . model ) print ( msg ) Model with index: 0 DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=121958, splitter='best') Model with index: 1 DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=671155, splitter='best') Model with index: 2 DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=131932, splitter='best') Model with index: 3 DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=365838, splitter='best') Model with index: 4 DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=4, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=259178, splitter='best') Model with index: 5 DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=4, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=644167, splitter='best') So, that looks good already. Let's examine up close. clf . m_codes array([[ 0, 1, 1, -1], [ 1, 1, 0, 0], [ 1, 1, -1, 0], [ 1, 0, 1, -1], [ 0, -1, -1, 1], [-1, 0, -1, 1]]) That's the matrix that summarizes everything. This can be dense to parse, and there's alternatives to gain insights, for instance; for m_idx , m in enumerate ( clf . m_list ): msg = \"\"\" Tree with id: {} has source attributes: {} has target attributes: {}, and predicts {} attributes \"\"\" . format ( m_idx , m . desc_ids , m . targ_ids , m . out_kind ) print ( msg ) Tree with id: 0 has source attributes: [0] has target attributes: [1, 2], and predicts numeric attributes Tree with id: 1 has source attributes: [2, 3] has target attributes: [0, 1], and predicts numeric attributes Tree with id: 2 has source attributes: [3] has target attributes: [0, 1], and predicts numeric attributes Tree with id: 3 has source attributes: [1] has target attributes: [0, 2], and predicts numeric attributes Tree with id: 4 has source attributes: [0] has target attributes: [3], and predicts nominal attributes Tree with id: 5 has source attributes: [1] has target attributes: [3], and predicts nominal attributes And that concludes my quick tour of how to fit with MERCS. Prediction \u00b6 First, we generate a query. # Single target q_code = np . zeros ( clf . m_codes [ 0 ] . shape [ 0 ], dtype = int ) q_code [ - 1 :] = 1 print ( \"Query code is: {}\" . format ( q_code )) y_pred = clf . predict ( test , q_code = q_code ) y_pred [: 10 ] Query code is: [0 0 0 1] array([0., 0., 0., 1., 0., 0., 1., 1., 1., 1.]) clf . show_q_diagram () # Multi-target q_code = np . zeros ( clf . m_codes [ 0 ] . shape [ 0 ], dtype = int ) q_code [ - 2 :] = 1 print ( \"Query code is: {}\" . format ( q_code )) y_pred = clf . predict ( test , q_code = q_code ) y_pred [: 10 ] Query code is: [0 0 1 1] array([[ 0.15161875, 0. ], [-0.07064853, 0. ], [ 0.15161875, 0. ], [ 0.21392281, 1. ], [ 0.03979332, 0. ], [-0.20459606, 0. ], [ 0.21392281, 1. ], [-0.20459606, 1. ], [-0.31503791, 1. ], [-0.17568144, 1. ]]) clf . show_q_diagram () # Missing attributes q_code = np . zeros ( clf . m_codes [ 0 ] . shape [ 0 ], dtype = int ) q_code [ - 1 :] = 1 q_code [: 2 ] = - 1 print ( \"Query code is: {}\" . format ( q_code )) y_pred = clf . predict ( test , q_code = q_code ) y_pred [: 10 ] Query code is: [-1 -1 0 1] array([0., 0., 0., 0., 0., 0., 0., 1., 1., 0.]) clf . show_q_diagram ()","title":"Quickstart"},{"location":"quickstart/#quickstart","text":"","title":"Quickstart"},{"location":"quickstart/#preliminaries","text":"","title":"Preliminaries"},{"location":"quickstart/#imports","text":"import mercs import numpy as np from mercs.tests import load_iris , default_dataset from mercs.core import Mercs import pandas as pd","title":"Imports"},{"location":"quickstart/#fit","text":"Here a small MERCS testdrive for what I suppose you'll need. First, let us generate a basic dataset. Some utility-functions are integrated in MERCS so that goes like this train , test = default_dataset ( n_features = 3 ) df = pd . DataFrame ( train ) df . head () .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } 0 1 2 3 0 -0.878999 0.372105 -0.177663 0.0 1 -1.007950 -0.196467 -1.271123 1.0 2 0.343341 0.209659 -0.446280 0.0 3 -2.361662 -0.600424 -1.301522 0.0 4 -2.123507 0.246505 -1.323388 0.0 df . describe () .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } 0 1 2 3 count 800.000000 800.000000 800.000000 800.000000 mean -0.026556 0.023105 -0.032320 0.495000 std 1.414683 0.982609 1.351052 0.500288 min -4.543441 -3.019512 -3.836929 0.000000 25% -1.074982 -0.629842 -1.040769 0.000000 50% -0.237825 0.000368 -0.180885 0.000000 75% 0.972748 0.668419 1.005200 1.000000 max 4.020262 3.926238 3.994644 1.000000 Now let's train a MERCS model. To know what options you have, come talk to me or dig in the code. For induction, nb_targets and nb_iterations matter most. Number of targets speaks for itself, number of iterations manages the amount of trees for each target . With n_jobs you can do multi-core learning (with joblib, really basic, but works fine on single machine), that makes stuff faster. fraction_missing sets the amount of attributes that is missing for a tree. However, this parameter only has an effect if you use the random selection algorithm. The alternative is the base algorithm, which selects targets, and uses all the rest as input. clf = Mercs ( max_depth = 4 , selection_algorithm = \"random\" , fraction_missing = 0.6 , nb_targets = 2 , nb_iterations = 2 , n_jobs = 1 , verbose = 1 , inference_algorithm = \"own\" , max_steps = 8 , prediction_algorithm = \"it\" , ) You have to specify the nominal attributes yourself. This determines whether a regressor or a classifier is learned for that target. MERCS takes care of grouping targets such that no mixed sets are created. nominal_ids = { train . shape [ 1 ] - 1 } nominal_ids {3} clf . fit ( train , nominal_attributes = nominal_ids ) So, now we have learned trees with two targets, but only a single target was nominal. If MERCS worked well, it should have learned single-target classifiers (for attribute 4) and multi-target regressors for all other target sets. for idx , m in enumerate ( clf . m_list ): msg = \"\"\" Model with index: {} {} \"\"\" . format ( idx , m . model ) print ( msg ) Model with index: 0 DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=121958, splitter='best') Model with index: 1 DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=671155, splitter='best') Model with index: 2 DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=131932, splitter='best') Model with index: 3 DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=365838, splitter='best') Model with index: 4 DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=4, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=259178, splitter='best') Model with index: 5 DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=4, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=644167, splitter='best') So, that looks good already. Let's examine up close. clf . m_codes array([[ 0, 1, 1, -1], [ 1, 1, 0, 0], [ 1, 1, -1, 0], [ 1, 0, 1, -1], [ 0, -1, -1, 1], [-1, 0, -1, 1]]) That's the matrix that summarizes everything. This can be dense to parse, and there's alternatives to gain insights, for instance; for m_idx , m in enumerate ( clf . m_list ): msg = \"\"\" Tree with id: {} has source attributes: {} has target attributes: {}, and predicts {} attributes \"\"\" . format ( m_idx , m . desc_ids , m . targ_ids , m . out_kind ) print ( msg ) Tree with id: 0 has source attributes: [0] has target attributes: [1, 2], and predicts numeric attributes Tree with id: 1 has source attributes: [2, 3] has target attributes: [0, 1], and predicts numeric attributes Tree with id: 2 has source attributes: [3] has target attributes: [0, 1], and predicts numeric attributes Tree with id: 3 has source attributes: [1] has target attributes: [0, 2], and predicts numeric attributes Tree with id: 4 has source attributes: [0] has target attributes: [3], and predicts nominal attributes Tree with id: 5 has source attributes: [1] has target attributes: [3], and predicts nominal attributes And that concludes my quick tour of how to fit with MERCS.","title":"Fit"},{"location":"quickstart/#prediction","text":"First, we generate a query. # Single target q_code = np . zeros ( clf . m_codes [ 0 ] . shape [ 0 ], dtype = int ) q_code [ - 1 :] = 1 print ( \"Query code is: {}\" . format ( q_code )) y_pred = clf . predict ( test , q_code = q_code ) y_pred [: 10 ] Query code is: [0 0 0 1] array([0., 0., 0., 1., 0., 0., 1., 1., 1., 1.]) clf . show_q_diagram () # Multi-target q_code = np . zeros ( clf . m_codes [ 0 ] . shape [ 0 ], dtype = int ) q_code [ - 2 :] = 1 print ( \"Query code is: {}\" . format ( q_code )) y_pred = clf . predict ( test , q_code = q_code ) y_pred [: 10 ] Query code is: [0 0 1 1] array([[ 0.15161875, 0. ], [-0.07064853, 0. ], [ 0.15161875, 0. ], [ 0.21392281, 1. ], [ 0.03979332, 0. ], [-0.20459606, 0. ], [ 0.21392281, 1. ], [-0.20459606, 1. ], [-0.31503791, 1. ], [-0.17568144, 1. ]]) clf . show_q_diagram () # Missing attributes q_code = np . zeros ( clf . m_codes [ 0 ] . shape [ 0 ], dtype = int ) q_code [ - 1 :] = 1 q_code [: 2 ] = - 1 print ( \"Query code is: {}\" . format ( q_code )) y_pred = clf . predict ( test , q_code = q_code ) y_pred [: 10 ] Query code is: [-1 -1 0 1] array([0., 0., 0., 0., 0., 0., 0., 1., 1., 0.]) clf . show_q_diagram ()","title":"Prediction"}]} \ No newline at end of file diff --git a/site/sitemap.xml b/site/sitemap.xml deleted file mode 100644 index 11103e3..0000000 --- a/site/sitemap.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - None - 2020-01-28 - daily - - - None - 2020-01-28 - daily - - \ No newline at end of file diff --git a/site/sitemap.xml.gz b/site/sitemap.xml.gz deleted file mode 100644 index c175e96..0000000 Binary files a/site/sitemap.xml.gz and /dev/null differ diff --git a/src/mercs/algo/inference_v3.py b/src/mercs/algo/inference_v3.py deleted file mode 100644 index db846a4..0000000 --- a/src/mercs/algo/inference_v3.py +++ /dev/null @@ -1,261 +0,0 @@ -from functools import partial - -import networkx as nx -import numpy as np - -from ..composition import o -from ..utils.inference_tools import ( - _dummy_array, - _map_classes, - _pad_proba, - _select_nominal, - _select_numeric, -) - - -# Main algorithm -def inference_algorithm(g, m_list, i_list, c_list, data, nominal_ids): - """Add inference information to graph g - - Arguments: - g {[type]} -- [description] - m_list {[type]} -- [description] - i_list {[type]} -- [description] - c_list {[type]} -- [description] - data {[type]} -- [description] - nominal_ids {[type]} -- [description] - - Raises: - ValueError: [description] - - Returns: - [type] -- [description] - """ - - _data_node = lambda k, n: k == "D" - _model_node = lambda k, n: k == "M" - _imputation_node = lambda k, n: k == "I" - _composite_node = lambda k, n: k == "C" - - nb_rows, _ = data.shape - - g_desc_ids = list(g.desc_ids) - - if data is not None: - g.data = data[:, g_desc_ids] - else: - g.data = None - - for n in g.nodes(): - if _data_node(*n): - in_degree = g.in_degree(n) - if in_degree == 0: - input_data_node(g, n, g_desc_ids) - elif in_degree > 0: - if n[1] in nominal_ids: - nominal_data_node(g, n, m_list, c_list) - else: - numeric_data_node(g, n, m_list, c_list) - elif _model_node(*n): - model_node(g, n, m_list) - elif _imputation_node(*n): - imputation_node(g, n, i_list, nb_rows) - elif _composite_node(*n): - composite_node(g, n, c_list) - else: - raise ValueError("Did not recognize node kind of {}".format(n)) - - return - - -# Specific Nodes -def input_data_node(g, node, g_desc_ids): - def f(rel_idx): - f1 = _select_numeric(rel_idx) - return f1(g.data) - - # New - g.nodes[node]["inputs"] = g_desc_ids.index(node[1]) - g.nodes[node]["compute"] = f - - return - - -def imputation_node(g, node, i_list, nb_rows): - - # Build function - def f(n): - return i_list[node[1]].transform(_dummy_array(n)).ravel() - - # New - g.nodes[node]["inputs"] = nb_rows - g.nodes[node]["compute"] = f - return - -""" -def single_data_node(g, node, m_list, c_list): - # New - parents = _numeric_parents(g, m_list, c_list, node) - - def f(parents): - collector = _numeric_inputs(g, parents) - return collector.pop() - - g.nodes[node]["inputs"] = parents - g.nodes[node]["compute"] = f - - return -""" - -def numeric_data_node(g, node, m_list, c_list): - parents = _numeric_parents(g, m_list, c_list, node) - - def f(parents): - collector = _numeric_inputs(g, parents) - return np.mean(collector, axis=0) - - g.nodes[node]["inputs"] = parents - g.nodes[node]["compute"] = f - return - - -def nominal_data_node(g, node, m_list, c_list): - # New - parents = _nominal_parents(g, m_list, c_list, node) - - classes = np.unique(np.hstack([c for _, c, _ in parents])) - - def vote(X): - return classes.take(np.argmax(X, axis=1), axis=0) - - def F(parents): - collector = _nominal_inputs(g, parents, classes) - return np.sum(collector, axis=0) - - def F2(parents): - return vote(F(parents)) - - g.nodes[node]["classes"] = classes - g.nodes[node]["inputs"] = parents - g.nodes[node]["compute_proba"] = F - g.nodes[node]["compute"] = F2 - - return - - -def model_node(g, node, m_list): - - # New - parents = _model_parents(g, node) - - def f(parents): - X = _model_inputs(g, parents) - return m_list[node[1]].predict(X) - - g.nodes[node]["inputs"] = parents - g.nodes[node]["compute"] = f - - if hasattr(m_list[node[1]], "predict_proba"): - - def f2(parents): - X = _model_inputs(g, parents) - return m_list[node[1]].predict_proba(X) - - g.nodes[node]["compute_proba"] = f2 - - return - - -def composite_node(g, node, c_list): - return model_node(g, node, c_list) - - -# Helpers - Function -def compute(g, node, proba=False): - - result = "result" - compute = "compute" - - if proba: - result += "_proba" - compute += "_proba" - - r = g.nodes[node].get(result, None) - if r is None: - i = g.nodes[node].get("inputs") - f = g.nodes[node].get(compute) - g.nodes[node][result] = f(i) - return g.nodes[node][result] - else: - return r - - -def _nominal_inputs(g, parents, classes): - collector = [ - _select_nominal(idx)(compute(g, n, proba=True)) - if len(c) == len(classes) - else _pad_proba(c, classes)(_select_nominal(idx)(compute(g, n, proba=True))) - for idx, c, n in parents - ] - return collector - - -def _numeric_inputs(g, parents): - collector = [_select_numeric(idx)(compute(g, n)) for idx, n in parents] - return collector - - -def _model_inputs(g, parents): - collector = [compute(g, n) for n in parents] - collector = np.stack(collector, axis=1) - return collector - - -def _numeric_parents(g, m_list, c_list, node): - - parents = [ - (rel_idx(p_idx, node[1], k, m_list, c_list), (k, p_idx)) - for k, p_idx in g.predecessors(node) - ] - - return parents - - -def _nominal_parents(g, m_list, c_list, node): - parents = [ - ( - rel_idx(p_idx, node[1], k, m_list, c_list), - classes( - p_idx, rel_idx(p_idx, node[1], k, m_list, c_list), k, m_list, c_list - ), - (k, p_idx), - ) - for k, p_idx in g.predecessors(node) - ] - - return parents - - -def _model_parents(g, node): - idxs = {p_idx: (m, p_idx) for m, p_idx in g.predecessors(node)} - - parents = [n for k, n in sorted(idxs.items())] - - return parents - - -def rel_idx(p_idx, n_idx, k, m_list, c_list): - if k == "M": - return m_list[p_idx].targ_ids.index(n_idx) - elif k == "C": - return c_list[p_idx].targ_ids.index(n_idx) - else: - return 0 - - -def classes(p_idx, r_idx, k, m_list, c_list): - if k == "M": - return m_list[p_idx].classes_[r_idx] - elif k == "C": - return c_list[p_idx].classes_[r_idx] - diff --git a/src/mercs/algo/new_inference.py b/src/mercs/algo/new_inference.py deleted file mode 100644 index 4f77038..0000000 --- a/src/mercs/algo/new_inference.py +++ /dev/null @@ -1,342 +0,0 @@ -from functools import partial - -import networkx as nx -import numpy as np -from dask import delayed - -from ..composition import o -from ..utils.inference_tools import ( - _dummy_array, - _map_classes, - _pad_proba, - _select_nominal, - _select_numeric, -) - - -# Main algorithm -def inference_algorithm(g, m_list, i_list, data, nominal_ids): - - data_node = lambda k, n: k == "D" - model_node = lambda k, n: k == "M" - imputation_node = lambda k, n: k == "I" - - nodes = list(nx.topological_sort(g)) - nb_rows, _ = data.shape - - g_desc_ids = list(g.desc_ids) - data = data[:, g_desc_ids] - - for n in nodes: - if data_node(*n): - in_degree = g.in_degree(n) - if in_degree == 0: - dask_input_data_node(g, n, g_desc_ids, data) - elif in_degree == 1: - dask_single_data_node(g, n, m_list) - elif in_degree > 1: - if n[1] in nominal_ids: - dask_nominal_data_node(g, n, m_list) - else: - dask_numeric_data_node(g, n, m_list) - elif model_node(*n): - dask_model_node(g, n, m_list) - elif imputation_node(*n): - dask_imputation_node(g, n, i_list, nb_rows) - else: - raise ValueError("Did not recognize node kind of {}".format(n)) - - return - - -# Specific Nodes -def dask_input_data_node(g, node, g_desc_ids, data): - - f = _select_numeric(g_desc_ids.index(node[1])) - - g.node[node]["dask"] = delayed(f)(data) - - # New - g.node[node]["inputs"] = data - g.node[node]["compute"] = f - - return - - -def dask_imputation_node(g, node, i_list, nb_rows): - - # Build function - f1 = _dummy_array - f2 = i_list[node[1]].transform - f3 = np.ravel - f = o(f3, o(f2, f1)) - - g.node[node]["dask"] = delayed(f)(nb_rows) - - # New - g.node[node]["inputs"] = nb_rows - g.node[node]["compute"] = f - return - - -def dask_single_data_node(g, node, m_list): - - # Build function - idx, parent_function = _dask_get_parents_of_numeric_data_node(g, m_list, node)[ - 0 - ] # Single input - f = _select_numeric(idx) - g.node[node]["dask"] = delayed(f)(parent_function) - - # New - parents = _numeric_parents(g, m_list, node) - - def f(parents): - collector = _numeric_inputs(parents) - return collector.pop() - - g.node[node]["inputs"] = parents - g.node[node]["compute"] = f - - return - - -def dask_numeric_data_node(g, node, m_list): - - idx_fnc = _dask_get_parents_of_numeric_data_node(g, m_list, node) - - parent_functions = [delayed(_select_numeric(idx))(fnc) for idx, fnc in idx_fnc] - - f1 = partial(np.mean, axis=0) - - g.node[node]["dask"] = delayed(f1)(parent_functions) - - # New - parents = _numeric_parents(g, m_list, node) - - def f(parents): - collector = _numeric_inputs(parents) - return f1(collector) - - g.node[node]["inputs"] = parents - g.node[node]["compute"] = f - return - - -def dask_nominal_data_node(g, node, m_list): - idx_cls_fnc = _dask_get_parents_of_nominal_data_node(g, m_list, node) - classes = np.unique(np.hstack([c for _, c, _ in idx_cls_fnc])) - - # Reduce - parent_functions = [] - - for idx, c, fnc in idx_cls_fnc: - f1 = delayed(_select_nominal(idx))(fnc) - if len(c) < len(classes): - f2 = delayed(_pad_proba(c, classes))(f1) - parent_functions.append(f2) - else: - parent_functions.append(f1) - - f3 = delayed(partial(np.sum, axis=0))(parent_functions) - g.node[node]["dask_proba"] = f3 - - g.node[node]["classes"] = classes - - # Vote - def vote(X): - return classes.take(np.argmax(X, axis=1), axis=0) - - g.node[node]["dask"] = delayed(vote)(f3) - - # New - """ - parents = ( - _select_nominal(idx)(fnc) - if len(c) == len(classes) - else _pad_proba(c, classes)(_select_nominal(idx)(fnc)) - for idx, c, fnc in _nominal_parents(g, m_list, node) - ) - - def F(parents): - collector = np.sum(list(parents), axis=0) - return collector - - def F2(parents): - try: - collector = np.sum(list(parents), axis=0) - return vote(collector) - except: - collector = np.sum(list(parents), axis=0) - return collector - """ - - parents = _nominal_parents(g, m_list, node) - def F(parents): - collector = _nominal_inputs(g, parents, classes) - return np.sum(collector, axis=0) - - def F2(parents): - return vote(F(parents)) - - g.node[node]["inputs"] = parents - g.node[node]["compute_proba"] = F - g.node[node]["compute"] = F2 - - return - - -def dask_model_node(g, node, m_list): - # Collect input data - parent_functions = _dask_get_parents_of_model_node(g, node) - - collector = delayed(np.stack, pure=True)(parent_functions, axis=1) - - # Convert function - g.node[node]["dask"] = delayed(m_list[node[1]].predict)(collector) - - if hasattr(m_list[node[1]], "predict_proba"): - g.node[node]["dask_proba"] = delayed(m_list[node[1]].predict_proba)(collector) - - # New - parents = _model_parents(g, node) - - def f(parents): - X = _model_inputs(g, parents) - return m_list[node[1]].predict(X) - - g.node[node]["inputs"] = parents - g.node[node]["compute"] = f - - if hasattr(m_list[node[1]], "predict_proba"): - def f2(parents): - X = _model_inputs(g, parents) - return m_list[node[1]].predict_proba(X) - - g.node[node]["compute_proba"] = f2 - - return - - -# Helpers - Function -def _nominal_inputs(g, parents, classes): - collector = [ - _select_nominal(idx)(compute(g, n, proba=True)) - if len(c) == len(classes) - else _pad_proba(c, classes)(_select_nominal(idx)(compute(g, n, proba=True))) - for idx, c, n in parents - ] - return collector - -def _numeric_inputs(g, parents): - collector = [_select_numeric(idx)(compute(g, n)) for idx, n in parents] - return collector - -def _model_inputs(g, parents): - collector = [compute(g, n) for n in parents] - collector = np.stack(collector, axis=1) - return collector - -def compute(g, node, proba=False): - - result = "result" - compute = "compute" - - if proba: - result += "_proba" - compute += "_proba" - - r = g.node[node].get(result, None) - if r is None: - i = g.node[node].get("inputs") - f = g.node[node].get(compute) - g.node[node][result] = f(i) - return g.node[node][result] - else: - return r - - -def _numeric_parents(g, m_list, node): - rel_idx = lambda p_idx, n_idx: m_list[p_idx].targ_ids.index(n_idx) - - # parents = ( - # (rel_idx(p_idx, node[1]) if m == "M" else 0, compute(g, (m, p_idx))) - # for m, p_idx in g.predecessors(node) - # - - parents = [ - (rel_idx(p_idx, node[1]) if m == "M" else 0, (m, p_idx)) - for m, p_idx in g.predecessors(node) - ] - - return parents - - -def _nominal_parents(g, m_list, node): - rel_idx = lambda p_idx, n_idx: m_list[p_idx].targ_ids.index(n_idx) - classes = lambda p_idx, r_idx: m_list[p_idx].classes_[r_idx] - - # parents = ( - # ( - # rel_idx(p_idx, node[1]) if m == "M" else 0, - # classes(p_idx, rel_idx(p_idx, node[1]) if m == "M" else 0), - # compute(g, (m, p_idx), proba=True), - # ) - # for m, p_idx in g.predecessors(node) - # ) - - parents = [ - ( - rel_idx(p_idx, node[1]) if m == "M" else 0, - classes(p_idx, rel_idx(p_idx, node[1]) if m == "M" else 0), - (m, p_idx), - ) - for m, p_idx in g.predecessors(node) - ] - - return parents - - -def _model_parents(g, node): - idxs = {p_idx: (m, p_idx) for m, p_idx in g.predecessors(node)} - - # parents = (compute(g, n) for k, n in sorted(idxs.items())) - - parents = [n for k, n in sorted(idxs.items())] - - return parents - - -# Helpers - Dask -def _dask_get_parents_of_model_node(g, node): - parent_functions = {a: g.nodes[(m, a)]["dask"] for m, a in g.predecessors(node)} - parent_functions = [v for k, v in sorted(parent_functions.items())] - return parent_functions - - -def _dask_get_parents_of_numeric_data_node(g, m_list, node): - rel_idx = lambda p_idx, n_idx: m_list[p_idx].targ_ids.index(n_idx) - - idx_fnc = [ - (rel_idx(p_idx, node[1]) if m == "M" else 0, g.node[(m, p_idx)]["dask"]) - for m, p_idx in g.predecessors(node) - ] - - return idx_fnc - - -def _dask_get_parents_of_nominal_data_node(g, m_list, node): - rel_idx = lambda p_idx, n_idx: m_list[p_idx].targ_ids.index(n_idx) - classes = lambda p_idx, r_idx: m_list[p_idx].classes_[r_idx] - - idx_fnc = ( - ( - rel_idx(p_idx, node[1]) if m == "M" else 0, - p_idx, - g.node[(m, p_idx)]["dask_proba"], - ) - for m, p_idx in g.predecessors(node) - ) - idx_cls_fnc = [(r_idx, classes(p_idx, r_idx), f) for r_idx, p_idx, f in idx_fnc] - - return idx_cls_fnc diff --git a/src/mercs/algo/new_prediction.py b/src/mercs/algo/new_prediction.py deleted file mode 100644 index 2ecba24..0000000 --- a/src/mercs/algo/new_prediction.py +++ /dev/null @@ -1,623 +0,0 @@ -import warnings -from functools import reduce - -import networkx as nx -import numpy as np -from networkx import NetworkXNoCycle -from networkx.algorithms import find_cycle - -from ..graph import add_imputation_nodes, add_merge_nodes, compose_all, get_ids -from ..utils import ( - change_role, - debug_print, - get_att, - ENCODING, - DESC_ENCODING, - TARG_ENCODING, - MISS_ENCODING, -) - -VERBOSITY = 0 - - -def mi(g_list, q_code, fi, t_codes, random_state=997): - return mrai( - g_list, - q_code, - fi, - t_codes, - init_threshold=-0.1, - stepsize=0.1, - greedy=True, - stochastic=False, - any_target=False, - imputation_nodes=True, - merge_nodes=True, - return_avl_g=False, - random_state=random_state, - ) - - -def mi_old(g_list, q_code, fi, t_codes, random_state=997): - - # Init - mod_ids = [g.graph["id"] for g in g_list] - - # Calculate criteria - avl_att = _att_indicator(q_code, kind="desc") - avl_mod = _mod_indicator(mod_ids, q_code, t_codes, any_target=True) - criteria = avl_mod - - # Pick - g_sel = _avl_pick(g_list, criteria) - - # Build new graph - q_diagram = _build_diagram( - g_sel, avl_att, imputation_nodes=True, merge_nodes=True, test=True - ) - - return q_diagram - - -def mrai( - g_list, - q_code, - fi, - t_codes, - init_threshold=1.0, - stepsize=0.1, - greedy=True, - stochastic=False, - any_target=False, - imputation_nodes=True, - merge_nodes=True, - return_avl_g=False, - random_state=997, -): - - # Init - thresholds = _init_thresholds(init_threshold, stepsize) - - mod_ids = [g.graph["id"] for g in g_list] - - # Calculate criteria - avl_att = _att_indicator(q_code, kind="desc") - avl_mod = _mod_indicator(mod_ids, q_code, t_codes, any_target=any_target) - criteria = _mod_criteria(mod_ids, avl_att, fi) - - criteria = ( - criteria * avl_mod - ) # All the criteria of unavailable models are set to zero - - criteria[np.where(avl_mod<=0)[0], :] = -1 # Unavailable models are set to -1, available ones keep their score. - - # Pick - for c_idx in range(criteria.shape[1]): - criterion = criteria[:, c_idx] - - if greedy: - g_sel = _greedy_pick(g_list, criterion, thresholds) - elif stochastic: - g_sel = _stochastic_pick(g_list, criterion, n=1, random_state=random_state) - else: - msg = """ - You either need to pick in a greedy fashion (picking the most appropriate models first) or - in a stochastic fashion (more likely to pick the most appropriate models). Both of those - options evaluated to False so I have no idea what you are trying to do. - """ - raise NotImplementedError(msg) - - # Build new graph - q_diagram = _build_diagram( - g_sel, - avl_att, - imputation_nodes=imputation_nodes, - merge_nodes=merge_nodes, - test=True, - ) - - if return_avl_g: - sel_ids = [g.graph["id"] for g in g_sel] - avl_g = [g for g in g_list if g.graph["id"] not in sel_ids] - return q_diagram, avl_g - else: - return q_diagram - - -def it( - g_list, - q_code, - fi, - t_codes, - max_steps=4, - init_threshold=1.0, - stepsize=0.1, - random_state=997, -): - # Init - stochastic = False - greedy = True - any_target = True - - g_sel = [] - avl_att = _att_indicator(q_code, kind="desc") - tgt_att = _att_indicator(q_code, kind="targ") - - step_g_list = g_list - step_q_code = change_role(q_code, MISS_ENCODING, TARG_ENCODING) - - for step in range(max_steps): - - last = step + 1 == max_steps # Check if this is our last chance - if last: - any_target = False # We finish the job - q_targ_todo = _targ_todo(step_q_code, tgt_att) - step_q_code = change_role(step_q_code, TARG_ENCODING, MISS_ENCODING) - step_q_code[q_targ_todo] = TARG_ENCODING - - step_q_diagram, step_g_list = mrai( - step_g_list, - step_q_code, - fi, - t_codes, - init_threshold=init_threshold, - stepsize=stepsize, - greedy=greedy, - stochastic=stochastic, - any_target=any_target, - imputation_nodes=True, - merge_nodes=False, - return_avl_g=True, - random_state=random_state, - ) - - # Remember graph of this step - g_sel.append(step_q_diagram) - - # Update query - step_targ = list(step_q_diagram.graph["targ_ids"]) - step_q_code[step_targ] = DESC_ENCODING - - if _stopping_criterion_it(step_q_code, tgt_att): - break - - # Build diagram - q_diagram = _build_diagram( - g_sel, - avl_att, - tgt_att, - imputation_nodes=False, - merge_nodes=True, - prune=True, - test=False, - ) - return q_diagram - - -def rw( - g_list, - q_code, - fi, - t_codes, - max_steps=4, - nb_walks=1, - init_threshold=1.0, - stepsize=0.1, - random_state=997, -): - - q_diagrams = [ - walk( - g_list, - q_code, - fi, - t_codes, - max_steps=max_steps, - init_threshold=init_threshold, - stepsize=stepsize, - random_state=random_state + i, - ) - for i in range(nb_walks) - ] - - return q_diagrams - - -def walk( - g_list, - q_code, - fi, - t_codes, - max_steps=4, - init_threshold=1.0, - stepsize=0.1, - random_state=997, -): - - # Init - avl_att = _att_indicator(q_code, kind="desc") - tgt_att = _att_indicator(q_code, kind="targ") - stochastic = True - greedy = False - any_target = True - - g_sel = [] - g_tgt = set([]) - q_desc = set(get_att(q_code, kind="desc")) - q_miss = set(get_att(q_code, kind="miss")) - - step_g_list = g_list - step_q_code = q_code.copy() - - # Generate chain - for step in reversed(range(max_steps)): - step_q_diagram, step_g_list = mrai( - step_g_list, - step_q_code, - fi, - t_codes, - init_threshold=init_threshold, - stepsize=stepsize, - greedy=greedy, - stochastic=stochastic, - any_target=any_target, - imputation_nodes=False, - merge_nodes=True, - return_avl_g=True, - random_state=random_state, - ) - - # Update query - step_targ = step_q_diagram.graph["targ_ids"] - step_desc = step_q_diagram.graph["desc_ids"] - - # Remember graph of this step (Append in front!) - g_sel.insert(0, step_q_diagram) - g_tgt = g_tgt.union(step_targ) - - # Extract info - step_q_code[:] = MISS_ENCODING - step_q_code[list(q_desc)] = DESC_ENCODING - step_q_code[list(q_miss.intersection(step_desc))] = TARG_ENCODING - step_q_code[ - list(g_tgt) - ] = ( - MISS_ENCODING - ) # Consider future targets forbidden (this might not be necessary) - - if _stopping_criterion_rw(step_q_code, step): - break - - # Build diagram - avl_desc = set(q_desc) - for g in g_sel: - add_imputation_nodes(g, avl_desc) - avl_desc = avl_desc.union(g.graph["targ_ids"]) - - q_diagram = _build_diagram( - g_sel, - avl_att, - tgt_att, - imputation_nodes=False, - merge_nodes=True, - prune=True, - test=False, - ) - return q_diagram - - -def rev( - g_list, - q_code, - fi, - t_codes, - max_steps=4, - init_threshold=1.0, - stepsize=0.1, - random_state=997, -): - - # Init - avl_att = _att_indicator(q_code, kind="desc") - tgt_att = _att_indicator(q_code, kind="targ") - stochastic = True - greedy = False - any_target = True - - g_sel = [] - g_tgt = set([]) - q_desc = set(get_att(q_code, kind="desc")) - q_miss = set(get_att(q_code, kind="miss")) - - step_g_list = g_list - step_q_code = q_code - - # Generate chain - for step in reversed(range(max_steps)): - step_q_diagram, step_g_list = mrai( - step_g_list, - step_q_code, - fi, - t_codes, - init_threshold=init_threshold, - stepsize=stepsize, - greedy=greedy, - stochastic=stochastic, - any_target=any_target, - imputation_nodes=False, - merge_nodes=True, - return_avl_g=True, - random_state=random_state, - ) - - # Update query - step_targ = step_q_diagram.graph["targ_ids"] - step_desc = step_q_diagram.graph["desc_ids"] - - # Remember graph of this step (Append in front!) - g_sel.insert(0, step_q_diagram) - g_tgt = g_tgt.union(step_targ) - - # Extract info - step_q_code[list(q_miss.intersection(step_desc))] = TARG_ENCODING - step_q_code[ - list(g_tgt) - ] = ( - MISS_ENCODING - ) # Consider future targets forbidden (this might not be necessary) - - if _stopping_criterion_rw(step_q_code, step): - break - - # Build diagram - avl_desc = set(q_desc) - for g in g_sel: - print(g.nodes()) - print(g.graph["desc_ids"], g.graph["targ_ids"]) - add_imputation_nodes(g, avl_desc) - avl_desc = avl_desc.union(g.graph["targ_ids"]) - - q_diagram = _build_diagram( - g_sel, - avl_att, - tgt_att, - imputation_nodes=False, - merge_nodes=True, - prune=True, - test=False, - ) - return q_diagram - - -# Stopping criteria -def _stopping_criterion_it(step_q_code, tgt_att): - q_targ_todo = _targ_todo(step_q_code, tgt_att) - return not np.any(q_targ_todo) - - -def _stopping_criterion_rw(step_q_code, step): - reason_01 = len(get_att(step_q_code, kind="targ")) == 0 - reason_02 = step == 0 - return reason_01 or reason_02 - - -def _stopping_criterion_greedy_pick(list_of_graphs): - return len(list_of_graphs) > 0 - - -def _targ_todo(step_q_code, tgt_att): - """ - Everything you want to know and do not know yet. - """ - return (tgt_att & (step_q_code != DESC_ENCODING)).astype(bool) - - -# Criteria-calculations -def _mod_criteria(mod_ids, avl_att, fi): - return np.dot(fi[mod_ids, :], avl_att).reshape(-1, 1) - - -def _mod_indicator(mod_ids, q_code, t_codes, any_target=True): - """Indicator vector of available models. - - Available models are models which are eligible for selection by - the algorithm. Currently, this just means that the model has to be - relevant, it has to predict at least one target that is required by the query. - - Hence, changes in behaviour (e.g., predicting a missing attribute is also OK) have to - be realized at the level of the query, not here. - - Parameters - ---------- - mod_ids: - q_code: - t_codes: - - Returns - ------- - - """ - - avl_tgt = np.eye(q_code.shape[0], dtype=int)[q_code == TARG_ENCODING].T - avl_mod = np.dot(t_codes[mod_ids, :], avl_tgt) - - if any_target: - # If any target works, I can just sum them up. - # Predicting multiple interesting targets will help to some extent! (sum) - avl_mod = np.sum(avl_mod, axis=1, keepdims=True) - - ones_idx = np.where(avl_mod > 0.) - avl_mod[:] = 0 - avl_mod[ones_idx] = 1 - - #avl_mod = np.clip(np.max(avl_mod, axis=1, keepdims=True), a_min=0, a_max=1) - - return avl_mod - - -def _att_indicator(q_code, kind="desc"): - return (q_code == ENCODING[kind]).astype(int) - - -# Pick models -def _stochastic_pick(g_list, criteria, n=1, random_state=997): - """ - Interpret an array of appropriateness scores as a distribution - corresponding to the probability of a certain model being selected. - - - Parameters - ---------- - criteria: list - Array that quantifies how likely a pick should be. - n: int - Number of picks - - Returns - ------- - picks: np.ndarray - List of indices that were picked - """ - - np.random.seed(random_state) - criteria += abs(np.min([0, np.min(criteria)])) # Shift in case of negative values - norm = np.linalg.norm(criteria, 1) - - if norm > 0: - criteria = criteria / norm - else: - msg = """ - Not a single appropriate model was found, therefore - making an arbitrary choice. - """ - warnings.warn(msg) - # If you cannot be right, be arbitrary - criteria = [1 / len(criteria) for i in criteria] - - - draw = np.random.multinomial(1, criteria, size=n) - picks = np.where(draw == 1)[1] - - return [g_list[g_idx].copy() for g_idx in picks] - - -def _greedy_pick(g_list, criteria, thresholds): - # I do not think I need to copy! - for thr in thresholds: - g_sel = [g_list[idx].copy() for idx, c in enumerate(criteria) if c >= thr] - if _stopping_criterion_greedy_pick(g_sel): - break - return g_sel - - -def _avl_pick(g_list, criteria): - g_sel = [g_list[idx].copy() for idx, c in enumerate(criteria) if c > 0.8] - return g_sel - - -# Initializations -def _init_thresholds(init_threshold, stepsize): - """Initialize thresholds array based on its two defining parameters. - - Parameters - ---------- - init_threshold: - stepsize: - - Returns - ------- - - """ - - thresholds = np.arange(init_threshold, -1 - stepsize, -stepsize) - thresholds = np.clip(thresholds, -1, 1) - return thresholds - - -# Graph - - -def _build_diagram( - g_sel, - avl_att, - tgt_att=None, - imputation_nodes=True, - merge_nodes=False, - prune=False, - test=False, -): - if imputation_nodes: - q_desc = np.where(avl_att)[0] - for g in g_sel: - add_imputation_nodes(g, q_desc) - - q_diagram = compose_all(g_sel) - - if merge_nodes: - add_merge_nodes(q_diagram) - - if prune: - assert tgt_att is not None, "If you prune, you need to provide tgt_att" - q_targ = np.where(tgt_att)[0] - _prune(q_diagram, q_targ) - - if test: - try: - cycles = find_cycle(q_diagram) - msg = """ - Found a cycle! - Cycle was: {} - """.format( - cycles - ) - raise ValueError(msg) - except NetworkXNoCycle: - pass - - q_diagram.graph["desc_ids"] = get_ids(q_diagram, kind="desc") - q_diagram.graph["targ_ids"] = get_ids(q_diagram, kind="targ") - - return q_diagram - - -def _prune(g, tgt_nodes=None): - - msg = """ - tgt_nodes: {} - tgt_nodes[0]: {} - type(tgt_nodes[0]): {} - """.format( - tgt_nodes, tgt_nodes[0], type(tgt_nodes[0]) - ) - debug_print(msg, level=1, V=VERBOSITY) - - if tgt_nodes is None: - tgt_nodes = [ - n - for n, out_degree in g.out_degree() - if out_degree == 0 - if g.nodes[n]["kind"] == "data" - ] - msg = """ - tgt_nodes: {} - """.format( - tgt_nodes - ) - debug_print(msg, level=1, V=VERBOSITY) - elif isinstance(tgt_nodes[0], (int, np.int64)): - tgt_nodes = [ - n - for n in g.nodes - if g.nodes[n]["kind"] == "data" - if g.nodes[n]["idx"] in tgt_nodes - ] - else: - assert isinstance(tgt_nodes[0], str) - - ancestors = [nx.ancestors(g, source=n) for n in tgt_nodes] - retain_nodes = reduce(set.union, ancestors, set(tgt_nodes)) - - nodes_to_remove = [n for n in g.nodes if n not in retain_nodes] - for n in nodes_to_remove: - g.remove_node(n) - return diff --git a/src/mercs/algo/prediction.py b/src/mercs/algo/prediction.py deleted file mode 100644 index 5150829..0000000 --- a/src/mercs/algo/prediction.py +++ /dev/null @@ -1,500 +0,0 @@ -import copy -import warnings -from functools import reduce - -import networkx as nx -import numpy as np - -from .new_prediction import _stochastic_pick -from ..graph import add_imputation_nodes, add_merge_nodes, compose, get_ids, get_nodes -from ..utils import code_to_query, debug_print, encode_attribute, query_to_code - -DESC_ENCODING = encode_attribute(1, [1], [2]) -TARG_ENCODING = encode_attribute(2, [1], [2]) -MISS_ENCODING = encode_attribute(0, [1], [2]) - -VERBOSITY = 0 - - -def mi_algorithm(g_list, q_code, random_state=997): - q_desc, q_targ, q_miss = code_to_query(q_code) - - def criterion(g): - """If g predicts a relevant target = OK""" - tgt_ids = get_ids(g, kind="tgt") - return len(set(q_targ).intersection(tgt_ids)) > 0 - - g_relevant = [g for g in g_list if criterion(g)] - g_relevant = [copy.copy(g) for g in g_relevant] - - result = reduce(compose, g_relevant) - - # Post-processing to get a good graph - add_imputation_nodes(result, q_desc) - add_merge_nodes(result) - - return result - - -def ma_algorithm(g_list, q_code, init_threshold=1.00, stepsize=0.05, random_state=997): - q_desc, q_targ, q_miss = code_to_query(q_code) - - def criterion(g): - src_ids = get_ids(g, kind="src") - tgt_ids = get_ids(g, kind="tgt") - - quantifier = len(set(q_desc).intersection(src_ids)) / len(src_ids) - rel_tgt = tgt_ids.intersection(q_targ) - yes_no = len(rel_tgt) > 0 - relevance_criterion = int(yes_no) * quantifier - - msg = """ - rel_tgt: {} - quantifier: {} - relevance_criterion: {} - """.format( - rel_tgt, quantifier, relevance_criterion - ) - debug_print(msg, level=1, V=VERBOSITY) - - return relevance_criterion - - thresholds = np.clip(np.arange(init_threshold, -stepsize, -stepsize), 0, 1) - - for thr in thresholds: - g_relevant = [g for g in g_list if criterion(g) > thr] - if len(g_relevant) > 0: - msg = """ - We have selected {0} model(s) at threshold: {1:.2f} - """.format( - len(g_relevant), thr - ) - debug_print(msg, level=1, V=VERBOSITY) - break - - g_relevant = [copy.copy(g) for g in g_relevant] - result = reduce(compose, g_relevant) - - # Post-processing to get a good graph - add_imputation_nodes(result, q_desc) - add_merge_nodes(result) - - return result - - -def mrai_algorithm( - g_list, - q_code, - init_threshold=1.0, - stepsize=0.1, - avoid_src=None, - avoid_tgt=None, - return_avl_g=False, - greedy=True, - stochastic=False, - imputation_nodes=True, - merge_nodes=True, - random_state=997, -): - - # Preliminaries - if avoid_src is None: - avoid_src = set([]) - if avoid_tgt is None: - avoid_tgt = set([]) - - q_desc, q_targ, q_miss = code_to_query(q_code) - nb_tgt = len(q_targ) - - thresholds = np.arange(init_threshold, -1 - stepsize, -stepsize) - thresholds = np.clip(thresholds, -1, 1) - - # Methods - def stopping_criterion(list_of_graphs): - return len(list_of_graphs) > 0 - - def criterion(g): - src_ids = get_ids(g, kind="src") - tgt_ids = get_ids(g, kind="tgt") - - rel_src = src_ids.intersection(q_desc) - rel_tgt = tgt_ids.intersection(q_targ) - - bad_src = src_ids.intersection(set(q_targ).union(avoid_src)) - bad_tgt = tgt_ids.intersection(avoid_tgt) # Things I should not predict - - data_nodes = get_nodes(g, kind="data") - - quantifier = 0 - for n in data_nodes: - idx = g.node[n]["idx"] - - if idx in rel_src: - quantifier += g.node[n]["fi"] - if idx in bad_src: - quantifier -= g.node[n]["fi"] - - f_01 = max(0.1, quantifier) - f_02 = int(len(rel_tgt) > 0) - f_03 = int(len(bad_tgt) > 0) - - if f_02: - return f_01 - elif f_03: - # print("Bad target: {}".format(bad_tgt)) - # No relevant targets, and a bad target. This model contributes nothing. - return -1 - else: - return -1 - - # Actual algorithm - if stochastic: - criteria = [criterion(g) for g in g_list] - picks = _pick(criteria, n=1, random_state=random_state) - - msg = """ - criteria: {} - picks: {} - """.format( - criteria, picks - ) - debug_print(msg, level=1, V=VERBOSITY) - - sel_g = [g_list[g_idx] for g_idx in picks] - - sel_g = [copy.deepcopy(g) for g in sel_g] - res_g = reduce(compose, sel_g) - - elif nb_tgt == 1 or greedy: - # Don't stop until you reach the goal - criteria = [criterion(g) for g in g_list] - - for thr in thresholds: - sel_g = [ - g_list[g_idx] for g_idx, c in enumerate(criteria) if c > thr - ] # Available graphs = Graphs that satisfy the criterion - - if stopping_criterion(sel_g): - mod_ids = [get_nodes(g, kind="model") for g in sel_g] - msg = """ - We have selected {0} model(s) - at threshold: {1:.2f} - with model ids: {2} - """.format( - len(sel_g), thr, mod_ids - ) - debug_print(msg, level=1, V=VERBOSITY) - break - - sel_g = [copy.deepcopy(g) for g in sel_g] - - for g in sel_g: - add_imputation_nodes(g, q_desc) - - res_g = reduce(compose, sel_g) - - elif nb_tgt > 1: - msg = """ - Multi-target case: - with target attributes: {} - """.format( - q_targ - ) - debug_print(msg, V=VERBOSITY) - - sel_g = [] - avl_g = g_list - for i in range(len(q_targ)): - tgt_q_targ = q_targ[i : i + 1] - tgt_avoid_src = q_targ[0:i] + q_targ[i + 1 :] - tgt_q_miss = q_miss + tgt_avoid_src - - tgt_q_code = query_to_code(q_desc, tgt_q_targ, q_miss=tgt_q_miss) - - msg = """ - tgt_q_code: {} - """.format( - tgt_q_code - ) - debug_print(msg, level=2, V=VERBOSITY) - tgt_g, avl_g = mrai_algorithm( - avl_g, - tgt_q_code, - avoid_src=tgt_avoid_src, - return_avl_g=True, - merge_nodes=False, - ) - - sel_g.append(tgt_g) - - res_g = reduce(compose, sel_g) - - else: - msg = """ - nb_tgt: {} - We expect one or more targets. - """.format( - nb_tgt - ) - raise ValueError(msg) - - if imputation_nodes: - add_imputation_nodes(res_g, q_desc) - if merge_nodes: - add_merge_nodes(res_g) - - if return_avl_g: - avl_g = [g for g in g_list if g not in sel_g] - return res_g, avl_g - else: - return res_g - - -def it_algorithm(g_list, q_code, max_steps=4, random_state=997): - """ - - Notes - ----- - `avl` is short for `available` - - avl_desc: Available descriptive attributes = Attributes that are available AS descriptive ones. - So, this means these attributes are KNOWN. - avl_targ: Available target attributes = Attributes that are available AS target ones. - So, this means these attributes are UNKNOWN. - - Parameters - ---------- - g_list - q_code - max_steps - random_state - - Returns - ------- - - """ - - def stopping_criterion(known_attributes, target_attributes): - """All targets known = DONE""" - return len(set(target_attributes).difference(known_attributes)) == 0 - - # Init - q_desc, q_targ, q_miss = code_to_query(q_code, return_list=True) - avl_desc = set(q_desc) - avl_targ = set(q_targ + q_miss) - avl_atts = set(q_desc + q_targ + q_miss) - - avl_q = query_to_code(avl_desc, avl_targ, atts=avl_atts) # 0: Known, 1: Unknown - - avl_g = g_list - - greedy = True - sel_g = [] - for step in range(max_steps): - last = step == (max_steps - 1) # Check if this is our last chance - - if last: - # All unknown targets are the target of the last step. - avl_targ = set(q_targ).difference(avl_desc) - avl_q = query_to_code(avl_desc, avl_targ, atts=avl_atts) - greedy = False # Get all remaining targets - - # Get next step - nxt_g, avl_g = mrai_algorithm( - avl_g, - avl_q, - return_avl_g=True, - greedy=greedy, - avoid_src=q_targ, - avoid_tgt=avl_desc, - imputation_nodes=True, - merge_nodes=False, - random_state=random_state, - ) - # IT goes from front to back - sel_g.append(nxt_g) - - # Update query - nxt_targ = get_ids(nxt_g, kind="targ") - avl_desc = avl_desc.union(nxt_targ) - avl_targ = avl_targ.difference(nxt_targ) - - avl_q = query_to_code(avl_desc, avl_targ, atts=avl_atts) - - if stopping_criterion(avl_desc, q_targ): - break - - # Composing - res_g = nx.DiGraph() - avl_desc = set(q_desc) - for g in sel_g: - msg = """ - AVL DESC: {} - """.format( - avl_desc - ) - debug_print(msg, level=1, V=VERBOSITY) - - # add_imputation_nodes(g, avl_desc) - res_g = compose(res_g, g) - - g_targ = get_ids(g, kind="targ") - avl_desc = avl_desc.union(g_targ) - - add_merge_nodes(res_g) - res_g = _prune(res_g, q_targ) - - return res_g - - -def rw_algorithm(g_list, q_code, max_steps=4, random_state=997): - def stopping_criterion(targets, step_number): - reason_01 = len(targets) == 0 - reason_02 = step_number == max_steps - 1 - return reason_01 or reason_02 - - # Init - diagrams - avl_g = g_list - sel_g = [] - - # Init - Attribute sets - q_desc, q_targ, q_miss = code_to_query(q_code, return_list=True) - - sel_targ = set([]) - avl_desc = set(q_desc) - avl_targ = set(q_targ) - avl_atts = set(q_desc + q_targ + q_miss) - avl_q = q_code - - for step in range(max_steps): - # Get next step - nxt_g, avl_g = mrai_algorithm( - avl_g, - avl_q, - return_avl_g=True, - avoid_src=q_targ, - avoid_tgt=avl_desc, - stochastic=True, - merge_nodes=False, - imputation_nodes=False, - random_state=random_state, - ) - # RW goes from back to front - sel_g.insert(0, nxt_g) - - # Update query - nxt_g_desc = get_ids(nxt_g, kind="desc") - nxt_g_targ = get_ids(nxt_g, kind="targ") - - sel_targ = sel_targ.union(nxt_g_targ) - - avl_desc = avl_desc - avl_targ = set(q_miss).difference(sel_targ).intersection(nxt_g_desc) - avl_q = query_to_code(avl_desc, avl_targ, atts=avl_atts) - - if stopping_criterion(avl_targ, step): - break - - # Composing - res_g = nx.DiGraph() - avl_desc = set(q_desc) - for g in sel_g: - msg = """ - AVL DESC: {} - """.format( - avl_desc - ) - debug_print(msg, level=1, V=VERBOSITY) - add_imputation_nodes(g, avl_desc) - res_g = compose(res_g, g) - - g_targ = get_ids(g, kind="targ") - avl_desc = avl_desc.union(g_targ) - - add_merge_nodes(res_g) - res_g = _prune(res_g, q_targ) - - return res_g - - -# Helpers -def _prune(g, tgt_nodes=None): - - msg = """ - tgt_nodes: {} - tgt_nodes[0]: {} - type(tgt_nodes[0]): {} - """.format( - tgt_nodes, tgt_nodes[0], type(tgt_nodes[0]) - ) - debug_print(msg, level=1, V=VERBOSITY) - - if tgt_nodes is None: - tgt_nodes = [ - n - for n, out_degree in g.out_degree() - if out_degree == 0 - if g.nodes[n]["kind"] == "data" - ] - msg = """ - tgt_nodes: {} - """.format( - tgt_nodes - ) - debug_print(msg, level=1, V=VERBOSITY) - elif isinstance(tgt_nodes[0], (int, np.int64)): - tgt_nodes = [ - n - for n in g.nodes - if g.nodes[n]["kind"] == "data" - if g.nodes[n]["idx"] in tgt_nodes - ] - else: - assert isinstance(tgt_nodes[0], str) - - ancestors = [nx.ancestors(g, source=n) for n in tgt_nodes] - retain_nodes = reduce(set.union, ancestors, set(tgt_nodes)) - - nodes_to_remove = [n for n in g.nodes if n not in retain_nodes] - for n in nodes_to_remove: - g.remove_node(n) - - return g - -def _pick(criteria, n=1, random_state=997): - """ - Interpret an array of appropriateness scores as a distribution - corresponding to the probability of a certain model being selected. - - - Parameters - ---------- - criteria: list - Array that quantifies how likely a pick should be. - n: int - Number of picks - - Returns - ------- - picks: np.ndarray - List of indices that were picked - """ - - np.random.seed(random_state) - criteria += abs(np.min([0, np.min(criteria)])) # Shift in case of negative values - norm = np.linalg.norm(criteria, 1) - - if norm > 0: - criteria = criteria / norm - else: - msg = """ - Not a single appropriate model was found, therefore - making an arbitrary choice. - """ - warnings.warn(msg) - # If you cannot be right, be arbitrary - criteria = [1 / len(criteria) for i in criteria] - - draw = np.random.multinomial(1, criteria, size=n) - picks = np.where(draw == 1)[1] - return picks \ No newline at end of file diff --git a/src/mercs/composition/CompositeModel.py b/src/mercs/composition/CompositeModel.py deleted file mode 100644 index b01e9fc..0000000 --- a/src/mercs/composition/CompositeModel.py +++ /dev/null @@ -1,138 +0,0 @@ -import numpy as np -from dask import delayed - -from .compose import o, x -from ..graph.network import get_ids, node_label, get_nodes - -from ..utils import debug_print - -VERBOSITY = 0 - - -class CompositeModel(object): - def __init__(self, diagram, desc_ids=None, targ_ids=None): - - # Assign desc and targ ids - if desc_ids is not None: - self.desc_ids = desc_ids - elif "desc_ids" in diagram.graph: - self.desc_ids = diagram.graph["desc_ids"] - else: - self.desc_ids = get_ids(diagram, kind="desc") - - if targ_ids is not None: - self.targ_ids = targ_ids - elif "targ_ids" in diagram.graph: - self.targ_ids = diagram.graph["targ_ids"] - else: - self.targ_ids = get_ids(diagram, kind="targ") - - self.desc_ids = list(self.desc_ids) - self.targ_ids = list(self.targ_ids) - - self.feature_importances_ = self.extract_feature_importances(diagram) - - self.predict = _get_predict(diagram, self.targ_ids) - self.out_kind = self.extract_out_kind(diagram, self.targ_ids) - - debug_print(self.out_kind) - - if self.out_kind in {"nominal", "mix"}: - - self.nominal_targ_ids = self.extract_nominal_targ_ids( - diagram, self.targ_ids - ) - - self.predict_proba = _get_predict_proba(diagram, self.nominal_targ_ids) - self.classes_ = _get_classes(diagram, self.nominal_targ_ids) - - return - - def extract_feature_importances(self, diagram, aggregation=np.sum): - fi = [] - for idx in self.desc_ids: - fi_idx = [ - d.get("fi", 0) - for src, tgt, d in diagram.edges(data=True) - if d.get("idx", 0) == idx - ] - fi.append(aggregation(fi_idx)) - - norm = np.linalg.norm(fi, 1) - fi = fi / norm - return fi - - @staticmethod - def extract_nominal_targ_ids(diagram, targ_ids): - nominal_targ_ids = [ - t - for t in targ_ids - if diagram.node[node_label(t, kind="data")]["type"] == "nominal" - ] - return nominal_targ_ids - - @staticmethod - def extract_out_kind(diagram, targ_ids): - out_kinds = [diagram.node[node_label(t, kind="data")]["type"] for t in targ_ids] - out_kinds = set(out_kinds) - - if len(out_kinds) == 1: - return out_kinds.pop() - else: - return "mix" - - -def _get_classes(diagram, nominal_targ_ids): - - nominal_targ_ids.sort() - - # The prob and vote nodes have complete information on the classes - targ_classes_ = [ - diagram.node[node_label(t, kind="prob")]["classes"] for t in nominal_targ_ids - ] - - if len(targ_classes_) == 1: - return targ_classes_.pop() - else: - return targ_classes_ - - -def _get_predict_proba(diagram, nominal_targ_ids): - - nominal_targ_ids.sort() - rel_nodes = [node_label(t, kind="prob") for t in nominal_targ_ids] - tgt_methods = [diagram.nodes[n]["dask"] for n in rel_nodes] - - if len(tgt_methods) == 1: - # We can safely return the only method - return tgt_methods.pop() - else: - # We need to package them together - collector = delayed(x)(*tgt_methods, return_type=list) - return collector - - -def _get_predict(diagram, targ_ids): - """ - Compose single predict function for a diagram. - - Parameters - ---------- - diagram - - Returns - ------- - - """ - targ_ids.sort() - - rel_nodes = [node_label(t, kind="data") for t in targ_ids] - tgt_methods = [diagram.nodes[n]["dask"] for n in rel_nodes] - - if len(tgt_methods) == 1: - # We can safely return the only method - return tgt_methods.pop() - else: - # We need to package them together - collector = delayed(np.stack)(tgt_methods, axis=1) - return collector \ No newline at end of file diff --git a/src/mercs/graph/__init__.py b/src/mercs/graph/__init__.py deleted file mode 100644 index 02e0f89..0000000 --- a/src/mercs/graph/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from .network import ( - model_to_graph, - add_merge_nodes, - add_imputation_nodes, - compose, - get_ids, - get_nodes, - compose_all, - get_targ, - get_desc -) - -from .graphviz import fix_layout, to_dot - -from .q_diagram import build_diagram diff --git a/src/mercs/graph/network.py b/src/mercs/graph/network.py deleted file mode 100644 index 8e93636..0000000 --- a/src/mercs/graph/network.py +++ /dev/null @@ -1,478 +0,0 @@ -import networkx as nx -import numpy as np - -from itertools import product -from .graphviz import fix_layout - - -NODE_PREFIXES = dict( - data="d", - vote="v", - prob="p", - merge="M", - imputation="I", - imputer="I", - function="f", - composition="c", - model="f") - -SHAPES = dict( - data='"circle', - vote='"triangle"', - prob='"circle', - merge='"triangle"', - imputation='"invtriangle"', - imputer='"invtriangle"', - function='"square"', - composition='"square"', - model='"square"') - - -# Building a graph -def model_to_graph(model, types=None, idx=0, composition=False): - """ - Convert a model to a network. - - Given a model with inputs and outputs, we convert it to a graphical - model that represents it. - - Parameters - ---------- - types - model: model - Model which is to be converted to a schematic representation - idx: int, default=0 - index (or equivalent:id) of the model - - Returns - ------- - - TODO - ---- - Numpy throws a runtimewarning somewhere in this method, I need to fix that. - - """ - - G = nx.DiGraph() - - # Create nodes - - if composition: - func_nodes = [_create_comp_node(model, idx=idx)] - else: - func_nodes = [_create_func_node(model, idx=idx)] - - nominal = func_nodes[0][1]["out"] == "nominal" # Nominal model yes/no - - data_nodes_src = [_create_data_node(i, types) for i in model.desc_ids] - data_nodes_tgt = [_create_data_node(i, types) for i in model.targ_ids] - - G.add_nodes_from(data_nodes_src) - G.add_nodes_from(data_nodes_tgt) - G.add_nodes_from(func_nodes) - - if nominal: - classes = get_classes(model) - prob_nodes_tgt = [ - _create_prob_node(i, types, classes) for i in model.targ_ids - ] - vote_nodes_tgt = [_create_vote_node(i, types, classes) for i in model.targ_ids] - G.add_nodes_from(prob_nodes_tgt) - G.add_nodes_from(vote_nodes_tgt) - - # Create edges - f = [t[0] for t in func_nodes] - s = [t[0] for t in data_nodes_src] - t = [t[0] for t in data_nodes_tgt] - - src_to_fnc_edges = [ - (*e, {"idx": d, "fi": fi}) - for e, d, fi in zip(product(s, f), model.desc_ids, model.feature_importances_) - ] - G.add_edges_from(src_to_fnc_edges) - - if nominal: - p = [t[0] for t in prob_nodes_tgt] - v = [t[0] for t in vote_nodes_tgt] - - fnc_to_prb_edges = [ - (*e, {"idx": d, "classes": G.node[e[1]]["classes"]}) - for e, d in zip(product(f, p), model.targ_ids) - ] - prb_to_vot_edges = [ - (*e, {"idx": d}) for e, d in zip(product(p, v), model.targ_ids) - ] - vot_to_tgt_edges = [ - (*e, {"idx": d}) for e, d in zip(product(v, t), model.targ_ids) - ] - - G.add_edges_from(fnc_to_prb_edges) - G.add_edges_from(prb_to_vot_edges) - G.add_edges_from(vot_to_tgt_edges) - else: - mod_to_tgt_edges = [ - (*e, {"idx": d}) for e, d in zip(product(f, t), model.targ_ids) - ] - G.add_edges_from(mod_to_tgt_edges) - - # Graph attributes - # TODO: Assign this in a single place. In the core file, we assign this to the composites. - G.graph["desc_ids"] = set(model.desc_ids) - G.graph["targ_ids"] = set(model.targ_ids) - G.graph["id"] = idx - - # FI - G = add_fi_to_graph(G) - - # Final touch - fix_layout(G) - return G - - -def _create_comp_node(model, idx=0): - comp_node = ( - node_label(idx, kind="composition"), - dict( - kind="model", - idx=idx, - mod=model, - src=model.desc_ids, - tgt=model.targ_ids, - out=model.out_kind - ), - ) - - if comp_node[1]["out"] in {"numeric"}: - comp_node[1]["predict"] = model.predict - - # No need to do inference, this goes right away - comp_node[1]["dask"] = comp_node[1]["predict"] - elif comp_node[1]["out"] in {"nominal", "mix"}: - comp_node[1]["predict"] = model.predict - comp_node[1]["predict_proba"] = model.predict_proba - - # No need to do inference, this goes right away - comp_node[1]["dask"] = comp_node[1]["predict"] - comp_node[1]["dask_proba"] = comp_node[1]["predict_proba"] - else: - pass - return comp_node - - -def _create_func_node(model, idx=0): - - func_node = ( - node_label(idx, kind="function"), - dict( - kind="model", - idx=idx, - mod=model, - src=model.desc_ids, - tgt=model.targ_ids, - out=model.out_kind - ), - ) - - if func_node[1]["out"] in {"numeric"}: - func_node[1]["predict"] = model.predict - elif func_node[1]["out"] in {"nominal", "mix"}: - func_node[1]["predict"] = model.predict - func_node[1]["predict_proba"] = model.predict_proba - else: - pass - return func_node - - -def _create_data_node(idx, types): - data_node = ( - node_label(idx, kind="data"), - dict(kind="data", idx=idx, tgt=[idx], type=types[idx]), - ) - return data_node - - -def _create_prob_node(idx, types, classes): - prob_node = ( - node_label(idx, kind="prob"), - dict(kind="prob", idx=idx, tgt=[idx], type=types[idx], classes=classes[idx]), - ) - return prob_node - - -def _create_vote_node(idx, types, classes): - vote_node = ( - node_label(idx, kind="vote"), - dict(kind="vote", idx=idx, tgt=[idx], type=types[idx], classes=classes[idx]), - ) - - - return vote_node - - -def compose_all(g_list): - R = g_list[0].__class__() - - # Add nodes - classes = {} - for g in g_list: - # Add nodes (one at a time) - for n, d in g.nodes(data=True): - R.add_node(n, **d) - - if d["kind"] in {"vote", "prob"}: - n_classes = d.get("classes", np.array([])) - r_classes = classes.get(n, np.array([])) - classes[n] = np.concatenate([r_classes, n_classes]) - - # Add edges (in bulk) - R.add_edges_from(g.edges(data=True)) - - # Joining classes - all_prob_nodes = get_nodes(R, kind="prob") - all_vote_nodes = get_nodes(R, kind="vote") - for n in all_prob_nodes.union(all_vote_nodes): - R.node[n]["classes"] = np.unique(classes[n]) - - return R - - -# Add FI -def add_fi_to_graph(G): - """ - Add feature importances to input data nodes. - - Parameters - ---------- - G - - Returns - ------- - - """ - - src_nodes = ( - n - for n, in_degree in G.in_degree() - if G.nodes[n]["kind"] == "data" - if in_degree == 0 - ) - - src_edges = ((n, G.out_edges(n)) for n in src_nodes) - - for n, edges in src_edges: - fi = np.mean([G.edges()[e]["fi"] for e in edges]) - G.nodes[n]["fi"] = fi - - return G - - -# Add -def add_merge_nodes(g): - - relevant_nodes = [n for n in get_nodes(g, kind="data") if len(g.in_edges(n)) > 1] - - for node in relevant_nodes: - # Collect original node - original_node_attributes = g.nodes(data=True)[node] - original_node = (node, original_node_attributes) - - # Convert original - merge_node_label = convert_data_node(g, node, kind="merge") - - # Insert the original back in, after the merge node - insert_new_node(g, original_node, merge_node_label, location="back") - return - - -def add_imputation_nodes(g, q_desc): - - relevant_nodes = [n for n in get_desc(g, ids=False) - if g.nodes[n]["idx"] not in q_desc] - - for node in relevant_nodes: - convert_data_node(g, node, kind="imputation") - return - - -# Node operations -def convert_data_node(G, data_node_label, kind="merge"): - - # Init - mapping = {} - prefix = NODE_PREFIXES[kind] - shape = SHAPES[kind] - - # Actions - mapping[data_node_label] = "{}({})".format(prefix, data_node_label) - new_node_label = mapping[data_node_label] - - nx.relabel_nodes(G, mapping, copy=False) - - G.nodes[new_node_label]["shape"] = shape - G.nodes[new_node_label]["kind"] = kind - - return mapping[data_node_label] - - -def insert_new_node(G, new_node, existing_node_label, location="behind"): - G.add_node(new_node[0], **new_node[1]) - - if location in {"behind", "after", "back"}: - G.add_edge(existing_node_label, new_node[0], idx=new_node[1]["idx"]) - elif location in {"before", "front"}: - G.add_edge(new_node[0], existing_node_label, idx=new_node[1]["idx"]) - else: - msg = """ - Did not recognize location: {} - to add new node relative to existing node. - """.format( - location - ) - raise ValueError(msg) - - return - - -def compose(G, H): - """ - Return a new graph of G composed with H. - - Composition is the simple union of the node sets and edge sets. - The node sets of G and H need not be disjoint. - - Parameters - ---------- - G, H : graph - A NetworkX graph - - Returns - ------- - C: A new graph with the same type as G - - Notes - ----- - This is a custom version of nx.compose - """ - - if not G.is_multigraph() == H.is_multigraph(): - raise nx.NetworkXError("G and H must both be graphs or multigraphs.") - - R = G.__class__() - - # add graph attributes, H attributes take precedent over G attributes - R.graph.update(G.graph) - R.graph.update(H.graph) - - R.add_nodes_from(G.nodes(data=True)) - R.add_nodes_from(H.nodes(data=True)) - - if G.is_multigraph(): - R.add_edges_from(G.edges(keys=True, data=True)) - else: - R.add_edges_from(G.edges(data=True)) - if H.is_multigraph(): - R.add_edges_from(H.edges(keys=True, data=True)) - else: - R.add_edges_from(H.edges(data=True)) - - # Custom modification - all_prob_nodes = get_nodes(R, kind="prob") - all_vote_nodes = get_nodes(R, kind="vote") - for node in all_prob_nodes.union(all_vote_nodes): - a = get_attribute(G, node, "classes", np.array([])) - b = get_attribute(H, node, "classes", np.array([])) - - R.node[node]["classes"] = np.unique(np.concatenate([a, b])) - return R - - -# Utils -def get_attribute(G, node, attribute, default=None): - """ - From a node that may not exist, collect an attribute that may not be there. - - Parameters - ---------- - G - node - attribute - default - - Returns - ------- - - """ - - return G.nodes.get(node, {}).get(attribute, default) - - -def get_classes(model): - if len(model.targ_ids) > 1: - return { - tgt_idx: model.classes_[idx] for idx, tgt_idx in enumerate(model.targ_ids) - } - else: - # Single target has no indexes, so just pass model.classes_ directly - return {tgt_idx: model.classes_ for idx, tgt_idx in enumerate(model.targ_ids)} - - -def node_label(idx, kind="function"): - """ - Generate a unique name for a node. - - Args: - idx: int - Node id - kind: str, {'func', 'model', 'function'} or {'data} - Every node represents either a function or data. - - Returns: - - """ - prefix = NODE_PREFIXES[kind] - return "{}-{:02d}".format(prefix, idx) - - -def get_ids(g, kind="desc"): - - if kind in {"s", "src", "source", "d", "desc", "descriptive"}: - r = get_desc(g, ids=True) - elif kind in {"t", "tgt", "targ", "target"}: - r = get_targ(g, ids=True) - else: - msg = """ - Did not recognize kind: {} - """.format( - kind - ) - raise ValueError(msg) - - return r - - -def get_desc(g, ids=False): - data_nodes = get_nodes(g, kind="data") - - r = {n for n in data_nodes if len(g.in_edges(n)) == 0} - - if ids: - r = {g.nodes[n]["idx"] for n in r} - - return r - - -def get_targ(g, ids=False): - data_nodes = get_nodes(g, kind="data") - - r = {n for n in data_nodes if len(g.out_edges(n)) == 0} - - if ids: - r = {g.nodes[n]["idx"] for n in r} - - return r - - -def get_nodes(g, kind="data"): - prefix = NODE_PREFIXES[kind] - r = {n for n in g.nodes if n.startswith(prefix)} - return r diff --git a/src/mercs/tests/__init__.py b/src/mercs/tests/__init__.py deleted file mode 100644 index e677a70..0000000 --- a/src/mercs/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .setup import load_iris, default_dataset \ No newline at end of file diff --git a/structure.md b/structure.md index 91a96ab..7f6c324 100644 --- a/structure.md +++ b/structure.md @@ -3,30 +3,23 @@ Layout for machine learning research projects. ``` -. -+-- cli - | Command line interface +-- docs | Documentation +-- note | Notebooks -+-- prod - | Products = all kinds of outputs. Typically you put these in .gitignore - +-- results - +-- visuals -+-- resc - | Rescources, usually config and data - +-- config - +-- data - | Data typically goes through steps, keep track of them - +--step-01 - +--step-02 -+-- src - +-- mercs -+-- test -| ++-- site + | Webpage source code ++-- mercs + | MERCS source code ++-- tests + | Testing files +-- .gitignore -+-- environment.yml ++-- AUTHORS.rst ++-- CHANGELOG.rst +-- deploy.md -+-- readme.md ++-- glossary.md ++-- LICENSE.txt ++-- mkdocs.yml ++-- README.md ++-- structure.md ``` diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ + diff --git a/tests/data/.gitkeep b/tests/data/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/tests/evaluation.py b/tests/evaluation.py new file mode 100644 index 0000000..1308352 --- /dev/null +++ b/tests/evaluation.py @@ -0,0 +1,23 @@ +import numpy as np + + +def accuracy(y, y_hat): + # Calculate classification accuracy of model + return (y.astype(int) == y_hat.astype(int)).sum() / y.size + + +def rmse(y, y_hat): + # Calculate root squared mean error of model + return np.sqrt(((y - y_hat) ** 2).mean()) + + +def compute_scores(y, y_hat, classification_targets): + scores = np.zeros(y.shape[1]) + # Calculate the classification and regression accuracy of the model + for i in range(y.shape[1]): + if i in classification_targets: + scores[i] = accuracy(y[:, i], y_hat[:, i]) + else: + scores[i] = rmse(y[:, i], y_hat[:, i]) + + return scores diff --git a/tests/integration/.gitkeep b/tests/integration/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/tests/test_mixed.py b/tests/test_mixed.py new file mode 100644 index 0000000..519be95 --- /dev/null +++ b/tests/test_mixed.py @@ -0,0 +1,48 @@ +import numpy as np +import pytest + +from mercs import Mercs +from mercs.utils import default_dataset + + +@pytest.fixture +def mercs(): + mercs = Mercs( + selection_algorithm="base", + inference_algorithm="base", + prediction_algorithm="it", + mixed_algorithm="morfist", + max_depth=4, + nb_targets=2, + nb_iterations=2, + n_jobs=1, + verbose=1, + max_steps=8, + ) + train, test = default_dataset(n_features=3) + + # ids of the nominal variables + nominal_ids = {train.shape[1] - 1} + + # fit the model + mercs.fit(train, nominal_attributes=nominal_ids) + + return mercs + + +def test_mixed_mode(mercs): + assert mercs.mixed_algorithm is not None + + +def test_codes(mercs): + assert [0, 0, 1, 1] in mercs.m_codes + + +def test_prediction(mercs): + _, test = default_dataset(n_features=3) + q_code = np.array([0, 0, 0, 1]) + + # predict value of query code for test data + y_pred = mercs.predict(test, q_code=q_code) + + assert y_pred[0] == 0 and y_pred[9] == 1 diff --git a/tests/test_mixed_auto.py b/tests/test_mixed_auto.py new file mode 100644 index 0000000..2ff6554 --- /dev/null +++ b/tests/test_mixed_auto.py @@ -0,0 +1,65 @@ +import numpy as np +from sklearn.model_selection import train_test_split + +from mercs import Mercs +from tests.evaluation import compute_scores + + +def test_auto(): + # initialize the models + mercs = Mercs( + selection_algorithm="base", + inference_algorithm="base", + prediction_algorithm="it", + max_depth=4, + nb_targets=2, + nb_iterations=1, + n_jobs=1, + verbose=1, + max_steps=8, + ) + + mercs_mixed = Mercs( + selection_algorithm="base", + inference_algorithm="base", + prediction_algorithm="it", + mixed_algorithm="morfist", + max_depth=7, + nb_targets=2, + nb_iterations=1, + n_jobs=1, + verbose=1, + max_steps=8, + ) + + # load the data + data = np.loadtxt("./data/auto-mpg.csv", delimiter=",", skiprows=1) + + # split the data into training and testing + x_train, x_test = train_test_split(data, test_size=0.25) + + # ids of the nominal variables + nominal_ids = {1, 6, 7} + + # fit the models + mercs.fit(x_train, nominal_attributes=nominal_ids) + mercs_mixed.fit(x_train, nominal_attributes=nominal_ids) + + # create the query code for the prediction + q_code = np.zeros(x_train.shape[1], dtype=np.int8) + targets = [0, 1] + q_code[targets] = 1 + print(q_code) + + # get real values of target variables + y_test = x_test[:, targets] + + # predict target values + y_pred = mercs.predict(x_test, q_code=q_code) + y_pred_mixed = mercs_mixed.predict(x_test, q_code=q_code) + + scores = compute_scores(y_test, y_pred, [1]) + scores_mixed = compute_scores(y_test, y_pred_mixed, [1]) + + print(scores) + print(scores_mixed) diff --git a/tests/test_mixed_heart.py b/tests/test_mixed_heart.py new file mode 100644 index 0000000..19f8e8a --- /dev/null +++ b/tests/test_mixed_heart.py @@ -0,0 +1,64 @@ +import numpy as np +from sklearn.model_selection import train_test_split + +from mercs import Mercs +from tests.evaluation import compute_scores + +def test_heart(): + # initialize the models + mercs = Mercs( + selection_algorithm="base", + inference_algorithm="base", + prediction_algorithm="it", + max_depth=4, + nb_targets=2, + nb_iterations=1, + n_jobs=1, + verbose=1, + max_steps=8, + ) + + mercs_mixed = Mercs( + selection_algorithm="base", + inference_algorithm="base", + prediction_algorithm="it", + mixed_algorithm="morfist", + max_depth=4, + nb_targets=2, + nb_iterations=1, + n_jobs=1, + verbose=1, + max_steps=8, + ) + + # load the data + data = np.loadtxt("./data/heart_failure_clinical_records.csv", delimiter=",", skiprows=1) + + # split the data into training and testing + x_train, x_test = train_test_split(data, test_size=0.25, random_state=1337) + + # ids of the nominal variables + nominal_ids = {1, 3, 5, 9, 10, 12} + + # fit the models + mercs.fit(x_train, nominal_attributes=nominal_ids) + mercs_mixed.fit(x_train, nominal_attributes=nominal_ids) + + # create the query code for the prediction + q_code = np.zeros(x_train.shape[1], dtype=np.int8) + targets = [2, 12] + q_code[targets] = 1 + print(q_code) + + # get real values of target variables + y_test = x_test[:, targets] + + # predict target values + y_pred = mercs.predict(x_test, q_code=q_code) + y_pred_mixed = mercs_mixed.predict(x_test, q_code=q_code) + + scores = compute_scores(y_test, y_pred, [1]) + scores_mixed = compute_scores(y_test, y_pred_mixed, [1]) + + print(scores) + print(scores_mixed) diff --git a/tests/test_mixed_sf1.py b/tests/test_mixed_sf1.py new file mode 100644 index 0000000..6f94fb2 --- /dev/null +++ b/tests/test_mixed_sf1.py @@ -0,0 +1,67 @@ +import numpy as np +from sklearn.model_selection import train_test_split + +from mercs import Mercs +from tests.evaluation import compute_scores + + +def test_sf1(): + # initialize the models + mercs = Mercs( + selection_algorithm="base", + inference_algorithm="base", + prediction_algorithm="it", + max_depth=4, + nb_targets=2, + nb_iterations=1, + n_jobs=1, + verbose=1, + max_steps=8, + ) + + mercs_mixed = Mercs( + selection_algorithm="base", + inference_algorithm="base", + prediction_algorithm="it", + mixed_algorithm="morfist", + max_depth=4, + nb_targets=2, + nb_iterations=1, + n_jobs=1, + verbose=1, + max_steps=8, + ) + + # load the data + data = np.loadtxt("./data/sf1.csv", delimiter=",", skiprows=1) + + # split the data into training and testing + x_train, x_test = train_test_split(data, test_size=0.25) + + # ids of the nominal variables + nominal_ids = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} + + # fit the models + mercs.fit(x_train, nominal_attributes=nominal_ids) + mercs_mixed.fit(x_train, nominal_attributes=nominal_ids) + + # create the query code for the prediction + q_code = np.zeros(x_train.shape[1], dtype=np.int8) + targets = [2, 8, 10] + q_code[targets] = 1 + print(q_code) + + # get real values of target variables + y_test = x_test[:, targets] + print(y_test.shape) + print(x_test.shape) + + # predict target values + y_pred = mercs.predict(x_test, q_code=q_code) + y_pred_mixed = mercs_mixed.predict(x_test, q_code=q_code) + + scores = compute_scores(y_test, y_pred, [0, 1]) + scores_mixed = compute_scores(y_test, y_pred_mixed, [0, 1]) + + print(scores) + print(scores_mixed) diff --git a/tests/test_mixed_students.py b/tests/test_mixed_students.py new file mode 100644 index 0000000..dff9470 --- /dev/null +++ b/tests/test_mixed_students.py @@ -0,0 +1,66 @@ +import numpy as np +from sklearn.model_selection import train_test_split + +from mercs import Mercs +from tests.evaluation import compute_scores + + +def test_students(): + # initialize the models + mercs = Mercs( + selection_algorithm="base", + inference_algorithm="base", + prediction_algorithm="it", + max_depth=4, + nb_targets=2, + nb_iterations=1, + n_jobs=1, + verbose=1, + max_steps=8, + ) + + mercs_mixed = Mercs( + selection_algorithm="base", + inference_algorithm="base", + prediction_algorithm="it", + mixed_algorithm="morfist", + max_depth=7, + nb_targets=2, + nb_iterations=1, + n_jobs=1, + verbose=1, + max_steps=8, + ) + + # load the data + data = np.loadtxt("./data/student-por.csv", delimiter=",", skiprows=1) + + # split the data into training and testing + x_train, x_test = train_test_split(data, test_size=0.25) + + # ids of the nominal variables + nominal_ids = {0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 29, 21, 22, 23, 24, 25, 26, 27, + 28} + + # fit the models + mercs.fit(x_train, nominal_attributes=nominal_ids) + mercs_mixed.fit(x_train, nominal_attributes=nominal_ids) + + # create the query code for the prediction + q_code = np.zeros(x_train.shape[1], dtype=np.int8) + targets = [1, 21, 31] + q_code[targets] = 1 + print(q_code) + + # get real values of target variables + y_test = x_test[:, targets] + + # predict target values + y_pred = mercs.predict(x_test, q_code=q_code) + y_pred_mixed = mercs_mixed.predict(x_test, q_code=q_code) + + scores = compute_scores(y_test, y_pred, [0, 1]) + scores_mixed = compute_scores(y_test, y_pred_mixed, [0, 1]) + + print(scores) + print(scores_mixed) diff --git a/tests/test_mixed_wine.py b/tests/test_mixed_wine.py new file mode 100644 index 0000000..b65e27e --- /dev/null +++ b/tests/test_mixed_wine.py @@ -0,0 +1,65 @@ +import numpy as np +from sklearn.model_selection import train_test_split + +from mercs import Mercs +from tests.evaluation import compute_scores + + +def test_wine(): + # initialize the models + mercs = Mercs( + selection_algorithm="base", + inference_algorithm="base", + prediction_algorithm="it", + max_depth=4, + nb_targets=3, + nb_iterations=1, + n_jobs=1, + verbose=1, + max_steps=8, + ) + + mercs_mixed = Mercs( + selection_algorithm="base", + inference_algorithm="base", + prediction_algorithm="it", + mixed_algorithm="morfist", + max_depth=7, + nb_targets=3, + nb_iterations=1, + n_jobs=1, + verbose=1, + max_steps=8, + ) + + # load the data + data = np.loadtxt("./data/wine-quality.csv", delimiter=",", skiprows=1) + + # split the data into training and testing + x_train, x_test = train_test_split(data, test_size=0.25) + + # ids of the nominal variables + nominal_ids = {11} + + # fit the models + mercs.fit(x_train, nominal_attributes=nominal_ids) + mercs_mixed.fit(x_train, nominal_attributes=nominal_ids) + + # create the query code for the prediction + q_code = np.zeros(x_train.shape[1], dtype=np.int8) + targets = [0, 1, 11] + q_code[targets] = 1 + print(q_code) + + # get real values of target variables + y_test = x_test[:, targets] + + # predict target values + y_pred = mercs.predict(x_test, q_code=q_code) + y_pred_mixed = mercs_mixed.predict(x_test, q_code=q_code) + + scores = compute_scores(y_test, y_pred, [2]) + scores_mixed = compute_scores(y_test, y_pred_mixed, [2]) + + print(scores) + print(scores_mixed) diff --git a/tests/test_skeleton.py b/tests/test_skeleton.py index 3df01ae..3e3aad6 100644 --- a/tests/test_skeleton.py +++ b/tests/test_skeleton.py @@ -1,16 +1,59 @@ -# -*- coding: utf-8 -*- +from mercs import Mercs +from mercs.utils import default_dataset +import numpy as np -import pytest -from mercs.skeleton import fib -__author__ = "Elia vw" -__copyright__ = "Elia vw" -__license__ = "mit" +def test_init(): + # load default dataset and print head + train, test = default_dataset(n_features=3) -def test_fib(): - assert fib(1) == 1 - assert fib(2) == 1 - assert fib(7) == 13 - with pytest.raises(AssertionError): - fib(-10) + # initialise MERCS model + # the nb_targets defines the number of targets to use while fitting the model + # but it is unrelated to the number of targets to use while predicting + clf = Mercs( + selection_algorithm="base", + inference_algorithm="base", + prediction_algorithm="it", + mixed_algorithm="morfist", + max_depth=4, + nb_targets=2, + nb_iterations=2, + n_jobs=1, + verbose=1, + max_steps=8, + ) + + # ids of the nominal variables + nominal_ids = {train.shape[1]-1} + + # fit the model + clf.fit(train, nominal_attributes=nominal_ids) + + for idx, m in enumerate(clf.m_list): + msg = """ + Model with index: {} + {} + """.format(idx, m.model) + print(msg) + + for m_idx, m in enumerate(clf.m_list): + msg = """ + Tree with id: {} + has source attributes: {} + has target attributes: {}, + and predicts {} attributes + """.format(m_idx, m.desc_ids, m.targ_ids, m.out_kind) + print(msg) + + # Query code is [0 0 0 1] where 0 = descriptive and 1 = target + q_code = np.array([0, 0, 0, 1]) + print("Query code is:", q_code) + + # predict value of query code for test data + y_pred = clf.predict(test, q_code=q_code) + # print the first 10 predictions + print("Predictions:", y_pred[:10]) + + +test_init() diff --git a/tests/travis_setup.sh b/tests/travis_setup.sh deleted file mode 100644 index f4b0080..0000000 --- a/tests/travis_setup.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash - -set -e - -# Deactivate the travis-provided venv and setup conda -deactivate - -if [[ -f "$HOME/miniconda/bin/conda" ]]; then - echo "Skip install conda [cached]" -else - # By default, travis caching mechanism creates an empty dir in the - # beginning of the build, but conda installer aborts if it finds an - # existing folder, so let's just remove it: - rm -rf "$HOME/miniconda" - - # Use miniconda - wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh - chmod +x miniconda.sh && ./miniconda.sh -b -p $HOME/miniconda -fi - -# Update path -export PATH=$HOME/miniconda/bin:$PATH - -# Update conda -conda update --yes conda - -# Create a local environment from the environment.yml file. - -echo "Recreate conda environment in Travis servers" -conda env create -f dependencies-deploy.yaml -n mercs -echo "Recreation done" - -# Conda activate does not work, use source instead. -echo "Add development packages" -source activate mercs -conda env update -n mercs -f dependencies-develop.yaml -echo "Development packages OK. Environment active." - -travis-cleanup() { - printf "Cleaning up environments ... " # printf avoids new lines - if [[ "$DISTRIB" == "conda" ]]; then - # Force the env to be recreated next time, for build consistency - source deactivate - conda remove -n mercs --all --yes - rm -rf ./.conda - fi - echo "DONE" -} - diff --git a/tests/unit/.gitkeep b/tests/unit/.gitkeep deleted file mode 100644 index e69de29..0000000