diff --git a/.gitignore b/.gitignore
index 19a78003..a26b9748 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,36 +1,110 @@
-*.class
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
-# Mobile Tools for Java (J2ME)
-.mtj.tmp/
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
-# Package Files #
-*.jar
-*.war
-*.ear
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-hs_err_pid*
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
-venv
-env
-.idea
-*.pyc
+# Unit test / coverage reports
+htmlcov/
+.tox/
.coverage
-__pycache__/
-build
-dist
-*.spec
-coverage.xml
-*.egg-info
+.coverage.*
.cache
-pytest-env
-*.zip
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
.ipynb_checkpoints
-# Avoid documentation
-auto-docs/build
-auto-docs/source/*.rst
-!auto-docs/source/index.rst
-.RData
-.Rhistory
-_pycache__
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# dotenv
+.env
+
+# virtualenv
+.venv
+venv/
+ENV/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+
+# idea
+.idea
+
+# pypi
+.pypirc
+
+# Dask
+dask-worker-space
\ No newline at end of file
diff --git a/.readthedocs.yml b/.readthedocs.yml
new file mode 100644
index 00000000..4c99b882
--- /dev/null
+++ b/.readthedocs.yml
@@ -0,0 +1,8 @@
+build:
+ image: latest
+
+python:
+ version: 3.6
+ pip_install: true
+
+requirements_file: docs/requirements.txt
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index 9d089652..4e90f15c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,11 +7,11 @@ branches:
- master
- /.*/
deploy:
- provider: pypi
- skip_cleanup: true
- user: ajnebro
- distributions: sdist bdist_wheel
- password:
- secure: "pJhh2ZwuDaMELZO7kmNGWa7sRaUi6s4By4GdBxf1hPjIBkB0GkOGHKxuivnWitAYLbmzpSoMcp2rHETcRiSqYTPlyovLA8A7YpY1HXIcNBrrmqnOpzc9bN3Ka90HMu0ySw2uYZgaQ2neFMm5CvD6W47IG0UUaFPYl68aZ8lEe8t7Tea7kFLU4UgXZxp3BXLTHF7xx7V29Ba5aKv2"
- on:
- branch: master
+ provider: pypi
+ skip_cleanup: true
+ user: ajnebro
+ distributions: sdist bdist_wheel
+ password:
+ secure: "pJhh2ZwuDaMELZO7kmNGWa7sRaUi6s4By4GdBxf1hPjIBkB0GkOGHKxuivnWitAYLbmzpSoMcp2rHETcRiSqYTPlyovLA8A7YpY1HXIcNBrrmqnOpzc9bN3Ka90HMu0ySw2uYZgaQ2neFMm5CvD6W47IG0UUaFPYl68aZ8lEe8t7Tea7kFLU4UgXZxp3BXLTHF7xx7V29Ba5aKv2"
+ on:
+ branch: master
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 6ac0b975..00000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# History
-## Last changes (July 21th 2017)
-* Added guide for using [cProfile](resources/pages/profiling.md).
-* Starting to implement [SMPSO](jmetal/algorithm/multiobjective/smpso.py).
-* Added [comparators](jmetal/util/comparator.py).
-
-## Last changes (July 12th 2017)
-* The time of execution and evaluation number now are shown in the live plot.
-* Several fixes regarding wrong imports and unused attributes.
-
-## Last changes (July 11th 2017)
-* Now It's possible to get to directly access the coords (x,y) of a point in a live plot by a mouse click. ~~Note: This still needs some changes in order to work properly.~~
-
-## Last changes (July 9th 2017)
-* New class for [graphics](jmetal/util/graphic.py).
-* New [observer](jmetal/component/observer.py) for graphical display of algorithm.
-* Added [CHANGELOG](CHANGELOG.md) file.
-
-## Last changes (July 7th 2017)
-* New methods for plotting the solution list (`plot_scatter` and `plot_scatter_real_time`).
-* New decorator for computing execution time of any method. Usage: [`from jmetal.util.time import get_time_of_exectuion`](jmetal/util/time.py) and add `@get_time_of_execution` before any method or function.
-* Several improvements regarding [PEP8](resources/pages/code_style.md) code style guide.
-* Updated [TODO.md](TODO.md) and added [CONTRIBUTING.cmd](CONTRIBUTING.md) file.
-* Updated requirements.
-
-## Last changes (July 4th 2017)
-* The algorithm [NSGA-II](jmetal/algorithm/multiobjective/nsgaii.py) has been implemented
-* Examples of configuring and running all the included algorithms are located in the [jmetal.runner](https://github.com/jMetal/jMetalPy/tree/master/jmetal/runner) package.
-
-## Last changes (June 1st 2017)
-* The package organization has been simplified to make it more "Python-ish". The former oarganization was a clone of the original Java-based jMetal project.
-* The [`EvolutionaryAlgorithm`](jmetal/core/algorithm.py) class interits from `threading.Thread`, so any evolutionary algorithm can run as a thread. This class also contains an `Observable` field, allowing observer entities to register to be notified with algorithm information.
-* [Four examples](jmetal/runner) of configuring and running three different single-objective algorithms are provided.
-
-## Current status (as for July 4th 2017)
-The current implementation contains the following features:
-* Algorithms
- * Multi-objective
- * NSGA-II
- * Single-objective
- * (mu+lamba)Evolution Strategy
- * (mu,lamba)Evolution Strategy
- * Generational Genetic algorithm
-* Problems (multi-objective)
- * Kursawe
- * Fonseca
- * Schaffer
- * Viennet2
-* Problems (single-objective)
- * Sphere
- * OneMax
-* Encoding
- * Float
- * Binary
-* Operators
- * SBX Crossover
- * Single Point Crossover
- * Polynomial Mutation
- * Bit Flip Mutation
- * Simple Random Mutation
- * Null Mutation
- * Uniform Mutation
- * Binary Tournament Selection
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b2e2fb41..6afbb71f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -8,4 +8,20 @@ Contributions to the jMetalPy project are welcome. Please, take into account the
- [Incorporate the new features of Python 3.5](resources/pages/features_python3.md)
- [Respect the initial structure](resources/pages/project_structure.md)
- [How to create auto documentation using compatible code](resources/pages/auto_doc.md)
-- [Performance analysis of Python](resources/pages/profiling.md)
\ No newline at end of file
+- [Performance analysis of Python](resources/pages/profiling.md)
+
+# Documentation
+
+To generate the documentation, install [Sphinx](http://www.sphinx-doc.org/en/master/) by running:
+
+```bash
+$ pip install sphinx
+$ pip install sphinx_rtd_theme
+```
+
+And then `cd` to `/docs` and run:
+
+```bash
+$ sphinx-apidoc -f -o source/ ../jmetal/
+$ make html
+```
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index e69de29b..600736db 100644
--- a/LICENSE
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Antonio J. Nebro
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index f7e0fd49..29a5bb6b 100644
--- a/README.md
+++ b/README.md
@@ -1,47 +1,50 @@
-# jMetalPy: Python version of the jMetal framework
-[![Build Status](https://travis-ci.org/jMetal/jMetalPy.svg?branch=master)](https://travis-ci.org/jMetal/jMetalPy)
-[![PyPI](https://img.shields.io/pypi/l/jMetalPy.svg)]()
-[![PyPI](https://img.shields.io/pypi/v/jMetalPy.svg)]()
-
-> jMetalPy is currently under heavy development!
-
-I started a new project called jMetalPy in February 2017. The initial idea was not to write the whole jMetal proyect in Python but to use it as a practical study to learn that programming language, although due to the interest of some researchers the goal of an usable jMetal version in Python is an ongoing work.
+
+
+
+
+
-Any ideas about how the structure the project, coding style, useful tools (I'm using PyCharm), or links to related projects are welcome (see [CONTRIBUTING](https://github.com/jMetal/jMetalPy/blob/master/CONTRIBUTING.md)). The starting point is the jMetal architecture:
-
-![jMetal architecture](resources/jMetal5UML.png)
-
----
+# jMetalPy: Python version of the jMetal framework
+[![Build Status](https://img.shields.io/travis/jMetal/jMetalPy.svg?style=flat-square)](https://travis-ci.org/jMetal/jMetalPy)
+[![Read the Docs](https://img.shields.io/readthedocs/jmetalpy.svg?style=flat-square)](https://readthedocs.org/projects/jmetalpy/)
+[![PyPI License](https://img.shields.io/pypi/l/jMetalPy.svg?style=flat-square)]()
+[![PyPI Python version](https://img.shields.io/pypi/pyversions/jMetalPy.svg?style=flat-square)]()
-# Table of Contents
+## Table of Contents
+- [Installation](#installation)
- [Usage](#usage)
- - [Dependencies](#dependencies)
-- [History](#history)
- - [Last changes (December 18th 2017)](#last-changes-december-18th-2017)
+- [Features](#features)
- [Contributing](#contributing)
- [License](#license)
-
-# Usage
-Examples of configuring and running all the included algorithms are located in the [jmetal.runner](https://github.com/jMetal/jMetalPy/tree/master/jmetal/runner) folder.
-
-## Dependencies
-With Python 3.6 installed, run:
-```Bash
+## Installation
+To download jMetalPy just clone the Git repository hosted in GitHub:
+```bash
$ git clone https://github.com/jMetal/jMetalPy.git
-$ pip install -r requirements.txt
+$ python setup.py install
```
-# History
-See [CHANGELOG](CHANGELOG.md) for full version history.
+Alternatively, you can install it with `pip`:
+```bash
+$ pip install jmetalpy
+```
+
+## Usage
+Examples of configuring and running all the included algorithms are located [in the docs](https://jmetalpy.readthedocs.io/en/latest/examples.html).
+
+## Features
+The current release of jMetalPy (v0.5.0) contains the following components:
-## Last changes (January 18th 2018)
-* (Fix) Search solution in `ScatterPlot()` now return only one solution object (as intended).
-* Added class `ParallelEvaluator` (Contribution of Michael Cipold)
-* Fixed a bug in class `DominanceComparator`
+* Algorithms: random search, NSGA-II, SMPSO, SMPSO/RP
+* Problems: ZDT1-6, DTLZ1-2, unconstrained (Kursawe, Fonseca, Schaffer, Viennet2), constrained (Srinivas, Tanaka).
+* Encodings: real, binary
+* Operators: selection (binary tournament, ranking and crowding distance, random, nary random, best solution), crossover (single-point, SBX), mutation (bit-blip, polynomial, uniform, random)
+* Quality indicators: hypervolume
+* Density estimator: crowding distance
+* Graphics: 2D/3D plotting in real-time
-# Contributing
+## Contributing
Please read [CONTRIBUTING](CONTRIBUTING.md) for details on how to contribute to the project.
-# License
+## License
This project is licensed under the terms of the MIT - see the [LICENSE](LICENSE) file for details.
diff --git a/TODO.md b/TODO.md
deleted file mode 100644
index eba0d856..00000000
--- a/TODO.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# TODO list
-
-- [ ] The documentation of the code is not complete.
-- [ ] Inclusion of integration tests for the algorithm implementations.
-- [ ] Full coverage with unit tests.
-- [ ] Add MSA problem.
\ No newline at end of file
diff --git a/auto-docs/source/index.rst b/auto-docs/source/index.rst
deleted file mode 100644
index 6fffa070..00000000
--- a/auto-docs/source/index.rst
+++ /dev/null
@@ -1,20 +0,0 @@
-.. jMetalPy documentation master file, created by
- sphinx-quickstart on Mon Jun 12 15:06:53 2017.
- You can adapt this file completely to your liking, but it should at least
- contain the root `toctree` directive.
-
-Welcome to jMetalPy's documentation!
-====================================
-
-.. toctree::
- :maxdepth: 2
- :caption: Contents:
-
-
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
diff --git a/auto-docs/Makefile b/docs/Makefile
similarity index 94%
rename from auto-docs/Makefile
rename to docs/Makefile
index 15c772b2..c3ba2e24 100644
--- a/auto-docs/Makefile
+++ b/docs/Makefile
@@ -3,7 +3,7 @@
# You can set these variables from the command line.
SPHINXOPTS =
-SPHINXBUILD = python -msphinx
+SPHINXBUILD = sphinx-build
SPHINXPROJ = jMetalPy
SOURCEDIR = source
BUILDDIR = build
diff --git a/docs/make.bat b/docs/make.bat
new file mode 100644
index 00000000..5205888d
--- /dev/null
+++ b/docs/make.bat
@@ -0,0 +1,36 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=source
+set BUILDDIR=build
+set SPHINXPROJ=jMetalPy
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.http://sphinx-doc.org/
+ exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
+
+:end
+popd
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 00000000..5a154449
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1 @@
+sphinx==1.6.3
\ No newline at end of file
diff --git a/docs/source/NSGAII-ZDT1.png b/docs/source/NSGAII-ZDT1.png
new file mode 100644
index 00000000..ac19d046
Binary files /dev/null and b/docs/source/NSGAII-ZDT1.png differ
diff --git a/docs/source/about.rst b/docs/source/about.rst
new file mode 100644
index 00000000..c5482847
--- /dev/null
+++ b/docs/source/about.rst
@@ -0,0 +1,10 @@
+About
+==============
+
+jMetalPy is being developed by `Antonio J. Nebro `_, associate professor at the University of Málaga, and `Antonio Benítez-Hidalgo `_.
+
+References
+--------------------------------
+
+1. J.J. Durillo, A.J. Nebro jMetal: a Java Framework for Multi-Objective Optimization. Advances in Engineering Software 42 (2011) 760-771.
+2. A.J. Nebro, J.J. Durillo, M. Vergne Redesigning the jMetal Multi-Objective Optimization Framework. GECCO (Companion) 2015, pp: 1093-1100. July 2015.
\ No newline at end of file
diff --git a/docs/source/api/jmetal.algorithm.multiobjective.rst b/docs/source/api/jmetal.algorithm.multiobjective.rst
new file mode 100644
index 00000000..8a8e0988
--- /dev/null
+++ b/docs/source/api/jmetal.algorithm.multiobjective.rst
@@ -0,0 +1,26 @@
+Multiobjective algorithms
+=======================================
+
+NSGA-II
+---------------------------------------------
+
+.. automodule:: jmetal.algorithm.multiobjective.nsgaii
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+SMPSO
+--------------------------------------------
+
+.. automodule:: jmetal.algorithm.multiobjective.smpso
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Random Search
+---------------------------------------------------
+
+.. automodule:: jmetal.algorithm.multiobjective.randomSearch
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/api/jmetal.algorithm.rst b/docs/source/api/jmetal.algorithm.rst
new file mode 100644
index 00000000..908deebd
--- /dev/null
+++ b/docs/source/api/jmetal.algorithm.rst
@@ -0,0 +1,7 @@
+Algorithms
+========================
+
+.. toctree::
+
+ jmetal.algorithm.multiobjective
+ jmetal.algorithm.singleobjective
\ No newline at end of file
diff --git a/docs/source/api/jmetal.algorithm.singleobjective.rst b/docs/source/api/jmetal.algorithm.singleobjective.rst
new file mode 100644
index 00000000..c3a88057
--- /dev/null
+++ b/docs/source/api/jmetal.algorithm.singleobjective.rst
@@ -0,0 +1,10 @@
+Singleobjectives algorithms
+========================================
+
+Evolutionary Algorithm
+-------------------------------------------------------------
+
+.. automodule:: jmetal.algorithm.singleobjective.evolutionaryalgorithm
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/api/jmetal.component.rst b/docs/source/api/jmetal.component.rst
new file mode 100644
index 00000000..b6ac613f
--- /dev/null
+++ b/docs/source/api/jmetal.component.rst
@@ -0,0 +1,58 @@
+Components
+========================
+
+Archive
+-------------------------------
+
+.. automodule:: jmetal.component.archive
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Comparator
+-----------------------------
+
+.. automodule:: jmetal.component.comparator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Density Estimator
+------------------------------------------
+
+.. automodule:: jmetal.component.density_estimator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Evaluator
+---------------------------------
+
+.. automodule:: jmetal.component.evaluator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Observer
+--------------------------------
+
+.. automodule:: jmetal.component.observer
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Quality indicator
+-----------------------------
+
+.. automodule:: jmetal.component.quality_indicator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Ranking
+--------------------------
+
+.. automodule:: jmetal.component.ranking
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/api/jmetal.core.rst b/docs/source/api/jmetal.core.rst
new file mode 100644
index 00000000..fae7742e
--- /dev/null
+++ b/docs/source/api/jmetal.core.rst
@@ -0,0 +1,44 @@
+Core
+===================
+
+This subpackage store templates used in jMetalPy.
+
+Algorithm
+----------------------------
+
+.. automodule:: jmetal.core.algorithm
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Operator
+---------------------------
+
+.. automodule:: jmetal.core.operator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Problem
+--------------------------
+
+.. automodule:: jmetal.core.problem
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Solution
+---------------------------
+
+.. automodule:: jmetal.core.solution
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Observable
+-----------------------------
+
+.. automodule:: jmetal.core.observable
+ :members:
+ :undoc-members:
+ :show-inheritance:
\ No newline at end of file
diff --git a/docs/source/api/jmetal.operator.rst b/docs/source/api/jmetal.operator.rst
new file mode 100644
index 00000000..31822cf3
--- /dev/null
+++ b/docs/source/api/jmetal.operator.rst
@@ -0,0 +1,26 @@
+Operators
+=======================
+
+Crossover
+--------------------------------
+
+.. automodule:: jmetal.operator.crossover
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Mutation
+-------------------------------
+
+.. automodule:: jmetal.operator.mutation
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Selection
+--------------------------------
+
+.. automodule:: jmetal.operator.selection
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/api/jmetal.problem.multiobjective.rst b/docs/source/api/jmetal.problem.multiobjective.rst
new file mode 100644
index 00000000..5894213c
--- /dev/null
+++ b/docs/source/api/jmetal.problem.multiobjective.rst
@@ -0,0 +1,34 @@
+Multiobjective problems
+=====================================
+
+Constrained
+------------------------------------------------
+
+.. automodule:: jmetal.problem.multiobjective.constrained
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Unconstrained
+--------------------------------------------------
+
+.. automodule:: jmetal.problem.multiobjective.unconstrained
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+DTLZ
+-----------------------------------------
+
+.. automodule:: jmetal.problem.multiobjective.dtlz
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+ZDT
+----------------------------------------
+
+.. automodule:: jmetal.problem.multiobjective.zdt
+ :members:
+ :undoc-members:
+ :show-inheritance:
\ No newline at end of file
diff --git a/docs/source/api/jmetal.problem.rst b/docs/source/api/jmetal.problem.rst
new file mode 100644
index 00000000..a7ff729b
--- /dev/null
+++ b/docs/source/api/jmetal.problem.rst
@@ -0,0 +1,7 @@
+Problems
+======================
+
+.. toctree::
+
+ jmetal.problem.multiobjective
+ jmetal.problem.singleobjective
\ No newline at end of file
diff --git a/docs/source/api/jmetal.problem.singleobjective.rst b/docs/source/api/jmetal.problem.singleobjective.rst
new file mode 100644
index 00000000..1e5266c4
--- /dev/null
+++ b/docs/source/api/jmetal.problem.singleobjective.rst
@@ -0,0 +1,10 @@
+Singleobjective problems
+======================================
+
+Unconstrained
+---------------------------------------------------
+
+.. automodule:: jmetal.problem.singleobjective.unconstrained
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/api/jmetal.rst b/docs/source/api/jmetal.rst
new file mode 100644
index 00000000..3693cd8e
--- /dev/null
+++ b/docs/source/api/jmetal.rst
@@ -0,0 +1,11 @@
+User documentation
+=====================================
+
+.. toctree::
+
+ jmetal.algorithm
+ jmetal.component
+ jmetal.core
+ jmetal.operator
+ jmetal.problem
+ jmetal.util
diff --git a/docs/source/api/jmetal.util.rst b/docs/source/api/jmetal.util.rst
new file mode 100644
index 00000000..0e330e90
--- /dev/null
+++ b/docs/source/api/jmetal.util.rst
@@ -0,0 +1,34 @@
+Utils
+===================
+
+Front file
+-----------------------------
+
+.. automodule:: jmetal.util.front_file
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Graphic
+--------------------------
+
+.. automodule:: jmetal.util.graphic
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Lab of experiments
+--------------------------
+
+.. automodule:: jmetal.util.laboratory
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Solution list output
+-----------------------------------------
+
+.. automodule:: jmetal.util.solution_list_output
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/auto-docs/source/conf.py b/docs/source/conf.py
similarity index 67%
rename from auto-docs/source/conf.py
rename to docs/source/conf.py
index d5694d89..f2abbff3 100644
--- a/auto-docs/source/conf.py
+++ b/docs/source/conf.py
@@ -1,17 +1,12 @@
-#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
-# jMetalPy documentation build configuration file, created by
-# sphinx-quickstart on Mon Jun 12 15:06:53 2017.
+# Configuration file for the Sphinx documentation builder.
#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
+# This file does only contain a selection of the most common options. For a
+# full list see the documentation:
+# http://www.sphinx-doc.org/en/master/config
+
+# -- Path setup --------------------------------------------------------------
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
@@ -21,9 +16,28 @@
import sys
sys.path.insert(0, os.path.abspath('../..'))
+# http://blog.rtwilson.com/how-to-make-your-sphinx-documentation-compile-with-readthedocs-when-youre-using-numpy-and-scipy/
+import mock
+
+MOCK_MODULES = ['numpy', 'dask', 'dask.distributed', 'tqdm', 'bokeh', 'bokeh.embed', 'bokeh.front', 'bokeh.client',
+ 'bokeh.io', 'bokeh.layouts','bokeh.models','bokeh.plotting', 'bokeh.resources',
+ 'mpl_toolkits', 'mpl_toolkits.mplot3d', 'matplotlib', 'matplotlib.pyplot', 'matplotlib.axes']
+for mod_name in MOCK_MODULES:
+ sys.modules[mod_name] = mock.Mock()
+
+# -- Project information -----------------------------------------------------
+project = 'jMetalPy'
+copyright = '2018, Antonio J. Nebro'
+author = 'Antonio J. Nebro'
+
+# The short X.Y version
+version = '0.5.0'
+# The full version, including alpha/beta/rc tags
+release = ''
-# -- General configuration ------------------------------------------------
+
+# -- General configuration ---------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
@@ -32,7 +46,9 @@
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
-extensions = ['sphinx.ext.autodoc']
+extensions = [
+ 'sphinx.ext.autodoc',
+]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
@@ -46,20 +62,6 @@
# The master toctree document.
master_doc = 'index'
-# General information about the project.
-project = 'jMetalPy'
-copyright = '2017, Antonio J. Nebro'
-author = 'Antonio J. Nebro'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = '1.0.0'
-# The full version, including alpha/beta/rc tags.
-release = '1.0.0'
-
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
@@ -69,22 +71,20 @@
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
-# This patterns also effect to html_static_path and html_extra_path
+# This pattern also affects html_static_path and html_extra_path .
exclude_patterns = []
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = False
-
-# -- Options for HTML output ----------------------------------------------
+# -- Options for HTML output -------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
-html_theme = 'classic'
+html_theme = 'sphinx_rtd_theme'
+html_logo = 'jmetalpy.png'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
@@ -97,14 +97,24 @@
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
+# Custom sidebar templates, must be a dictionary that maps document names
+# to template names.
+#
+# The default sidebars (for documents that don't match any pattern) are
+# defined by theme itself. Builtin themes are using these templates by
+# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
+# 'searchbox.html']``.
+#
+# html_sidebars = {}
-# -- Options for HTMLHelp output ------------------------------------------
+
+# -- Options for HTMLHelp output ---------------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = 'jMetalPydoc'
-# -- Options for LaTeX output ---------------------------------------------
+# -- Options for LaTeX output ------------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
@@ -133,7 +143,7 @@
]
-# -- Options for manual page output ---------------------------------------
+# -- Options for manual page output ------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
@@ -143,7 +153,7 @@
]
-# -- Options for Texinfo output -------------------------------------------
+# -- Options for Texinfo output ----------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
@@ -155,4 +165,5 @@
]
-
+# -- Extension configuration -------------------------------------------------
+autoclass_content = 'both'
\ No newline at end of file
diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst
new file mode 100644
index 00000000..5ddc89f8
--- /dev/null
+++ b/docs/source/contributing.rst
@@ -0,0 +1,203 @@
+Contributing
+================================================
+
+Contributions to the jMetalPy project are welcome.
+Please, take into account the following guidelines (all developers should follow these guidelines):
+
+Git WorkFlow
+-------------------------------
+
+We have a set of branches on the remote Git server.
+Some branches are temporary, and others are constant throughout the life of the repository.
+
+* Branches always present in the repository:
+ * *master*: You have the latest released to production, receive merges from the develop branch, or merge from a *hotfix* branch (emergency).
+ * Do I have to put a TAG when doing a merge from develop to master? yes
+ * Do I have to put a TAG when doing a merge from a hotfix branch to master? yes
+ * After merge from a hotfix to master, do I have to merge from master to develop? yes
+ * *develop*: It is considered the "Next Release", receives merges from branches of each developer, either corrections (*fix*) or new features (*feature*).
+
+* Temporary branches:
+ * *feature/\\-\*: When we are doing a development, we create a local branch with the prefix "feature/", then only if there is a task id, we indicate it and we add a hyphen. The following we indicate a description according to the functionality that we are developing. The words are separated by hyphens.
+ * Where does this branch emerge? This branch always emerge from the develop branch
+ * When I finish the development in my feature branch, which branch to merge into?: You always merge feature branch into develop branch
+
+ * *fix/\\-\*: When we are making a correction, we create a local branch with the prefix "fix/", then only if there is a task id, we indicate it and we add a hyphen. The following we indicate a description according to the functionality that we are correcting. The words are separated by hyphens.
+ * Where does this branch emerge? This branch always emerge from the develop branch
+ * When I finish the correction in my fix branch, which branch to merge into?: You always merge feature branch into develop branch
+
+ * *hotfix/\\-\*: When we are correcting an emergency incidence in production, we create a local branch with the prefix "hotfix/", then only if there is a task id, we indicate it and we add a hyphen. The following we indicate a description according to the functionality that we are correcting. The words are separated by hyphens.
+ * Where does this branch emerge?: This branch always emerge from the master branch
+ * When I finish the correction in my hotfix branch, which branch to merge into?: This branch always emerge from the master and develop branch
+
+* Steps to follow when you are creating or going to work on a branch of any kind (feature / fix / hotfix):
+ 1. After you create your branch (feature / fix / hotfix) locally, upload it to the remote Git server. The integration system will verify your code from the outset.
+ 2. Each time you commit, as much as possible, you send a push to the server. Each push will trigger the automated launch of the tests, etc.
+ 3. Once the development is finished, having done a push to the remote Git server, and that the test phase has passed without problem, you create an `pull request `_.
+
+.. note:: Do not forget to remove your branch (feature / fix / hotfix) once the merge has been made.
+
+Some useful Git commands:
+
+* git fetch --prune: Cleaning branches removed and bringing new branches
+
+PEP8!
+-------------------------------
+
+It is really important to follow some standards when a team develops an application. If all team members format the code in the same format, then it is much easier to read the code. PEP8 is Python's style guide. It's a set of rules for how to format your Python code.
+
+Some style rules:
+
+* Package and module names: Modules should have short, **all-lowercase** names. Underscores can be used in the module name if it improves readability. Python packages should also have short, **all-lowercase** names, although the use of underscores is discouraged. In Python, a module is a file with the suffix '.py'.
+* Class names: Class names should normally use the **CapWords** convention.
+* Method names and instance variables: **Lowercase with words separated by underscores** as necessary to improve readability.
+
+There are many more style standards in PEP8 so, please, refer to `PEP8 documentation `_
+. The most appropriate is to use an IDE that has support for PEP8. For example, `PyCharm `_.
+
+Object-oriented programming
+-------------------------------
+
+**Object-oriented programming should be the single programming paradigm used**. Avoiding as far as possible, imperative and functional programming.
+
+.. image:: contributing/python_poo_programming.png
+
+.. image:: contributing/python_functional_programming.png
+
+.. image:: contributing/python_imperative_programming.png
+
+In classes, we directly access the attributes, which are usually defined as public.
+
+.. image:: contributing/without_getter_setter.png
+
+Only when we want to **implement additional logic in the accesses to the attributes** we define getter/setter methods, but **always by using the *property*** annotation or the ***property*** function:
+
+.. image:: contributing/property_annotation.png
+
+.. image:: contributing/property_functional.png
+
+By using ***property***, we continue to access the attributes directly:
+
+.. image:: contributing/good_access.png
+
+Do not use getter/setter methods without the *property* annotation or the *property* function:
+
+.. image:: contributing/with_getter_setter.png
+
+Since this way of accessing the attribute is not commonly used in Python:
+
+.. image:: contributing/bad_access.png
+
+Structure
+-------------------------------
+
+Python is not Java. In Java you cannot, by design, have more than one class in a file. In Python, you can do it.
+
+In Python, **it is appropriate to group several classes into a single .py file. For that reason, the .py files are called modules.**
+
+Python 3.6
+-------------------------------
+
+We **always** define types in the parameters of the arguments and the return value:
+
+.. image:: contributing/types_in_methods.png
+
+We can define abstract classes (ABCs) in Python:
+
+.. image:: contributing/abstract.png
+
+In the case that we want to define an **interface** class, it is done in the same way. We just have to define all the methods of the class as abstract.
+
+Example of use of generic types:
+
+.. image:: contributing/generic_types.png
+
+In the code below, the IDE displays a **warning**, since although the 2nd parameter is a float type, which is a type allowed in the definition of the generic type X, it is not of the same type as the first, since the first 2 parameters must be of the same generic type (S):
+
+.. image:: contributing/instance_with_generic_types1_wearning.png
+
+In the code below, the IDE displays a **warning**, since the 2nd parameter is a type not allowed in the definition of the generic type ( *TypeVar('S', int, float)* ):
+
+.. image:: contributing/instance_with_generic_types2_wearning.png
+
+When the class inherits from *Generic[...]*, the **class is defined as generic**. In this way we can indicate the types that will have the values of the generic types, when using the class as type. Look at the *add_car()* method of the *Parking* class.
+
+.. note:: The generic classes inherit from abc.ABCMeta, so they are abstract classes and **abstract methods can be used**.
+
+.. image:: contributing/generic_class1.png
+
+.. image:: contributing/generic_class2.png
+
+In the code below, the IDE displays a **warning** in the call to the *add_car()* method when adding the car, since the 3rd parameter of the init must be a *str* type, as defined in the *add_car()* method of the *Parking* class.
+
+.. image:: contributing/instance_with_generic_class_wearning.png
+
+When inheriting from generic classes, some type variables could be fixed:
+
+.. image:: contributing/generic_types_fixed.png
+
+Example of inheritance from non-generic class to generic class:
+
+.. image:: contributing/inheritance_non_generic_to_generic.png
+
+Example of inheritance from generic class to another generic class:
+
+.. image:: contributing/inheritance_generic_to_generic.png
+
+Create automatic documentation files with Sphinx
+--------------------------------------------------
+
+First, you need to know how to correctly document your code. It is **important** to follow these simple rules in order to automatically create good documentation for the project.
+
+When you create a new module file (testDoc.py in this example), you should mention it using this format:
+
+.. code-block:: python
+
+ """
+ .. module:: testDoc
+ :platform: Unix, Windows
+ :synopsis: A useful module indeed.
+
+ .. moduleauthor:: Andrew Carter
+ """
+
+ class testDoc(object):
+ """We use this as a public class example class.
+
+ This class is ruled by the very trendy important method :func:`public_fn_with_sphinxy_docstring`.
+
+ .. note::
+ An example of intersphinx is this: you **cannot** use :mod:`pickle` on this class.
+ """
+
+ def __init__(self):
+ pass
+
+This code snippet generates the following documentation:
+
+.. image:: contributing/class_header.png
+
+Now, you can document your methods using the following sintax:
+
+.. code-block:: python
+
+ def public_fn_with_sphinxy_docstring(self, name: str, state: bool = False) -> int:
+ """This function does something.
+
+ :param name: The name to use.
+ :type name: str.
+ :param state: Current state to be in.
+ :type state: bool.
+ :returns: int -- the return code.
+ :raises: AttributeError, KeyError
+ """
+ return 0
+
+ def public_fn_without_docstring(self):
+ return True
+
+And the produced output doc will be:
+
+.. image:: contributing/method_way_sphinx.png
+
+As you may notice, if you don't use any docstring, the method documentation will be empty.
\ No newline at end of file
diff --git a/resources/WorkflowGitBranches.png b/docs/source/contributing/WorkflowGitBranches.png
similarity index 100%
rename from resources/WorkflowGitBranches.png
rename to docs/source/contributing/WorkflowGitBranches.png
diff --git a/resources/abstract.png b/docs/source/contributing/abstract.png
similarity index 100%
rename from resources/abstract.png
rename to docs/source/contributing/abstract.png
diff --git a/resources/bad_access.png b/docs/source/contributing/bad_access.png
similarity index 100%
rename from resources/bad_access.png
rename to docs/source/contributing/bad_access.png
diff --git a/resources/class_header.png b/docs/source/contributing/class_header.png
similarity index 100%
rename from resources/class_header.png
rename to docs/source/contributing/class_header.png
diff --git a/resources/generic_class1.png b/docs/source/contributing/generic_class1.png
similarity index 100%
rename from resources/generic_class1.png
rename to docs/source/contributing/generic_class1.png
diff --git a/resources/generic_class2.png b/docs/source/contributing/generic_class2.png
similarity index 100%
rename from resources/generic_class2.png
rename to docs/source/contributing/generic_class2.png
diff --git a/resources/generic_types.png b/docs/source/contributing/generic_types.png
similarity index 100%
rename from resources/generic_types.png
rename to docs/source/contributing/generic_types.png
diff --git a/resources/generic_types_fixed.png b/docs/source/contributing/generic_types_fixed.png
similarity index 100%
rename from resources/generic_types_fixed.png
rename to docs/source/contributing/generic_types_fixed.png
diff --git a/resources/good_access.png b/docs/source/contributing/good_access.png
similarity index 100%
rename from resources/good_access.png
rename to docs/source/contributing/good_access.png
diff --git a/resources/inheritance_generic_to_generic.png b/docs/source/contributing/inheritance_generic_to_generic.png
similarity index 100%
rename from resources/inheritance_generic_to_generic.png
rename to docs/source/contributing/inheritance_generic_to_generic.png
diff --git a/resources/inheritance_non_generic_to_generic.png b/docs/source/contributing/inheritance_non_generic_to_generic.png
similarity index 100%
rename from resources/inheritance_non_generic_to_generic.png
rename to docs/source/contributing/inheritance_non_generic_to_generic.png
diff --git a/resources/instance_with_generic_class_wearning.png b/docs/source/contributing/instance_with_generic_class_wearning.png
similarity index 100%
rename from resources/instance_with_generic_class_wearning.png
rename to docs/source/contributing/instance_with_generic_class_wearning.png
diff --git a/resources/instance_with_generic_types1_wearning.png b/docs/source/contributing/instance_with_generic_types1_wearning.png
similarity index 100%
rename from resources/instance_with_generic_types1_wearning.png
rename to docs/source/contributing/instance_with_generic_types1_wearning.png
diff --git a/resources/instance_with_generic_types2_wearning.png b/docs/source/contributing/instance_with_generic_types2_wearning.png
similarity index 100%
rename from resources/instance_with_generic_types2_wearning.png
rename to docs/source/contributing/instance_with_generic_types2_wearning.png
diff --git a/resources/jMetal5UML.png b/docs/source/contributing/jMetal5UML.png
similarity index 100%
rename from resources/jMetal5UML.png
rename to docs/source/contributing/jMetal5UML.png
diff --git a/docs/source/contributing/jmetalpy.png b/docs/source/contributing/jmetalpy.png
new file mode 100644
index 00000000..a41ad1e1
Binary files /dev/null and b/docs/source/contributing/jmetalpy.png differ
diff --git a/resources/method_way_sphinx.png b/docs/source/contributing/method_way_sphinx.png
similarity index 100%
rename from resources/method_way_sphinx.png
rename to docs/source/contributing/method_way_sphinx.png
diff --git a/resources/property_annotation.png b/docs/source/contributing/property_annotation.png
similarity index 100%
rename from resources/property_annotation.png
rename to docs/source/contributing/property_annotation.png
diff --git a/resources/property_functional.png b/docs/source/contributing/property_functional.png
similarity index 100%
rename from resources/property_functional.png
rename to docs/source/contributing/property_functional.png
diff --git a/resources/python_functional_programming.png b/docs/source/contributing/python_functional_programming.png
similarity index 100%
rename from resources/python_functional_programming.png
rename to docs/source/contributing/python_functional_programming.png
diff --git a/resources/python_imperative_programming.png b/docs/source/contributing/python_imperative_programming.png
similarity index 100%
rename from resources/python_imperative_programming.png
rename to docs/source/contributing/python_imperative_programming.png
diff --git a/resources/python_poo_programming.png b/docs/source/contributing/python_poo_programming.png
similarity index 100%
rename from resources/python_poo_programming.png
rename to docs/source/contributing/python_poo_programming.png
diff --git a/resources/types_in_methods.png b/docs/source/contributing/types_in_methods.png
similarity index 100%
rename from resources/types_in_methods.png
rename to docs/source/contributing/types_in_methods.png
diff --git a/resources/with_getter_setter.png b/docs/source/contributing/with_getter_setter.png
similarity index 100%
rename from resources/with_getter_setter.png
rename to docs/source/contributing/with_getter_setter.png
diff --git a/resources/without_getter_setter.png b/docs/source/contributing/without_getter_setter.png
similarity index 100%
rename from resources/without_getter_setter.png
rename to docs/source/contributing/without_getter_setter.png
diff --git a/docs/source/examples.rst b/docs/source/examples.rst
new file mode 100644
index 00000000..e56a766a
--- /dev/null
+++ b/docs/source/examples.rst
@@ -0,0 +1,15 @@
+Examples
+==============
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Algorithms:
+
+ runner/nsgaii
+ runner/smpso
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Further configuration:
+
+ runner/observer
diff --git a/docs/source/index.rst b/docs/source/index.rst
new file mode 100644
index 00000000..586a542d
--- /dev/null
+++ b/docs/source/index.rst
@@ -0,0 +1,59 @@
+.. jMetalPy documentation master file, created by
+ sphinx-quickstart on Fri May 4 10:10:17 2018.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+jMetalPy: Python version of the jMetal framework
+================================================
+
+.. warning:: Documentation is WIP!! Some information may be missing.
+
+.. toctree::
+ :maxdepth: 1
+ :caption: Contents:
+
+ examples
+ contributing
+ about
+ api/jmetal
+
+Installation steps
+------------------------
+
+Via pip:
+
+.. code-block:: console
+
+ $ pip install jmetalpy
+
+Via Github:
+
+.. code-block:: console
+
+ $ git clone https://github.com/jMetal/jMetalPy.git
+ $ pip install -r requirements.txt
+ $ python setup.py install
+
+Basic usage
+-----------
+
+.. code-block:: python
+
+ problem = ZDT1()
+
+ algorithm = NSGAII(
+ problem=problem,
+ population_size=100,
+ max_evaluations=25000,
+ mutation=Polynomial(probability=1.0/problem.number_of_variables, distribution_index=20),
+ crossover=SBX(probability=1.0, distribution_index=20),
+ selection=BinaryTournamentSelection(comparator=RankingAndCrowdingDistanceComparator())
+ )
+
+ algorithm.run()
+ front = algorithm.get_result()
+
+ pareto_front = ScatterMatplotlib(plot_title='NSGAII for ZDT1', number_of_objectives=problem.number_of_objectives)
+ pareto_front.plot(front, reference=problem.get_reference_front(), output='NSGAII-ZDT1', show=False)
+
+.. image:: NSGAII-ZDT1.png
diff --git a/docs/source/jmetalpy.png b/docs/source/jmetalpy.png
new file mode 100644
index 00000000..a41ad1e1
Binary files /dev/null and b/docs/source/jmetalpy.png differ
diff --git a/docs/source/runner/nsgaii.rst b/docs/source/runner/nsgaii.rst
new file mode 100644
index 00000000..3a693b43
--- /dev/null
+++ b/docs/source/runner/nsgaii.rst
@@ -0,0 +1,51 @@
+NSGA-II
+========================
+
+Common imports for these examples:
+
+.. code-block:: python
+
+ from jmetal.algorithm import NSGAII
+ from jmetal.operator import Polynomial, SBX, BinaryTournamentSelection
+ from jmetal.component import RankingAndCrowdingDistanceComparator
+
+ from jmetal.problem import ZDT1
+
+NSGA-II with standard settings
+------------------------------------
+
+.. code-block:: python
+
+ algorithm = NSGAII(
+ problem=ZDT1(),
+ population_size=100,
+ max_evaluations=25000,
+ mutation=Polynomial(probability=1.0/problem.number_of_variables, distribution_index=20),
+ crossover=SBX(probability=1.0, distribution_index=20),
+ selection=BinaryTournamentSelection(comparator=RankingAndCrowdingDistanceComparator())
+ )
+
+ algorithm.run()
+ front = algorithm.get_result()
+
+NSGA-II stopping by time
+------------------------------------
+
+.. code-block:: python
+
+ class NSGA2b(NSGAII):
+ def is_stopping_condition_reached(self):
+ # Re-define the stopping condition
+ return [False, True][self.get_current_computing_time() > 4]
+
+ algorithm = NSGA2b(
+ problem=ZDT1(),
+ population_size=100,
+ max_evaluations=25000,
+ mutation=Polynomial(probability=1.0/problem.number_of_variables, distribution_index=20),
+ crossover=SBX(probability=1.0, distribution_index=20),
+ selection=BinaryTournamentSelection(comparator=RankingAndCrowdingDistanceComparator())
+ )
+
+ algorithm.run()
+ front = algorithm.get_result()
diff --git a/docs/source/runner/observer.rst b/docs/source/runner/observer.rst
new file mode 100644
index 00000000..59082f04
--- /dev/null
+++ b/docs/source/runner/observer.rst
@@ -0,0 +1,12 @@
+Observers
+========================
+
+It is possible to attach any number of observers to a jMetalPy's algorithm to retrieve information from each iteration.
+For example, a basic algorithm observer will print the number of evaluations, the objectives from the best individual in the population and the computing time:
+
+.. code-block:: python
+
+ basic = BasicAlgorithmObserver(frequency=1.0)
+ algorithm.observable.register(observer=basic)
+
+A full list of all available observer can be found at :py:mod:`jmetal.component.observer` module.
\ No newline at end of file
diff --git a/docs/source/runner/smpso.rst b/docs/source/runner/smpso.rst
new file mode 100644
index 00000000..140f5535
--- /dev/null
+++ b/docs/source/runner/smpso.rst
@@ -0,0 +1,59 @@
+SMPSO
+========================
+
+Common imports:
+
+.. code-block:: python
+
+ from jmetal.operator import Polynomial
+
+ from jmetal.problem import ZDT1
+
+SMPSO with standard settings
+------------------------------------
+
+.. code-block:: python
+
+ from jmetal.algorithm import SMPSO
+ from jmetal.component import CrowdingDistanceArchive
+
+ algorithm = SMPSO(
+ problem=ZDT1(),
+ swarm_size=100,
+ max_evaluations=25000,
+ mutation=Polynomial(probability=1.0/problem.number_of_variables, distribution_index=20),
+ leaders=CrowdingDistanceArchive(100)
+ )
+
+ algorithm.run()
+ front = algorithm.get_result()
+
+SMPSO/RP with standard settings
+------------------------------------
+
+.. code-block:: python
+
+ from jmetal.algorithm import SMPSORP
+ from jmetal.component import CrowdingDistanceArchiveWithReferencePoint
+
+ swarm_size = 100
+
+ reference_points = [[0.8, 0.2], [0.4, 0.6]]
+ archives_with_reference_points = []
+
+ for point in reference_points:
+ archives_with_reference_points.append(
+ CrowdingDistanceArchiveWithReferencePoint(swarm_size, point)
+ )
+
+ algorithm = SMPSORP(
+ problem=ZDT1(),
+ swarm_size=swarm_size,
+ max_evaluations=25000,
+ mutation=Polynomial(probability=1.0/problem.number_of_variables, distribution_index=20),
+ reference_points=reference_points,
+ leaders=archives_with_reference_points
+ )
+
+ algorithm.run()
+ front = algorithm.get_result()
\ No newline at end of file
diff --git a/examples/experiment/NSGAII-SMPSO for ZDT1.py b/examples/experiment/NSGAII-SMPSO for ZDT1.py
new file mode 100644
index 00000000..17697176
--- /dev/null
+++ b/examples/experiment/NSGAII-SMPSO for ZDT1.py
@@ -0,0 +1,21 @@
+from jmetal.algorithm import NSGAII, SMPSO
+from jmetal.component.archive import CrowdingDistanceArchive
+from jmetal.component.comparator import RankingAndCrowdingDistanceComparator
+from jmetal.operator import NullMutation, SBX, BinaryTournamentSelection
+from jmetal.problem import ZDT1, ZDT2
+from jmetal.component.quality_indicator import HyperVolume
+from jmetal.util.laboratory import experiment, display
+
+algorithm = [
+ (NSGAII, {'population_size': 100, 'max_evaluations': 25000, 'mutation': NullMutation(), 'crossover': SBX(1.0, 20),
+ 'selection': BinaryTournamentSelection(RankingAndCrowdingDistanceComparator())}),
+ (NSGAII(population_size=100, max_evaluations=25000, mutation=NullMutation(), crossover=SBX(1.0, 20),
+ selection=BinaryTournamentSelection(RankingAndCrowdingDistanceComparator()), problem=ZDT1()), {}),
+ (SMPSO, {'swarm_size': 100, 'max_evaluations': 25000, 'mutation': NullMutation(),
+ 'leaders': CrowdingDistanceArchive(100)})
+]
+metric = [HyperVolume(reference_point=[1, 1])]
+problem = [(ZDT1, {}), (ZDT2, {})]
+
+results = experiment(algorithm, metric, problem)
+display(results)
\ No newline at end of file
diff --git a/jmetal/algorithm/multiobjective/test/__init__.py b/examples/experiment/__init__.py
similarity index 100%
rename from jmetal/algorithm/multiobjective/test/__init__.py
rename to examples/experiment/__init__.py
diff --git a/examples/multiobjective/nsgaii_full_settings.py b/examples/multiobjective/nsgaii_full_settings.py
new file mode 100644
index 00000000..a3de7483
--- /dev/null
+++ b/examples/multiobjective/nsgaii_full_settings.py
@@ -0,0 +1,38 @@
+from jmetal.algorithm import NSGAII
+from jmetal.component import VisualizerObserver, ProgressBarObserver, RankingAndCrowdingDistanceComparator
+from jmetal.problem import ZDT1
+from jmetal.operator import SBX, Polynomial, BinaryTournamentSelection
+from jmetal.util import ScatterMatplotlib, SolutionList
+
+
+if __name__ == '__main__':
+ problem = ZDT1()
+
+ algorithm = NSGAII(
+ problem=problem,
+ population_size=100,
+ max_evaluations=25000,
+ mutation=Polynomial(probability=1.0 / problem.number_of_variables, distribution_index=20),
+ crossover=SBX(probability=1.0, distribution_index=20),
+ selection=BinaryTournamentSelection(comparator=RankingAndCrowdingDistanceComparator())
+ )
+
+ observer = VisualizerObserver(problem)
+ progress_bar = ProgressBarObserver(step=100, maximum=25000)
+ algorithm.observable.register(observer=observer)
+ algorithm.observable.register(observer=progress_bar)
+
+ algorithm.run()
+ front = algorithm.get_result()
+
+ # Plot frontier to file
+ pareto_front = ScatterMatplotlib(plot_title='NSGAII for ZDT1', number_of_objectives=problem.number_of_objectives)
+ pareto_front.plot(front, reference=problem.get_reference_front(), output='NSGAII-ZDT1', show=False)
+
+ # Save variables to file
+ SolutionList.print_function_values_to_file(front, 'FUN.NSGAII.' + problem.get_name())
+ SolutionList.print_variables_to_file(front, 'VAR.NSGAII.' + problem.get_name())
+
+ print('Algorithm (continuous problem): ' + algorithm.get_name())
+ print('Problem: ' + problem.get_name())
+ print('Computing time: ' + str(algorithm.total_computing_time))
diff --git a/examples/multiobjective/smpso_full_settings.py b/examples/multiobjective/smpso_full_settings.py
new file mode 100644
index 00000000..0b9014ea
--- /dev/null
+++ b/examples/multiobjective/smpso_full_settings.py
@@ -0,0 +1,39 @@
+from jmetal.algorithm import SMPSO
+from jmetal.component.observer import ProgressBarObserver, VisualizerObserver
+from jmetal.component.archive import CrowdingDistanceArchive
+from jmetal.problem import ZDT1
+from jmetal.operator import Polynomial
+from jmetal.util.graphic import ScatterMatplotlib
+from jmetal.util.solution_list_output import SolutionList
+
+
+if __name__ == '__main__':
+ problem = ZDT1()
+
+ algorithm = SMPSO(
+ problem=problem,
+ swarm_size=100,
+ max_evaluations=25000,
+ mutation=Polynomial(probability=1.0/problem.number_of_variables, distribution_index=20),
+ leaders=CrowdingDistanceArchive(100)
+ )
+
+ observer = VisualizerObserver(problem)
+ progress_bar = ProgressBarObserver(step=100, maximum=25000)
+ algorithm.observable.register(observer=observer)
+ algorithm.observable.register(observer=progress_bar)
+
+ algorithm.run()
+ front = algorithm.get_result()
+
+ # Plot frontier to file
+ pareto_front = ScatterMatplotlib(plot_title='SMPSO for ' + problem.get_name(), number_of_objectives=problem.number_of_objectives)
+ pareto_front.plot(front, reference=problem.get_reference_front(), output='SMPSO-' + problem.get_name(), show=False)
+
+ # Save variables to file
+ SolutionList.print_function_values_to_file(front, 'FUN.SMPSO.' + problem.get_name())
+ SolutionList.print_variables_to_file(front, 'VAR.SMPSO.' + problem.get_name())
+
+ print('Algorithm (continuous problem): ' + algorithm.get_name())
+ print('Problem: ' + problem.get_name())
+ print('Computing time: ' + str(algorithm.total_computing_time))
diff --git a/examples/multiobjective/smpsorp_standard_settings.py b/examples/multiobjective/smpsorp_standard_settings.py
new file mode 100644
index 00000000..8d485365
--- /dev/null
+++ b/examples/multiobjective/smpsorp_standard_settings.py
@@ -0,0 +1,36 @@
+from jmetal.algorithm import SMPSORP
+from jmetal.component.archive import CrowdingDistanceArchiveWithReferencePoint
+from jmetal.component.observer import ProgressBarObserver
+from jmetal.problem import ZDT1
+from jmetal.operator import Polynomial
+
+
+if __name__ == '__main__':
+ problem = ZDT1()
+ swarm_size = 100
+
+ reference_points = [[0.0, 0.0]]
+ archives_with_reference_points = []
+
+ for point in reference_points:
+ archives_with_reference_points.append(
+ CrowdingDistanceArchiveWithReferencePoint(swarm_size, point)
+ )
+
+ algorithm = SMPSORP(
+ problem=problem,
+ swarm_size=swarm_size,
+ max_evaluations=25000,
+ mutation=Polynomial(probability=1.0/problem.number_of_variables, distribution_index=20),
+ reference_points=reference_points,
+ leaders=archives_with_reference_points
+ )
+
+ progress_bar = ProgressBarObserver(step=swarm_size, maximum=25000)
+ algorithm.observable.register(progress_bar)
+
+ algorithm.run()
+
+ print('Algorithm (continuous problem): ' + algorithm.get_name())
+ print('Problem: ' + problem.get_name())
+ print('Computing time: ' + str(algorithm.total_computing_time))
diff --git a/jmetal/runner/singleobjective/evolution_strategy/elitist_evolution_strategy_binary.py b/examples/singleobjective/evolution_strategy/elitist_evolution_strategy_binary.py
similarity index 82%
rename from jmetal/runner/singleobjective/evolution_strategy/elitist_evolution_strategy_binary.py
rename to examples/singleobjective/evolution_strategy/elitist_evolution_strategy_binary.py
index cb26d66e..2a35bc50 100644
--- a/jmetal/runner/singleobjective/evolution_strategy/elitist_evolution_strategy_binary.py
+++ b/examples/singleobjective/evolution_strategy/elitist_evolution_strategy_binary.py
@@ -7,15 +7,18 @@
def main() -> None:
bits = 512
problem = OneMax(bits)
- algorithm = ElitistEvolutionStrategy[BinarySolution, BinarySolution]\
- (problem,
- mu=1,
- lambdA=10,
- max_evaluations=25000,
- mutation=BitFlip(1.0/bits))
+
+ algorithm = ElitistEvolutionStrategy[BinarySolution, BinarySolution](
+ problem=problem,
+ mu=1,
+ lambd_a=10,
+ max_evaluations=25000,
+ mutation=BitFlip(probability=1.0/bits)
+ )
algorithm.run()
result = algorithm.get_result()
+
print("Algorithm: " + algorithm.get_name())
print("Problem: " + problem.get_name())
print("Solution: " + str(result.variables[0]))
diff --git a/jmetal/runner/singleobjective/evolution_strategy/elitist_evolution_strategy_float.py b/examples/singleobjective/evolution_strategy/elitist_evolution_strategy_float.py
similarity index 82%
rename from jmetal/runner/singleobjective/evolution_strategy/elitist_evolution_strategy_float.py
rename to examples/singleobjective/evolution_strategy/elitist_evolution_strategy_float.py
index 4908e6a7..9399387e 100644
--- a/jmetal/runner/singleobjective/evolution_strategy/elitist_evolution_strategy_float.py
+++ b/examples/singleobjective/evolution_strategy/elitist_evolution_strategy_float.py
@@ -7,15 +7,18 @@
def main() -> None:
variables = 10
problem = Sphere(variables)
- algorithm = ElitistEvolutionStrategy[FloatSolution, FloatSolution]\
- (problem,
- mu=10,
- lambdA=10,
- max_evaluations=50000,
- mutation=Polynomial(1.0/variables))
+
+ algorithm = ElitistEvolutionStrategy[FloatSolution, FloatSolution](
+ problem=problem,
+ mu=10,
+ lambd_a=10,
+ max_evaluations=50000,
+ mutation=Polynomial(probability=1.0/variables)
+ )
algorithm.run()
result = algorithm.get_result()
+
print("Algorithm: " + algorithm.get_name())
print("Problem: " + problem.get_name())
print("Solution: " + str(result.variables))
diff --git a/jmetal/runner/singleobjective/evolution_strategy/elitist_evolution_strategy_running_as_a_thread.py b/examples/singleobjective/evolution_strategy/elitist_evolution_strategy_running_as_a_thread.py
similarity index 83%
rename from jmetal/runner/singleobjective/evolution_strategy/elitist_evolution_strategy_running_as_a_thread.py
rename to examples/singleobjective/evolution_strategy/elitist_evolution_strategy_running_as_a_thread.py
index e0032e1e..ef32c2db 100644
--- a/jmetal/runner/singleobjective/evolution_strategy/elitist_evolution_strategy_running_as_a_thread.py
+++ b/examples/singleobjective/evolution_strategy/elitist_evolution_strategy_running_as_a_thread.py
@@ -7,12 +7,14 @@
def main() -> None:
variables = 10
problem = Sphere(variables)
- algorithm = ElitistEvolutionStrategy[FloatSolution, FloatSolution]\
- (problem,
- mu=10,
- lambdA=10,
- max_evaluations=50000,
- mutation=Polynomial(1.0/variables))
+
+ algorithm = ElitistEvolutionStrategy[FloatSolution, FloatSolution](
+ problem=problem,
+ mu=10,
+ lambd_a=10,
+ max_evaluations=50000,
+ mutation=Polynomial(probability=1.0/variables)
+ )
algorithm.start()
print("Algorithm (running as a thread): " + algorithm.get_name())
@@ -20,6 +22,7 @@ def main() -> None:
algorithm.join()
result = algorithm.get_result()
+
print("Solution: " + str(result.variables))
print("Fitness: " + str(result.objectives[0]))
print("Computing time: " + str(algorithm.total_computing_time))
diff --git a/jmetal/runner/singleobjective/evolution_strategy/non_elitist_evolution_strategy_binary.py b/examples/singleobjective/evolution_strategy/non_elitist_evolution_strategy_binary.py
similarity index 82%
rename from jmetal/runner/singleobjective/evolution_strategy/non_elitist_evolution_strategy_binary.py
rename to examples/singleobjective/evolution_strategy/non_elitist_evolution_strategy_binary.py
index 6a9fbc15..29592da2 100644
--- a/jmetal/runner/singleobjective/evolution_strategy/non_elitist_evolution_strategy_binary.py
+++ b/examples/singleobjective/evolution_strategy/non_elitist_evolution_strategy_binary.py
@@ -7,16 +7,24 @@
def main() -> None:
bits = 512
problem = OneMax(bits)
- algorithm = NonElitistEvolutionStrategy[BinarySolution, BinarySolution]\
- (problem, mu=1, lambdA=10, max_evaluations= 25000, mutation=BitFlip(1.0/bits))
+
+ algorithm = NonElitistEvolutionStrategy[BinarySolution, BinarySolution](
+ problem=problem,
+ mu=1,
+ lambd_a=10,
+ max_evaluations= 25000,
+ mutation=BitFlip(probability=1.0/bits)
+ )
algorithm.run()
result = algorithm.get_result()
+
print("Algorithm: " + algorithm.get_name())
print("Problem: " + problem.get_name())
print("Solution: " + str(result.variables[0]))
print("Fitness: " + str(result.objectives[0]))
print("Computing time: " + str(algorithm.total_computing_time))
+
if __name__ == '__main__':
main()
diff --git a/jmetal/runner/singleobjective/evolution_strategy/non_elitist_evolution_strategy_float.py b/examples/singleobjective/evolution_strategy/non_elitist_evolution_strategy_float.py
similarity index 81%
rename from jmetal/runner/singleobjective/evolution_strategy/non_elitist_evolution_strategy_float.py
rename to examples/singleobjective/evolution_strategy/non_elitist_evolution_strategy_float.py
index 1175954a..0ff5bb2c 100644
--- a/jmetal/runner/singleobjective/evolution_strategy/non_elitist_evolution_strategy_float.py
+++ b/examples/singleobjective/evolution_strategy/non_elitist_evolution_strategy_float.py
@@ -7,11 +7,18 @@
def main() -> None:
variables = 10
problem = Sphere(variables)
- algorithm = NonElitistEvolutionStrategy[FloatSolution, FloatSolution]\
- (problem, mu=10, lambdA=10, max_evaluations= 50000, mutation=Polynomial(1.0/variables))
+
+ algorithm = NonElitistEvolutionStrategy[FloatSolution, FloatSolution](
+ problem=problem,
+ mu=10,
+ lambd_a=10,
+ max_evaluations=50000,
+ mutation=Polynomial(probability=1.0/variables)
+ )
algorithm.run()
result = algorithm.get_result()
+
print("Algorithm: " + algorithm.get_name())
print("Problem: " + problem.get_name())
print("Solution: " + str(result.variables))
diff --git a/jmetal/runner/singleobjective/evolution_strategy/non_elitist_evolution_strategy_running_as_a_thread.py b/examples/singleobjective/evolution_strategy/non_elitist_evolution_strategy_running_as_a_thread.py
similarity index 82%
rename from jmetal/runner/singleobjective/evolution_strategy/non_elitist_evolution_strategy_running_as_a_thread.py
rename to examples/singleobjective/evolution_strategy/non_elitist_evolution_strategy_running_as_a_thread.py
index a23215ef..590f0c92 100644
--- a/jmetal/runner/singleobjective/evolution_strategy/non_elitist_evolution_strategy_running_as_a_thread.py
+++ b/examples/singleobjective/evolution_strategy/non_elitist_evolution_strategy_running_as_a_thread.py
@@ -7,8 +7,14 @@
def main() -> None:
variables = 10
problem = Sphere(variables)
- algorithm = NonElitistEvolutionStrategy[FloatSolution, FloatSolution]\
- (problem, mu=10, lambdA=10, max_evaluations= 50000, mutation=Polynomial(1.0/variables))
+
+ algorithm = NonElitistEvolutionStrategy[FloatSolution, FloatSolution](
+ problem=problem,
+ mu=10,
+ lambd_a=10,
+ max_evaluations=50000,
+ mutation=Polynomial(probability=1.0/variables)
+ )
algorithm.start()
print("Algorithm (running as a thread): " + algorithm.get_name())
diff --git a/examples/singleobjective/genetic_algorithm/generational_genetic_algorithm_binary.py b/examples/singleobjective/genetic_algorithm/generational_genetic_algorithm_binary.py
new file mode 100644
index 00000000..afd06659
--- /dev/null
+++ b/examples/singleobjective/genetic_algorithm/generational_genetic_algorithm_binary.py
@@ -0,0 +1,33 @@
+from jmetal.algorithm.singleobjective.evolutionaryalgorithm import GenerationalGeneticAlgorithm
+from jmetal.core.solution import BinarySolution
+from jmetal.operator.crossover import SP
+from jmetal.operator.mutation import BitFlip
+from jmetal.operator.selection import BinaryTournamentSelection
+from jmetal.problem.singleobjective.unconstrained import OneMax
+
+
+def main() -> None:
+ bits = 256
+ problem = OneMax(bits)
+
+ algorithm = GenerationalGeneticAlgorithm[BinarySolution, BinarySolution](
+ problem=problem,
+ population_size=100,
+ max_evaluations=150000,
+ mutation=BitFlip(1.0/bits),
+ crossover=SP(0.9),
+ selection=BinaryTournamentSelection()
+ )
+
+ algorithm.run()
+ result = algorithm.get_result()
+
+ print("Algorithm: " + algorithm.get_name())
+ print("Problem: " + problem.get_name())
+ print("Solution: " + str(result.variables))
+ print("Fitness: " + str(result.objectives[0]))
+ print("Computing time: " + str(algorithm.total_computing_time))
+
+
+if __name__ == '__main__':
+ main()
diff --git a/jmetal/runner/singleobjective/genetic_algorithm/generational_genetic_algorithm_float.py b/examples/singleobjective/genetic_algorithm/generational_genetic_algorithm_float.py
similarity index 56%
rename from jmetal/runner/singleobjective/genetic_algorithm/generational_genetic_algorithm_float.py
rename to examples/singleobjective/genetic_algorithm/generational_genetic_algorithm_float.py
index 97d260b8..cb212dfc 100644
--- a/jmetal/runner/singleobjective/genetic_algorithm/generational_genetic_algorithm_float.py
+++ b/examples/singleobjective/genetic_algorithm/generational_genetic_algorithm_float.py
@@ -1,5 +1,3 @@
-import logging
-
from jmetal.algorithm.singleobjective.evolutionaryalgorithm import GenerationalGeneticAlgorithm
from jmetal.core.solution import FloatSolution
from jmetal.operator.crossover import SBX
@@ -7,28 +5,29 @@
from jmetal.operator.selection import BinaryTournamentSelection
from jmetal.problem.singleobjective.unconstrained import Sphere
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
def main() -> None:
variables = 10
problem = Sphere(variables)
+
algorithm = GenerationalGeneticAlgorithm[FloatSolution, FloatSolution](
- problem,
+ problem=problem,
population_size=100,
max_evaluations=25000,
- mutation=Polynomial(1.0/variables, distribution_index=20),
- crossover=SBX(1.0, distribution_index=20),
- selection=BinaryTournamentSelection())
+ mutation=Polynomial(probability=1.0/variables, distribution_index=20),
+ crossover=SBX(probability=1.0, distribution_index=20),
+ selection=BinaryTournamentSelection()
+ )
algorithm.run()
result = algorithm.get_result()
- logger.info("Algorithm (continuous problem): " + algorithm.get_name())
- logger.info("Problem: " + problem.get_name())
- logger.info("Solution: " + str(result.variables))
- logger.info("Fitness: " + str(result.objectives[0]))
+ print("Algorithm: " + algorithm.get_name())
+ print("Problem: " + problem.get_name())
+ print("Solution: " + str(result.variables))
+ print("Fitness: " + str(result.objectives[0]))
+ print("Computing time: " + str(algorithm.total_computing_time))
+
if __name__ == '__main__':
main()
diff --git a/jmetal/runner/singleobjective/genetic_algorithm/generational_genetic_algorithm_with_observer.py b/examples/singleobjective/genetic_algorithm/generational_genetic_algorithm_running_as_a_thread.py
similarity index 51%
rename from jmetal/runner/singleobjective/genetic_algorithm/generational_genetic_algorithm_with_observer.py
rename to examples/singleobjective/genetic_algorithm/generational_genetic_algorithm_running_as_a_thread.py
index 95ded0a1..11db7404 100644
--- a/jmetal/runner/singleobjective/genetic_algorithm/generational_genetic_algorithm_with_observer.py
+++ b/examples/singleobjective/genetic_algorithm/generational_genetic_algorithm_running_as_a_thread.py
@@ -1,40 +1,34 @@
-import logging
-
from jmetal.algorithm.singleobjective.evolutionaryalgorithm import GenerationalGeneticAlgorithm
-from jmetal.component.observer import BasicAlgorithmConsumer
from jmetal.core.solution import FloatSolution
from jmetal.operator.crossover import SBX
from jmetal.operator.mutation import Polynomial
from jmetal.operator.selection import BinaryTournamentSelection
from jmetal.problem.singleobjective.unconstrained import Sphere
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
def main() -> None:
variables = 10
problem = Sphere(variables)
+
algorithm = GenerationalGeneticAlgorithm[FloatSolution, FloatSolution](
- problem,
+ problem=problem,
population_size=100,
max_evaluations=25000,
- mutation=Polynomial(1.0 / variables, distribution_index=20),
- crossover=SBX(1.0, distribution_index=20),
- selection=BinaryTournamentSelection())
-
- observer = BasicAlgorithmConsumer(2000)
-
- algorithm.observable.register(observer=observer)
+ mutation=Polynomial(probability=1.0/variables, distribution_index=20),
+ crossover=SBX(probability=1.0, distribution_index=20),
+ selection=BinaryTournamentSelection()
+ )
algorithm.start()
+ print("Algorithm (running as a thread): " + algorithm.get_name())
+ print("Problem: " + problem.get_name())
algorithm.join()
result = algorithm.get_result()
- logger.info("Algorithm: " + algorithm.get_name())
- logger.info("Problem: " + problem.get_name())
- logger.info("Solution: " + str(result.variables))
- logger.info("Fitness: " + str(result.objectives[0]))
+
+ print("Solution: " + str(result.variables))
+ print("Fitness: " + str(result.objectives[0]))
+ print("Computing time: " + str(algorithm.total_computing_time))
if __name__ == '__main__':
diff --git a/jmetal/runner/singleobjective/genetic_algorithm/generational_genetic_algorithm_stopping_by_time.py b/examples/singleobjective/genetic_algorithm/generational_genetic_algorithm_stopping_by_time.py
similarity index 59%
rename from jmetal/runner/singleobjective/genetic_algorithm/generational_genetic_algorithm_stopping_by_time.py
rename to examples/singleobjective/genetic_algorithm/generational_genetic_algorithm_stopping_by_time.py
index 73fa150a..0b9ec4e0 100644
--- a/jmetal/runner/singleobjective/genetic_algorithm/generational_genetic_algorithm_stopping_by_time.py
+++ b/examples/singleobjective/genetic_algorithm/generational_genetic_algorithm_stopping_by_time.py
@@ -1,5 +1,3 @@
-import logging
-
from jmetal.algorithm.singleobjective.evolutionaryalgorithm import GenerationalGeneticAlgorithm
from jmetal.core.solution import FloatSolution
from jmetal.operator.crossover import SBX
@@ -7,9 +5,6 @@
from jmetal.operator.selection import BinaryTournamentSelection
from jmetal.problem.singleobjective.unconstrained import Sphere
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
def main() -> None:
class GGA2(GenerationalGeneticAlgorithm[FloatSolution, FloatSolution]):
@@ -18,27 +13,30 @@ def is_stopping_condition_reached(self):
reached = [False, True][self.get_current_computing_time() > 4]
if reached:
- logger.info("Stopping condition reached!")
+ print("Stopping condition reached!")
return reached
variables = 10
problem = Sphere(variables)
+
algorithm = GGA2(
- problem,
- population_size = 100,
+ problem=problem,
+ population_size=100,
max_evaluations=0,
- mutation = Polynomial(1.0/variables, distribution_index=20),
- crossover = SBX(1.0, distribution_index=20),
- selection = BinaryTournamentSelection())
+ mutation=Polynomial(1.0/variables, distribution_index=20),
+ crossover=SBX(1.0, distribution_index=20),
+ selection=BinaryTournamentSelection()
+ )
algorithm.run()
result = algorithm.get_result()
- logger.info("Algorithm (stop for timeout): " + algorithm.get_name())
- logger.info("Problem: " + problem.get_name())
- logger.info("Solution: " + str(result.variables))
- logger.info("Fitness: " + str(result.objectives[0]))
+ print("Algorithm (stop for timeout): " + algorithm.get_name())
+ print("Problem: " + problem.get_name())
+ print("Solution: " + str(result.variables))
+ print("Fitness: " + str(result.objectives[0]))
+ print("Computing time: " + str(algorithm.total_computing_time))
if __name__ == '__main__':
diff --git a/jmetal/__init__.py b/jmetal/__init__.py
index b5bfb0c6..213468e7 100644
--- a/jmetal/__init__.py
+++ b/jmetal/__init__.py
@@ -1,8 +1,25 @@
+import logging
+
from jmetal import algorithm
from jmetal import core
from jmetal import operator
from jmetal import problem
__all__ = ['core', 'algorithm', 'operator', 'problem']
-__version__ = '1.0'
-__author__ = 'Antonio J. Nebro '
+
+logger = logging.getLogger('jMetalPy')
+logger.setLevel(logging.DEBUG)
+
+# create a file handler
+file_handler = logging.FileHandler('jmetalpy.log', delay=True)
+file_handler.setLevel(logging.INFO)
+stream_handler = logging.StreamHandler()
+
+# create a logging format
+formatter = logging.Formatter('%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s')
+file_handler.setFormatter(formatter)
+stream_handler.setFormatter(formatter)
+
+# add the handlers to the logger
+logger.addHandler(file_handler)
+logger.addHandler(stream_handler)
diff --git a/jmetal/algorithm/__init__.py b/jmetal/algorithm/__init__.py
index e69de29b..839f7f76 100644
--- a/jmetal/algorithm/__init__.py
+++ b/jmetal/algorithm/__init__.py
@@ -0,0 +1,9 @@
+from .multiobjective.nsgaii import NSGAII
+from .multiobjective.smpso import SMPSO, SMPSORP
+from .singleobjective.evolutionaryalgorithm import ElitistEvolutionStrategy, NonElitistEvolutionStrategy
+
+__all__ = [
+ 'NSGAII',
+ 'SMPSO', 'SMPSORP',
+ 'ElitistEvolutionStrategy', 'NonElitistEvolutionStrategy'
+]
diff --git a/jmetal/algorithm/multiobjective/nsgaii.py b/jmetal/algorithm/multiobjective/nsgaii.py
index 386f46b3..5f8d99cc 100644
--- a/jmetal/algorithm/multiobjective/nsgaii.py
+++ b/jmetal/algorithm/multiobjective/nsgaii.py
@@ -5,13 +5,21 @@
from jmetal.core.operator import Mutation, Crossover, Selection
from jmetal.core.problem import Problem
from jmetal.operator.selection import RankingAndCrowdingDistanceSelection
-from jmetal.util.observable import Observable, DefaultObservable
S = TypeVar('S')
R = TypeVar(List[S])
+"""
+.. module:: NSGA-II
+ :platform: Unix, Windows
+ :synopsis: NSGA-II (Non-dominance Sorting Genetic Algorithm II) implementation.
+
+.. moduleauthor:: Antonio J. Nebro
+"""
+
class NSGAII(GenerationalGeneticAlgorithm[S, R]):
+
def __init__(self,
problem: Problem[S],
population_size: int,
@@ -19,8 +27,25 @@ def __init__(self,
mutation: Mutation[S],
crossover: Crossover[S, S],
selection: Selection[List[S], S],
- observable: Observable = DefaultObservable(),
evaluator: Evaluator[S] = SequentialEvaluator[S]()):
+ """ NSGA-II implementation as described in
+
+ * K. Deb, A. Pratap, S. Agarwal and T. Meyarivan, "A fast and elitist
+ multiobjective genetic algorithm: NSGA-II," in IEEE Transactions on Evolutionary Computation,
+ vol. 6, no. 2, pp. 182-197, Apr 2002. doi: 10.1109/4235.996017
+
+ NSGA-II is a genetic algorithm (GA), i.e. it belongs to the evolutionary algorithms (EAs)
+ family. The implementation of NSGA-II provided in jMetalPy follows the evolutionary
+ algorithm template described in the algorithm module (:py:mod:`algorithm`).
+
+ :param problem: The problem to solve.
+ :param population_size: Size of the population.
+ :param max_evaluations: Maximum number of evaluations/iterations.
+ :param mutation: Mutation operator (see :py:mod:`mutation`).
+ :param crossover: Crossover operator (see :py:mod:`crosover`).
+ :param selection: Selection operator (see :py:mod:`selection`).
+ :param evaluator: An evaluator object to evaluate the individuals of the population.
+ """
super(NSGAII, self).__init__(
problem,
population_size,
@@ -28,17 +53,21 @@ def __init__(self,
mutation,
crossover,
selection,
- observable,
evaluator)
- def replacement(self, population: List[S], offspring_population: List[S]) -> List[List[TypeVar('S')]]:
+ def replacement(self, population: List[S], offspring_population: List[S]) -> List[List[S]]:
+ """ This method joins the current and offspring populations to produce the population of the next generation
+ by applying the ranking and crowding distance selection.
+
+ :param population: Parent population.
+ :param offspring_population: Offspring population.
+ :return: New population after ranking and crowding distance selection is applied.
+ """
join_population = population + offspring_population
return RankingAndCrowdingDistanceSelection(self.population_size).execute(join_population)
- def get_name(self) -> str:
- return "NSGA-II"
-
def get_result(self) -> R:
return self.population
-
+ def get_name(self) -> str:
+ return 'Non-dominated Sorting Genetic Algorithm II'
diff --git a/jmetal/algorithm/multiobjective/randomSearch.py b/jmetal/algorithm/multiobjective/randomSearch.py
index 3f6f9303..13fa5573 100644
--- a/jmetal/algorithm/multiobjective/randomSearch.py
+++ b/jmetal/algorithm/multiobjective/randomSearch.py
@@ -3,14 +3,22 @@
from jmetal.component.archive import NonDominatedSolutionListArchive
from jmetal.core.problem import Problem
-""" Class representing simple random search algorithms """
+S = TypeVar('S')
+"""
+.. module:: RamdomSearch
+ :platform: Unix, Windows
+ :synopsis: Simple random search algorithms.
-S = TypeVar('S')
+.. moduleauthor:: Antonio J. Nebro
+"""
class RandomSearch(Generic[S]):
- def __init__(self, problem: Problem[S], max_evaluations: int):
+
+ def __init__(self,
+ problem: Problem[S],
+ max_evaluations: int = 25000):
self.problem = problem
self.max_evaluations = max_evaluations
self.archive = NonDominatedSolutionListArchive()
@@ -21,8 +29,9 @@ def run(self) -> None:
self.problem.evaluate(new_solution)
self.archive.add(new_solution)
- def get_name(self) -> str:
- return "Random Search Algorithm"
-
def get_result(self) -> List[S]:
- return self.archive.get_solution_list()
\ No newline at end of file
+ return self.archive.solution_list
+
+ @staticmethod
+ def get_name() -> str:
+ return 'Random Search Algorithm'
diff --git a/jmetal/algorithm/multiobjective/smpso.py b/jmetal/algorithm/multiobjective/smpso.py
index 3bbccc0b..26830c9d 100644
--- a/jmetal/algorithm/multiobjective/smpso.py
+++ b/jmetal/algorithm/multiobjective/smpso.py
@@ -1,6 +1,7 @@
-from copy import copy
-from random import Random
from typing import TypeVar, List
+from copy import copy
+from math import sqrt
+import random
import numpy
@@ -10,28 +11,49 @@
from jmetal.core.operator import Mutation
from jmetal.core.problem import FloatProblem
from jmetal.core.solution import FloatSolution
-from jmetal.util.comparator import DominanceComparator
-from jmetal.util.observable import Observable, DefaultObservable
+from jmetal.component.comparator import DominanceComparator
R = TypeVar('R')
+"""
+.. module:: SMPSO
+ :platform: Unix, Windows
+ :synopsis: Implementation of SMPSO.
+
+.. moduleauthor:: Antonio Benítez-Hidalgo
+"""
+
class SMPSO(ParticleSwarmOptimization):
+
def __init__(self,
problem: FloatProblem,
swarm_size: int,
max_evaluations: int,
mutation: Mutation[FloatSolution],
leaders: BoundedArchive[FloatSolution],
- observable: Observable = DefaultObservable(),
evaluator: Evaluator[FloatSolution] = SequentialEvaluator[FloatSolution]()):
+ """ This class implements the SMPSO algorithm as described in
+
+ * SMPSO: A new PSO-based metaheuristic for multi-objective optimization
+ * MCDM 2009. DOI: ``_.
+
+ The implementation of SMPSO provided in jMetalPy follows the algorithm template described in the algorithm
+ templates section of the documentation.
+
+ :param problem: The problem to solve.
+ :param swarm_size: Swarm size.
+ :param max_evaluations: Maximum number of evaluations.
+ :param mutation: Mutation operator.
+ :param leaders: Archive for leaders.
+ :param evaluator: An evaluator object to evaluate the solutions in the population.
+ """
super(SMPSO, self).__init__()
self.problem = problem
self.swarm_size = swarm_size
self.max_evaluations = max_evaluations
- self.mutation : Mutation[FloatSolution] = mutation
+ self.mutation = mutation
self.leaders = leaders
- self.observable = observable
self.evaluator = evaluator
self.evaluations = 0
@@ -40,7 +62,10 @@ def __init__(self,
self.c1_max = 2.5
self.c2_min = 1.5
self.c2_max = 2.5
-
+ self.r1_min = 0.0
+ self.r1_max = 1.0
+ self.r2_min = 0.0
+ self.r2_max = 1.0
self.min_weight = 0.1
self.max_weight = 0.1
@@ -50,24 +75,25 @@ def __init__(self,
self.dominance_comparator = DominanceComparator()
self.speed = numpy.zeros((self.swarm_size, self.problem.number_of_variables), dtype=float)
- self.delta_max = numpy.empty(problem.number_of_variables)
- self.delta_min = numpy.empty(problem.number_of_variables)
+ self.delta_max, self.delta_min = numpy.empty(problem.number_of_variables),\
+ numpy.empty(problem.number_of_variables)
for i in range(problem.number_of_variables):
self.delta_max[i] = (self.problem.upper_bound[i] - self.problem.lower_bound[i]) / 2.0
self.delta_min = -1.0 * self.delta_max
- def init_progress(self) -> None :
+ def init_progress(self) -> None:
self.evaluations = self.swarm_size
self.leaders.compute_density_estimator()
- def update_progress(self) -> None :
+ def update_progress(self) -> None:
self.evaluations += self.swarm_size
self.leaders.compute_density_estimator()
observable_data = {'evaluations': self.evaluations,
- 'population': self.swarm,
- 'computing time': self.get_current_computing_time()}
+ 'computing time': self.get_current_computing_time(),
+ 'population': self.leaders.solution_list}
+
self.observable.notify_all(**observable_data)
def is_stopping_condition_reached(self) -> bool:
@@ -75,54 +101,52 @@ def is_stopping_condition_reached(self) -> bool:
def create_initial_swarm(self) -> List[FloatSolution]:
swarm = []
-
- for i in range(self.swarm_size):
+ for _ in range(self.swarm_size):
swarm.append(self.problem.create_solution())
-
return swarm
def evaluate_swarm(self, swarm: List[FloatSolution]) -> List[FloatSolution]:
return self.evaluator.evaluate(swarm, self.problem)
def initialize_global_best(self, swarm: List[FloatSolution]) -> None:
- for particle in self.swarm:
+ for particle in swarm:
self.leaders.add(particle)
def initialize_particle_best(self, swarm: List[FloatSolution]) -> None:
- for particle in self.swarm:
- particle.attributes["local_best"] = copy(particle)
+ for particle in swarm:
+ particle.attributes['local_best'] = copy(particle)
def initialize_velocity(self, swarm: List[FloatSolution]) -> None:
- pass # Velocity initialized in the constructor
+ pass # Velocity initialized in the constructor
def update_velocity(self, swarm: List[FloatSolution]) -> None:
for i in range(self.swarm_size):
- particle = copy(self.swarm[i])
- best_particle = copy(self.swarm[i].attributes["local_best"])
- best_global = self.__select_global_best()
-
- r1 = Random.random()
- r2 = Random.random()
+ best_particle = copy(swarm[i].attributes['local_best'])
+ best_global = self.select_global_best()
- c1 = Random.uniform(self.c1_min, self.c1_max)
- c2 = Random.uniform(self.c2_min, self.c2_max)
-
- wmin = self.min_weight
+ r1 = round(random.uniform(self.r1_min, self.r1_max), 1)
+ r2 = round(random.uniform(self.r2_min, self.r2_max), 1)
+ c1 = round(random.uniform(self.c1_min, self.c1_max), 1)
+ c2 = round(random.uniform(self.c2_min, self.c2_max), 1)
wmax = self.max_weight
+ wmin = self.min_weight
- for var in range(self.problem.number_of_variables):
+ for var in range(swarm[i].number_of_variables):
self.speed[i][var] = \
- self.__velocity_constriction(self.__constriction_coefficient(c1, c2) * \
- (wmax * self.speed[i][var] +
- c1 * r1 * (best_particle.variables[var] - particle.variables[var]) +
- c2 * r2 * (best_global.variables[var] - particle.variables[var])),
- var)
+ self.__velocity_constriction(
+ self.__constriction_coefficient(c1, c2) *
+ ((self.__inertia_weight(self.evaluations, self.max_evaluations, wmax, wmin)
+ * self.speed[i][var])
+ + (c1 * r1 * (best_particle.variables[var] - swarm[i].variables[var]))
+ + (c2 * r2 * (best_global.variables[var] - swarm[i].variables[var]))
+ ),
+ self.delta_max, self.delta_min, var)
def update_position(self, swarm: List[FloatSolution]) -> None:
for i in range(self.swarm_size):
- particle = self.swarm[i]
+ particle = swarm[i]
- for j in particle.variables:
+ for j in range(particle.number_of_variables):
particle.variables[j] += self.speed[i][j]
if particle.variables[j] < self.problem.lower_bound[j]:
@@ -134,53 +158,154 @@ def update_position(self, swarm: List[FloatSolution]) -> None:
self.speed[i][j] *= self.change_velocity2
def perturbation(self, swarm: List[FloatSolution]) -> None:
- for particle in self.swarm:
- self.mutation.execute(particle)
+ for i in range(self.swarm_size):
+ if (i % 6) == 0:
+ self.mutation.execute(swarm[i])
def update_global_best(self, swarm: List[FloatSolution]) -> None:
- for particle in self.swarm:
+ for particle in swarm:
self.leaders.add(copy(particle))
def update_particle_best(self, swarm: List[FloatSolution]) -> None:
for i in range(self.swarm_size):
flag = self.dominance_comparator.compare(
- self.swarm[i],
- self.swarm[i].attribute["local_best"])
-
- if flag is not 1:
- swarm[i].attributes["local_best"] = copy(self.swarm[i])
+ swarm[i],
+ swarm[i].attributes['local_best'])
+ if flag != 1:
+ swarm[i].attributes['local_best'] = copy(swarm[i])
def get_result(self) -> List[FloatSolution]:
- self.leaders.solution_list
-
- def __select_global_best(self) -> FloatSolution:
- #pos1 = Random.randint(0, len(self.leaders.solution_list) - 1)
- #pos2 = Random.randint(0, len(self.leaders.solution_list) - 1)
- best_global = None
- particles = Random.sample(self.leaders.solution_list, 2)
- if self.leaders.get_comparator().compare(particles[0], particles[1]) < 1:
- best_global = copy(particles[0])
+ return self.leaders.solution_list
+
+ def select_global_best(self) -> FloatSolution:
+ leaders = self.leaders.solution_list
+
+ if len(leaders) > 2:
+ particles = random.sample(leaders, 2)
+
+ if self.leaders.comparator.compare(particles[0], particles[1]) < 1:
+ best_global = copy(particles[0])
+ else:
+ best_global = copy(particles[1])
else:
- best_global = copy(particles[1])
+ best_global = copy(self.leaders.solution_list[0])
return best_global
- def __velocity_constriction(self, value: float, variable_index: int) -> float:
- result = None
- if value > self.delta_max[variable_index]:
- result = self.delta_max[variable_index]
-
- if value < self.delta_min[variable_index]:
- result = self.delta_min[variable_index]
+ def __velocity_constriction(self, value: float, delta_max: [], delta_min: [], variable_index: int) -> float:
+ result = value
+ if value > delta_max[variable_index]:
+ result = delta_max[variable_index]
+ if value < delta_min[variable_index]:
+ result = delta_min[variable_index]
return result
+ def __inertia_weight(self, evaluations: int, max_evaluations: int, wmax: float, wmin: float):
+ # todo ?
+ return wmax
+
def __constriction_coefficient(self, c1: float, c2: float) -> float:
- result = 0.0
rho = c1 + c2
if rho <= 4:
result = 1.0
else:
- result = 2.0 / (2.0 - rho - numpy.sqrt(pow(rho, 2.0) - 4.0 * rho))
+ result = 2.0 / (2.0 - rho - sqrt(pow(rho, 2.0) - 4.0 * rho))
return result
+
+
+class SMPSORP(SMPSO):
+
+ def __init__(self,
+ problem: FloatProblem,
+ swarm_size: int,
+ max_evaluations: int,
+ mutation: Mutation[FloatSolution],
+ reference_points: List[List[float]],
+ leaders: List[BoundedArchive[FloatSolution]],
+ evaluator: Evaluator[FloatSolution] = SequentialEvaluator[FloatSolution]()):
+ """ This class implements the SMPSORP algorithm.
+
+ :param problem: The problem to solve.
+ :param swarm_size:
+ :param max_evaluations:
+ :param mutation:
+ :param leaders: List of bounded archives.
+ :param evaluator: An evaluator object to evaluate the solutions in the population.
+ """
+ super(SMPSORP, self).__init__(
+ problem=problem,
+ swarm_size=swarm_size,
+ max_evaluations=max_evaluations,
+ mutation=mutation,
+ leaders=None,
+ evaluator=evaluator)
+ self.reference_points = reference_points
+ self.leaders = leaders
+
+ def update_leaders_density_estimator(self):
+ for leader in self.leaders:
+ leader.compute_density_estimator()
+
+ def init_progress(self) -> None:
+ self.evaluations = self.swarm_size
+ self.update_leaders_density_estimator()
+
+ def update_progress(self) -> None:
+ self.evaluations += self.swarm_size
+ self.update_leaders_density_estimator()
+
+ reference_points = []
+ for i, _ in enumerate(self.reference_points):
+ point = self.problem.create_solution()
+ point.objectives = self.reference_points[i]
+ reference_points.append(point)
+
+ observable_data = {'evaluations': self.evaluations,
+ 'computing time': self.get_current_computing_time(),
+ 'population': self.get_result() + reference_points}
+
+ self.observable.notify_all(**observable_data)
+
+ def initialize_global_best(self, swarm: List[FloatSolution]) -> None:
+ for particle in swarm:
+ for leader in self.leaders:
+ leader.add(copy(particle))
+
+ def update_global_best(self, swarm: List[FloatSolution]) -> None:
+ for particle in swarm:
+ for leader in self.leaders:
+ leader.add(copy(particle))
+
+ def get_result(self) -> List[FloatSolution]:
+ result = []
+
+ for leader in self.leaders:
+ for solution in leader.solution_list:
+ result.append(solution)
+
+ return result
+
+ def select_global_best(self) -> FloatSolution:
+ selected = False
+ selected_swarm_index = 0
+
+ while not selected:
+ selected_swarm_index = random.randint(0, len(self.leaders) - 1)
+ if len(self.leaders[selected_swarm_index].solution_list) != 0:
+ selected = True
+
+ leaders = self.leaders[selected_swarm_index].solution_list
+
+ if len(leaders) > 2:
+ particles = random.sample(leaders, 2)
+
+ if self.leaders[selected_swarm_index].comparator.compare(particles[0], particles[1]) < 1:
+ best_global = copy(particles[0])
+ else:
+ best_global = copy(particles[1])
+ else:
+ best_global = copy(self.leaders[selected_swarm_index].solution_list[0])
+
+ return best_global
diff --git a/jmetal/algorithm/multiobjective/test/test_smpo.py b/jmetal/algorithm/multiobjective/test/test_smpo.py
deleted file mode 100644
index e62a3ae0..00000000
--- a/jmetal/algorithm/multiobjective/test/test_smpo.py
+++ /dev/null
@@ -1,56 +0,0 @@
-import unittest
-
-import numpy
-
-from jmetal.algorithm.multiobjective.smpso import SMPSO
-from jmetal.component.archive import BoundedArchive
-from jmetal.core.problem import Problem
-from jmetal.core.solution import FloatSolution
-from jmetal.operator.mutation import Polynomial
-
-
-class SMPSOTestCases(unittest.TestCase):
-
- def setUp(self):
- pass
-
- def test_should_constructor_create_a_valid_object(self):
- problem = self.__DummyFloatProblem()
- algorithm = SMPSO(
- problem=problem,
- swarm_size=100,
- max_evaluations=200,
- mutation=Polynomial(probability=1.0/problem.number_of_variables),
- leaders=BoundedArchive[FloatSolution](100)
- )
-
- self.assertEqual(1.5, algorithm.c1_min)
- self.assertEqual(2.5, algorithm.c1_max)
- self.assertEqual(1.5, algorithm.c2_min)
- self.assertEqual(2.5, algorithm.c2_max)
- self.assertEqual(0.1, algorithm.min_weight)
- self.assertEqual(0.1, algorithm.max_weight)
- self.assertEqual(-1.0, algorithm.change_velocity1)
- self.assertEqual(-1.0, algorithm.change_velocity2)
- self.assertEqual(200, algorithm.max_evaluations)
- self.assertEqual((100, 2), algorithm.speed.shape)
-
- numpy.testing.assert_array_almost_equal(numpy.array([2.0, 2.0]), algorithm.delta_max)
- numpy.testing.assert_array_almost_equal(algorithm.delta_max * -1.0, algorithm.delta_min)
-
- class __DummyFloatProblem(Problem[FloatSolution]):
- def __init__(self):
- self.number_of_variables = 2
- self.number_of_objectives = 2
- self.number_of_constraints = 0
-
- self.lower_bound = [-2.0 for i in range(self.number_of_variables)]
- self.upper_bound = [2.0 for i in range(self.number_of_variables)]
-
- FloatSolution.lower_bound = self.lower_bound
- FloatSolution.upper_bound = self.upper_bound
-
-
-if __name__ == '__main__':
- unittest.main()
-
diff --git a/jmetal/algorithm/singleobjective/evolutionaryalgorithm.py b/jmetal/algorithm/singleobjective/evolutionaryalgorithm.py
index 14a91977..12c60201 100644
--- a/jmetal/algorithm/singleobjective/evolutionaryalgorithm.py
+++ b/jmetal/algorithm/singleobjective/evolutionaryalgorithm.py
@@ -1,27 +1,35 @@
from copy import copy
from typing import TypeVar, List
-from jmetal.component.evaluator import Evaluator, SequentialEvaluator
+from jmetal.component.evaluator import Evaluator
from jmetal.core.algorithm import EvolutionaryAlgorithm
from jmetal.core.operator import Mutation, Crossover, Selection
from jmetal.core.problem import Problem
-from jmetal.util.observable import Observable, DefaultObservable
S = TypeVar('S')
R = TypeVar('R')
+"""
+.. module:: evolutionary_algorithm
+ :platform: Unix, Windows
+ :synopsis: Implementation of Evolutionary Algorithms.
+
+.. moduleauthor:: Antonio J. Nebro
+"""
+
class ElitistEvolutionStrategy(EvolutionaryAlgorithm[S, R]):
+
def __init__(self,
problem: Problem[S],
mu: int,
- lambdA: int,
+ lambd_a: int,
max_evaluations: int,
mutation: Mutation[S]):
super(ElitistEvolutionStrategy, self).__init__()
self.problem = problem
self.mu = mu
- self.lambdA = lambdA
+ self.lambd_a = lambd_a
self.max_evaluations = max_evaluations
self.mutation = mutation
@@ -29,7 +37,7 @@ def init_progress(self):
self.evaluations = self.mu
def update_progress(self):
- self.evaluations += self.lambdA
+ self.evaluations += self.lambd_a
def is_stopping_condition_reached(self) -> bool:
return self.evaluations >= self.max_evaluations
@@ -40,25 +48,24 @@ def create_initial_population(self) -> List[S]:
population.append(self.problem.create_solution())
return population
- def evaluate_population(self, population: List[S]):
+ def evaluate_population(self, population: List[S]) -> List[S]:
for solution in population:
self.problem.evaluate(solution)
return population
- def selection(self, population: List[S]):
+ def selection(self, population: List[S]) -> List[S]:
return population
- def reproduction(self, population: List[S]):
+ def reproduction(self, population: List[S]) -> List[S]:
offspring_population = []
for solution in population:
- for j in range((int)(self.lambdA / self.mu)):
+ for j in range(int(self.lambd_a / self.mu)):
new_solution = copy(solution)
offspring_population.append(self.mutation.execute(new_solution))
return offspring_population
- def replacement(self, population: List[S], offspring_population: List[S]) \
- -> List[S]:
+ def replacement(self, population: List[S], offspring_population: List[S]) -> List[S]:
for solution in offspring_population:
self.population.append(solution)
@@ -73,21 +80,21 @@ def replacement(self, population: List[S], offspring_population: List[S]) \
def get_result(self) -> R:
return self.population[0]
- def get_name(self):
- return "(" + str(self.mu) + "+" + str(self.lambdA) + ")ES"
+ def get_name(self) -> str:
+ return 'Elitist evolution Strategy'
class NonElitistEvolutionStrategy(ElitistEvolutionStrategy[S, R]):
+
def __init__(self,
problem: Problem[S],
- mu: int, lambdA: int,
+ mu: int,
+ lambd_a: int,
max_evaluations: int,
mutation: Mutation[S]):
- super(NonElitistEvolutionStrategy, self).__init__(problem, mu, lambdA,
- max_evaluations, mutation)
+ super(NonElitistEvolutionStrategy, self).__init__(problem, mu, lambd_a, max_evaluations, mutation)
- def replacement(self, population: List[S], offspring_population: List[S]) \
- -> List[S]:
+ def replacement(self, population: List[S], offspring_population: List[S]) -> List[S]:
offspring_population.sort(key=lambda s: s.objectives[0])
new_population = []
@@ -97,10 +104,11 @@ def replacement(self, population: List[S], offspring_population: List[S]) \
return new_population
def get_name(self) -> str:
- return "(" + str(self.mu) + "," + str(self.lambdA) + ")ES"
+ return 'Non-Elitist evolution Strategy'
class GenerationalGeneticAlgorithm(EvolutionaryAlgorithm[S, R]):
+
def __init__(self,
problem: Problem[S],
population_size: int,
@@ -108,17 +116,15 @@ def __init__(self,
mutation: Mutation[S],
crossover: Crossover[S, S],
selection: Selection[List[S], S],
- observable: Observable = DefaultObservable(),
- evaluator: Evaluator[S] = SequentialEvaluator[S]()):
- super(GenerationalGeneticAlgorithm, self).__init__(evaluator)
+ evaluator: Evaluator[S]):
+ super(GenerationalGeneticAlgorithm, self).__init__()
self.problem = problem
self.population_size = population_size
self.max_evaluations = max_evaluations
self.mutation_operator = mutation
self.crossover_operator = crossover
self.selection_operator = selection
- self.evaluations = 0
- self.observable = observable
+ self.evaluator = evaluator
def init_progress(self):
self.evaluations = self.population_size
@@ -127,9 +133,9 @@ def update_progress(self):
self.evaluations += self.population_size
observable_data = {'evaluations': self.evaluations,
- 'population': self.population,
- 'computing time': self.get_current_computing_time()}
-
+ 'computing time': self.get_current_computing_time(),
+ 'population': self.population}
+
self.observable.notify_all(**observable_data)
def is_stopping_condition_reached(self) -> bool:
@@ -157,7 +163,7 @@ def selection(self, population: List[S]):
def reproduction(self, population: List[S]) -> List[S]:
number_of_parents_to_combine = self.crossover_operator.get_number_of_parents()
- self.__check_number_of_parents(population, number_of_parents_to_combine)
+ self.__check_number_of_parents(number_of_parents_to_combine)
offspring_population = []
for i in range(0, self.population_size, number_of_parents_to_combine):
@@ -173,8 +179,7 @@ def reproduction(self, population: List[S]) -> List[S]:
return offspring_population
- def replacement(self, population: List[S], offspring_population: List[S]) \
- -> List[S]:
+ def replacement(self, population: List[S], offspring_population: List[S]) -> List[S]:
population.sort(key=lambda s: s.objectives[0])
offspring_population.append(population[0])
@@ -192,10 +197,9 @@ def get_result(self) -> R:
"""
return self.population[0]
- def get_name(self) -> str:
- return "Generational Genetic Algorithm"
-
- def __check_number_of_parents(self, population: List[S], number_of_parents_for_crossover: int):
+ def __check_number_of_parents(self, number_of_parents_for_crossover: int):
if self.population_size % number_of_parents_for_crossover != 0:
- raise Exception("Wrong number of parents")
+ raise Exception('Wrong number of parents')
+ def get_name(self) -> str:
+ return 'Generational Genetic Algorithm'
diff --git a/jmetal/component/__init__.py b/jmetal/component/__init__.py
index e69de29b..084c20c0 100644
--- a/jmetal/component/__init__.py
+++ b/jmetal/component/__init__.py
@@ -0,0 +1,21 @@
+from .archive import BoundedArchive, NonDominatedSolutionListArchive, CrowdingDistanceArchive, \
+ CrowdingDistanceArchiveWithReferencePoint
+from .comparator import EqualSolutionsComparator, SolutionAttributeComparator, RankingAndCrowdingDistanceComparator, \
+ DominanceComparator
+from .density_estimator import CrowdingDistance
+from .evaluator import SequentialEvaluator, MapEvaluator
+from .observer import ProgressBarObserver, BasicAlgorithmObserver, WriteFrontToFileObserver, VisualizerObserver
+from .quality_indicator import HyperVolume
+from .ranking import FastNonDominatedRanking
+
+__all__ = [
+ 'BoundedArchive', 'NonDominatedSolutionListArchive', 'CrowdingDistanceArchive',
+ 'CrowdingDistanceArchiveWithReferencePoint',
+ 'EqualSolutionsComparator', 'SolutionAttributeComparator', 'RankingAndCrowdingDistanceComparator',
+ 'DominanceComparator',
+ 'CrowdingDistance',
+ 'SequentialEvaluator', 'MapEvaluator',
+ 'ProgressBarObserver', 'BasicAlgorithmObserver', 'WriteFrontToFileObserver', 'VisualizerObserver',
+ 'HyperVolume',
+ 'FastNonDominatedRanking'
+]
diff --git a/jmetal/component/archive.py b/jmetal/component/archive.py
index 77c8c552..8236d02b 100644
--- a/jmetal/component/archive.py
+++ b/jmetal/component/archive.py
@@ -1,52 +1,91 @@
+import random
+import copy
+from abc import ABCMeta, abstractmethod
from typing import TypeVar, Generic, List
-from jmetal.component.density_estimator import CrowdingDistance
-from jmetal.util.comparator import DominanceComparator, EqualSolutionsComparator, SolutionAttributeComparator
+from jmetal.component.density_estimator import CrowdingDistance, DensityEstimator
+from jmetal.component.comparator import Comparator, DominanceComparator, EqualSolutionsComparator, \
+ SolutionAttributeComparator
S = TypeVar('S')
+"""
+.. module:: archive
+ :platform: Unix, Windows
+ :synopsis: Archive implementation.
+
+.. moduleauthor:: Antonio J. Nebro
+"""
+
class Archive(Generic[S]):
+
+ __metaclass__ = ABCMeta
+
def __init__(self):
self.solution_list: List[S] = []
+ @abstractmethod
def add(self, solution: S) -> bool:
pass
- def get(self, index:int) -> S:
+ def get(self, index: int) -> S:
return self.solution_list[index]
- def get_solution_list(self) -> List[S]:
- return self.solution_list
-
def size(self) -> int:
return len(self.solution_list)
- def get_comparator(self):
- pass
+ def get_name(self) -> str:
+ return self.__class__.__name__
class BoundedArchive(Archive[S]):
- def __init__(self, maximum_size: int):
+
+ def __init__(self,
+ maximum_size: int,
+ comparator: Comparator[S]=None,
+ density_estimator: DensityEstimator=None):
super(BoundedArchive, self).__init__()
self.maximum_size = maximum_size
-
- def get_max_size(self) -> int:
- return self.maximum_size
+ self.comparator = comparator
+ self.density_estimator = density_estimator
+ self.non_dominated_solution_archive = NonDominatedSolutionListArchive()
+ self.solution_list = self.non_dominated_solution_archive.solution_list
def compute_density_estimator(self):
- pass
+ self.density_estimator.compute_density_estimator(self.solution_list)
- def sort(self):
- pass
+ def add(self, solution: S) -> bool:
+ success = self.non_dominated_solution_archive.add(solution)
+ if success:
+ if self.size() > self.maximum_size:
+ self.compute_density_estimator()
+ worst_solution = self.__find_worst_solution(self.solution_list)
+ self.solution_list.remove(worst_solution)
+
+ return success
+
+ def __find_worst_solution(self, solution_list: List[S]) -> S:
+ if solution_list is None:
+ raise Exception("The solution list is None")
+ elif len(solution_list) is 0:
+ raise Exception("The solution list is empty")
+
+ worst_solution = solution_list[0]
+ for solution in solution_list[1:]:
+ if self.comparator.compare(worst_solution, solution) < 0:
+ worst_solution = solution
+
+ return worst_solution
class NonDominatedSolutionListArchive(Archive[S]):
+
def __init__(self):
super(NonDominatedSolutionListArchive, self).__init__()
self.comparator = DominanceComparator()
- def add(self, solution:S) -> bool:
+ def add(self, solution: S) -> bool:
is_dominated = False
is_contained = False
@@ -76,44 +115,92 @@ def add(self, solution:S) -> bool:
return False
- def get_comparator(self):
- return self.comparator
-
class CrowdingDistanceArchive(BoundedArchive[S]):
- def __init__(self, maximum_size: int):
- super(CrowdingDistanceArchive, self).__init__(maximum_size)
- self.__non_dominated_solution_archive = NonDominatedSolutionListArchive[S]()
- self.__comparator = SolutionAttributeComparator("crowding_distance", lowest_is_best=False)
- self.__crowding_distance = CrowdingDistance()
- self.solution_list = self.__non_dominated_solution_archive.get_solution_list()
+ def __init__(self,
+ maximum_size: int):
+ super(CrowdingDistanceArchive, self).__init__(
+ maximum_size=maximum_size,
+ comparator=SolutionAttributeComparator("crowding_distance", lowest_is_best=False),
+ density_estimator=CrowdingDistance())
+
+
+class ArchiveWithReferencePoint(BoundedArchive[S]):
+
+ def __init__(self,
+ maximum_size: int,
+ reference_point: List[float],
+ comparator: Comparator[S],
+ density_estimator: DensityEstimator):
+ super(ArchiveWithReferencePoint, self).__init__(maximum_size, comparator, density_estimator)
+ self.__reference_point = reference_point
+ self.__comparator = comparator
+ self.__density_estimator = density_estimator
+ self.__reference_point_solution = None
def add(self, solution: S) -> bool:
- success: bool = self.__non_dominated_solution_archive.add(solution)
- if success:
- if self.size() > self.get_max_size():
- self.compute_density_estimator()
- worst_solution = self.__find_worst_solution(self.get_solution_list())
- self.get_solution_list().remove(worst_solution)
+ if self.__reference_point_solution is None:
+ self.__reference_point_solution = copy.deepcopy(solution)
+
+ self.__reference_point_solution.objectives = [value for value in self.__reference_point]
+
+ dominated_solution = None
+
+ if self.__dominance_test(solution, self.__reference_point_solution) == 0:
+ if len(self.solution_list) == 0:
+ result = True
+ else:
+ if random.uniform(0.0, 1.0) < 0.05:
+ result = True
+ dominated_solution = solution
+ else:
+ result = False
+ else:
+ result = True
- return success
+ if result:
+ result = super(ArchiveWithReferencePoint, self).add(solution)
- def compute_density_estimator(self):
- self.__crowding_distance.compute_density_estimator(self.get_solution_list())
+ if result and dominated_solution is not None and len(self.solution_list) > 1:
+ self.solution_list.remove(dominated_solution)
- def __find_worst_solution(self, solution_list: List[S]) -> S:
- if solution_list is None:
- raise Exception("The solution list is None")
- elif len(solution_list) is 0:
- raise Exception("The solution list is empty")
+ if result and len(self.solution_list) > self.maximum_size:
+ self.compute_density_estimator()
- worst_solution = solution_list[0]
- for solution in solution_list[1:]:
- if self.__comparator.compare(worst_solution, solution) < 0:
- worst_solution = solution
+ return result
- return worst_solution
+ def get_reference_point(self)->List[float]:
+ return self.__reference_point
+
+ def __dominance_test(self, solution1: S, solution2: S) -> int:
+ best_is_one = 0
+ best_is_two = 0
+
+ for value1, value2 in zip(solution1.objectives, solution2.objectives):
+ if value1 != value2:
+ if value1 < value2:
+ best_is_one = 1
+ if value2 < value1:
+ best_is_two = 1
+
+ if best_is_one > best_is_two:
+ result = -1
+ elif best_is_two > best_is_one:
+ result = 1
+ else:
+ result = 0
+
+ return result
+
+
+class CrowdingDistanceArchiveWithReferencePoint(ArchiveWithReferencePoint[S]):
- def get_comparator(self):
- return self.__comparator
+ def __init__(self,
+ maximum_size: int,
+ reference_point: List[float]):
+ super(CrowdingDistanceArchiveWithReferencePoint, self).__init__(
+ maximum_size=maximum_size,
+ reference_point=reference_point,
+ comparator=SolutionAttributeComparator("crowding_distance", lowest_is_best=False),
+ density_estimator=CrowdingDistance())
diff --git a/jmetal/util/comparator.py b/jmetal/component/comparator.py
similarity index 78%
rename from jmetal/util/comparator.py
rename to jmetal/component/comparator.py
index 0e547453..3861355e 100644
--- a/jmetal/util/comparator.py
+++ b/jmetal/component/comparator.py
@@ -1,16 +1,25 @@
-from typing import TypeVar
+from abc import ABCMeta, abstractmethod
+from typing import TypeVar, Generic
from jmetal.core.solution import Solution
S = TypeVar('S')
-class Comparator():
- def compare(self, object1: S, object2: S) -> int:
+class Comparator(Generic[S]):
+
+ __metaclass__ = ABCMeta
+
+ @abstractmethod
+ def compare(self, solution1: S, solution2: S) -> int:
pass
+ def get_name(self) -> str:
+ return self.__class__.__name__
+
+
+class EqualSolutionsComparator(Comparator):
-class EqualSolutionsComparator():
def compare(self, solution1: Solution, solution2: Solution) -> int:
if solution1 is None:
return 1
@@ -24,7 +33,7 @@ def compare(self, solution1: Solution, solution2: Solution) -> int:
value1 = solution1.objectives[i]
value2 = solution2.objectives[i]
- if value1 value2:
flag = 1
@@ -43,26 +52,9 @@ def compare(self, solution1: Solution, solution2: Solution) -> int:
elif dominate2 == 1:
return 1
-"""
-class DominanceRankingComparator(Comparator):
- def compare(self, solution1: Solution, solution2: Solution) -> int:
- rank1 = solution1.attributes.get("dominance_ranking")
- rank2 = solution1.attributes.get("dominance_ranking")
-
- result = 0
- if rank1 is not None or rank2 is not None:
- if rank1 < rank2:
- result = -1
- elif rank1 > rank2:
- result = 1
- else:
- result = 0
-
- return result
-"""
+class SolutionAttributeComparator(Comparator):
-class SolutionAttributeComparator():
def __init__(self, key: str, lowest_is_best: bool = True):
self.key = key
self.lowest_is_best = lowest_is_best
@@ -104,8 +96,9 @@ def compare(self, solution1: Solution, solution2: Solution) -> int:
return result
-class DominanceComparator():
- def __init__(self, constraint_comparator = SolutionAttributeComparator("overall_constraint_violation", lowest_is_best=False)):
+class DominanceComparator(Comparator):
+
+ def __init__(self, constraint_comparator=SolutionAttributeComparator("overall_constraint_violation", False)):
self.constraint_comparator = constraint_comparator
def compare(self, solution1: Solution, solution2: Solution) -> int:
@@ -122,7 +115,7 @@ def compare(self, solution1: Solution, solution2: Solution) -> int:
return result
- def __dominance_test(self, solution1, solution2) -> float:
+ def __dominance_test(self, solution1: Solution, solution2: Solution) -> float:
best_is_one = 0
best_is_two = 0
@@ -142,4 +135,4 @@ def __dominance_test(self, solution1, solution2) -> float:
else:
result = 0
- return result
\ No newline at end of file
+ return result
diff --git a/jmetal/component/density_estimator.py b/jmetal/component/density_estimator.py
index b8e842fc..31c3b86a 100644
--- a/jmetal/component/density_estimator.py
+++ b/jmetal/component/density_estimator.py
@@ -1,6 +1,9 @@
import logging
+from abc import ABCMeta, abstractmethod
from typing import TypeVar, List
+logger = logging.getLogger(__name__)
+
S = TypeVar('S')
"""
@@ -11,14 +14,14 @@
.. moduleauthor:: Álvaro Gómez Jáuregui
"""
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
class DensityEstimator(List[S]):
"""This is the interface of any density estimator algorithm.
"""
+ __metaclass__ = ABCMeta
+
+ @abstractmethod
def compute_density_estimator(self, solution_list: List[S]) -> float:
pass
@@ -28,48 +31,49 @@ class CrowdingDistance(DensityEstimator[List[S]]):
In consequence, the main method of this class is :func:`compute_density_estimator`.
"""
- def compute_density_estimator(self, solution_list: List[S]):
+ def compute_density_estimator(self, front: List[S]):
"""This function performs the computation of the crowding density estimation over the solution list.
- .. note::
- This method assign the distance in the inner elements of the solution list.
- :param solution_list: The list of solutions.
+ .. note::
+ This method assign the distance in the inner elements of the solution list.
+
+ :param front: The list of solutions.
"""
- size = len(solution_list)
+ size = len(front)
if size is 0:
return
elif size is 1:
- solution_list[0].attributes["crowding_distance"] = float("inf")
+ front[0].attributes['crowding_distance'] = float("inf")
return
elif size is 2:
- solution_list[0].attributes["crowding_distance"] = float("inf")
- solution_list[1].attributes["crowding_distance"] = float("inf")
+ front[0].attributes['crowding_distance'] = float("inf")
+ front[1].attributes['crowding_distance'] = float("inf")
return
- for i in range(len(solution_list)):
- solution_list[i].attributes["crowding_distance"] = 0.0
+ for i in range(len(front)):
+ front[i].attributes['crowding_distance'] = 0.0
- number_of_objectives = solution_list[0].number_of_objectives
+ number_of_objectives = front[0].number_of_objectives
for i in range(number_of_objectives):
# Sort the population by Obj n
- solution_list = sorted(solution_list, key=lambda x: x.objectives[i])
- objective_minn = solution_list[0].objectives[i]
- objective_maxn = solution_list[len(solution_list) - 1].objectives[i]
+ front = sorted(front, key=lambda x: x.objectives[i])
+ objective_minn = front[0].objectives[i]
+ objective_maxn = front[len(front) - 1].objectives[i]
# Set de crowding distance
- solution_list[0].attributes["crowding_distance"] = float("inf")
- solution_list[size - 1].attributes["crowding_distance"] = float("inf")
+ front[0].attributes['crowding_distance'] = float('inf')
+ front[size - 1].attributes['crowding_distance'] = float('inf')
for j in range(1, size - 1):
- distance = solution_list[j + 1].objectives[i] - solution_list[j - 1].objectives[i]
+ distance = front[j + 1].objectives[i] - front[j - 1].objectives[i]
# Check if minimum and maximum are the same (in which case do nothing)
if objective_maxn - objective_minn == 0:
- logger.info("Minimum and maximum are the same!")
+ logger.warning('Minimum and maximum are the same!')
else:
distance = distance / (objective_maxn - objective_minn)
- distance += solution_list[j].attributes["crowding_distance"]
- solution_list[j].attributes["crowding_distance"] = distance
+ distance += front[j].attributes['crowding_distance']
+ front[j].attributes['crowding_distance'] = distance
diff --git a/jmetal/component/evaluator.py b/jmetal/component/evaluator.py
index 3ab4641d..3094be0c 100644
--- a/jmetal/component/evaluator.py
+++ b/jmetal/component/evaluator.py
@@ -1,3 +1,4 @@
+from abc import ABCMeta, abstractmethod
from multiprocessing.pool import ThreadPool
from typing import TypeVar, List, Generic
@@ -7,6 +8,10 @@
class Evaluator(Generic[S]):
+
+ __metaclass__ = ABCMeta
+
+ @abstractmethod
def evaluate(self, solution_list: List[S], problem: Problem) -> List[S]:
pass
@@ -16,8 +21,12 @@ def evaluate_solution(solution: S, problem: Problem) -> None:
if problem.number_of_constraints > 0:
problem.evaluate_constraints(solution)
+ def get_name(self) -> str:
+ return self.__class__.__name__
+
class SequentialEvaluator(Evaluator[S]):
+
def evaluate(self, solution_list: List[S], problem: Problem) -> List[S]:
for solution in solution_list:
Evaluator.evaluate_solution(solution, problem)
@@ -25,7 +34,8 @@ def evaluate(self, solution_list: List[S], problem: Problem) -> List[S]:
return solution_list
-class ParallelEvaluator(Evaluator[S]):
+class MapEvaluator(Evaluator[S]):
+
def __init__(self, processes=None):
self.pool = ThreadPool(processes)
diff --git a/jmetal/component/observer.py b/jmetal/component/observer.py
index 9b5e953f..5a8ff12e 100644
--- a/jmetal/component/observer.py
+++ b/jmetal/component/observer.py
@@ -1,56 +1,93 @@
import logging
import os
-from jmetal.util.observable import Observer
-from jmetal.util.solution_list_output import SolutionListOutput
+from tqdm import tqdm
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
+from jmetal.core.problem import Problem
+from jmetal.util.graphic import ScatterMatplotlib
+from jmetal.core.observable import Observer
+from jmetal.util.solution_list_output import SolutionList
+
+jMetalPyLogger = logging.getLogger('jMetalPy')
+
+"""
+.. module:: observer
+ :platform: Unix, Windows
+ :synopsis: Implementation of algorithm's observers.
+
+.. moduleauthor:: Antonio J. Nebro
+"""
+
+
+class ProgressBarObserver(Observer):
+
+ def __init__(self, step: int, maximum: int, desc: str= 'Progress') -> None:
+ self.progress_bar = tqdm(total=maximum, initial=step, ascii=True, desc=desc)
+ self.progress = step
+ self.step = step
+ self.maxx = maximum
+
+ def update(self, *args, **kwargs):
+ self.progress_bar.update(self.step)
+ self.progress += self.step
+
+ if self.progress >= self.maxx:
+ self.progress_bar.close()
class BasicAlgorithmObserver(Observer):
+
def __init__(self, frequency: float = 1.0) -> None:
self.display_frequency = frequency
def update(self, *args, **kwargs):
- evaluations = kwargs["evaluations"]
+ computing_time = kwargs['computing time']
+ evaluations = kwargs['evaluations']
+ front = kwargs['population']
if (evaluations % self.display_frequency) == 0:
- logger.info("Evaluations: " + str(evaluations) +
- ". Best fitness: " + str(kwargs["population"][0].objectives) +
- ". Computing time: " + str(kwargs["computing time"]))
+ jMetalPyLogger.debug(
+ 'Evaluations: {0} \n Best fitness: {1} \n Computing time: {2}'.format(
+ evaluations, front[0].objectives, computing_time
+ )
+ )
class WriteFrontToFileObserver(Observer):
+
def __init__(self, output_directory) -> None:
self.counter = 0
self.directory = output_directory
if os.path.isdir(self.directory):
- logger.info("Directory " + self.directory + " exists. Removing contents.")
+ jMetalPyLogger.warning('Directory {0} exists. Removing contents.'.format(self.directory))
for file in os.listdir(self.directory):
- os.remove(self.directory + "/" + file)
+ os.remove('{0}/{1}'.format(self.directory, file))
else:
- logger.info("Directory " + self.directory + " does not exist. Creating it.")
+ jMetalPyLogger.warning('Directory {0} does not exist. Creating it.'.format(self.directory))
os.mkdir(self.directory)
def update(self, *args, **kwargs):
- SolutionListOutput.print_function_values_to_file(
- self.directory + "/FUN." + str(self.counter), kwargs["population"])
+ front = kwargs['population']
+ SolutionList.print_function_values_to_file(front, '{0}/FUN.{1}'.format(self.directory, self.counter))
self.counter += 1
-class AlgorithmObserver(Observer):
- def __init__(self, animation_speed: float, frequency: float = 1.0) -> None:
- self.animation_speed = animation_speed
- self.display_frequency = frequency
+class VisualizerObserver(Observer):
+
+ def __init__(self, problem: Problem, replace: bool=True) -> None:
+ self.display_frequency = 1.0
+ self.replace = replace
+ self.reference = problem.get_reference_front()
+ self.plot = ScatterMatplotlib('jMetalPy', problem.number_of_objectives)
def update(self, *args, **kwargs):
- evaluations = kwargs["evaluations"]
- population = kwargs["population"]
- computing_time = kwargs["computing time"]
+ computing_time = kwargs['computing time']
+ evaluations = kwargs['evaluations']
+ front = kwargs['population']
+
+ title = '{0}, Eval: {1}, Time: {2}'.format('VisualizerObserver', evaluations, computing_time)
if (evaluations % self.display_frequency) == 0:
- SolutionListOutput.plot_scatter_real_time(population, evaluations, computing_time,
- self.animation_speed)
+ self.plot.update(front, self.reference, new_title=title, persistence=self.replace)
diff --git a/jmetal/component/quality_indicator.py b/jmetal/component/quality_indicator.py
new file mode 100644
index 00000000..4ce33951
--- /dev/null
+++ b/jmetal/component/quality_indicator.py
@@ -0,0 +1,278 @@
+from abc import ABCMeta, abstractmethod
+from typing import List, TypeVar
+
+from jmetal.core.solution import Solution
+
+"""
+.. module:: indicators
+ :platform: Unix, Windows
+ :synopsis: Quality indicators implementation.
+
+.. moduleauthor:: Antonio Benítez-Hidalgo , Simon Wessing
+"""
+
+S = TypeVar('S')
+
+
+class Metric:
+
+ __metaclass__ = ABCMeta
+
+ @abstractmethod
+ def get_name(self) -> str:
+ return self.__class__.__name__
+
+
+class HyperVolume(Metric):
+ """ Hypervolume computation based on variant 3 of the algorithm in the paper:
+
+ * C. M. Fonseca, L. Paquete, and M. Lopez-Ibanez. An improved dimension-sweep
+ algorithm for the hypervolume indicator. In IEEE Congress on Evolutionary
+ Computation, pages 1157-1163, Vancouver, Canada, July 2006.
+
+ Minimization is implicitly assumed here!
+ """
+
+ def __init__(self, reference_point: list):
+ """Constructor."""
+ self.referencePoint = reference_point
+ self.list: MultiList = []
+
+ def compute(self, front: List[Solution]):
+ """Before the HV computation, front and reference point are translated, so
+ that the reference point is [0, ..., 0].
+
+ :return: The hypervolume that is dominated by a non-dominated front.
+ """
+ def get_variables() -> list:
+ result = []
+ for solution in front:
+ result.append(solution.objectives)
+
+ return result
+
+ front = get_variables()
+
+ def weakly_dominates(point, other):
+ for i in range(len(point)):
+ if point[i] > other[i]:
+ return False
+ return True
+
+ relevant_points = []
+ reference_point = self.referencePoint
+ dimensions = len(reference_point)
+ for point in front:
+ # only consider points that dominate the reference point
+ if weakly_dominates(point, reference_point):
+ relevant_points.append(point)
+ if any(reference_point):
+ # shift points so that reference_point == [0, ..., 0]
+ # this way the reference point doesn't have to be explicitly used
+ # in the HV computation
+ for j in range(len(relevant_points)):
+ relevant_points[j] = [relevant_points[j][i] - reference_point[i] for i in range(dimensions)]
+ self._pre_process(relevant_points)
+ bounds = [-1.0e308] * dimensions
+
+ return self._hv_recursive(dimensions - 1, len(relevant_points), bounds)
+
+ def _hv_recursive(self, dim_index: int, length: int, bounds: list):
+ """Recursive call to hypervolume calculation.
+
+ In contrast to the paper, the code assumes that the reference point
+ is [0, ..., 0]. This allows the avoidance of a few operations.
+ """
+ hvol = 0.0
+ sentinel = self.list.sentinel
+ if length == 0:
+ return hvol
+ elif dim_index == 0:
+ # special case: only one dimension
+ # why using hypervolume at all?
+ return -sentinel.next[0].cargo[0]
+ elif dim_index == 1:
+ # special case: two dimensions, end recursion
+ q = sentinel.next[1]
+ h = q.cargo[0]
+ p = q.next[1]
+ while p is not sentinel:
+ p_cargo = p.cargo
+ hvol += h * (q.cargo[1] - p_cargo[1])
+ if p_cargo[0] < h:
+ h = p_cargo[0]
+ q = p
+ p = q.next[1]
+ hvol += h * q.cargo[1]
+ return hvol
+ else:
+ remove = self.list.remove
+ reinsert = self.list.reinsert
+ hv_recursive = self._hv_recursive
+ p = sentinel
+ q = p.prev[dim_index]
+ while q.cargo is not None:
+ if q.ignore < dim_index:
+ q.ignore = 0
+ q = q.prev[dim_index]
+ q = p.prev[dim_index]
+ while length > 1 and (
+ q.cargo[dim_index] > bounds[dim_index] or q.prev[dim_index].cargo[dim_index] >= bounds[dim_index]):
+ p = q
+ remove(p, dim_index, bounds)
+ q = p.prev[dim_index]
+ length -= 1
+ q_area = q.area
+ q_cargo = q.cargo
+ q_prev_dim_index = q.prev[dim_index]
+ if length > 1:
+ hvol = q_prev_dim_index.volume[dim_index] + q_prev_dim_index.area[dim_index] * (
+ q_cargo[dim_index] - q_prev_dim_index.cargo[dim_index])
+ else:
+ q_area[0] = 1
+ q_area[1:dim_index + 1] = [q_area[i] * -q_cargo[i] for i in range(dim_index)]
+ q.volume[dim_index] = hvol
+ if q.ignore >= dim_index:
+ q_area[dim_index] = q_prev_dim_index.area[dim_index]
+ else:
+ q_area[dim_index] = hv_recursive(dim_index - 1, length, bounds)
+ if q_area[dim_index] <= q_prev_dim_index.area[dim_index]:
+ q.ignore = dim_index
+ while p is not sentinel:
+ p_cargo_dim_index = p.cargo[dim_index]
+ hvol += q.area[dim_index] * (p_cargo_dim_index - q.cargo[dim_index])
+ bounds[dim_index] = p_cargo_dim_index
+ reinsert(p, dim_index, bounds)
+ length += 1
+ q = p
+ p = p.next[dim_index]
+ q.volume[dim_index] = hvol
+ if q.ignore >= dim_index:
+ q.area[dim_index] = q.prev[dim_index].area[dim_index]
+ else:
+ q.area[dim_index] = hv_recursive(dim_index - 1, length, bounds)
+ if q.area[dim_index] <= q.prev[dim_index].area[dim_index]:
+ q.ignore = dim_index
+ hvol -= q.area[dim_index] * q.cargo[dim_index]
+ return hvol
+
+ def _pre_process(self, front):
+ """Sets up the list front structure needed for calculation."""
+ dimensions = len(self.referencePoint)
+ node_list = MultiList(dimensions)
+ nodes = [MultiList.Node(dimensions, point) for point in front]
+ for i in range(dimensions):
+ self._sort_by_dimension(nodes, i)
+ node_list.extend(nodes, i)
+ self.list = node_list
+
+ def _sort_by_dimension(self, nodes, i):
+ """Sorts the list of nodes by the i-th value of the contained points."""
+ # build a list of tuples of (point[i], node)
+ decorated = [(node.cargo[i], node) for node in nodes]
+ # sort by this value
+ decorated.sort()
+ # write back to original list
+ nodes[:] = [node for (_, node) in decorated]
+
+ def get_name(self) -> str:
+ return 'Hypervolume'
+
+
+class MultiList:
+ """A special front structure needed by FonsecaHyperVolume.
+
+ It consists of several doubly linked lists that share common nodes. So,
+ every node has multiple predecessors and successors, one in every list.
+ """
+
+ class Node:
+
+ def __init__(self, number_lists, cargo=None):
+ self.cargo = cargo
+ self.next = [None] * number_lists
+ self.prev = [None] * number_lists
+ self.ignore = 0
+ self.area = [0.0] * number_lists
+ self.volume = [0.0] * number_lists
+
+ def __str__(self):
+ return str(self.cargo)
+
+ def __init__(self, number_lists):
+ """ Builds 'numberLists' doubly linked lists.
+ """
+ self.number_lists = number_lists
+ self.sentinel = MultiList.Node(number_lists)
+ self.sentinel.next = [self.sentinel] * number_lists
+ self.sentinel.prev = [self.sentinel] * number_lists
+
+ def __str__(self):
+ strings = []
+ for i in range(self.number_lists):
+ current_list = []
+ node = self.sentinel.next[i]
+ while node != self.sentinel:
+ current_list.append(str(node))
+ node = node.next[i]
+ strings.append(str(current_list))
+ string_repr = ""
+ for string in strings:
+ string_repr += string + "\n"
+ return string_repr
+
+ def __len__(self):
+ """Returns the number of lists that are included in this MultiList."""
+ return self.number_lists
+
+ def get_length(self, i):
+ """Returns the length of the i-th list."""
+ length = 0
+ sentinel = self.sentinel
+ node = sentinel.next[i]
+ while node != sentinel:
+ length += 1
+ node = node.next[i]
+ return length
+
+ def append(self, node, index):
+ """ Appends a node to the end of the list at the given index."""
+ last_but_one = self.sentinel.prev[index]
+ node.next[index] = self.sentinel
+ node.prev[index] = last_but_one
+ # set the last element as the new one
+ self.sentinel.prev[index] = node
+ last_but_one.next[index] = node
+
+ def extend(self, nodes, index):
+ """ Extends the list at the given index with the nodes."""
+ sentinel = self.sentinel
+ for node in nodes:
+ last_but_one = sentinel.prev[index]
+ node.next[index] = sentinel
+ node.prev[index] = last_but_one
+ # set the last element as the new one
+ sentinel.prev[index] = node
+ last_but_one.next[index] = node
+
+ def remove(self, node, index, bounds):
+ """ Removes and returns 'node' from all lists in [0, 'index'[."""
+ for i in range(index):
+ predecessor = node.prev[i]
+ successor = node.next[i]
+ predecessor.next[i] = successor
+ successor.prev[i] = predecessor
+ if bounds[i] > node.cargo[i]:
+ bounds[i] = node.cargo[i]
+ return node
+
+ def reinsert(self, node, index, bounds):
+ """ Inserts 'node' at the position it had in all lists in [0, 'index'[
+ before it was removed. This method assumes that the next and previous
+ nodes of the node that is reinserted are in the list.
+ """
+ for i in range(index):
+ node.prev[i].next[i] = node
+ node.next[i].prev[i] = node
+ if bounds[i] > node.cargo[i]:
+ bounds[i] = node.cargo[i]
diff --git a/jmetal/util/ranking.py b/jmetal/component/ranking.py
similarity index 52%
rename from jmetal/util/ranking.py
rename to jmetal/component/ranking.py
index af25dd49..bf3d23aa 100644
--- a/jmetal/util/ranking.py
+++ b/jmetal/component/ranking.py
@@ -1,89 +1,93 @@
+from abc import ABCMeta, abstractmethod
from typing import TypeVar, List
-from jmetal.util.comparator import DominanceComparator
+from jmetal.component.comparator import DominanceComparator
S = TypeVar('S')
class Ranking(List[S]):
+
+ __metaclass__ = ABCMeta
+
def __init__(self):
- self.number_of_comparions = 0
+ super(Ranking, self).__init__()
+ self.number_of_comparisons = 0
self.ranked_sublists = []
+ @abstractmethod
def compute_ranking(self, solution_list: List[S]):
pass
def get_subfront(self, rank: int):
if rank >= len(self.ranked_sublists):
- raise Exception("Invalid rank: " + str(rank) + ". Max rank = " + str(len(self.ranked_sublists) -1))
+ raise Exception('Invalid rank: {0}. Max rank: {1}'.format(rank, len(self.ranked_sublists) - 1))
return self.ranked_sublists[rank]
def get_number_of_subfronts(self):
return len(self.ranked_sublists)
- def get_number_of_comparions(self) -> int:
- return self.number_of_comparisons
-
class FastNonDominatedRanking(Ranking[List[S]]):
- """ Class implementing the non-dominated ranking of NSGA-II"""
+ """ Class implementing the non-dominated ranking of NSGA-II. """
+
def __init__(self):
super(FastNonDominatedRanking, self).__init__()
def compute_ranking(self, solution_list: List[S]):
# number of solutions dominating solution ith
- dominate_me = [0 for i in range(len(solution_list))]
+ dominating_ith = [0 for _ in range(len(solution_list))]
# list of solutions dominated by solution ith
- i_dominate = [[] for i in range(len(solution_list))]
+ ith_dominated = [[] for _ in range(len(solution_list))]
# front[i] contains the list of solutions belonging to front i
- front = [[] for i in range(len(solution_list) + 1)]
+ front = [[] for _ in range(len(solution_list) + 1)]
for p in range(len(solution_list) - 1):
for q in range(p + 1, len(solution_list)):
dominance_test_result = DominanceComparator().compare(solution_list[p], solution_list[q])
- self.number_of_comparions += 1
- if dominance_test_result is -1:
- i_dominate[p].append(q)
- dominate_me[q] += 1
+ self.number_of_comparisons += 1
+
+ if dominance_test_result == -1:
+ ith_dominated[p].append(q)
+ dominating_ith[q] += 1
elif dominance_test_result is 1:
- i_dominate[q].append(p)
- dominate_me[p] += 1
+ ith_dominated[q].append(p)
+ dominating_ith[p] += 1
for i in range(len(solution_list)):
- if dominate_me[i] is 0:
+ if dominating_ith[i] is 0:
front[0].append(i)
- solution_list[i].attributes["dominance_ranking"] = 0
+ solution_list[i].attributes['dominance_ranking'] = 0
i = 0
while len(front[i]) != 0:
i += 1
for p in front[i - 1]:
- if p <= len(i_dominate):
- for q in i_dominate[p]:
- index = q
- dominate_me[index] -= 1
- if dominate_me[index] is 0:
- front[i].append(index)
- solution_list[index].attributes["dominance_ranking"] = i
+ if p <= len(ith_dominated):
+ for q in ith_dominated[p]:
+ dominating_ith[q] -= 1
+ if dominating_ith[q] is 0:
+ front[i].append(q)
+ solution_list[q].attributes['dominance_ranking'] = i
self.ranked_sublists = [[]] * i
for j in range(i):
- Q = [0] * len(front[j])
+ q = [0] * len(front[j])
for k in range(len(front[j])):
- Q[k] = solution_list[front[j][k]]
- self.ranked_sublists[j] = Q
+ q[k] = solution_list[front[j][k]]
+ self.ranked_sublists[j] = q
return self.ranked_sublists
class EfficientNonDominatedRanking(Ranking[List[S]]):
- """ Class implementing the EDS (efficient non-dominated sorting) algorithm """
+ """ Class implementing the EDS (efficient non-dominated sorting) algorithm. """
+
def __init__(self):
super(EfficientNonDominatedRanking, self).__init__()
def compute_ranking(self, solution_list: List[S]):
- #todo
-
- return self.ranked_sublists
\ No newline at end of file
+ # todo
+ return self.ranked_sublists
diff --git a/jmetal/component/test/test_archive.py b/jmetal/component/test/test_archive.py
index e7d2f3a3..47c86043 100644
--- a/jmetal/component/test/test_archive.py
+++ b/jmetal/component/test/test_archive.py
@@ -5,53 +5,59 @@
class ArchiveTestCases(unittest.TestCase):
+ class DummyArchive(Archive):
+
+ def add(self, solution) -> bool:
+ pass
+
def setUp(self):
- self.archive = Archive[Solution]()
+ self.archive = self.DummyArchive()
def test_should_constructor_create_a_non_null_object(self):
self.assertIsNotNone(self.archive)
def test_should_constructor_create_an_empty_list(self):
- self.assertEqual(0, len(self.archive.get_solution_list()))
+ self.assertEqual(0, len(self.archive.solution_list))
class BoundedArchiveTestCases(unittest.TestCase):
+
def setUp(self):
- self.archive = BoundedArchive[Solution](5)
+ self.archive = BoundedArchive(5)
def test_should_constructor_create_a_non_null_object(self):
self.assertIsNotNone(self.archive)
def test_should_constructor_set_the_max_size(self):
- self.assertEqual(5, self.archive.get_max_size())
+ self.assertEqual(5, self.archive.maximum_size)
class NonDominatedSolutionListArchiveTestCases(unittest.TestCase):
def setUp(self):
- self.archive = NonDominatedSolutionListArchive[Solution]()
+ self.archive = NonDominatedSolutionListArchive()
def test_should_constructor_create_a_non_null_object(self):
self.assertIsNotNone(self.archive)
def test_should_adding_one_solution_work_properly(self):
- solution = Solution(1,1)
+ solution = Solution(1, 1)
self.archive.add(solution)
self.assertEqual(1, self.archive.size())
- self.assertEqual(solution, self.archive.get_solution_list()[0])
+ self.assertEqual(solution, self.archive.solution_list[0])
def test_should_adding_two_solutions_work_properly_if_one_is_dominated(self):
- dominated_solution = Solution(1,2)
- dominated_solution.objectives = [2.0,2.0]
+ dominated_solution = Solution(1, 2)
+ dominated_solution.objectives = [2.0, 2.0]
- dominant_solution = Solution(1,2)
- dominant_solution.objectives = [1.0,1.0]
+ dominant_solution = Solution(1, 2)
+ dominant_solution.objectives = [1.0, 1.0]
self.archive.add(dominated_solution)
self.archive.add(dominant_solution)
self.assertEqual(1, self.archive.size())
- self.assertEqual(dominant_solution, self.archive.get_solution_list()[0])
+ self.assertEqual(dominant_solution, self.archive.solution_list[0])
def test_should_adding_two_solutions_work_properly_if_both_are_non_dominated(self):
solution1 = Solution(1, 2)
@@ -64,8 +70,8 @@ def test_should_adding_two_solutions_work_properly_if_both_are_non_dominated(sel
self.archive.add(solution2)
self.assertEqual(2, self.archive.size())
- self.assertTrue(solution1 in self.archive.get_solution_list() and
- solution2 in self.archive.get_solution_list())
+ self.assertTrue(solution1 in self.archive.solution_list and
+ solution2 in self.archive.solution_list)
def test_should_adding_four_solutions_work_properly_if_one_dominates_the_others(self):
solution1 = Solution(1, 2)
@@ -86,7 +92,7 @@ def test_should_adding_four_solutions_work_properly_if_one_dominates_the_others(
self.archive.add(solution4)
self.assertEqual(1, self.archive.size())
- self.assertEqual(solution4, self.archive.get_solution_list()[0])
+ self.assertEqual(solution4, self.archive.solution_list[0])
def test_should_adding_three_solutions_work_properly_if_two_of_them_are_equal(self):
solution1 = Solution(1, 2)
@@ -104,159 +110,139 @@ def test_should_adding_three_solutions_work_properly_if_two_of_them_are_equal(se
self.assertEqual(2, self.archive.size())
self.assertFalse(result)
- self.assertTrue(solution1 in self.archive.get_solution_list()
- or solution3 in self.archive.get_solution_list())
+ self.assertTrue(solution1 in self.archive.solution_list
+ or solution3 in self.archive.solution_list)
class CrowdingDistanceArchiveTestCases(unittest.TestCase):
+
def setUp(self):
- pass
+ self.archive = CrowdingDistanceArchive[Solution](5)
def test_should_constructor_create_a_non_null_object(self):
- archive = CrowdingDistanceArchive[Solution](5)
- self.assertIsNotNone(archive)
+ self.assertIsNotNone(self.archive)
def test_should_constructor_set_the_max_size(self):
- archive = CrowdingDistanceArchive[Solution](5)
- self.assertEqual(5, archive.get_max_size())
+ self.assertEqual(5, self.archive.maximum_size)
def test_should_constructor_create_an_empty_archive(self):
- archive = CrowdingDistanceArchive[Solution](5)
- self.assertEqual(0, archive.size())
+ self.assertEqual(0, self.archive.size())
def test_should_add_a_solution_when_the_archive_is_empty_work_properly(self):
- archive = CrowdingDistanceArchive[Solution](5)
-
solution = Solution(2, 3)
- archive.add(solution)
+ self.archive.add(solution)
- self.assertEqual(1, archive.size())
- self.assertEqual(solution, archive.get(0))
+ self.assertEqual(1, self.archive.size())
+ self.assertEqual(solution, self.archive.get(0))
- def test_should_add_work_properly_case1(self) :
- """
- Case 1: add a dominated solution when the archive size is 1 must not include the solution
+ def test_should_add_work_properly_case1(self):
+ """ Case 1: add a dominated solution when the archive size is 1 must not include the solution.
"""
- archive = CrowdingDistanceArchive[Solution](5)
-
solution1 = Solution(2, 2)
solution1.objectives = [1, 2]
solution2 = Solution(2, 2)
solution2.objectives = [3, 4]
- archive.add(solution1)
- archive.add(solution2)
+ self.archive.add(solution1)
+ self.archive.add(solution2)
- self.assertEqual(1, archive.size())
- self.assertEqual(solution1, archive.get(0))
+ self.assertEqual(1, self.archive.size())
+ self.assertEqual(solution1, self.archive.get(0))
- def test_should_add_work_properly_case2(self) :
- """
- Case 2: add a non-dominated solution when the archive size is 1 must include the solution
+ def test_should_add_work_properly_case2(self):
+ """ Case 2: add a non-dominated solution when the archive size is 1 must include the solution.
"""
- archive = CrowdingDistanceArchive[Solution](5)
-
solution1 = Solution(2, 2)
solution1.objectives = [1, 2]
solution2 = Solution(2, 2)
solution2.objectives = [0, 4]
- archive.add(solution1)
- archive.add(solution2)
+ self.archive.add(solution1)
+ self.archive.add(solution2)
- self.assertEqual(2, archive.size())
- self.assertTrue(solution1 in archive.get_solution_list())
- self.assertTrue(solution2 in archive.get_solution_list())
+ self.assertEqual(2, self.archive.size())
+ self.assertTrue(solution1 in self.archive.solution_list)
+ self.assertTrue(solution2 in self.archive.solution_list)
- def test_should_add_work_properly_case3(self) :
- """
- Case 3: add a non-dominated solution when the archive size is 3 must include the solution
+ def test_should_add_work_properly_case3(self):
+ """ Case 3: add a non-dominated solution when the archive size is 3 must include the solution.
"""
- archive = CrowdingDistanceArchive[Solution](5)
-
solution1 = Solution(2, 2)
solution1.objectives = [1.0, 2.0]
solution2 = Solution(2, 2)
solution2.objectives = [0.0, 4.0]
solution3 = Solution(2, 2)
- solution3.objectives = [1.5, 1.5 ]
+ solution3.objectives = [1.5, 1.5]
solution4 = Solution(2, 2)
solution4.objectives = [1.6, 1.2]
- archive.add(solution1)
- archive.add(solution2)
- archive.add(solution3)
- archive.add(solution4)
+ self.archive.add(solution1)
+ self.archive.add(solution2)
+ self.archive.add(solution3)
+ self.archive.add(solution4)
- self.assertEqual(4, archive.size())
- self.assertTrue(solution1 in archive.get_solution_list())
- self.assertTrue(solution2 in archive.get_solution_list())
- self.assertTrue(solution3 in archive.get_solution_list())
- self.assertTrue(solution4 in archive.get_solution_list())
+ self.assertEqual(4, self.archive.size())
+ self.assertTrue(solution1 in self.archive.solution_list)
+ self.assertTrue(solution2 in self.archive.solution_list)
+ self.assertTrue(solution3 in self.archive.solution_list)
+ self.assertTrue(solution4 in self.archive.solution_list)
- def test_should_add_work_properly_case4(self) :
+ def test_should_add_work_properly_case4(self):
+ """ Case 4: add a dominated solution when the archive size is 3 must not include the solution.
"""
- Case 4: add a dominated solution when the archive size is 3 must not include the solution
- """
- archive = CrowdingDistanceArchive[Solution](5)
-
solution1 = Solution(2, 2)
solution1.objectives = [1.0, 2.0]
solution2 = Solution(2, 2)
solution2.objectives = [0.0, 4.0]
solution3 = Solution(2, 2)
- solution3.objectives = [1.5, 1.5 ]
+ solution3.objectives = [1.5, 1.5]
solution4 = Solution(2, 2)
solution4.objectives = [5.0, 6.0]
- archive.add(solution1)
- archive.add(solution2)
- archive.add(solution3)
- archive.add(solution4)
+ self.archive.add(solution1)
+ self.archive.add(solution2)
+ self.archive.add(solution3)
+ self.archive.add(solution4)
- self.assertEqual(3, archive.size())
- self.assertTrue(solution1 in archive.get_solution_list())
- self.assertTrue(solution2 in archive.get_solution_list())
- self.assertTrue(solution3 in archive.get_solution_list())
+ self.assertEqual(3, self.archive.size())
+ self.assertTrue(solution1 in self.archive.solution_list)
+ self.assertTrue(solution2 in self.archive.solution_list)
+ self.assertTrue(solution3 in self.archive.solution_list)
- def test_should_add_work_properly_case5(self) :
- """
- Case 5: add a dominated solution when the archive is full should not include the solution
+ def test_should_add_work_properly_case5(self):
+ """ Case 5: add a dominated solution when the archive is full should not include the solution.
"""
- archive = CrowdingDistanceArchive[Solution](3)
-
solution1 = Solution(2, 2)
solution1.objectives = [1.0, 2.0]
solution2 = Solution(2, 2)
solution2.objectives = [0.0, 4.0]
solution3 = Solution(2, 2)
- solution3.objectives = [1.5, 1.5 ]
+ solution3.objectives = [1.5, 1.5]
solution4 = Solution(2, 2)
solution4.objectives = [5.0, 6.0]
- archive.add(solution1)
- archive.add(solution2)
- archive.add(solution3)
- archive.add(solution4)
+ self.archive.add(solution1)
+ self.archive.add(solution2)
+ self.archive.add(solution3)
+ self.archive.add(solution4)
- self.assertEqual(3, archive.size())
- self.assertTrue(solution1 in archive.get_solution_list())
- self.assertTrue(solution2 in archive.get_solution_list())
- self.assertTrue(solution3 in archive.get_solution_list())
+ self.assertEqual(3, self.archive.size())
+ self.assertTrue(solution1 in self.archive.solution_list)
+ self.assertTrue(solution2 in self.archive.solution_list)
+ self.assertTrue(solution3 in self.archive.solution_list)
- def test_should_add_work_properly_case6(self) :
+ def test_should_add_work_properly_case6(self):
+ """ Case 6: add a non-dominated solution when the archive is full should not include
+ the solution if it has the highest distance crowding value.
"""
- Case 6: add a non-dominated solution when the archive is full should not include
- the solution if it has the highest distance crowding value
- """
- archive = CrowdingDistanceArchive[Solution](4)
+ archive = CrowdingDistanceArchive(4)
solution1 = Solution(2, 2)
solution1.objectives = [0.0, 3.0]
solution2 = Solution(2, 2)
solution2.objectives = [1.0, 2.0]
solution3 = Solution(2, 2)
- solution3.objectives = [2.0, 1.5 ]
+ solution3.objectives = [2.0, 1.5]
solution4 = Solution(2, 2)
solution4.objectives = [3.0, 0.0]
@@ -270,21 +256,19 @@ def test_should_add_work_properly_case6(self) :
archive.add(new_solution)
self.assertEqual(4, archive.size())
- self.assertTrue(new_solution not in archive.get_solution_list())
+ self.assertTrue(new_solution not in archive.solution_list)
- def test_should_add_work_properly_case7(self) :
- """
- Case 7: add a non-dominated solution when the archive is full should remove all the
- dominated solutions
+ def test_should_add_work_properly_case7(self):
+ """ Case 7: add a non-dominated solution when the archive is full should remove all the dominated solutions.
"""
- archive = CrowdingDistanceArchive[Solution](4)
+ archive = CrowdingDistanceArchive(4)
solution1 = Solution(2, 2)
solution1.objectives = [0.0, 3.0]
solution2 = Solution(2, 2)
solution2.objectives = [1.0, 2.0]
solution3 = Solution(2, 2)
- solution3.objectives = [2.0, 1.5 ]
+ solution3.objectives = [2.0, 1.5]
solution4 = Solution(2, 2)
solution4.objectives = [3.0, 0.0]
@@ -298,13 +282,12 @@ def test_should_add_work_properly_case7(self) :
archive.add(new_solution)
self.assertEqual(1, archive.size())
- self.assertTrue(new_solution in archive.get_solution_list())
+ self.assertTrue(new_solution in archive.solution_list)
- def test_should_compute_density_estimator_work_properly_case1(self) :
+ def test_should_compute_density_estimator_work_properly_case1(self):
+ """ Case 1: The archive contains one solution.
"""
- Case 1: The archive contains one solution
- """
- archive = CrowdingDistanceArchive[Solution](4)
+ archive = CrowdingDistanceArchive(4)
solution1 = Solution(2, 2)
solution1.objectives = [0.0, 3.0]
@@ -315,11 +298,10 @@ def test_should_compute_density_estimator_work_properly_case1(self) :
self.assertEqual(1, archive.size())
self.assertEqual(float("inf"), solution1.attributes["crowding_distance"])
- def test_should_compute_density_estimator_work_properly_case2(self) :
- """
- Case 2: The archive contains two solutions
+ def test_should_compute_density_estimator_work_properly_case2(self):
+ """ Case 2: The archive contains two solutions.
"""
- archive = CrowdingDistanceArchive[Solution](4)
+ archive = CrowdingDistanceArchive(4)
solution1 = Solution(2, 2)
solution1.objectives = [0.0, 3.0]
@@ -335,18 +317,17 @@ def test_should_compute_density_estimator_work_properly_case2(self) :
self.assertEqual(float("inf"), solution1.attributes["crowding_distance"])
self.assertEqual(float("inf"), solution2.attributes["crowding_distance"])
- def test_should_compute_density_estimator_work_properly_case3(self) :
- """
- Case 3: The archive contains two solutions
+ def test_should_compute_density_estimator_work_properly_case3(self):
+ """ Case 3: The archive contains two solutions.
"""
- archive = CrowdingDistanceArchive[Solution](4)
+ archive = CrowdingDistanceArchive(4)
solution1 = Solution(2, 2)
solution1.objectives = [0.0, 3.0]
solution2 = Solution(2, 2)
solution2.objectives = [1.0, 2.0]
solution3 = Solution(2, 2)
- solution3.objectives = [2.0, 1.5 ]
+ solution3.objectives = [2.0, 1.5]
archive.add(solution1)
archive.add(solution2)
diff --git a/jmetal/util/test/test_comparator.py b/jmetal/component/test/test_comparator.py
similarity index 82%
rename from jmetal/util/test/test_comparator.py
rename to jmetal/component/test/test_comparator.py
index c3265518..0daddbb9 100644
--- a/jmetal/util/test/test_comparator.py
+++ b/jmetal/component/test/test_comparator.py
@@ -1,7 +1,7 @@
import unittest
from jmetal.core.solution import FloatSolution, Solution
-from jmetal.util.comparator import DominanceComparator, SolutionAttributeComparator, \
+from jmetal.component.comparator import DominanceComparator, SolutionAttributeComparator, \
RankingAndCrowdingDistanceComparator
@@ -21,13 +21,7 @@ def test_should_dominance_comparator_raise_an_exception_if_the_second_solution_i
solution2 = None
with self.assertRaises(Exception):
self.comparator.compare(solution, solution2)
- """
- def test_should_dominance_comparator_raise_an_exception_if_the_solutions_have_not_the_same_number_of_objectives(self):
- solution = FloatSolution(3, 2, 0, [], [])
- solution2 = FloatSolution(3, 5, 0, [], [])
- with self.assertRaises(Exception):
- self.comparator.compare(solution, solution2)
- """
+
def test_should_dominance_comparator_return_zero_if_the_two_solutions_have_one_objective_with_the_same_value(self):
solution = FloatSolution(3, 1, 0, [], [])
solution2 = FloatSolution(3, 1, 0, [], [])
@@ -56,9 +50,8 @@ def test_should_dominance_comparator_return_minus_one_if_the_two_solutions_have_
self.assertEqual(-1, self.comparator.compare(solution, solution2))
def test_should_dominance_comparator_work_properly_case_a(self):
- '''
- Case A: solution1 has objectives [-1.0, 5.0, 9.0] and solution2 has [2.0, 6.0, 15.0]
- '''
+ """ Case A: solution1 has objectives [-1.0, 5.0, 9.0] and solution2 has [2.0, 6.0, 15.0]
+ """
solution = FloatSolution(3, 3, 0, [], [])
solution2 = FloatSolution(3, 3, 0, [], [])
@@ -68,9 +61,8 @@ def test_should_dominance_comparator_work_properly_case_a(self):
self.assertEqual(-1, self.comparator.compare(solution, solution2))
def test_should_dominance_comparator_work_properly_case_b(self):
- '''
- Case b: solution1 has objectives [-1.0, 5.0, 9.0] and solution2 has [-1.0, 5.0, 10.0]
- '''
+ """ Case b: solution1 has objectives [-1.0, 5.0, 9.0] and solution2 has [-1.0, 5.0, 10.0]
+ """
solution = FloatSolution(3, 3, 0, [], [])
solution2 = FloatSolution(3, 3, 0, [], [])
@@ -80,9 +72,8 @@ def test_should_dominance_comparator_work_properly_case_b(self):
self.assertEqual(-1, self.comparator.compare(solution, solution2))
def test_should_dominance_comparator_work_properly_case_c(self):
- '''
- Case c: solution1 has objectives [-1.0, 5.0, 9.0] and solution2 has [-2.0, 5.0, 9.0]
- '''
+ """ Case c: solution1 has objectives [-1.0, 5.0, 9.0] and solution2 has [-2.0, 5.0, 9.0]
+ """
solution = FloatSolution(3, 3, 0, [], [])
solution2 = FloatSolution(3, 3, 0, [], [])
@@ -92,11 +83,10 @@ def test_should_dominance_comparator_work_properly_case_c(self):
self.assertEqual(1, self.comparator.compare(solution, solution2))
def test_should_dominance_comparator_work_properly_case_d(self):
- '''
- Case d: solution1 has objectives [-1.0, 5.0, 9.0] and solution2 has [-1.0, 5.0, 8.0]
- '''
+ """ Case d: solution1 has objectives [-1.0, 5.0, 9.0] and solution2 has [-1.0, 5.0, 8.0]
+ """
solution = FloatSolution(3, 3, 0, [], [])
- solution2 = FloatSolution(3, 3, 0 , [], [])
+ solution2 = FloatSolution(3, 3, 0, [], [])
solution.objectives = [-1.0, 5.0, 9.0]
solution2.objectives = [-1.0, 5.0, 8.0]
@@ -104,9 +94,8 @@ def test_should_dominance_comparator_work_properly_case_d(self):
self.assertEqual(1, self.comparator.compare(solution, solution2))
def test_should_dominance_comparator_work_properly_case_3(self):
- '''
- Case d: solution1 has objectives [-1.0, 5.0, 9.0] and solution2 has [-2.0, 5.0, 10.0]
- '''
+ """ Case d: solution1 has objectives [-1.0, 5.0, 9.0] and solution2 has [-2.0, 5.0, 10.0]
+ """
solution = FloatSolution(3, 3, 0, [], [])
solution2 = FloatSolution(3, 3, 0, [], [])
@@ -116,9 +105,8 @@ def test_should_dominance_comparator_work_properly_case_3(self):
self.assertEqual(0, self.comparator.compare(solution, solution2))
def test_should_dominance_comparator_work_properly_with_constrains_case_1(self):
- '''
- Case 1: solution1 has a higher degree of constraint violation than solution 2
- '''
+ """ Case 1: solution1 has a higher degree of constraint violation than solution 2
+ """
solution1 = FloatSolution(3, 3, 0, [], [])
solution2 = FloatSolution(3, 3, 0, [], [])
solution1.attributes["overall_constraint_violation"] = -0.1
@@ -130,9 +118,8 @@ def test_should_dominance_comparator_work_properly_with_constrains_case_1(self):
self.assertEqual(-1, self.comparator.compare(solution1, solution2))
def test_should_dominance_comparator_work_properly_with_constrains_case_2(self):
- '''
- Case 2: solution1 has a lower degree of constraint violation than solution 2
- '''
+ """ Case 2: solution1 has a lower degree of constraint violation than solution 2
+ """
solution1 = FloatSolution(3, 3, 0, [], [])
solution2 = FloatSolution(3, 3, 0, [], [])
solution1.attributes["overall_constraint_violation"] = -0.3
@@ -144,7 +131,6 @@ def test_should_dominance_comparator_work_properly_with_constrains_case_2(self):
self.assertEqual(1, self.comparator.compare(solution1, solution2))
-
class SolutionAttributeComparatorTestCases(unittest.TestCase):
def setUp(self):
@@ -179,8 +165,7 @@ def test_should_compare_return_zero_if_both_solutions_have_the_same_attribute_va
self.assertEqual(0, self.comparator.compare(solution1, solution2))
def test_should_compare_works_properly_case1(self):
- """
- Case 1: solution1.attribute < solution2.attribute (lowest is best)
+ """ Case 1: solution1.attribute < solution2.attribute (lowest is best)
"""
solution1 = Solution(1, 1)
solution2 = Solution(1, 1)
@@ -190,8 +175,7 @@ def test_should_compare_works_properly_case1(self):
self.assertEqual(-1, self.comparator.compare(solution1, solution2))
def test_should_compare_works_properly_case2(self):
- """
- Case 2: solution1.attribute > solution2.attribute (lowest is best)
+ """ Case 2: solution1.attribute > solution2.attribute (lowest is best)
"""
solution1 = Solution(1, 1)
solution2 = Solution(1, 1)
@@ -201,8 +185,7 @@ def test_should_compare_works_properly_case2(self):
self.assertEqual(1, self.comparator.compare(solution1, solution2))
def test_should_compare_works_properly_case3(self):
- """
- Case 3: solution1.attribute < solution2.attribute (highest is best)
+ """ Case 3: solution1.attribute < solution2.attribute (highest is best)
"""
comparator = SolutionAttributeComparator("attribute", False)
solution1 = Solution(1, 1)
@@ -213,8 +196,7 @@ def test_should_compare_works_properly_case3(self):
self.assertEqual(1, comparator.compare(solution1, solution2))
def test_should_compare_works_properly_case4(self):
- """
- Case 4: solution1.attribute > solution2.attribute (highest is best)
+ """ Case 4: solution1.attribute > solution2.attribute (highest is best)
"""
solution1 = Solution(1, 1)
solution2 = Solution(1, 1)
@@ -231,8 +213,7 @@ def setUp(self):
self.comparator = RankingAndCrowdingDistanceComparator()
def test_should_compare_work_properly_case_1(self):
- """
- Case 1: solution1.ranking < solution2.ranking
+ """ Case 1: solution1.ranking < solution2.ranking
"""
solution1 = Solution(1, 1)
solution2 = Solution(1, 1)
@@ -242,8 +223,7 @@ def test_should_compare_work_properly_case_1(self):
self.assertEqual(-1, self.comparator.compare(solution1, solution2))
def test_should_compare_work_properly_case_2(self):
- """
- Case 2: solution1.ranking > solution2.ranking
+ """ Case 2: solution1.ranking > solution2.ranking
"""
solution1 = Solution(1, 1)
solution2 = Solution(1, 1)
@@ -253,9 +233,8 @@ def test_should_compare_work_properly_case_2(self):
self.assertEqual(1, self.comparator.compare(solution1, solution2))
def test_should_compare_work_properly_case_3(self):
- """
- Case 3: solution1.ranking == solution2.ranking
- solution1.crowding < solution2.crowding
+ """ Case 3: solution1.ranking == solution2.ranking
+ solution1.crowding < solution2.crowding
"""
solution1 = Solution(1, 1)
solution2 = Solution(1, 1)
@@ -267,9 +246,8 @@ def test_should_compare_work_properly_case_3(self):
self.assertEqual(1, self.comparator.compare(solution1, solution2))
def test_should_compare_work_properly_case_4(self):
- """
- Case 4: solution1.ranking == solution2.ranking
- solution1.crowding > solution2.crowding
+ """ Case 4: solution1.ranking == solution2.ranking
+ solution1.crowding > solution2.crowding
"""
solution1 = Solution(1, 1)
solution2 = Solution(1, 1)
@@ -281,9 +259,8 @@ def test_should_compare_work_properly_case_4(self):
self.assertEqual(-1, self.comparator.compare(solution1, solution2))
def test_should_compare_work_properly_case_5(self):
- """
- Case 5: solution1.ranking == solution2.ranking
- solution1.crowding == solution2.crowding
+ """ Case 5: solution1.ranking == solution2.ranking
+ solution1.crowding == solution2.crowding
"""
solution1 = Solution(1, 1)
solution2 = Solution(1, 1)
@@ -297,4 +274,3 @@ def test_should_compare_work_properly_case_5(self):
if __name__ == '__main__':
unittest.main()
-
diff --git a/jmetal/component/test/test_density_estimator.py b/jmetal/component/test/test_density_estimator.py
index 69251817..e34ff1d6 100644
--- a/jmetal/component/test/test_density_estimator.py
+++ b/jmetal/component/test/test_density_estimator.py
@@ -5,6 +5,7 @@
class CrowdingDistanceTestCases(unittest.TestCase):
+
def setUp(self):
self.crowding = CrowdingDistance()
@@ -87,4 +88,4 @@ def test_should_the_crowding_distance_of_four_solutions_correctly_assigned(self)
if __name__ == "__main__":
- unittest.main()
\ No newline at end of file
+ unittest.main()
diff --git a/jmetal/component/test/test_evaluator.py b/jmetal/component/test/test_evaluator.py
new file mode 100644
index 00000000..f091894c
--- /dev/null
+++ b/jmetal/component/test/test_evaluator.py
@@ -0,0 +1,84 @@
+import unittest
+
+from jmetal.component.evaluator import SequentialEvaluator, MapEvaluator
+from jmetal.core.problem import FloatProblem
+from jmetal.core.solution import FloatSolution
+
+
+class MockedProblem(FloatProblem):
+
+ def __init__(self, number_of_variables: int = 3):
+ super(MockedProblem, self).__init__()
+ self.number_of_objectives = 2
+ self.number_of_variables = number_of_variables
+ self.number_of_constraints = 0
+
+ self.lower_bound = [-5.0 for _ in range(number_of_variables)]
+ self.upper_bound = [5.0 for _ in range(number_of_variables)]
+
+ FloatSolution.lower_bound = self.lower_bound
+ FloatSolution.upper_bound = self.upper_bound
+
+ def evaluate(self, solution: FloatSolution):
+ solution.objectives[0] = 1.2
+ solution.objectives[1] = 2.3
+
+ return solution
+
+
+class SequentialEvaluatorTestCases(unittest.TestCase):
+
+ def setUp(self):
+ self.evaluator = SequentialEvaluator()
+ self.problem = MockedProblem()
+
+ def test_should_constructor_create_a_non_null_object(self):
+ self.assertIsNotNone(self.evaluator)
+
+ def test_should_evaluate_a_list_of_problem_work_properly_with_a_solution(self):
+ problem_list = [self.problem.create_solution() for _ in range(1)]
+
+ self.evaluator.evaluate(problem_list, self.problem)
+
+ self.assertEqual(1.2, problem_list[0].objectives[0])
+ self.assertEqual(2.3, problem_list[0].objectives[1])
+
+ def test_should_evaluate_a_list_of_problem_work_properly(self):
+ problem_list = [self.problem.create_solution() for _ in range(10)]
+
+ self.evaluator.evaluate(problem_list, self.problem)
+
+ for i in range(10):
+ self.assertEqual(1.2, problem_list[i].objectives[0])
+ self.assertEqual(2.3, problem_list[i].objectives[1])
+
+
+class ParallelEvaluatorTestCases(unittest.TestCase):
+
+ def setUp(self):
+ self.evaluator = MapEvaluator()
+ self.problem = MockedProblem()
+
+ def test_should_constructor_create_a_non_null_object(self):
+ self.assertIsNotNone(self.evaluator)
+
+ def test_should_evaluate_a_list_of_problem_work_properly_with_a_solution(self):
+ problem_list = [self.problem.create_solution() for _ in range(1)]
+
+ self.evaluator.evaluate(problem_list, self.problem)
+
+ self.assertEqual(1.2, problem_list[0].objectives[0])
+ self.assertEqual(2.3, problem_list[0].objectives[1])
+
+ def test_should_evaluate_a_list_of_problem_work_properly(self):
+ problem_list = [self.problem.create_solution() for _ in range(10)]
+
+ self.evaluator.evaluate(problem_list, self.problem)
+
+ for i in range(10):
+ self.assertEqual(1.2, problem_list[i].objectives[0])
+ self.assertEqual(2.3, problem_list[i].objectives[1])
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/jmetal/component/test/test_quality_indicator.py b/jmetal/component/test/test_quality_indicator.py
new file mode 100644
index 00000000..1874f4c3
--- /dev/null
+++ b/jmetal/component/test/test_quality_indicator.py
@@ -0,0 +1,41 @@
+from os.path import dirname, join
+import unittest
+
+from jmetal.core.solution import Solution
+from jmetal.problem import ZDT1
+from jmetal.component.quality_indicator import HyperVolume
+
+
+class HyperVolumeTestCases(unittest.TestCase):
+
+ def setUp(self):
+ self.file_path = dirname(join(dirname(__file__)))
+
+ def test_should_hypervolume_return_5_0(self):
+ reference_point = [2, 2, 2]
+
+ solution1 = Solution(1, 3)
+ solution1.objectives = [1, 0, 1]
+
+ solution2 = Solution(1, 3)
+ solution2.objectives = [0, 1, 0]
+
+ front = [solution1, solution2]
+
+ hv = HyperVolume(reference_point)
+ value = hv.compute(front)
+
+ self.assertEqual(5.0, value)
+
+ def test_should_hypervolume_return_the_correct_value_when_applied_to_the_ZDT1_reference_front(self):
+ problem = ZDT1()
+ reference_point = [1, 1]
+
+ hv = HyperVolume(reference_point)
+ value = hv.compute(problem.get_reference_front())
+
+ self.assertAlmostEqual(0.666, value, delta=0.001)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/jmetal/util/test/test_ranking.py b/jmetal/component/test/test_ranking.py
similarity index 97%
rename from jmetal/util/test/test_ranking.py
rename to jmetal/component/test/test_ranking.py
index 43634a34..6dc993b6 100644
--- a/jmetal/util/test/test_ranking.py
+++ b/jmetal/component/test/test_ranking.py
@@ -1,10 +1,11 @@
import unittest
from jmetal.core.solution import Solution
-from jmetal.util.ranking import FastNonDominatedRanking
+from jmetal.component.ranking import FastNonDominatedRanking
class FastNonDominatedRankingTestCases(unittest.TestCase):
+
def setUp(self):
self.ranking = FastNonDominatedRanking()
@@ -40,7 +41,8 @@ def test_should_compute_ranking_return_a_subfront_if_the_solution_list_contains_
self.assertEqual(solution2, ranking[0][1])
def test_should_compute_ranking_work_properly_case1(self):
- """ The list contains two solutions and one of them is dominated by the other one """
+ """ The list contains two solutions and one of them is dominated by the other one.
+ """
solution = Solution(2, 2)
solution.objectives = [2, 3]
solution2 = Solution(2, 2)
diff --git a/jmetal/core/algorithm.py b/jmetal/core/algorithm.py
index fd92053f..99b1e5ce 100644
--- a/jmetal/core/algorithm.py
+++ b/jmetal/core/algorithm.py
@@ -1,28 +1,34 @@
-import logging
import threading
import time
+from abc import ABCMeta, abstractmethod
from typing import TypeVar, Generic, List
-from jmetal.component.evaluator import Evaluator, SequentialEvaluator
from jmetal.core.solution import FloatSolution
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
+from jmetal.core.observable import DefaultObservable
S = TypeVar('S')
R = TypeVar('R')
+"""
+.. module:: algorithm
+ :platform: Unix, Windows
+ :synopsis: Templates for algorithms.
+
+.. moduleauthor:: Antonio J. Nebro
+"""
+
class Algorithm(Generic[S, R], threading.Thread):
+
+ __metaclass__ = ABCMeta
+
def __init__(self):
threading.Thread.__init__(self)
- self.observable = None
- self.evaluations: int = 0
- self.start_computing_time: int = 0
- self.total_computing_time: int = 0
-
- def get_name(self) -> str:
- return type(self).__name__
+ self.evaluations = 0
+ self.max_evaluations = 100
+ self.start_computing_time = 0
+ self.total_computing_time = 0
+ self.observable = DefaultObservable()
def get_evaluations(self) -> int:
return self.evaluations
@@ -30,117 +36,147 @@ def get_evaluations(self) -> int:
def get_current_computing_time(self) -> float:
return time.time() - self.start_computing_time
+ @abstractmethod
+ def get_result(self) -> R:
+ """ :return: Final population.
+ """
+ pass
+
+ def get_name(self) -> str:
+ return self.__class__.__name__
+
class EvolutionaryAlgorithm(Algorithm[S, R]):
- def __init__(self, evaluator: Evaluator[S] = SequentialEvaluator[S]()):
- super(EvolutionaryAlgorithm,self).__init__()
+
+ __metaclass__ = ABCMeta
+
+ def __init__(self):
+ super(EvolutionaryAlgorithm, self).__init__()
self.population = []
- self.evaluator = evaluator
+ @abstractmethod
def create_initial_population(self) -> List[S]:
pass
+ @abstractmethod
def evaluate_population(self, population: List[S]) -> List[S]:
pass
+ @abstractmethod
def init_progress(self) -> None:
pass
+ @abstractmethod
def is_stopping_condition_reached(self) -> bool:
pass
+ @abstractmethod
def selection(self, population: List[S]) -> List[S]:
pass
+ @abstractmethod
def reproduction(self, population: List[S]) -> List[S]:
pass
+ @abstractmethod
def replacement(self, population: List[S], offspring_population: List[S]) -> List[S]:
pass
+ @abstractmethod
def update_progress(self):
pass
- def get_result(self) -> R:
- pass
-
def run(self):
- """
- Step One: Generate the initial population of individuals randomly. (First generation)
- Step Two: Evaluate the fitness of each individual in that population (time limit, sufficient fitness achieved, etc.)
- Step Three: Repeat the following regenerational steps until termination:
+ """* Step One: Generate the initial population of individuals randomly. (First generation)
+ * Step Two: Evaluate the fitness of each individual in that population
+ * Step Three: Repeat the following regenerational steps until termination
+
1. Select the best-fit individuals for reproduction. (Parents)
2. Breed new individuals through crossover and mutation operations to give birth to offspring.
3. Evaluate the individual fitness of new individuals.
4. Replace least-fit population with new individuals.
+
+ .. note::
+ To develop an EA, all the abstract the methods used in the run() method must be implemented.
"""
self.start_computing_time = time.time()
- self.population = self.create_initial_population() # Step One
- self.population = self.evaluate_population(self.population) # Step Two
+ self.population = self.create_initial_population()
+ self.population = self.evaluate_population(self.population)
self.init_progress()
- while not self.is_stopping_condition_reached(): # Step Three
- mating_population = self.selection(self.population) # Step Three.1
- offspring_population = self.reproduction(mating_population) # Step Three.2
- offspring_population = self.evaluate_population(offspring_population) # Step Three.3
- self.population = self.replacement(self.population, offspring_population) # Step Three.4
+ while not self.is_stopping_condition_reached():
+ mating_population = self.selection(self.population)
+ offspring_population = self.reproduction(mating_population)
+ offspring_population = self.evaluate_population(offspring_population)
+ self.population = self.replacement(self.population, offspring_population)
self.update_progress()
self.total_computing_time = self.get_current_computing_time()
class ParticleSwarmOptimization(Algorithm[FloatSolution, List[FloatSolution]]):
+
+ __metaclass__ = ABCMeta
+
def __init__(self):
super(ParticleSwarmOptimization, self).__init__()
self.swarm = []
- def init_progress(self) -> None :
+ @abstractmethod
+ def init_progress(self) -> None:
pass
- def update_progress(self) -> None :
+ @abstractmethod
+ def update_progress(self) -> None:
pass
+ @abstractmethod
def is_stopping_condition_reached(self) -> bool:
pass
+ @abstractmethod
def create_initial_swarm(self) -> List[FloatSolution]:
pass
+ @abstractmethod
def evaluate_swarm(self, swarm: List[FloatSolution]) -> List[FloatSolution]:
pass
+ @abstractmethod
def initialize_global_best(self, swarm: List[FloatSolution]) -> None:
pass
+ @abstractmethod
def initialize_particle_best(self, swarm: List[FloatSolution]) -> None:
pass
+ @abstractmethod
def initialize_velocity(self, swarm: List[FloatSolution]) -> None:
pass
+ @abstractmethod
def update_velocity(self, swarm: List[FloatSolution]) -> None:
pass
+ @abstractmethod
def update_position(self, swarm: List[FloatSolution]) -> None:
pass
+ @abstractmethod
def perturbation(self, swarm: List[FloatSolution]) -> None:
pass
+ @abstractmethod
def update_global_best(self, swarm: List[FloatSolution]) -> None:
pass
+ @abstractmethod
def update_particle_best(self, swarm: List[FloatSolution]) -> None:
pass
- def get_result(self) -> R:
- pass
-
def run(self):
- """
- """
self.start_computing_time = time.time()
self.swarm = self.create_initial_swarm()
diff --git a/jmetal/core/objective.py b/jmetal/core/objective.py
deleted file mode 100644
index 5682eb5d..00000000
--- a/jmetal/core/objective.py
+++ /dev/null
@@ -1,13 +0,0 @@
-
-from jmetal.core.problem import Problem
-from jmetal.core.solution import Solution
-
-__author__ = "Antonio J. Nebro"
-
-
-class Objective:
- def compute(self, solution: Solution, problem: Problem) -> float:
- pass
-
- def is_a_minimization_objective(self) -> bool:
- return True
diff --git a/jmetal/util/observable.py b/jmetal/core/observable.py
similarity index 73%
rename from jmetal/util/observable.py
rename to jmetal/core/observable.py
index 4240c09c..dd901044 100644
--- a/jmetal/util/observable.py
+++ b/jmetal/core/observable.py
@@ -1,27 +1,22 @@
from abc import ABCMeta, abstractmethod
+"""
+.. module:: Observable
+ :platform: Unix, Windows
+ :synopsis: Implementation of the observer-observable pattern.
-class Observable(object):
- def register(self, observer):
- pass
+.. moduleauthor:: Antonio J. Nebro
+"""
- def deregister(self, observer):
- pass
- def deregister_all(self):
- pass
-
- def notify_all(self, *args, **kwargs):
- pass
+class Observer:
-
-class Observer(object):
__metaclass__ = ABCMeta
@abstractmethod
def update(self, *args, **kwargs):
- """
- Update method
+ """ Update method
+
:param args:
:param kwargs:
:return:
@@ -29,7 +24,29 @@ def update(self, *args, **kwargs):
pass
+class Observable:
+
+ __metaclass__ = ABCMeta
+
+ @abstractmethod
+ def register(self, observer):
+ pass
+
+ @abstractmethod
+ def deregister(self, observer):
+ pass
+
+ @abstractmethod
+ def deregister_all(self):
+ pass
+
+ @abstractmethod
+ def notify_all(self, *args, **kwargs):
+ pass
+
+
class DefaultObservable(Observable):
+
def __init__(self):
self.observers = []
diff --git a/jmetal/core/operator.py b/jmetal/core/operator.py
index 3f47b9f3..837ecef3 100644
--- a/jmetal/core/operator.py
+++ b/jmetal/core/operator.py
@@ -1,55 +1,92 @@
+from abc import ABCMeta, abstractmethod
from typing import TypeVar, Generic, List
-__author__ = "Antonio J. Nebro"
+S = TypeVar('S')
+R = TypeVar('R')
-Source = TypeVar('S')
-Result = TypeVar('R')
+"""
+.. module:: Operator
+ :platform: Unix, Windows
+ :synopsis: Templates for operators.
+.. moduleauthor:: Antonio J. Nebro
+"""
-class Operator(Generic[Source, Result]):
- """ Class representing operators """
- def execute(self, source: Source) -> Result:
+class Operator(Generic[S, R]):
+ """ Class representing operator """
+
+ __metaclass__ = ABCMeta
+
+ @abstractmethod
+ def execute(self, source: S) -> R:
pass
- def get_name(self):
+ @abstractmethod
+ def get_name(self) -> str:
pass
-class Mutation(Operator[Source, Source]):
- """ Class representing mutation operators """
+class Mutation(Operator[S, S]):
+ """ Class representing mutation operator. """
+
+ __metaclass__ = ABCMeta
def __init__(self, probability: float):
if probability > 1.0:
- raise Exception("The probability is greater than one: " + str(probability))
+ raise Exception('The probability is greater than one: {}'.format(probability))
elif probability < 0.0:
- raise Exception("The probability is lower than zero: " + str(probability))
+ raise Exception('The probability is lower than zero: {}'.format(probability))
self.probability = probability
- def execute(self, source: Source) -> Source:
+ @abstractmethod
+ def execute(self, source: S) -> R:
pass
+ @abstractmethod
+ def get_name(self) -> str:
+ pass
+
+
+class Crossover(Operator[List[S], List[R]]):
+ """ Class representing crossover operator. """
+
+ __metaclass__ = ABCMeta
-class Crossover(Operator[List[Source], List[Result]]):
def __init__(self, probability: float):
if probability > 1.0:
- raise Exception("The probability is greater than one: " + str(probability))
+ raise Exception('The probability is greater than one: {}'.format(probability))
elif probability < 0.0:
- raise Exception("The probability is lower than zero: " + str(probability))
+ raise Exception('The probability is lower than zero: {}'.format(probability))
self.probability = probability
- def execute(self, source: Source) -> Result:
+ @abstractmethod
+ def get_number_of_parents(self):
pass
- def get_number_of_parents(self) -> int:
+ @abstractmethod
+ def execute(self, source: S) -> R:
pass
+ @abstractmethod
+ def get_name(self) -> str:
+ pass
+
+
+class Selection(Operator[S, R]):
+ """ Class representing selection operator. """
+
+ __metaclass__ = ABCMeta
-class Selection(Operator[Source, Result]):
def __init__(self):
- super(Selection, self).__init__()
+ pass
+
+ @abstractmethod
+ def execute(self, source: S) -> R:
+ pass
- def execute(self, source: Source) -> Result:
+ @abstractmethod
+ def get_name(self) -> str:
pass
diff --git a/jmetal/core/problem.py b/jmetal/core/problem.py
index 056ea7a9..da10044b 100644
--- a/jmetal/core/problem.py
+++ b/jmetal/core/problem.py
@@ -1,56 +1,94 @@
-import random
+from abc import ABCMeta, abstractmethod
+from os.path import dirname, join
+from pathlib import Path
from typing import Generic, TypeVar
+import random
-import jmetal
from jmetal.core.solution import BinarySolution, FloatSolution, IntegerSolution
-
-__author__ = "Antonio J. Nebro"
+from jmetal.util.front_file import read_front_from_file_as_solutions
S = TypeVar('S')
class Problem(Generic[S]):
- """ Class representing problems """
+ """ Class representing problems. """
+
+ __metaclass__ = ABCMeta
+
+ MINIMIZE = -1
+ MAXIMIZE = 1
def __init__(self):
- self.objectives = [jmetal.core.objective.Objective]
- self.number_of_variables: int = None
- self.number_of_objectives: int = None
- self.number_of_constraints: int = None
-
- def evaluate(self, solution: S) -> None:
- for i in range(self.number_of_objectives):
- if self.objectives[i].is_a_minimization_objective():
- solution.objectives[i] = self.objectives[i].compute(solution, self)
- else:
- solution.objectives[i] = -1.0 * self.objectives[i].compute(solution, self)
+ self.number_of_variables = None
+ self.number_of_objectives = None
+ self.number_of_constraints = None
+ self.obj_directions = []
- def evaluate_constraints(self, solution: S):
+ @abstractmethod
+ def evaluate(self, solution: S) -> S:
+ """ Evaluate a solution.
+
+ :return: Evaluated solution. """
pass
+ @abstractmethod
def create_solution(self) -> S:
+ """ Creates a random solution to the problem.
+
+ :return: Solution. """
pass
- def get_name(self) -> str :
+ def evaluate_constraints(self, solution: S):
pass
+ def get_reference_front(self) -> list:
+ """ Get the reference front to the problem (if any).
+ This method read front files (.pf) located in `jmetal/problem/reference_front/`, which must have the same
+ name as the problem.
+
+ :return: Front."""
+ reference_front_path = 'problem/reference_front/{0}.pf'.format(self.get_name())
+
+ front = []
+ file_path = dirname(join(dirname(__file__)))
+ computed_path = join(file_path, reference_front_path)
+
+ if Path(computed_path).is_file():
+ front = read_front_from_file_as_solutions(computed_path)
+
+ return front
+
+ def get_name(self) -> str:
+ return self.__class__.__name__
+
class BinaryProblem(Problem[BinarySolution]):
- """ Class representing binary problems """
+ """ Class representing binary problems. """
- def evaluate(self, solution: BinarySolution) -> None:
+ __metaclass__ = ABCMeta
+
+ @abstractmethod
+ def evaluate(self, solution: BinarySolution) -> BinarySolution:
pass
+ @abstractmethod
def create_solution(self) -> BinarySolution:
pass
class FloatProblem(Problem[FloatSolution]):
- """ Class representing float problems """
+ """ Class representing float problems. """
+
+ __metaclass__ = ABCMeta
def __init__(self):
- self.lower_bound : [] = None
- self.upper_bound : [] = None
+ super(FloatProblem, self).__init__()
+ self.lower_bound = None
+ self.upper_bound = None
+
+ @abstractmethod
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
+ pass
def create_solution(self) -> FloatSolution:
new_solution = FloatSolution(self.number_of_variables, self.number_of_objectives, self.number_of_constraints,
@@ -62,10 +100,18 @@ def create_solution(self) -> FloatSolution:
class IntegerProblem(Problem[IntegerSolution]):
- """ Class representing integer problems """
+ """ Class representing integer problems. """
+
+ __metaclass__ = ABCMeta
+
def __init__(self):
- self.lower_bound : [] = None
- self.upper_bound : [] = None
+ super(IntegerProblem, self).__init__()
+ self.lower_bound = None
+ self.upper_bound = None
+
+ @abstractmethod
+ def evaluate(self, solution: IntegerSolution) -> IntegerSolution:
+ pass
def create_solution(self) -> IntegerSolution:
new_solution = IntegerSolution(
@@ -75,6 +121,7 @@ def create_solution(self) -> IntegerSolution:
self.lower_bound, self.upper_bound)
new_solution.variables = \
- [int(random.uniform(self.lower_bound[i]*1.0, self.upper_bound[i]*1.0)) for i in range(self.number_of_variables)]
+ [int(random.uniform(self.lower_bound[i]*1.0, self.upper_bound[i]*1.0))
+ for i in range(self.number_of_variables)]
return new_solution
diff --git a/jmetal/core/solution.py b/jmetal/core/solution.py
index 9233fcfd..2ead41d7 100644
--- a/jmetal/core/solution.py
+++ b/jmetal/core/solution.py
@@ -7,14 +7,23 @@
class Solution(Generic[S]):
""" Class representing solutions """
- def __init__(self, number_of_variables : int, number_of_objectives : int, number_of_constraints = 0):
- self.number_of_objectives: int = number_of_objectives
- self.number_of_variables: int = number_of_variables
- self.number_of_constraints: int = number_of_constraints
- self.objectives = [0.0 for x in range(self.number_of_objectives)]
- self.variables = [[] for x in range(self.number_of_variables)]
+ def __init__(self, number_of_variables: int, number_of_objectives: int, number_of_constraints: int = 0):
+ self.number_of_objectives = number_of_objectives
+ self.number_of_variables = number_of_variables
+ self.number_of_constraints = number_of_constraints
+ self.objectives = [0.0 for _ in range(self.number_of_objectives)]
+ self.variables = [[] for _ in range(self.number_of_variables)]
self.attributes = {}
+ def __str__(self) -> str:
+ solution = 'number_of_objectives: {0} \nnumber_of_variables: {1} \nnumber_of_constraints: {2} \n'.format(
+ self.number_of_objectives, self.number_of_variables, self.number_of_constraints
+ )
+ solution += 'objectives: \n {0} \n'.format(self.objectives)
+ solution += 'variables: \n {0}'.format(self.variables)
+
+ return solution
+
class BinarySolution(Solution[BitSet]):
""" Class representing float solutions """
@@ -43,8 +52,8 @@ def get_total_number_of_bits(self) -> int:
class FloatSolution(Solution[float]):
""" Class representing float solutions """
- def __init__(self, number_of_variables : int, number_of_objectives : int, number_of_constraints : int,
- lower_bound : List[float], upper_bound : List[float]):
+ def __init__(self, number_of_variables: int, number_of_objectives: int, number_of_constraints: int,
+ lower_bound: List[float], upper_bound: List[float]):
super(FloatSolution, self).__init__(number_of_variables, number_of_objectives, number_of_constraints)
self.lower_bound = lower_bound
self.upper_bound = upper_bound
@@ -65,8 +74,8 @@ def __copy__(self):
class IntegerSolution(Solution[int]):
""" Class representing integer solutions """
- def __init__(self, number_of_variables : int, number_of_objectives : int, number_of_constraints : int,
- lower_bound : List[int], upper_bound : List[int]):
+ def __init__(self, number_of_variables: int, number_of_objectives: int, number_of_constraints: int,
+ lower_bound: List[int], upper_bound: List[int]):
super(IntegerSolution, self).__init__(number_of_variables, number_of_objectives, number_of_constraints)
self.lower_bound = lower_bound
self.upper_bound = upper_bound
diff --git a/jmetal/core/test/test_algorithm.py b/jmetal/core/test/test_algorithm.py
deleted file mode 100644
index a6903253..00000000
--- a/jmetal/core/test/test_algorithm.py
+++ /dev/null
@@ -1,32 +0,0 @@
-import logging
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-"""
->>>>>>> 5fdebfdf33c118dab271bc7ab380a121b396fde5
-class AlgorithmTestIntegrationTestCases(unittest.TestCase):
-
- def setUp(self):
- bits = 512
- self.problem = OneMax(bits)
- self.algorithm = GenerationalGeneticAlgorithm[BinarySolution, BinarySolution](
- self.problem,
- population_size=100,
- max_evaluations=25000,
- mutation=BitFlip(1.0 / bits),
- crossover=SinglePoint(0.9),
- selection=BinaryTournament())
-
-
- def test_genetic_algorithm(self):
- self.algorithm.run()
- result = self.algorithm.get_result()
- logger.info("Algorithm (binary problem): " + self.algorithm.get_name())
- logger.info("Problem: " + self.problem.get_name())
- logger.info("Solution: " + str(result.variables[0]))
- logger.info("Fitness: " + str(result.objectives[0]))
-
-
- assert(-500 <= result.objectives[0] <= -300 or 300 <= result.objectives[0] <= 500)
-"""
\ No newline at end of file
diff --git a/jmetal/util/test/test_observable.py b/jmetal/core/test/test_observable.py
similarity index 86%
rename from jmetal/util/test/test_observable.py
rename to jmetal/core/test/test_observable.py
index dad01cab..eb75c856 100644
--- a/jmetal/util/test/test_observable.py
+++ b/jmetal/core/test/test_observable.py
@@ -1,9 +1,10 @@
import unittest
-from jmetal.util.observable import DefaultObservable, Observer
+from jmetal.core.observable import DefaultObservable, Observer
class ObservableTestCases(unittest.TestCase):
+
def setUp(self):
self.observable = DefaultObservable()
@@ -52,13 +53,6 @@ def test_should_deregister_all_remove_all_the_observers(self):
self.assertEqual(0, len(self.observable.observers))
-"""
- def test_should_notify_all_update_an_observer(self):
- observer = mock(Observer)
- self.observable.register(observer)
-
- self.observable.notify_all("color", "blue")
-"""
if __name__ == "__main__":
- unittest.main()
\ No newline at end of file
+ unittest.main()
diff --git a/jmetal/core/test/test_operator.py b/jmetal/core/test/test_operator.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/jmetal/core/test/test_problem.py b/jmetal/core/test/test_problem.py
index 8d5bf1d9..62954395 100644
--- a/jmetal/core/test/test_problem.py
+++ b/jmetal/core/test/test_problem.py
@@ -1,28 +1,22 @@
import unittest
-from jmetal.core.problem import Problem, FloatProblem, IntegerProblem
-
-__author__ = "Antonio J. Nebro"
-
-
-class ProblemTestCases(unittest.TestCase):
-
- def test_should_default_constructor_create_a_valid_problem(self) -> None:
- problem = Problem()
- self.assertEqual(None, problem.number_of_variables)
- self.assertEqual(None, problem.number_of_objectives)
- self.assertEqual(None, problem.number_of_constraints)
+from jmetal.core.problem import FloatProblem, IntegerProblem
+from jmetal.core.solution import FloatSolution, IntegerSolution
class FloatProblemTestCases(unittest.TestCase):
+ class DummyFloatProblem(FloatProblem):
+
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
+ pass
def test_should_default_constructor_create_a_valid_problem(self) -> None:
- problem = FloatProblem()
+ problem = self.DummyFloatProblem()
problem.number_of_variables = 1
problem.number_of_objectives = 2
problem.number_of_constraints = 0
problem.lower_bound = [-1.0]
- problem.upper_bound= [1.0]
+ problem.upper_bound = [1.0]
self.assertEqual(1, problem.number_of_variables)
self.assertEqual(2, problem.number_of_objectives)
self.assertEqual(0, problem.number_of_constraints)
@@ -30,12 +24,12 @@ def test_should_default_constructor_create_a_valid_problem(self) -> None:
self.assertEqual([1], problem.upper_bound)
def test_should_create_solution_create_a_valid_solution(self) -> None:
- problem = FloatProblem()
+ problem = self.DummyFloatProblem()
problem.number_of_variables = 2
problem.number_of_objectives = 2
problem.number_of_constraints = 0
problem.lower_bound = [-1.0, -2.0]
- problem.upper_bound= [1.0, 2.0]
+ problem.upper_bound = [1.0, 2.0]
solution = problem.create_solution()
self.assertNotEqual(None, solution)
@@ -44,14 +38,18 @@ def test_should_create_solution_create_a_valid_solution(self) -> None:
class IntegerProblemTestCases(unittest.TestCase):
+ class DummyIntegerProblem(IntegerProblem):
+
+ def evaluate(self, solution: IntegerSolution) -> IntegerSolution:
+ pass
def test_should_default_constructor_create_a_valid_problem(self) -> None:
- problem = IntegerProblem()
+ problem = self.DummyIntegerProblem()
problem.number_of_variables = 1
problem.number_of_objectives = 2
problem.number_of_constraints = 0
problem.lower_bound = [-1]
- problem.upper_bound= [1]
+ problem.upper_bound = [1]
self.assertEqual(1, problem.number_of_variables)
self.assertEqual(2, problem.number_of_objectives)
@@ -60,14 +58,18 @@ def test_should_default_constructor_create_a_valid_problem(self) -> None:
self.assertEqual([1], problem.upper_bound)
def test_should_create_solution_create_a_valid_solution(self) -> None:
- problem = FloatProblem()
+ problem = self.DummyIntegerProblem()
problem.number_of_variables = 2
problem.number_of_objectives = 2
problem.number_of_constraints = 0
problem.lower_bound = [-1, -2]
- problem.upper_bound= [1, 2]
+ problem.upper_bound = [1, 2]
solution = problem.create_solution()
self.assertNotEqual(None, solution)
self.assertTrue(-1 <= solution.variables[0] <= 1)
- self.assertTrue(-2 <= solution.variables[1] <= 2)
\ No newline at end of file
+ self.assertTrue(-2 <= solution.variables[1] <= 2)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/jmetal/core/test/test_solution.py b/jmetal/core/test/test_solution.py
index f0f5a3d5..dd28c356 100644
--- a/jmetal/core/test/test_solution.py
+++ b/jmetal/core/test/test_solution.py
@@ -3,14 +3,9 @@
from jmetal.core.solution import BinarySolution, FloatSolution, Solution, IntegerSolution
-__author__ = "Antonio J. Nebro"
-
class SolutionTestCase(unittest.TestCase):
- def setUp(self) -> None:
- pass
-
def test_should_constructor_create_a_non_null_object(self) -> None:
solution = Solution[int](3, 2)
self.assertIsNotNone(solution)
@@ -34,9 +29,6 @@ def test_should_constructor_create_a_non_null_objective_list(self) -> None:
class BinarySolutionTestCase(unittest.TestCase):
- def setUp(self) -> None:
- pass
-
def test_should_default_constructor_create_a_valid_solution(self) -> None:
solution = BinarySolution(2, 3, 1)
self.assertEqual(2, solution.number_of_variables)
@@ -67,9 +59,6 @@ def test_should_get_total_number_of_bits_return_the_right_value(self) -> None:
class FloatSolutionTestCase(unittest.TestCase):
- def setUp(self) -> None:
- pass
-
def test_should_constructor_create_a_non_null_object(self) -> None:
solution = FloatSolution(3, 2, 0, [], [])
self.assertIsNotNone(solution)
@@ -106,9 +95,6 @@ def test_should_copy_work_properly(self) -> None:
class IntegerSolutionTestCase(unittest.TestCase):
- def setUp(self) -> None:
- pass
-
def test_should_constructor_create_a_non_null_object(self) -> None:
solution = IntegerSolution(3, 2, 0, [], [])
self.assertIsNotNone(solution)
diff --git a/jmetal/operator/__init__.py b/jmetal/operator/__init__.py
index e69de29b..f2bb825c 100644
--- a/jmetal/operator/__init__.py
+++ b/jmetal/operator/__init__.py
@@ -0,0 +1,11 @@
+from .crossover import NullCrossover, SBX, SP
+from .mutation import NullMutation, BitFlip, Polynomial, IntegerPolynomial, Uniform, SimpleRandom
+from .selection import BestSolutionSelection, BinaryTournamentSelection, BinaryTournament2Selection, \
+ RandomSolutionSelection, NaryRandomSolutionSelection, RankingAndCrowdingDistanceSelection
+
+__all__ = [
+ 'NullCrossover', 'SBX', 'SP',
+ 'NullMutation', 'BitFlip', 'Polynomial', 'IntegerPolynomial', 'Uniform', 'SimpleRandom',
+ 'BestSolutionSelection', 'BinaryTournamentSelection', 'BinaryTournament2Selection', 'RandomSolutionSelection',
+ 'NaryRandomSolutionSelection', 'RankingAndCrowdingDistanceSelection'
+]
diff --git a/jmetal/operator/crossover.py b/jmetal/operator/crossover.py
index 71c722ed..5967d125 100644
--- a/jmetal/operator/crossover.py
+++ b/jmetal/operator/crossover.py
@@ -5,22 +5,32 @@
from jmetal.core.operator import Crossover
from jmetal.core.solution import Solution, FloatSolution, BinarySolution
-""" Class implementing the null crossover operators """
+"""
+.. module:: crosover
+ :platform: Unix, Windows
+ :synopsis: Module implementing crossover operators.
+.. moduleauthor:: Antonio J. Nebro
+"""
+
+
+class NullCrossover(Crossover[Solution, Solution]):
-class Null(Crossover[Solution, Solution]):
def __init__(self):
- super(Null, self).__init__(probability=0)
+ super(NullCrossover, self).__init__(probability=0)
def execute(self, parents: List[Solution]) -> List[Solution]:
if len(parents) != 2:
- raise Exception("The number of parents is not two: " + str(len(parents)))
+ raise Exception('The number of parents is not two: {}'.format(len(parents)))
- return [copy.deepcopy(parents[0]), copy.deepcopy(parents[1])]
+ return parents
def get_number_of_parents(self):
return 2
-
+
+ def get_name(self):
+ return 'Null crossover'
+
class SBX(Crossover[FloatSolution, FloatSolution]):
__EPS = 1.0e-14
@@ -31,7 +41,7 @@ def __init__(self, probability: float, distribution_index: float = 20.0):
def execute(self, parents: List[FloatSolution]) -> List[FloatSolution]:
if len(parents) != 2:
- raise Exception("The number of parents is not two: " + str(len(parents)))
+ raise Exception('The number of parents is not two: {}'.format(len(parents)))
offspring = [copy.copy(parents[0]), copy.copy(parents[1])]
rand = random.random()
@@ -47,9 +57,9 @@ def execute(self, parents: List[FloatSolution]) -> List[FloatSolution]:
else:
y1, y2 = value_x2, value_x1
- lowerBound, upperBound = parents[0].lower_bound[i], parents[1].upper_bound[i]
+ lower_bound, upper_bound = parents[0].lower_bound[i], parents[1].upper_bound[i]
- beta = 1.0 + (2.0 * (y1 - lowerBound) / (y2 - y1))
+ beta = 1.0 + (2.0 * (y1 - lower_bound) / (y2 - y1))
alpha = 2.0 - pow(beta, -(self.distribution_index + 1.0))
rand = random.random()
@@ -59,7 +69,7 @@ def execute(self, parents: List[FloatSolution]) -> List[FloatSolution]:
betaq = pow(1.0 / (2.0 - rand * alpha), 1.0 / (self.distribution_index + 1.0))
c1 = 0.5 * (y1 + y2 - betaq * (y2 - y1))
- beta = 1.0 + (2.0 * (upperBound - y2) / (y2 - y1))
+ beta = 1.0 + (2.0 * (upper_bound - y2) / (y2 - y1))
alpha = 2.0 - pow(beta, -(self.distribution_index + 1.0))
if rand <= (1.0 / alpha):
@@ -69,14 +79,14 @@ def execute(self, parents: List[FloatSolution]) -> List[FloatSolution]:
c2 = 0.5 * (y1 + y2 + betaq * (y2 - y1))
- if c1 < lowerBound:
- c1 = lowerBound
- if c2 < lowerBound:
- c2 = lowerBound
- if c1 > upperBound:
- c1 = upperBound
- if c2 > upperBound:
- c2 = upperBound
+ if c1 < lower_bound:
+ c1 = lower_bound
+ if c2 < lower_bound:
+ c2 = lower_bound
+ if c1 > upper_bound:
+ c1 = upper_bound
+ if c2 > upper_bound:
+ c2 = upper_bound
if random.random() <= 0.5:
offspring[0].variables[i] = c2
@@ -95,14 +105,18 @@ def execute(self, parents: List[FloatSolution]) -> List[FloatSolution]:
def get_number_of_parents(self):
return 2
+ def get_name(self):
+ return 'SBX crossover'
+
+
+class SP(Crossover[BinarySolution, BinarySolution]):
-class SinglePoint(Crossover[BinarySolution, BinarySolution]):
def __init__(self, probability: float):
- super(SinglePoint, self).__init__(probability=probability)
+ super(SP, self).__init__(probability=probability)
def execute(self, parents: List[BinarySolution]) -> List[BinarySolution]:
if len(parents) != 2:
- raise Exception("The number of parents is not two: " + str(len(parents)))
+ raise Exception('The number of parents is not two: {}'.format(len(parents)))
offspring = [copy.copy(parents[0]), copy.copy(parents[1])]
rand = random.random()
@@ -146,3 +160,6 @@ def execute(self, parents: List[BinarySolution]) -> List[BinarySolution]:
def get_number_of_parents(self):
return 2
+
+ def get_name(self):
+ return 'Single point crossover'
diff --git a/jmetal/operator/mutation.py b/jmetal/operator/mutation.py
index 38338603..c0459204 100644
--- a/jmetal/operator/mutation.py
+++ b/jmetal/operator/mutation.py
@@ -3,11 +3,29 @@
from jmetal.core.operator import Mutation
from jmetal.core.solution import BinarySolution, Solution, FloatSolution, IntegerSolution
-""" Class implementing the binary BitFlip mutation operators """
-__author__ = "Antonio J. Nebro"
+"""
+.. module:: mutation
+ :platform: Unix, Windows
+ :synopsis: Module implementing mutation operators.
+
+.. moduleauthor:: Antonio J. Nebro
+"""
+
+
+class NullMutation(Mutation[Solution]):
+
+ def __init__(self):
+ super(NullMutation, self).__init__(probability=0)
+
+ def execute(self, solution: Solution) -> Solution:
+ return solution
+
+ def get_name(self):
+ return 'Null mutation'
class BitFlip(Mutation[BinarySolution]):
+
def __init__(self, probability: float):
super(BitFlip, self).__init__(probability=probability)
@@ -16,30 +34,20 @@ def execute(self, solution: BinarySolution) -> BinarySolution:
for j in range(len(solution.variables[i])):
rand = random.random()
if rand <= self.probability:
- solution.variables[i][j] = True if solution.variables[i][j] == False else False
+ solution.variables[i][j] = True if solution.variables[i][j] is False else False
return solution
-
-class Null(Mutation[Solution]):
- def __init__(self):
- super(Null, self).__init__(probability=0)
-
def get_name(self):
- return "Null mutation"
-
- def execute(self, solution: Solution) -> Solution:
- return solution
+ return 'BitFlip mutation'
class Polynomial(Mutation[FloatSolution]):
+
def __init__(self, probability: float, distribution_index: float = 0.20):
super(Polynomial, self).__init__(probability=probability)
self.distribution_index = distribution_index
- def get_name(self):
- return "Polynomial mutation"
-
def execute(self, solution: FloatSolution) -> FloatSolution:
for i in range(solution.number_of_variables):
rand = random.random()
@@ -61,7 +69,7 @@ def execute(self, solution: FloatSolution) -> FloatSolution:
deltaq = pow(val, mut_pow) - 1.0
else:
xy = 1.0 - delta2
- val = 2.0 * (1.0 - rnd) + 2.0 * (rnd - 0.5) * (pow(xy, self.distribution_index + 1.0));
+ val = 2.0 * (1.0 - rnd) + 2.0 * (rnd - 0.5) * (pow(xy, self.distribution_index + 1.0))
deltaq = 1.0 - pow(val, mut_pow)
y += deltaq * (yu - yl)
@@ -74,15 +82,16 @@ def execute(self, solution: FloatSolution) -> FloatSolution:
return solution
+ def get_name(self):
+ return 'Polynomial mutation'
+
class IntegerPolynomial(Mutation[IntegerSolution]):
+
def __init__(self, probability: float, distribution_index: float = 0.20):
super(IntegerPolynomial, self).__init__(probability=probability)
self.distribution_index = distribution_index
- def get_name(self):
- return "Polynomial mutation (Integer)"
-
def execute(self, solution: IntegerSolution) -> IntegerSolution:
for i in range(solution.number_of_variables):
if random.random() <= self.probability:
@@ -94,16 +103,16 @@ def execute(self, solution: IntegerSolution) -> IntegerSolution:
else:
delta1 = (y - yl) / (yu - yl)
delta2 = (yu - y) / (yu - yl)
- mutPow = 1.0 / (self.distribution_index + 1.0)
+ mut_pow = 1.0 / (self.distribution_index + 1.0)
rnd = random.random()
if rnd <= 0.5:
xy = 1.0 - delta1
val = 2.0 * rnd + (1.0 - 2.0 * rnd) * (xy ** (self.distribution_index + 1.0))
- deltaq = val ** mutPow - 1.0
+ deltaq = val ** mut_pow - 1.0
else:
xy = 1.0 - delta2
val = 2.0 * (1.0 - rnd) + 2.0 * (rnd - 0.5) * (xy ** (self.distribution_index + 1.0))
- deltaq = 1.0 - val ** mutPow
+ deltaq = 1.0 - val ** mut_pow
y += deltaq * (yu - yl)
if y < solution.lower_bound[i]:
@@ -114,14 +123,15 @@ def execute(self, solution: IntegerSolution) -> IntegerSolution:
solution.variables[i] = int(round(y))
return solution
+ def get_name(self):
+ return 'Polynomial mutation (Integer)'
+
class SimpleRandom(Mutation[FloatSolution]):
+
def __init__(self, probability: float):
super(SimpleRandom, self).__init__(probability=probability)
- def get_name(self):
- return "Simple random mutation"
-
def execute(self, solution: FloatSolution) -> FloatSolution:
for i in range(solution.number_of_variables):
rand = random.random()
@@ -130,15 +140,16 @@ def execute(self, solution: FloatSolution) -> FloatSolution:
(solution.upper_bound[i] - solution.lower_bound[i]) * random.random()
return solution
+ def get_name(self):
+ return 'Simple random mutation'
+
class Uniform(Mutation[FloatSolution]):
+
def __init__(self, probability: float, perturbation: float = 0.5):
super(Uniform, self).__init__(probability=probability)
self.perturbation = perturbation
- def get_name(self):
- return "Uniform mutation"
-
def execute(self, solution: FloatSolution) -> FloatSolution:
for i in range(solution.number_of_variables):
rand = random.random()
@@ -154,4 +165,7 @@ def execute(self, solution: FloatSolution) -> FloatSolution:
solution.variables[i] = tmp
- return solution
\ No newline at end of file
+ return solution
+
+ def get_name(self):
+ return 'Uniform mutation'
diff --git a/jmetal/operator/selection.py b/jmetal/operator/selection.py
index 7308eb5f..d3785520 100644
--- a/jmetal/operator/selection.py
+++ b/jmetal/operator/selection.py
@@ -3,31 +3,39 @@
from jmetal.component.density_estimator import CrowdingDistance
from jmetal.core.operator import Selection
-from jmetal.util.comparator import Comparator, DominanceComparator
-from jmetal.util.ranking import FastNonDominatedRanking
-
-""" Class implementing a best solution selection operators """
+from jmetal.component.comparator import Comparator, DominanceComparator
+from jmetal.component.ranking import FastNonDominatedRanking
S = TypeVar('S')
+"""
+.. module:: selection
+ :platform: Unix, Windows
+ :synopsis: Module implementing selection operators.
+
+.. moduleauthor:: Antonio J. Nebro
+"""
+
class BinaryTournamentSelection(Selection[List[S], S]):
+
def __init__(self, comparator: Comparator = DominanceComparator()):
super(BinaryTournamentSelection, self).__init__()
self.comparator = comparator
- def execute(self, solution_list: List[S]) -> S:
- if solution_list is None:
- raise Exception("The solution list is null")
- elif len(solution_list) == 0:
- raise Exception("The solution is empty")
+ def execute(self, front: List[S]) -> S:
+ if front is None:
+ raise Exception('The front is null')
+ elif len(front) == 0:
+ raise Exception('The front is empty')
- if len(solution_list) == 1:
- result = solution_list[0]
+ if len(front) == 1:
+ result = front[0]
else:
- i, j = random.sample(range(0, len(solution_list)), 2) # sampling without replacement
- solution1 = solution_list[i]
- solution2 = solution_list[j]
+ # Sampling without replacement
+ i, j = random.sample(range(0, len(front)), 2)
+ solution1 = front[i]
+ solution2 = front[j]
flag = self.comparator.compare(solution1, solution2)
@@ -41,69 +49,82 @@ def execute(self, solution_list: List[S]) -> S:
return result
def get_name(self) -> str:
- return "Binary tournament selection"
+ return 'Binary tournament selection'
class BestSolutionSelection(Selection[List[S], S]):
+
def __init__(self):
super(BestSolutionSelection, self).__init__()
- def execute(self, solution_list: List[S]) -> S:
- if solution_list is None:
- raise Exception("The solution list is null")
- elif len(solution_list) == 0:
- raise Exception("The solution is empty")
+ def execute(self, front: List[S]) -> S:
+ if front is None:
+ raise Exception('The front is null')
+ elif len(front) == 0:
+ raise Exception('The front is empty')
- result = solution_list[0]
- for solution in solution_list[1:]:
+ result = front[0]
+ for solution in front[1:]:
if DominanceComparator().compare(solution, result) < 0:
result = solution
return result
+ def get_name(self) -> str:
+ return 'Best solution selection'
+
class NaryRandomSolutionSelection(Selection[List[S], S]):
- def __init__(self, number_of_solutions_to_be_returned:int = 1):
+
+ def __init__(self, number_of_solutions_to_be_returned: int = 1):
super(NaryRandomSolutionSelection, self).__init__()
if number_of_solutions_to_be_returned < 0:
- raise Exception("The number of solutions to be returned must be positive integer")
+ raise Exception('The number of solutions to be returned must be positive integer')
self.number_of_solutions_to_be_returned = number_of_solutions_to_be_returned
- def execute(self, solution_list: List[S]) -> S:
- if solution_list is None:
- raise Exception("The solution list is null")
- if len(solution_list) == 0:
- raise Exception("The solution is empty")
- if len(solution_list) S:
+ if front is None:
+ raise Exception('The front is null')
+ if len(front) == 0:
+ raise Exception('The front is empty')
+ if len(front) < self.number_of_solutions_to_be_returned:
+ raise Exception('The front contains less elements than required')
# random sampling without replacement
- return random.sample(solution_list, self.number_of_solutions_to_be_returned)
+ return random.sample(front, self.number_of_solutions_to_be_returned)
+
+ def get_name(self) -> str:
+ return 'Nary random solution selection'
class RandomSolutionSelection(Selection[List[S], S]):
+
def __init__(self):
super(RandomSolutionSelection, self).__init__()
- def execute(self, solution_list: List[S]) -> S:
- if solution_list is None:
- raise Exception("The solution list is null")
- elif len(solution_list) == 0:
- raise Exception("The solution is empty")
+ def execute(self, front: List[S]) -> S:
+ if front is None:
+ raise Exception('The front is null')
+ elif len(front) == 0:
+ raise Exception('The front is empty')
- return random.choice(solution_list)
+ return random.choice(front)
+
+ def get_name(self) -> str:
+ return 'Random solution selection'
class RankingAndCrowdingDistanceSelection(Selection[List[S], List[S]]):
+
def __init__(self, max_population_size: int):
super(RankingAndCrowdingDistanceSelection, self).__init__()
self.max_population_size = max_population_size
- def execute(self, solution_list: List[S]) -> List[S]:
+ def execute(self, front: List[S]) -> List[S]:
ranking = FastNonDominatedRanking()
crowding_distance = CrowdingDistance()
- ranking.compute_ranking(solution_list)
+ ranking.compute_ranking(front)
ranking_index = 0
new_solution_list = []
@@ -115,49 +136,52 @@ def execute(self, solution_list: List[S]) -> List[S]:
else:
subfront = ranking.get_subfront(ranking_index)
crowding_distance.compute_density_estimator(subfront)
- sorted_subfront = sorted(subfront, key=lambda x: x.attributes["crowding_distance"], reverse=True)
+ sorted_subfront = sorted(subfront, key=lambda x: x.attributes['crowding_distance'], reverse=True)
for i in range((self.max_population_size - len(new_solution_list))):
new_solution_list.append(sorted_subfront[i])
return new_solution_list
+ def get_name(self) -> str:
+ return 'Ranking and crowding distance selection'
+
class BinaryTournament2Selection(Selection[List[S], S]):
+
def __init__(self, comparator_list: List[Comparator]):
super(BinaryTournament2Selection, self).__init__()
self.comparator_list = comparator_list
- def get_name(self):
- return "Binary tournament selection (experimental)"
-
- def execute(self, solution_list: List[S]) -> S:
- if solution_list is None:
- raise Exception("The solution list is null")
- elif len(solution_list) == 0:
- raise Exception("The solution is empty")
+ def execute(self, front: List[S]) -> S:
+ if front is None:
+ raise Exception('The front is null')
+ elif len(front) == 0:
+ raise Exception('The front is empty')
elif not self.comparator_list:
- raise Exception("The list of comparators is empty")
+ raise Exception('The comparators\' list is empty')
winner = None
- if len(solution_list) == 1:
- winner = solution_list[0]
+ if len(front) == 1:
+ winner = front[0]
else:
for comparator in self.comparator_list:
- winner = self.__winner(solution_list, comparator)
+ winner = self.__winner(front, comparator)
if winner is not None:
break
if not winner:
- i = random.randrange(0, len(solution_list))
- winner = solution_list[i]
+ i = random.randrange(0, len(front))
+ winner = front[i]
return winner
- def __winner(self, solution_list: List[S], comparator: Comparator):
- i, j = random.sample(range(0, len(solution_list)), 2) # sampling without replacement
- solution1 = solution_list[i]
- solution2 = solution_list[j]
+ def __winner(self, front: List[S], comparator: Comparator):
+ # Sampling without replacement
+ i, j = random.sample(range(0, len(front)), 2)
+
+ solution1 = front[i]
+ solution2 = front[j]
flag = comparator.compare(solution1, solution2)
@@ -169,3 +193,6 @@ def __winner(self, solution_list: List[S], comparator: Comparator):
result = None
return result
+
+ def get_name(self) -> str:
+ return 'Binary tournament selection (experimental)'
diff --git a/jmetal/operator/test/test_crossover.py b/jmetal/operator/test/test_crossover.py
index 305354f0..1a880985 100644
--- a/jmetal/operator/test/test_crossover.py
+++ b/jmetal/operator/test/test_crossover.py
@@ -2,24 +2,21 @@
from unittest import mock
from jmetal.core.solution import BinarySolution
-from jmetal.operator.crossover import Null, SinglePoint
+from jmetal.operator.crossover import NullCrossover, SP
class NullCrossoverTestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self):
- solution = Null()
+ solution = NullCrossover()
self.assertIsNotNone(solution)
def test_should_constructor_create_a_valid_operator(self):
- operator = Null()
+ operator = NullCrossover()
self.assertEqual(0, operator.probability)
def test_should_the_solution_remain_unchanged(self):
- operator = Null()
+ operator = NullCrossover()
solution1 = BinarySolution(number_of_variables=1, number_of_objectives=1)
solution1.variables[0] = [True, False, False, True, True, False]
solution2 = BinarySolution(number_of_variables=1, number_of_objectives=1)
@@ -31,27 +28,25 @@ def test_should_the_solution_remain_unchanged(self):
class SinglePointTestCases(unittest.TestCase):
- def setUp(self):
- pass
def test_should_constructor_create_a_non_null_object(self):
- solution = SinglePoint(1.0)
+ solution = SP(1.0)
self.assertIsNotNone(solution)
def test_should_constructor_create_a_valid_operator(self):
- operator = SinglePoint(0.5)
+ operator = SP(0.5)
self.assertEqual(0.5, operator.probability)
def test_should_constructor_raise_an_exception_if_the_probability_is_greater_than_one(self):
with self.assertRaises(Exception):
- SinglePoint(2)
+ SP(2)
def test_should_constructor_raise_an_exception_if_the_probability_is_lower_than_zero(self):
with self.assertRaises(Exception):
- SinglePoint(-12)
+ SP(-12)
def test_should_the_solution_remain_unchanged_if_the_probability_is_zero(self):
- operator = SinglePoint(0.0)
+ operator = SP(0.0)
solution1 = BinarySolution(number_of_variables=1, number_of_objectives=1)
solution1.variables[0] = [True, False, False, True, True, False]
solution2 = BinarySolution(number_of_variables=1, number_of_objectives=1)
@@ -63,7 +58,7 @@ def test_should_the_solution_remain_unchanged_if_the_probability_is_zero(self):
@mock.patch('random.randrange')
def test_should_the_operator_work_if_the_first_bit_is_selected(self, random_call):
- operator = SinglePoint(1.0)
+ operator = SP(1.0)
solution1 = BinarySolution(number_of_variables=1, number_of_objectives=1)
solution1.variables[0] = [True, False, False, True, True, False]
solution2 = BinarySolution(number_of_variables=1, number_of_objectives=1)
@@ -76,7 +71,7 @@ def test_should_the_operator_work_if_the_first_bit_is_selected(self, random_call
@mock.patch('random.randrange')
def test_should_the_operator_work_if_the_last_bit_is_selected(self, random_call):
- operator = SinglePoint(1.0)
+ operator = SP(1.0)
solution1 = BinarySolution(number_of_variables=1, number_of_objectives=1)
solution1.variables[0] = [True, False, False, True, True, False]
solution2 = BinarySolution(number_of_variables=1, number_of_objectives=1)
@@ -89,7 +84,7 @@ def test_should_the_operator_work_if_the_last_bit_is_selected(self, random_call)
@mock.patch('random.randrange')
def test_should_the_operator_work_if_the_third_bit_is_selected(self, random_call):
- operator = SinglePoint(1.0)
+ operator = SP(1.0)
solution1 = BinarySolution(number_of_variables=1, number_of_objectives=1)
solution1.variables[0] = [True, False, False, True, True, False]
solution2 = BinarySolution(number_of_variables=1, number_of_objectives=1)
@@ -102,7 +97,7 @@ def test_should_the_operator_work_if_the_third_bit_is_selected(self, random_call
@mock.patch('random.randrange')
def test_should_the_operator_work_with_a_solution_with_three_binary_variables(self, random_call):
- operator = SinglePoint(1.0)
+ operator = SP(1.0)
solution1 = BinarySolution(number_of_variables=3, number_of_objectives=1)
solution1.variables[0] = [True, False, False, True, True, False]
solution1.variables[1] = [True, False, False, True, False, False]
@@ -121,5 +116,6 @@ def test_should_the_operator_work_with_a_solution_with_three_binary_variables(se
self.assertEqual([True, True, False, True, False, False], offspring[1].variables[1])
self.assertEqual([True, False, True, True, True, True], offspring[1].variables[2])
+
if __name__ == '__main__':
unittest.main()
diff --git a/jmetal/operator/test/test_mutation.py b/jmetal/operator/test/test_mutation.py
index 87c9021a..d6bca2e3 100644
--- a/jmetal/operator/test/test_mutation.py
+++ b/jmetal/operator/test/test_mutation.py
@@ -3,14 +3,9 @@
from jmetal.core.solution import BinarySolution, FloatSolution, IntegerSolution
from jmetal.operator.mutation import BitFlip, Uniform, SimpleRandom, Polynomial, IntegerPolynomial
-__author__ = "Antonio J. Nebro"
-
class PolynomialMutationTestMethods(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self):
mutation = Polynomial(1.0)
self.assertIsNotNone(mutation)
@@ -50,9 +45,6 @@ def test_should_the_solution_change__if_the_probability_is_one(self):
class BitFlipTestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self):
solution = BitFlip(1.0)
self.assertIsNotNone(solution)
@@ -90,9 +82,6 @@ def test_should_the_solution_change_all_the_bits_if_the_probability_is_one(self)
class UniformMutationTestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self):
operator = Uniform(0.3)
operator2 = Uniform(0.3, 0.7)
@@ -141,9 +130,6 @@ def test_should_the_solution_change_between_max_and_min_value(self):
class RandomMutationTestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self):
operator = SimpleRandom(1.0)
self.assertIsNotNone(operator)
@@ -188,8 +174,6 @@ def test_should_the_solution_change_between_max_and_min_value(self):
class IntegerPolynomialMutationTestCases(unittest.TestCase):
- def setUp(self):
- pass
def test_should_constructor_create_a_non_null_object(self):
operator = IntegerPolynomial(1.0)
@@ -224,7 +208,8 @@ def test_should_the_solution_change__if_the_probability_is_one(self):
mutated_solution = operator.execute(solution)
self.assertNotEqual([1, 2, 3], mutated_solution.variables)
- self.assertEqual([True, True, True], [isinstance(x, int) for x in mutated_solution.variables])
+ self.assertEqual([True, True, True], [isinstance(x, int) for x in mutated_solution.variables])
+
if __name__ == '__main__':
unittest.main()
diff --git a/jmetal/operator/test/test_selection.py b/jmetal/operator/test/test_selection.py
index 91267046..08d31a0a 100644
--- a/jmetal/operator/test/test_selection.py
+++ b/jmetal/operator/test/test_selection.py
@@ -1,17 +1,15 @@
import unittest
-from hamcrest import *
+from hamcrest import assert_that, any_of
from jmetal.core.solution import Solution
from jmetal.operator.selection import BinaryTournamentSelection, BestSolutionSelection, RandomSolutionSelection, \
- NaryRandomSolutionSelection, \
- RankingAndCrowdingDistanceSelection, BinaryTournament2Selection
-from jmetal.util.comparator import Comparator, SolutionAttributeComparator
-
-__author__ = "Antonio J. Nebro"
+ NaryRandomSolutionSelection, RankingAndCrowdingDistanceSelection, BinaryTournament2Selection
+from jmetal.component.comparator import SolutionAttributeComparator, EqualSolutionsComparator
class BinaryTournamentTestCases(unittest.TestCase):
+
def setUp(self):
self.selection = BinaryTournamentSelection[Solution]()
@@ -29,25 +27,25 @@ def test_should_execute_raise_an_exception_if_the_list_of_solutions_is_empty(sel
self.selection.execute(solution_list)
def test_should_execute_return_the_solution_in_a_list_with_one_solution(self):
- solution = Solution(3,2)
+ solution = Solution(3, 2)
solution_list = [solution]
self.assertEqual(solution, self.selection.execute(solution_list))
def test_should_execute_work_if_the_solution_list_contains_two_non_dominated_solutions(self):
- solution1 = Solution(2,2)
+ solution1 = Solution(2, 2)
solution1.variables = [1.0, 2.0]
- solution2 = Solution(2,2)
+ solution2 = Solution(2, 2)
solution2.variables = [0.0, 3.0]
solution_list = [solution1, solution2]
- assert_that(any_of(solution1 , solution2), self.selection.execute(solution_list))
+ assert_that(any_of(solution1, solution2), self.selection.execute(solution_list))
def test_should_execute_work_if_the_solution_list_contains_two_solutions_and_one_them_is_dominated(self):
- solution1 = Solution(2,2)
+ solution1 = Solution(2, 2)
solution1.variables = [1.0, 4.0]
- solution2 = Solution(2,2)
+ solution2 = Solution(2, 2)
solution2.variables = [0.0, 3.0]
solution_list = [solution1, solution2]
@@ -56,6 +54,7 @@ def test_should_execute_work_if_the_solution_list_contains_two_solutions_and_one
class BestSolutionSelectionTestCases(unittest.TestCase):
+
def setUp(self):
self.selection = BestSolutionSelection[Solution]()
@@ -74,15 +73,15 @@ def test_should_execute_raise_an_exception_if_the_list_of_solutions_is_empty(sel
self.selection.execute(solution_list)
def test_should_execute_return_the_solution_in_a_list_with_one_solution(self):
- solution = Solution(3,2)
+ solution = Solution(3, 2)
solution_list = [solution]
self.assertEqual(solution, self.selection.execute(solution_list))
def test_should_execute_work_if_the_solution_list_contains_two_non_dominated_solutions(self):
- solution1 = Solution(2,2)
+ solution1 = Solution(2, 2)
solution1.objectives = [1.0, 2.0]
- solution2 = Solution(2,2)
+ solution2 = Solution(2, 2)
solution2.objectives = [0.0, 3.0]
solution_list = [solution1, solution2]
@@ -90,9 +89,9 @@ def test_should_execute_work_if_the_solution_list_contains_two_non_dominated_sol
self.assertTrue(self.selection.execute(solution_list) in solution_list)
def test_should_execute_work_if_the_solution_list_contains_two_solutions_and_one_them_is_dominated(self):
- solution1 = Solution(2,2)
+ solution1 = Solution(2, 2)
solution1.objectives = [1.0, 4.0]
- solution2 = Solution(2,2)
+ solution2 = Solution(2, 2)
solution2.objectives = [0.0, 3.0]
solution_list = [solution1, solution2]
@@ -100,15 +99,15 @@ def test_should_execute_work_if_the_solution_list_contains_two_solutions_and_one
self.assertEqual(solution2, self.selection.execute(solution_list))
def test_should_execute_work_if_the_solution_list_contains_five_solutions_and_one_them_is_dominated(self):
- solution1 = Solution(2,2)
+ solution1 = Solution(2, 2)
solution1.objectives = [1.0, 4.0]
- solution2 = Solution(2,2)
+ solution2 = Solution(2, 2)
solution2.objectives = [0.0, 3.0]
- solution3 = Solution(2,2)
+ solution3 = Solution(2, 2)
solution3.objectives = [0.0, 4.0]
- solution4 = Solution(2,2)
+ solution4 = Solution(2, 2)
solution4.objectives = [1.0, 3.0]
- solution5 = Solution(2,2)
+ solution5 = Solution(2, 2)
solution5.objectives = [0.2, 4.4]
solution_list = [solution1, solution2, solution3, solution4, solution5]
@@ -135,15 +134,15 @@ def test_should_execute_raise_an_exception_if_the_list_of_solutions_is_empty(sel
self.selection.execute(solution_list)
def test_should_execute_return_the_solution_in_a_list_with_one_solution(self):
- solution = Solution(3,2)
+ solution = Solution(3, 2)
solution_list = [solution]
self.assertEqual(solution, self.selection.execute(solution_list))
def test_should_execute_work_if_the_solution_list_contains_two_non_dominated_solutions(self):
- solution1 = Solution(2,2)
+ solution1 = Solution(2, 2)
solution1.objectives = [1.0, 2.0]
- solution2 = Solution(2,2)
+ solution2 = Solution(2, 2)
solution2.objectives = [0.0, 3.0]
solution_list = [solution1, solution2]
@@ -151,9 +150,9 @@ def test_should_execute_work_if_the_solution_list_contains_two_non_dominated_sol
self.assertTrue(self.selection.execute(solution_list) in solution_list)
def test_should_execute_work_if_the_solution_list_contains_two_solutions_and_one_them_is_dominated(self):
- solution1 = Solution(2,2)
+ solution1 = Solution(2, 2)
solution1.objectives = [1.0, 4.0]
- solution2 = Solution(2,2)
+ solution2 = Solution(2, 2)
solution2.objectives = [0.0, 3.0]
solution_list = [solution1, solution2]
@@ -161,15 +160,15 @@ def test_should_execute_work_if_the_solution_list_contains_two_solutions_and_one
self.assertTrue(self.selection.execute(solution_list) in solution_list)
def test_should_execute_work_if_the_solution_list_contains_five_solutions_and_one_them_is_dominated(self):
- solution1 = Solution(2,2)
+ solution1 = Solution(2, 2)
solution1.objectives = [1.0, 4.0]
- solution2 = Solution(2,2)
+ solution2 = Solution(2, 2)
solution2.objectives = [0.0, 3.0]
- solution3 = Solution(2,2)
+ solution3 = Solution(2, 2)
solution3.objectives = [0.0, 4.0]
- solution4 = Solution(2,2)
+ solution4 = Solution(2, 2)
solution4.objectives = [1.0, 3.0]
- solution5 = Solution(2,2)
+ solution5 = Solution(2, 2)
solution5.objectives = [0.2, 4.4]
solution_list = [solution1, solution2, solution3, solution4, solution5]
@@ -178,9 +177,6 @@ def test_should_execute_work_if_the_solution_list_contains_five_solutions_and_on
class NaryRandomSolutionSelectionTestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self):
selection = NaryRandomSolutionSelection[Solution]()
self.assertIsNotNone(selection)
@@ -199,26 +195,26 @@ def test_should_execute_raise_an_exception_if_the_list_of_solutions_is_empty(sel
selection = NaryRandomSolutionSelection[Solution]()
solution_list = []
with self.assertRaises(Exception):
- selection.execute(solution_list)
+ selection.execute(solution_list)
def test_should_execute_raise_an_exception_if_the_list_of_solutions_is_smaller_than_required(self):
selection = NaryRandomSolutionSelection[Solution](4)
- solution_list = [Solution(1,1), Solution(1,1)]
+ solution_list = [Solution(1, 1), Solution(1, 1)]
with self.assertRaises(Exception):
- selection.execute(solution_list)
+ selection.execute(solution_list)
def test_should_execute_return_the_solution_in_a_list_with_one_solution(self):
selection = NaryRandomSolutionSelection[Solution](1)
- solution = Solution(3,2)
+ solution = Solution(3, 2)
solution_list = [solution]
self.assertEqual([solution], selection.execute(solution_list))
def test_should_execute_work_if_the_solution_list_contains_two_non_dominated_solutions(self):
selection = NaryRandomSolutionSelection[Solution](2)
- solution1 = Solution(2,2)
+ solution1 = Solution(2, 2)
solution1.objectives = [1.0, 2.0]
- solution2 = Solution(2,2)
+ solution2 = Solution(2, 2)
solution2.objectives = [0.0, 3.0]
solution_list = [solution1, solution2]
@@ -229,15 +225,15 @@ def test_should_execute_work_if_the_solution_list_contains_two_non_dominated_sol
def test_should_execute_work_if_the_solution_list_contains_five_solutions_and_one_them_is_dominated(self):
selection = NaryRandomSolutionSelection[Solution](1)
- solution1 = Solution(2,2)
+ solution1 = Solution(2, 2)
solution1.objectives = [1.0, 4.0]
- solution2 = Solution(2,2)
+ solution2 = Solution(2, 2)
solution2.objectives = [0.0, 3.0]
- solution3 = Solution(2,2)
+ solution3 = Solution(2, 2)
solution3.objectives = [0.0, 4.0]
- solution4 = Solution(2,2)
+ solution4 = Solution(2, 2)
solution4.objectives = [1.0, 3.0]
- solution5 = Solution(2,2)
+ solution5 = Solution(2, 2)
solution5.objectives = [0.2, 4.4]
solution_list = [solution1, solution2, solution3, solution4, solution5]
@@ -246,6 +242,7 @@ def test_should_execute_work_if_the_solution_list_contains_five_solutions_and_on
class DominanceRankingTestCases(unittest.TestCase):
+
def setUp(self):
self.ranking_and_crowding_selection = RankingAndCrowdingDistanceSelection(5)
@@ -312,17 +309,16 @@ def test_should_operator_raise_an_exception_if_the_list_of_comparators_is_empty(
selection.execute(solution_list)
def test_should_execute_return_the_solution_in_a_list_with_one_solution(self):
- solution = Solution(3,2)
+ solution = Solution(3, 2)
solution_list = [solution]
- selection = BinaryTournament2Selection[Solution]([Comparator()])
+ selection = BinaryTournament2Selection[Solution]([EqualSolutionsComparator()])
self.assertEqual(solution, selection.execute(solution_list))
-
def test_should_execute_work_properly_case1(self):
- solution1 = Solution(3,2)
+ solution1 = Solution(3, 2)
solution1.objectives = [2, 3]
- solution2 = Solution(3,2)
+ solution2 = Solution(3, 2)
solution2.objectives = [1, 4]
solution1.attributes["dominance_ranking"] = 1
solution2.attributes["dominance_ranking"] = 1
@@ -330,9 +326,9 @@ def test_should_execute_work_properly_case1(self):
solution_list = [solution1, solution2]
operator = BinaryTournament2Selection[Solution]([SolutionAttributeComparator("key")])
selection1 = operator.execute(solution_list)
- selection2 = operator.execute(solution_list)
- self.assertTrue(1, selection1.attributes["dominance_ranking"])
+ self.assertTrue(1, selection1.attributes["dominance_ranking"])
+
if __name__ == '__main__':
unittest.main()
diff --git a/jmetal/problem/__init__.py b/jmetal/problem/__init__.py
index e69de29b..49d74770 100644
--- a/jmetal/problem/__init__.py
+++ b/jmetal/problem/__init__.py
@@ -0,0 +1,13 @@
+from .multiobjective.constrained import Srinivas, Tanaka
+from .multiobjective.unconstrained import Kursawe, Fonseca, Schaffer, Viennet2
+from .multiobjective.dtlz import DTLZ1, DTLZ2
+from .multiobjective.zdt import ZDT1, ZDT2, ZDT3, ZDT4, ZDT6
+from .singleobjective.unconstrained import OneMax, Sphere
+
+__all__ = [
+ 'Srinivas', 'Tanaka',
+ 'Kursawe', 'Fonseca', 'Schaffer', 'Viennet2',
+ 'DTLZ1', 'DTLZ2',
+ 'ZDT1', 'ZDT2', 'ZDT3', 'ZDT4', 'ZDT6',
+ 'OneMax', 'Sphere'
+]
diff --git a/jmetal/problem/multiobjective/constrained.py b/jmetal/problem/multiobjective/constrained.py
index 683cd0b4..c0cf034e 100644
--- a/jmetal/problem/multiobjective/constrained.py
+++ b/jmetal/problem/multiobjective/constrained.py
@@ -1,46 +1,43 @@
from math import pi, cos, atan
-""" Unconstrained Test problems for multi-objective optimization """
-from jmetal.core.objective import Objective
from jmetal.core.solution import FloatSolution
-
from jmetal.core.problem import FloatProblem
+"""
+.. module:: constrained
+ :platform: Unix, Windows
+ :synopsis: Constrained test problems for multi-objective optimization
+
+.. moduleauthor:: Antonio J. Nebro
+"""
+
class Srinivas(FloatProblem):
- """ Class representing problem Srinivas """
- def __init__(self):
- self.objectives = [self.Objective1(), self.Objective2()]
+ """ Class representing problem Srinivas. """
- self.number_of_objectives = len(self.objectives)
+ def __init__(self):
+ super(Srinivas, self).__init__()
+ self.number_of_objectives = 2
self.number_of_variables = 2
self.number_of_constraints = 2
- self.lower_bound = [-20.0 for i in range(self.number_of_variables)]
- self.upper_bound = [20.0 for i in range(self.number_of_variables)]
+ self.lower_bound = [-20.0 for _ in range(self.number_of_variables)]
+ self.upper_bound = [20.0 for _ in range(self.number_of_variables)]
FloatSolution.lower_bound = self.lower_bound
FloatSolution.upper_bound = self.upper_bound
- def get_name(self):
- return "Srinivas"
-
- class Objective1(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- x1 = solution.variables[0]
- x2 = solution.variables[1]
-
- return 2.0 + (x1 - 2.0) * (x1 - 2.0) + (x2 - 1.0) * (x2 - 1.0)
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
+ x1 = solution.variables[0]
+ x2 = solution.variables[1]
- class Objective2(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- x1 = solution.variables[0]
- x2 = solution.variables[1]
+ solution.objectives[0] = 2.0 + (x1 - 2.0) * (x1 - 2.0) + (x2 - 1.0) * (x2 - 1.0)
+ solution.objectives[1] = 9.0 * x1 - (x2 - 1.0) * (x2 - 1.0)
- return 9.0 * x1 - (x2 - 1.0) * (x2 - 1.0)
+ return solution
def evaluate_constraints(self, solution: FloatSolution) -> None:
- constraints : [float] = [0.0 for x in range(self.number_of_constraints)]
+ constraints = [0.0 for _ in range(self.number_of_constraints)]
x1 = solution.variables[0]
x2 = solution.variables[1]
@@ -56,38 +53,36 @@ def evaluate_constraints(self, solution: FloatSolution) -> None:
overall_constraint_violation += constrain
number_of_violated_constraints += 1
- solution.attributes["overall_constraint_violation"] = overall_constraint_violation
- solution.attributes["number_of_violated_constraints"] = number_of_violated_constraints
+ solution.attributes['overall_constraint_violation'] = overall_constraint_violation
+ solution.attributes['number_of_violated_constraints'] = number_of_violated_constraints
+
+ def get_name(self):
+ return 'Srinivas'
class Tanaka(FloatProblem):
""" Class representing problem Tanaka """
- def __init__(self):
- self.objectives = [self.Objective1(), self.Objective2()]
- self.number_of_objectives = len(self.objectives)
+ def __init__(self):
+ super(Tanaka, self).__init__()
+ self.number_of_objectives = 2
self.number_of_variables = 2
self.number_of_constraints = 2
- self.lower_bound = [10e-5 for i in range(self.number_of_variables)]
- self.upper_bound = [pi for i in range(self.number_of_variables)]
+ self.lower_bound = [10e-5 for _ in range(self.number_of_variables)]
+ self.upper_bound = [pi for _ in range(self.number_of_variables)]
FloatSolution.lower_bound = self.lower_bound
FloatSolution.upper_bound = self.upper_bound
- def get_name(self):
- return "Tanaka"
-
- class Objective1(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- return solution.variables[0]
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
+ solution.objectives[0] = solution.variables[0]
+ solution.objectives[1] = solution.variables[1]
- class Objective2(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- return solution.variables[1]
+ return solution
def evaluate_constraints(self, solution: FloatSolution) -> None:
- constraints : [float] = [0.0 for x in range(self.number_of_constraints)]
+ constraints = [0.0 for _ in range(self.number_of_constraints)]
x1 = solution.variables[0]
x2 = solution.variables[1]
@@ -103,6 +98,8 @@ def evaluate_constraints(self, solution: FloatSolution) -> None:
overall_constraint_violation += constrain
number_of_violated_constraints += 1
- solution.attributes["overall_constraint_violation"] = overall_constraint_violation
- solution.attributes["number_of_violated_constraints"] = number_of_violated_constraints
+ solution.attributes['overall_constraint_violation'] = overall_constraint_violation
+ solution.attributes['number_of_violated_constraints'] = number_of_violated_constraints
+ def get_name(self):
+ return 'Tanaka'
diff --git a/jmetal/problem/multiobjective/dtlz.py b/jmetal/problem/multiobjective/dtlz.py
index d4944f9e..2a908641 100644
--- a/jmetal/problem/multiobjective/dtlz.py
+++ b/jmetal/problem/multiobjective/dtlz.py
@@ -1,87 +1,99 @@
+from math import pi, cos, sin
+
+from jmetal.core.problem import FloatProblem
+from jmetal.core.solution import FloatSolution
+
"""
- ============================================================
- :mod:`dtlz` -- DTLZ problem family of multi-objective problems
- ============================================================
+.. module:: DTLZ
+ :platform: Unix, Windows
+ :synopsis: DTLZ problem family of multi-objective problems.
- This module provides the implementation of the DTLZ problems defined in:
+.. moduleauthor:: Antonio J. Nebro
+"""
- ...
- DOI: ...
+class DTLZ1(FloatProblem):
+ """ Problem DTLZ1. Continuous problem having a flat Pareto front
+ .. note:: Unconstrained problem. The default number of variables and objectives are, respectively, 7 and 3.
+ """
- These problems are scalable in the number of the decision variables and the number of
- objective functions
+ def __init__(self, number_of_variables: int = 7, number_of_objectives=3):
+ """ :param number_of_variables: number of decision variables of the problem.
+ """
+ super(DTLZ1, self).__init__()
+ self.number_of_variables = number_of_variables
+ self.number_of_objectives = number_of_objectives
+ self.number_of_constraints = 0
- .. module:: jmetal.problem.multiobjective.dtlz
+ self.obj_directions = [self.MINIMIZE] * number_of_objectives
- :platform: Unix, Windows
- :synopsis: Module including the implementation of the DTLZ problem family.
+ self.lower_bound = self.number_of_variables * [0.0]
+ self.upper_bound = self.number_of_variables * [1.0]
- .. moduleauthor:: Antonio J. Nebro
+ FloatSolution.lower_bound = self.lower_bound
+ FloatSolution.upper_bound = self.upper_bound
-"""
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
+ k = self.number_of_variables - self.number_of_objectives + 1
+ g = sum([(x - 0.5) * (x - 0.5) - cos(20.0 * pi * (x - 0.5))
+ for x in solution.variables[self.number_of_variables - k:]])
-from math import pi, cos
+ g = 100 * (k + g)
-from jmetal.core.objective import Objective
-from jmetal.core.problem import FloatProblem
-from jmetal.core.solution import FloatSolution
+ solution.objectives = [(1.0 + g) * 0.5] * self.number_of_objectives
+ for i in range(self.number_of_objectives):
+ for j in range(self.number_of_objectives - (i + 1)):
+ solution.objectives[i] *= solution.variables[j]
-class DTLZ1(FloatProblem):
- """ Problem DTLZ1
+ if i != 0:
+ solution.objectives[i] *= 1 - solution.variables[self.number_of_objectives - (i + 1)]
- .. note:: Unconstrained problem. The default number of variables and objectives are,
- respectively, 7 and 3.
+ return solution
- .. note:: Continuous problem having a convex Pareto front
+ def get_name(self):
+ return 'DTLZ1'
- """
- def __init__(self, number_of_variables: int = 30, number_of_objectives = 3):
- """Constructor
- Arguments:
+class DTLZ2(FloatProblem):
+ """ Problem DTLZ2. Continuous problem having a convex Pareto front
- :param number_of_variables: number of decision variables of the problem
- """
- self.objectives = [self.Dtlz1Objective() for i in range(number_of_objectives)]
+ .. note:: Unconstrained problem. The default number of variables and objectives are, respectively, 12 and 3.
+ """
+ def __init__(self, number_of_variables: int = 12, number_of_objectives=3):
+ """:param number_of_variables: number of decision variables of the problem
+ """
+ super(DTLZ2, self).__init__()
self.number_of_variables = number_of_variables
self.number_of_objectives = number_of_objectives
self.number_of_constraints = 0
+ self.obj_directions = [self.MINIMIZE] * number_of_objectives
+
self.lower_bound = self.number_of_variables * [0.0]
self.upper_bound = self.number_of_variables * [1.0]
FloatSolution.lower_bound = self.lower_bound
FloatSolution.upper_bound = self.upper_bound
- class Dtlz1Objective(Objective):
- def is_a_minimization_objective(self):
- return True
-
- def evaluate(self, solution: FloatSolution):
- g = 0.0
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
k = self.number_of_variables - self.number_of_objectives + 1
- for i in range (self.number_of_variables - k, self.number_of_variables):
- g += (solution.variables[i] - 0.5) * (solution.variables[i] - 0.5) - \
- cos(20.0 * pi * (solution.variables[i] - 0.5))
- g = 100 * (k + g)
- for i in range(self.number_of_objectives):
- solution.objectives[i] = (1.0 + g) * 0.5
+ g = sum([(x - 0.5) * (x - 0.5) for x in solution.variables[self.number_of_variables - k:]])
+
+ solution.objectives = [1.0 + g] * self.number_of_objectives
for i in range(self.number_of_objectives):
for j in range(self.number_of_objectives - (i + 1)):
- solution.objectives[i] *= solution.variables[j]
+ solution.objectives[i] *= cos(solution.variables[j] * 0.5 * pi)
if i != 0:
- aux = self.number_of_objectives - (i + 1)
- solution.objectives[i] *= 1 - solution.variables[aux]
-
- def get_name(self):
- return "DTLZ1"
+ solution.objectives[i] *= sin(0.5 * pi * solution.variables[self.number_of_objectives - (i + 1)])
+ return solution
+ def get_name(self):
+ return 'DTLZ2'
diff --git a/jmetal/problem/multiobjective/test/test_constrained.py b/jmetal/problem/multiobjective/test/test_constrained.py
index 1117beee..7d0ac8e1 100644
--- a/jmetal/problem/multiobjective/test/test_constrained.py
+++ b/jmetal/problem/multiobjective/test/test_constrained.py
@@ -3,14 +3,9 @@
from jmetal.problem.multiobjective.constrained import Srinivas, Tanaka
-__author__ = "Antonio J. Nebro"
-
class SrinivasTestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self) -> None:
problem = Srinivas()
self.assertIsNotNone(problem)
@@ -41,9 +36,6 @@ def test_should_get_name_return_the_right_name(self):
class TanakaTestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self) -> None:
problem = Tanaka()
self.assertIsNotNone(problem)
@@ -71,5 +63,6 @@ def test_should_get_name_return_the_right_name(self):
problem = Tanaka()
self.assertEqual("Tanaka", problem.get_name())
+
if __name__ == '__main__':
unittest.main()
diff --git a/jmetal/problem/multiobjective/test/test_unconstrained.py b/jmetal/problem/multiobjective/test/test_unconstrained.py
index 8427b36f..f2a41612 100644
--- a/jmetal/problem/multiobjective/test/test_unconstrained.py
+++ b/jmetal/problem/multiobjective/test/test_unconstrained.py
@@ -2,14 +2,9 @@
from jmetal.problem.multiobjective.unconstrained import Kursawe, Fonseca, Schaffer, Viennet2
-__author__ = "Antonio J. Nebro"
-
class KursaweTestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self) -> None:
problem = Kursawe(3)
self.assertIsNotNone(problem)
@@ -50,8 +45,6 @@ def test_should_get_name_return_the_right_name(self):
class FonsecaTestCases(unittest.TestCase):
- def setUp(self):
- pass
def test_should_constructor_create_a_non_null_object(self):
problem = Fonseca()
@@ -63,8 +56,8 @@ def test_should_constructor_create_a_valid_problem_with_default_settings(self):
self.assertEqual(2, problem.number_of_objectives)
self.assertEqual(0, problem.number_of_constraints)
- self.assertEqual( 3 * [-4], problem.lower_bound)
- self.assertEqual( 3 * [ 4], problem.upper_bound)
+ self.assertEqual(3 * [-4], problem.lower_bound)
+ self.assertEqual(3 * [4], problem.upper_bound)
def test_should_create_solution_create_a_valid_float_solution(self):
problem = Fonseca()
@@ -77,7 +70,7 @@ def test_should_create_solution_create_a_valid_float_solution(self):
self.assertEqual(0, problem.number_of_constraints)
self.assertEqual(3 * [-4], problem.lower_bound)
- self.assertEqual(3 * [ 4], problem.upper_bound)
+ self.assertEqual(3 * [4], problem.upper_bound)
self.assertTrue(solution.variables[0] >= -4)
self.assertTrue(solution.variables[0] <= 4)
@@ -92,8 +85,8 @@ def test_should_create_solution_return_right_evaluation_values(self):
problem.evaluate(solution1)
- self.assertAlmostEqual(solution1.objectives[0], 0.991563628, 4);
- self.assertAlmostEqual(solution1.objectives[1], 0.999663388, 4);
+ self.assertAlmostEqual(solution1.objectives[0], 0.991563628, 4)
+ self.assertAlmostEqual(solution1.objectives[1], 0.999663388, 4)
def test_should_get_name_return_the_right_name(self):
problem = Fonseca()
@@ -102,9 +95,6 @@ def test_should_get_name_return_the_right_name(self):
class SchafferTestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self):
problem = Schaffer()
self.assertIsNotNone(problem)
@@ -145,11 +135,11 @@ def test_should_create_solution_return_right_evaluation_values(self):
problem.evaluate(solution1)
problem.evaluate(solution2)
- self.assertAlmostEqual(solution1.objectives[0], 9);
- self.assertAlmostEqual(solution1.objectives[1], 1);
+ self.assertAlmostEqual(solution1.objectives[0], 9)
+ self.assertAlmostEqual(solution1.objectives[1], 1)
- self.assertAlmostEqual(solution2.objectives[0], 6.76);
- self.assertAlmostEqual(solution2.objectives[1], 21.16);
+ self.assertAlmostEqual(solution2.objectives[0], 6.76)
+ self.assertAlmostEqual(solution2.objectives[1], 21.16)
def test_should_get_name_return_the_right_name(self):
problem = Schaffer()
@@ -158,9 +148,6 @@ def test_should_get_name_return_the_right_name(self):
class Viennet2TestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self):
problem = Viennet2()
self.assertIsNotNone(problem)
@@ -198,13 +185,14 @@ def test_should_create_solution_return_right_evaluation_values(self):
problem.evaluate(solution2)
- self.assertAlmostEqual(solution2.objectives[0], 14.0607692307);
- self.assertAlmostEqual(solution2.objectives[1], -11.8818055555);
- self.assertAlmostEqual(solution2.objectives[2], -11.1532369747);
+ self.assertAlmostEqual(solution2.objectives[0], 14.0607692307)
+ self.assertAlmostEqual(solution2.objectives[1], -11.8818055555)
+ self.assertAlmostEqual(solution2.objectives[2], -11.1532369747)
def test_should_get_name_return_the_right_name(self):
problem = Viennet2()
self.assertEqual("Viennet2", problem.get_name())
+
if __name__ == '__main__':
unittest.main()
diff --git a/jmetal/problem/multiobjective/test/test_zdt.py b/jmetal/problem/multiobjective/test/test_zdt.py
index 98f07919..a87168ba 100644
--- a/jmetal/problem/multiobjective/test/test_zdt.py
+++ b/jmetal/problem/multiobjective/test/test_zdt.py
@@ -2,14 +2,9 @@
from jmetal.problem.multiobjective.zdt import ZDT1, ZDT2, ZDT3, ZDT4, ZDT6
-__author__ = "Antonio J. Nebro"
-
class ZDT1TestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self) -> None:
problem = ZDT1()
self.assertIsNotNone(problem)
@@ -51,9 +46,6 @@ def test_should_get_name_return_the_right_name(self):
class ZDT2TestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self) -> None:
problem = ZDT2()
self.assertIsNotNone(problem)
@@ -95,9 +87,6 @@ def test_should_get_name_return_the_right_name(self):
class ZDT3TestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self) -> None:
problem = ZDT3()
self.assertIsNotNone(problem)
@@ -139,9 +128,6 @@ def test_should_get_name_return_the_right_name(self):
class ZDT4TestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self) -> None:
problem = ZDT4()
self.assertIsNotNone(problem)
@@ -191,9 +177,6 @@ def test_should_get_name_return_the_right_name(self):
class ZDT6TestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self) -> None:
problem = ZDT6()
self.assertIsNotNone(problem)
@@ -232,5 +215,6 @@ def test_should_get_name_return_the_right_name(self):
problem = ZDT6()
self.assertEqual("ZDT6", problem.get_name())
+
if __name__ == '__main__':
unittest.main()
diff --git a/jmetal/problem/multiobjective/unconstrained.py b/jmetal/problem/multiobjective/unconstrained.py
index 0c83441d..cd2ade73 100644
--- a/jmetal/problem/multiobjective/unconstrained.py
+++ b/jmetal/problem/multiobjective/unconstrained.py
@@ -1,138 +1,136 @@
from math import sqrt, exp, pow, sin
-from jmetal.core.objective import Objective
from jmetal.core.problem import FloatProblem
from jmetal.core.solution import FloatSolution
-""" Unconstrained Test problems for multi-objective optimization """
+"""
+.. module:: constrained
+ :platform: Unix, Windows
+ :synopsis: Unconstrained test problems for multi-objective optimization
+
+.. moduleauthor:: Antonio J. Nebro
+"""
+
class Kursawe(FloatProblem):
- """ Class representing problem Kursawe """
- def __init__(self, number_of_variables: int = 3):
- self.objectives = [self.Objective1(), self.Objective2()]
+ """ Class representing problem Kursawe. """
- self.number_of_objectives = len(self.objectives)
+ def __init__(self, number_of_variables: int = 3):
+ super(Kursawe, self).__init__()
+ self.number_of_objectives = 2
self.number_of_variables = number_of_variables
self.number_of_constraints = 0
- self.lower_bound = [-5.0 for i in range(number_of_variables)]
- self.upper_bound = [5.0 for i in range(number_of_variables)]
+ self.obj_directions = [self.MINIMIZE, self.MINIMIZE]
+
+ self.lower_bound = [-5.0 for _ in range(number_of_variables)]
+ self.upper_bound = [5.0 for _ in range(number_of_variables)]
FloatSolution.lower_bound = self.lower_bound
FloatSolution.upper_bound = self.upper_bound
- def get_name(self):
- return "Kursawe"
-
- class Objective1(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- fx = 0.0
- for i in range(problem.number_of_variables - 1):
- xi = solution.variables[i] * solution.variables[i]
- xj = solution.variables[i + 1] * solution.variables[i + 1]
- aux = -0.2 * sqrt(xi + xj)
- fx += -10 * exp(aux)
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
+ fx = [0.0 for _ in range(self.number_of_objectives)]
+ for i in range(self.number_of_variables - 1):
+ xi = solution.variables[i] * solution.variables[i]
+ xj = solution.variables[i + 1] * solution.variables[i + 1]
+ aux = -0.2 * sqrt(xi + xj)
+ fx[0] += -10 * exp(aux)
+ fx[1] += pow(abs(solution.variables[i]), 0.8) + 5.0 * sin(pow(solution.variables[i], 3.0))
- return fx
+ solution.objectives[0] = fx[0]
+ solution.objectives[1] = fx[1]
- class Objective2(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- fx = 0.0
- for i in range(problem.number_of_variables):
- fx += pow(abs(solution.variables[i]), 0.8) + 5.0 * sin(pow(solution.variables[i], 3.0))
+ return solution
- return fx
+ def get_name(self):
+ return 'Kursawe'
class Fonseca(FloatProblem):
- def __init__(self):
- self.objectives = [self.Objective1(), self.Objective2()]
+ def __init__(self):
+ super(Fonseca, self).__init__()
self.number_of_variables = 3
self.number_of_objectives = 2
self.number_of_constraints = 0
+ self.obj_directions = [self.MINIMIZE, self.MINIMIZE]
+
self.lower_bound = self.number_of_variables * [-4]
- self.upper_bound = self.number_of_variables * [ 4]
+ self.upper_bound = self.number_of_variables * [4]
FloatSolution.lower_bound = self.lower_bound
FloatSolution.upper_bound = self.upper_bound
- def get_name(self):
- return "Fonseca"
-
- class Objective1(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- n = problem.number_of_variables
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
+ n = self.number_of_variables
+ solution.objectives[0] = 1 - exp(-sum([(x - 1.0 / n ** 0.5) ** 2 for x in solution.variables]))
+ solution.objectives[1] = 1 - exp(-sum([(x + 1.0 / n ** 0.5) ** 2 for x in solution.variables]))
- return 1 - exp(-sum([(x - 1.0 / n ** 0.5) ** 2 for x in solution.variables]))
+ return solution
- class Objective2(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- n = problem.number_of_variables
+ def get_name(self):
+ return 'Fonseca'
- return 1 - exp(-sum([(x + 1.0 / n ** 0.5) ** 2 for x in solution.variables]))
class Schaffer(FloatProblem):
- def __init__(self):
- self.objectives = [self.Objective1(), self.Objective2()]
+ def __init__(self):
+ super(Schaffer, self).__init__()
self.number_of_variables = 1
self.number_of_objectives = 2
self.number_of_constraints = 0
+ self.obj_directions = [self.MINIMIZE, self.MINIMIZE]
+
self.lower_bound = [-100000]
self.upper_bound = [100000]
FloatSolution.lower_bound = self.lower_bound
FloatSolution.upper_bound = self.upper_bound
- def get_name(self):
- return "Schaffer"
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
+ value = solution.variables[0]
+
+ solution.objectives[0] = value ** 2
+ solution.objectives[1] = (value - 2) ** 2
- class Objective1(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- return solution.variables[0] ** 2
+ return solution
- class Objective2(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- return (solution.variables[0] - 2.0) ** 2
+ def get_name(self):
+ return 'Schaffer'
class Viennet2(FloatProblem):
- def __init__(self):
- self.objectives = [self.Objective1(), self.Objective2(), self.Objective3()]
+ def __init__(self):
+ super(Viennet2, self).__init__()
self.number_of_variables = 2
self.number_of_objectives = 3
self.number_of_constraints = 0
+ self.obj_directions = [self.MINIMIZE, self.MINIMIZE, self.MINIMIZE]
+
self.lower_bound = self.number_of_variables * [-4]
self.upper_bound = self.number_of_variables * [4]
FloatSolution.lower_bound = self.lower_bound
FloatSolution.upper_bound = self.upper_bound
- def get_name(self):
- return "Viennet2"
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
+ x0 = solution.variables[0]
+ x1 = solution.variables[1]
- class Objective1(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- x0 = solution.variables[0]
- x1 = solution.variables[1]
+ f1 = (x0 - 2) * (x0 - 2) / 2.0 + (x1 + 1) * (x1 + 1) / 13.0 + 3.0
+ f2 = (x0 + x1 - 3.0) * (x0 + x1 - 3.0) / 36.0 + (-x0 + x1 + 2.0) * (-x0 + x1 + 2.0) / 8.0 - 17.0
+ f3 = (x0 + 2 * x1 - 1) * (x0 + 2 * x1 - 1) / 175.0 + (2 * x1 - x0) * (2 * x1 - x0) / 17.0 - 13.0
- return (x0 - 2) * (x0 - 2) / 2.0 + (x1 + 1) * (x1 + 1) / 13.0 + 3.0
+ solution.objectives[0] = f1
+ solution.objectives[1] = f2
+ solution.objectives[2] = f3
- class Objective2(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- x0 = solution.variables[0]
- x1 = solution.variables[1]
+ return solution
- return (x0 + x1 - 3.0) * (x0 + x1 - 3.0) / 36.0 + (-x0 + x1 + 2.0) * (-x0 + x1 + 2.0) / 8.0 - 17.0
-
- class Objective3(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- x0 = solution.variables[0]
- x1 = solution.variables[1]
-
- return (x0 + 2 * x1 - 1) * (x0 + 2 * x1 - 1) / 175.0 + (2 * x1 - x0) * (2 * x1 - x0) / 17.0 - 13.0
+ def get_name(self):
+ return 'Viennet2'
diff --git a/jmetal/problem/multiobjective/zdt.py b/jmetal/problem/multiobjective/zdt.py
index 7e0ded61..8e05124a 100644
--- a/jmetal/problem/multiobjective/zdt.py
+++ b/jmetal/problem/multiobjective/zdt.py
@@ -1,201 +1,172 @@
-"""
- ============================================================
- :mod:`zdt` -- ZDT problem family of multi-objective problems
- ============================================================
-
- This module provides the implementation of the ZDT problems defined in:
-
- Zitzler, E., Deb, K., Thiele, L.
- Comparison of multiobjective evolutionary algorithms: Empirical results.
- Evolutionary Computation 8(2), pp: 173-195. 2000
-
- DOI: https://doi.org/10.1162/106365600568202
-
-
- These problems are scalable in the number of the decision variables, i.e. the Pareto front
- is the same independently of the number of variables
+from math import sqrt, pow, sin, pi, cos
- .. module:: jmetal.problem.multiobjective.zdt
-
- :platform: Unix, Windows
- :synopsis: Module including the implementation of the ZDT problem family.
-
- .. moduleauthor:: Antonio J. Nebro
+from jmetal.core.problem import FloatProblem
+from jmetal.core.solution import FloatSolution
"""
+.. module:: ZDT
+ :platform: Unix, Windows
+ :synopsis: ZDT problem family of multi-objective problems.
-
-from math import sqrt, exp, pow, sin, pi, cos
-
-from jmetal.core.objective import Objective
-from jmetal.core.problem import FloatProblem
-from jmetal.core.solution import FloatSolution
+.. moduleauthor:: Antonio J. Nebro
+"""
class ZDT1(FloatProblem):
- """ Problem ZDT1
+ """ Problem ZDT1.
.. note:: Bi-objective unconstrained problem. The default number of variables is 30.
-
.. note:: Continuous problem having a convex Pareto front
-
"""
- def __init__(self, number_of_variables: int = 30):
- """Constructor
- Arguments:
-
- :param number_of_variables: number of decision variables of the problem
+ def __init__(self, number_of_variables: int = 30):
"""
- self.objectives = [self.Objective1(), self.Objective2()]
-
+ :param number_of_variables: Number of decision variables of the problem.
+ """
+ super(ZDT1, self).__init__()
self.number_of_variables = number_of_variables
- self.number_of_objectives = len(self.objectives)
+ self.number_of_objectives = 2
self.number_of_constraints = 0
+ self.obj_directions = [self.MINIMIZE, self.MINIMIZE]
+
self.lower_bound = self.number_of_variables * [0.0]
self.upper_bound = self.number_of_variables * [1.0]
FloatSolution.lower_bound = self.lower_bound
FloatSolution.upper_bound = self.upper_bound
- class Objective1(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- return solution.variables[0]
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
+ g = self.__eval_g(solution)
+ h = self.__eval_h(solution.variables[0], g)
- class Objective2(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- g = self.__eval_g(solution)
- h = self.__eval_h(solution.variables[0], g)
+ solution.objectives[0] = solution.variables[0]
+ solution.objectives[1] = h * g
- return h * g
+ return solution
- @staticmethod
- def __eval_g(solution: FloatSolution):
- g = sum(solution.variables) - solution.variables[0]
+ def __eval_g(self, solution: FloatSolution):
+ g = sum(solution.variables) - solution.variables[0]
- constant = 9.0 / (solution.number_of_variables - 1)
- g = constant * g
- g = g + 1.0
- return g
+ constant = 9.0 / (solution.number_of_variables - 1)
+ g = constant * g
+ g = g + 1.0
- @staticmethod
- def __eval_h(f: float, g: float) -> float:
- return 1.0 - sqrt(f/g)
+ return g
+
+ def __eval_h(self, f: float, g: float) -> float:
+ return 1.0 - sqrt(f / g)
def get_name(self):
- return "ZDT1"
+ return 'ZDT1'
class ZDT2(FloatProblem):
""" Problem ZDT2
.. note:: Bi-objective unconstrained problem. The default number of variables is 30.
-
.. note:: Continuous problem having a non-convex Pareto front
-
"""
- def __init__(self, number_of_variables: int = 30):
- self.objectives = [self.Objective1(), self.Objective2()]
+ def __init__(self, number_of_variables: int = 30):
+ super(ZDT2, self).__init__()
self.number_of_variables = number_of_variables
- self.number_of_objectives = len(self.objectives)
+ self.number_of_objectives = 2
self.number_of_constraints = 0
+ self.obj_directions = [self.MINIMIZE, self.MINIMIZE]
+
self.lower_bound = self.number_of_variables * [0.0]
self.upper_bound = self.number_of_variables * [1.0]
FloatSolution.lower_bound = self.lower_bound
FloatSolution.upper_bound = self.upper_bound
- class Objective1(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- return solution.variables[0]
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
+ g = self.__eval_g(solution)
+ h = self.__eval_h(solution.variables[0], g)
- class Objective2(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- g = self.__eval_g(solution)
- h = self.__eval_h(solution.variables[0], g)
+ solution.objectives[0] = solution.variables[0]
+ solution.objectives[1] = h * g
- return h * g
+ return solution
- def __eval_g(self, solution: FloatSolution):
- g = sum(solution.variables) - solution.variables[0]
+ def __eval_g(self, solution: FloatSolution):
+ g = sum(solution.variables) - solution.variables[0]
- constant = 9.0 / (solution.number_of_variables - 1)
- g = constant * g
- g = g + 1.0
- return g
+ constant = 9.0 / (solution.number_of_variables - 1)
+ g = constant * g
+ g = g + 1.0
- def __eval_h(self, f: float, g: float) -> float:
- return 1.0 - pow(f / g, 2.0)
+ return g
+
+ def __eval_h(self, f: float, g: float) -> float:
+ return 1.0 - pow(f / g, 2.0)
def get_name(self):
- return "ZDT2"
+ return 'ZDT2'
class ZDT3(FloatProblem):
""" Problem ZDT3
.. note:: Bi-objective unconstrained problem. The default number of variables is 30.
-
.. note:: Continuous problem having a partitioned Pareto front
-
"""
- def __init__(self, number_of_variables: int = 30):
- self.objectives = [self.Objective1(), self.Objective2()]
+ def __init__(self, number_of_variables: int = 30):
+ super(ZDT3, self).__init__()
self.number_of_variables = number_of_variables
- self.number_of_objectives = len(self.objectives)
+ self.number_of_objectives = 2
self.number_of_constraints = 0
+ self.obj_directions = [self.MINIMIZE, self.MINIMIZE]
+
self.lower_bound = self.number_of_variables * [0.0]
self.upper_bound = self.number_of_variables * [1.0]
FloatSolution.lower_bound = self.lower_bound
FloatSolution.upper_bound = self.upper_bound
- class Objective1(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- return solution.variables[0]
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
+ g = self.__eval_g(solution)
+ h = self.__eval_h(solution.variables[0], g)
- class Objective2(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- g = self.__eval_g(solution)
- h = self.__eval_h(solution.variables[0], g)
+ solution.objectives[0] = solution.variables[0]
+ solution.objectives[1] = h * g
- return h * g
+ return solution
- def __eval_g(self, solution: FloatSolution):
- g = sum(solution.variables) - solution.variables[0]
+ def __eval_g(self, solution: FloatSolution):
+ g = sum(solution.variables) - solution.variables[0]
- constant = 9.0 / (solution.number_of_variables - 1)
- g = constant * g
- g = g + 1.0
- return g
+ constant = 9.0 / (solution.number_of_variables - 1)
+ g = constant * g
+ g = g + 1.0
+ return g
- def __eval_h(self, f: float, g: float) -> float:
- return 1.0 - sqrt(f / g) - (f / g) * sin(10.0 * f * pi)
+ def __eval_h(self, f: float, g: float) -> float:
+ return 1.0 - sqrt(f / g) - (f / g) * sin(10.0 * f * pi)
def get_name(self):
- return "ZDT3"
+ return 'ZDT3'
class ZDT4(FloatProblem):
""" Problem ZDT4
.. note:: Bi-objective unconstrained problem. The default number of variables is 10.
-
.. note:: Continuous multi-modal problem having a convex Pareto front
-
"""
- def __init__(self, number_of_variables: int = 10):
- self.objectives = [self.Objective1(), self.Objective2()]
+ def __init__(self, number_of_variables: int = 10):
+ super(ZDT4, self).__init__()
self.number_of_variables = number_of_variables
- self.number_of_objectives = len(self.objectives)
+ self.number_of_objectives = 2
self.number_of_constraints = 0
+ self.obj_directions = [self.MINIMIZE, self.MINIMIZE]
+
self.lower_bound = self.number_of_variables * [-5.0]
self.upper_bound = self.number_of_variables * [5.0]
self.lower_bound[0] = 0.0
@@ -204,78 +175,73 @@ def __init__(self, number_of_variables: int = 10):
FloatSolution.lower_bound = self.lower_bound
FloatSolution.upper_bound = self.upper_bound
- class Objective1(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- return solution.variables[0]
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
+ g = self.__eval_g(solution)
+ h = self.__eval_h(solution.variables[0], g)
- class Objective2(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- g = self.__eval_g(solution)
- h = self.__eval_h(solution.variables[0], g)
+ solution.objectives[0] = solution.variables[0]
+ solution.objectives[1] = h * g
- return h * g
+ return solution
- def __eval_g(self, solution: FloatSolution):
- g = 0.0
+ def __eval_g(self, solution: FloatSolution):
+ g = 0.0
- for i in range(1, solution.number_of_variables):
- g += pow(solution.variables[i], 2.0) - 10.0 * cos(4.0 * pi * solution.variables[i])
+ for i in range(1, solution.number_of_variables):
+ g += pow(solution.variables[i], 2.0) - 10.0 * cos(4.0 * pi * solution.variables[i])
- g += 1.0 + 10.0 * (solution.number_of_variables - 1)
+ g += 1.0 + 10.0 * (solution.number_of_variables - 1)
- return g
+ return g
- def __eval_h(self, f: float, g: float) -> float:
- return 1.0 - sqrt(f / g)
+ def __eval_h(self, f: float, g: float) -> float:
+ return 1.0 - sqrt(f / g)
def get_name(self):
- return "ZDT4"
+ return 'ZDT4'
class ZDT6(FloatProblem):
""" Problem ZDT6
.. note:: Bi-objective unconstrained problem. The default number of variables is 10.
-
.. note:: Continuous problem having a non-convex Pareto front
-
"""
- def __init__(self, number_of_variables: int = 10):
- self.objectives = [self.Objective1(), self.Objective2()]
+ def __init__(self, number_of_variables: int = 10):
+ super(ZDT6, self).__init__()
self.number_of_variables = number_of_variables
- self.number_of_objectives = len(self.objectives)
+ self.number_of_objectives = 2
self.number_of_constraints = 0
+ self.obj_directions = [self.MINIMIZE, self.MINIMIZE]
+
self.lower_bound = self.number_of_variables * [0.0]
self.upper_bound = self.number_of_variables * [1.0]
FloatSolution.lower_bound = self.lower_bound
FloatSolution.upper_bound = self.upper_bound
- class Objective1(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- return 1.0 - exp((-4.0) * solution.variables[0]) \
- * pow(sin(6.0 * pi * solution.variables[0]), 6.0)
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
+ g = self.__eval_g(solution)
+ h = self.__eval_h(solution.variables[0], g)
- class Objective2(Objective):
- def compute(self, solution: FloatSolution, problem: FloatProblem):
- g = self.__eval_g(solution)
- h = self.__eval_h(solution.objectives[0], g)
+ solution.objectives[0] = solution.variables[0]
+ solution.objectives[1] = h * g
- return h * g
+ return solution
- def __eval_g(self, solution: FloatSolution):
- g = sum(solution.variables) - solution.variables[0]
- g = g / (solution.number_of_variables - 1)
- g = pow(g, 0.25)
- g = 9.0 * g
- g = 1.0 + g
+ def __eval_g(self, solution: FloatSolution):
+ g = sum(solution.variables) - solution.variables[0]
+ g = g / (solution.number_of_variables - 1)
+ g = pow(g, 0.25)
+ g = 9.0 * g
+ g = 1.0 + g
- return g
+ return g
- def __eval_h(self, f: float, g: float) -> float:
- return 1.0 - pow(f / g, 2.0)
+ def __eval_h(self, f: float, g: float) -> float:
+ return 1.0 - pow(f / g, 2.0)
def get_name(self):
- return "ZDT6"
+ return 'ZDT6'
diff --git a/jmetal/problem/reference_front/DTLZ1.pf b/jmetal/problem/reference_front/DTLZ1.pf
new file mode 100644
index 00000000..48d5dbc8
--- /dev/null
+++ b/jmetal/problem/reference_front/DTLZ1.pf
@@ -0,0 +1,10000 @@
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0 0.5
+0 0.005 0.495
+5e-005 0.00495 0.495
+0.0001 0.0049 0.495
+0.00015 0.00485 0.495
+0.0002 0.0048 0.495
+0.00025 0.00475 0.495
+0.0003 0.0047 0.495
+0.00035 0.00465 0.495
+0.0004 0.0046 0.495
+0.00045 0.00455 0.495
+0.0005 0.0045 0.495
+0.00055 0.00445 0.495
+0.0006 0.0044 0.495
+0.00065 0.00435 0.495
+0.0007 0.0043 0.495
+0.00075 0.00425 0.495
+0.0008 0.0042 0.495
+0.00085 0.00415 0.495
+0.0009 0.0041 0.495
+0.00095 0.00405 0.495
+0.001 0.004 0.495
+0.00105 0.00395 0.495
+0.0011 0.0039 0.495
+0.00115 0.00385 0.495
+0.0012 0.0038 0.495
+0.00125 0.00375 0.495
+0.0013 0.0037 0.495
+0.00135 0.00365 0.495
+0.0014 0.0036 0.495
+0.00145 0.00355 0.495
+0.0015 0.0035 0.495
+0.00155 0.00345 0.495
+0.0016 0.0034 0.495
+0.00165 0.00335 0.495
+0.0017 0.0033 0.495
+0.00175 0.00325 0.495
+0.0018 0.0032 0.495
+0.00185 0.00315 0.495
+0.0019 0.0031 0.495
+0.00195 0.00305 0.495
+0.002 0.003 0.495
+0.00205 0.00295 0.495
+0.0021 0.0029 0.495
+0.00215 0.00285 0.495
+0.0022 0.0028 0.495
+0.00225 0.00275 0.495
+0.0023 0.0027 0.495
+0.00235 0.00265 0.495
+0.0024 0.0026 0.495
+0.00245 0.00255 0.495
+0.0025 0.0025 0.495
+0.00255 0.00245 0.495
+0.0026 0.0024 0.495
+0.00265 0.00235 0.495
+0.0027 0.0023 0.495
+0.00275 0.00225 0.495
+0.0028 0.0022 0.495
+0.00285 0.00215 0.495
+0.0029 0.0021 0.495
+0.00295 0.00205 0.495
+0.003 0.002 0.495
+0.00305 0.00195 0.495
+0.0031 0.0019 0.495
+0.00315 0.00185 0.495
+0.0032 0.0018 0.495
+0.00325 0.00175 0.495
+0.0033 0.0017 0.495
+0.00335 0.00165 0.495
+0.0034 0.0016 0.495
+0.00345 0.00155 0.495
+0.0035 0.0015 0.495
+0.00355 0.00145 0.495
+0.0036 0.0014 0.495
+0.00365 0.00135 0.495
+0.0037 0.0013 0.495
+0.00375 0.00125 0.495
+0.0038 0.0012 0.495
+0.00385 0.00115 0.495
+0.0039 0.0011 0.495
+0.00395 0.00105 0.495
+0.004 0.001 0.495
+0.00405 0.00095 0.495
+0.0041 0.0009 0.495
+0.00415 0.00085 0.495
+0.0042 0.0008 0.495
+0.00425 0.00075 0.495
+0.0043 0.0007 0.495
+0.00435 0.00065 0.495
+0.0044 0.0006 0.495
+0.00445 0.00055 0.495
+0.0045 0.0005 0.495
+0.00455 0.00045 0.495
+0.0046 0.0004 0.495
+0.00465 0.00035 0.495
+0.0047 0.0003 0.495
+0.00475 0.00025 0.495
+0.0048 0.0002 0.495
+0.00485 0.00015 0.495
+0.0049 0.0001 0.495
+0.00495 5e-005 0.495
+0 0.01 0.49
+0.0001 0.0099 0.49
+0.0002 0.0098 0.49
+0.0003 0.0097 0.49
+0.0004 0.0096 0.49
+0.0005 0.0095 0.49
+0.0006 0.0094 0.49
+0.0007 0.0093 0.49
+0.0008 0.0092 0.49
+0.0009 0.0091 0.49
+0.001 0.009 0.49
+0.0011 0.0089 0.49
+0.0012 0.0088 0.49
+0.0013 0.0087 0.49
+0.0014 0.0086 0.49
+0.0015 0.0085 0.49
+0.0016 0.0084 0.49
+0.0017 0.0083 0.49
+0.0018 0.0082 0.49
+0.0019 0.0081 0.49
+0.002 0.008 0.49
+0.0021 0.0079 0.49
+0.0022 0.0078 0.49
+0.0023 0.0077 0.49
+0.0024 0.0076 0.49
+0.0025 0.0075 0.49
+0.0026 0.0074 0.49
+0.0027 0.0073 0.49
+0.0028 0.0072 0.49
+0.0029 0.0071 0.49
+0.003 0.007 0.49
+0.0031 0.0069 0.49
+0.0032 0.0068 0.49
+0.0033 0.0067 0.49
+0.0034 0.0066 0.49
+0.0035 0.0065 0.49
+0.0036 0.0064 0.49
+0.0037 0.0063 0.49
+0.0038 0.0062 0.49
+0.0039 0.0061 0.49
+0.004 0.006 0.49
+0.0041 0.0059 0.49
+0.0042 0.0058 0.49
+0.0043 0.0057 0.49
+0.0044 0.0056 0.49
+0.0045 0.0055 0.49
+0.0046 0.0054 0.49
+0.0047 0.0053 0.49
+0.0048 0.0052 0.49
+0.0049 0.0051 0.49
+0.005 0.005 0.49
+0.0051 0.0049 0.49
+0.0052 0.0048 0.49
+0.0053 0.0047 0.49
+0.0054 0.0046 0.49
+0.0055 0.0045 0.49
+0.0056 0.0044 0.49
+0.0057 0.0043 0.49
+0.0058 0.0042 0.49
+0.0059 0.0041 0.49
+0.006 0.004 0.49
+0.0061 0.0039 0.49
+0.0062 0.0038 0.49
+0.0063 0.0037 0.49
+0.0064 0.0036 0.49
+0.0065 0.0035 0.49
+0.0066 0.0034 0.49
+0.0067 0.0033 0.49
+0.0068 0.0032 0.49
+0.0069 0.0031 0.49
+0.007 0.003 0.49
+0.0071 0.0029 0.49
+0.0072 0.0028 0.49
+0.0073 0.0027 0.49
+0.0074 0.0026 0.49
+0.0075 0.0025 0.49
+0.0076 0.0024 0.49
+0.0077 0.0023 0.49
+0.0078 0.0022 0.49
+0.0079 0.0021 0.49
+0.008 0.002 0.49
+0.0081 0.0019 0.49
+0.0082 0.0018 0.49
+0.0083 0.0017 0.49
+0.0084 0.0016 0.49
+0.0085 0.0015 0.49
+0.0086 0.0014 0.49
+0.0087 0.0013 0.49
+0.0088 0.0012 0.49
+0.0089 0.0011 0.49
+0.009 0.001 0.49
+0.0091 0.0009 0.49
+0.0092 0.0008 0.49
+0.0093 0.0007 0.49
+0.0094 0.0006 0.49
+0.0095 0.0005 0.49
+0.0096 0.0004 0.49
+0.0097 0.0003 0.49
+0.0098 0.0002 0.49
+0.0099 0.0001 0.49
+0 0.015 0.485
+0.00015 0.01485 0.485
+0.0003 0.0147 0.485
+0.00045 0.01455 0.485
+0.0006 0.0144 0.485
+0.00075 0.01425 0.485
+0.0009 0.0141 0.485
+0.00105 0.01395 0.485
+0.0012 0.0138 0.485
+0.00135 0.01365 0.485
+0.0015 0.0135 0.485
+0.00165 0.01335 0.485
+0.0018 0.0132 0.485
+0.00195 0.01305 0.485
+0.0021 0.0129 0.485
+0.00225 0.01275 0.485
+0.0024 0.0126 0.485
+0.00255 0.01245 0.485
+0.0027 0.0123 0.485
+0.00285 0.01215 0.485
+0.003 0.012 0.485
+0.00315 0.01185 0.485
+0.0033 0.0117 0.485
+0.00345 0.01155 0.485
+0.0036 0.0114 0.485
+0.00375 0.01125 0.485
+0.0039 0.0111 0.485
+0.00405 0.01095 0.485
+0.0042 0.0108 0.485
+0.00435 0.01065 0.485
+0.0045 0.0105 0.485
+0.00465 0.01035 0.485
+0.0048 0.0102 0.485
+0.00495 0.01005 0.485
+0.0051 0.0099 0.485
+0.00525 0.00975 0.485
+0.0054 0.0096 0.485
+0.00555 0.00945 0.485
+0.0057 0.0093 0.485
+0.00585 0.00915 0.485
+0.006 0.009 0.485
+0.00615 0.00885 0.485
+0.0063 0.0087 0.485
+0.00645 0.00855 0.485
+0.0066 0.0084 0.485
+0.00675 0.00825 0.485
+0.0069 0.0081 0.485
+0.00705 0.00795 0.485
+0.0072 0.0078 0.485
+0.00735 0.00765 0.485
+0.0075 0.0075 0.485
+0.00765 0.00735 0.485
+0.0078 0.0072 0.485
+0.00795 0.00705 0.485
+0.0081 0.0069 0.485
+0.00825 0.00675 0.485
+0.0084 0.0066 0.485
+0.00855 0.00645 0.485
+0.0087 0.0063 0.485
+0.00885 0.00615 0.485
+0.009 0.006 0.485
+0.00915 0.00585 0.485
+0.0093 0.0057 0.485
+0.00945 0.00555 0.485
+0.0096 0.0054 0.485
+0.00975 0.00525 0.485
+0.0099 0.0051 0.485
+0.01005 0.00495 0.485
+0.0102 0.0048 0.485
+0.01035 0.00465 0.485
+0.0105 0.0045 0.485
+0.01065 0.00435 0.485
+0.0108 0.0042 0.485
+0.01095 0.00405 0.485
+0.0111 0.0039 0.485
+0.01125 0.00375 0.485
+0.0114 0.0036 0.485
+0.01155 0.00345 0.485
+0.0117 0.0033 0.485
+0.01185 0.00315 0.485
+0.012 0.003 0.485
+0.01215 0.00285 0.485
+0.0123 0.0027 0.485
+0.01245 0.00255 0.485
+0.0126 0.0024 0.485
+0.01275 0.00225 0.485
+0.0129 0.0021 0.485
+0.01305 0.00195 0.485
+0.0132 0.0018 0.485
+0.01335 0.00165 0.485
+0.0135 0.0015 0.485
+0.01365 0.00135 0.485
+0.0138 0.0012 0.485
+0.01395 0.00105 0.485
+0.0141 0.0009 0.485
+0.01425 0.00075 0.485
+0.0144 0.0006 0.485
+0.01455 0.00045 0.485
+0.0147 0.0003 0.485
+0.01485 0.00015 0.485
+0 0.02 0.48
+0.0002 0.0198 0.48
+0.0004 0.0196 0.48
+0.0006 0.0194 0.48
+0.0008 0.0192 0.48
+0.001 0.019 0.48
+0.0012 0.0188 0.48
+0.0014 0.0186 0.48
+0.0016 0.0184 0.48
+0.0018 0.0182 0.48
+0.002 0.018 0.48
+0.0022 0.0178 0.48
+0.0024 0.0176 0.48
+0.0026 0.0174 0.48
+0.0028 0.0172 0.48
+0.003 0.017 0.48
+0.0032 0.0168 0.48
+0.0034 0.0166 0.48
+0.0036 0.0164 0.48
+0.0038 0.0162 0.48
+0.004 0.016 0.48
+0.0042 0.0158 0.48
+0.0044 0.0156 0.48
+0.0046 0.0154 0.48
+0.0048 0.0152 0.48
+0.005 0.015 0.48
+0.0052 0.0148 0.48
+0.0054 0.0146 0.48
+0.0056 0.0144 0.48
+0.0058 0.0142 0.48
+0.006 0.014 0.48
+0.0062 0.0138 0.48
+0.0064 0.0136 0.48
+0.0066 0.0134 0.48
+0.0068 0.0132 0.48
+0.007 0.013 0.48
+0.0072 0.0128 0.48
+0.0074 0.0126 0.48
+0.0076 0.0124 0.48
+0.0078 0.0122 0.48
+0.008 0.012 0.48
+0.0082 0.0118 0.48
+0.0084 0.0116 0.48
+0.0086 0.0114 0.48
+0.0088 0.0112 0.48
+0.009 0.011 0.48
+0.0092 0.0108 0.48
+0.0094 0.0106 0.48
+0.0096 0.0104 0.48
+0.0098 0.0102 0.48
+0.01 0.01 0.48
+0.0102 0.0098 0.48
+0.0104 0.0096 0.48
+0.0106 0.0094 0.48
+0.0108 0.0092 0.48
+0.011 0.009 0.48
+0.0112 0.0088 0.48
+0.0114 0.0086 0.48
+0.0116 0.0084 0.48
+0.0118 0.0082 0.48
+0.012 0.008 0.48
+0.0122 0.0078 0.48
+0.0124 0.0076 0.48
+0.0126 0.0074 0.48
+0.0128 0.0072 0.48
+0.013 0.007 0.48
+0.0132 0.0068 0.48
+0.0134 0.0066 0.48
+0.0136 0.0064 0.48
+0.0138 0.0062 0.48
+0.014 0.006 0.48
+0.0142 0.0058 0.48
+0.0144 0.0056 0.48
+0.0146 0.0054 0.48
+0.0148 0.0052 0.48
+0.015 0.005 0.48
+0.0152 0.0048 0.48
+0.0154 0.0046 0.48
+0.0156 0.0044 0.48
+0.0158 0.0042 0.48
+0.016 0.004 0.48
+0.0162 0.0038 0.48
+0.0164 0.0036 0.48
+0.0166 0.0034 0.48
+0.0168 0.0032 0.48
+0.017 0.003 0.48
+0.0172 0.0028 0.48
+0.0174 0.0026 0.48
+0.0176 0.0024 0.48
+0.0178 0.0022 0.48
+0.018 0.002 0.48
+0.0182 0.0018 0.48
+0.0184 0.0016 0.48
+0.0186 0.0014 0.48
+0.0188 0.0012 0.48
+0.019 0.001 0.48
+0.0192 0.0008 0.48
+0.0194 0.0006 0.48
+0.0196 0.0004 0.48
+0.0198 0.0002 0.48
+0 0.025 0.475
+0.00025 0.02475 0.475
+0.0005 0.0245 0.475
+0.00075 0.02425 0.475
+0.001 0.024 0.475
+0.00125 0.02375 0.475
+0.0015 0.0235 0.475
+0.00175 0.02325 0.475
+0.002 0.023 0.475
+0.00225 0.02275 0.475
+0.0025 0.0225 0.475
+0.00275 0.02225 0.475
+0.003 0.022 0.475
+0.00325 0.02175 0.475
+0.0035 0.0215 0.475
+0.00375 0.02125 0.475
+0.004 0.021 0.475
+0.00425 0.02075 0.475
+0.0045 0.0205 0.475
+0.00475 0.02025 0.475
+0.005 0.02 0.475
+0.00525 0.01975 0.475
+0.0055 0.0195 0.475
+0.00575 0.01925 0.475
+0.006 0.019 0.475
+0.00625 0.01875 0.475
+0.0065 0.0185 0.475
+0.00675 0.01825 0.475
+0.007 0.018 0.475
+0.00725 0.01775 0.475
+0.0075 0.0175 0.475
+0.00775 0.01725 0.475
+0.008 0.017 0.475
+0.00825 0.01675 0.475
+0.0085 0.0165 0.475
+0.00875 0.01625 0.475
+0.009 0.016 0.475
+0.00925 0.01575 0.475
+0.0095 0.0155 0.475
+0.00975 0.01525 0.475
+0.01 0.015 0.475
+0.01025 0.01475 0.475
+0.0105 0.0145 0.475
+0.01075 0.01425 0.475
+0.011 0.014 0.475
+0.01125 0.01375 0.475
+0.0115 0.0135 0.475
+0.01175 0.01325 0.475
+0.012 0.013 0.475
+0.01225 0.01275 0.475
+0.0125 0.0125 0.475
+0.01275 0.01225 0.475
+0.013 0.012 0.475
+0.01325 0.01175 0.475
+0.0135 0.0115 0.475
+0.01375 0.01125 0.475
+0.014 0.011 0.475
+0.01425 0.01075 0.475
+0.0145 0.0105 0.475
+0.01475 0.01025 0.475
+0.015 0.01 0.475
+0.01525 0.00975 0.475
+0.0155 0.0095 0.475
+0.01575 0.00925 0.475
+0.016 0.009 0.475
+0.01625 0.00875 0.475
+0.0165 0.0085 0.475
+0.01675 0.00825 0.475
+0.017 0.008 0.475
+0.01725 0.00775 0.475
+0.0175 0.0075 0.475
+0.01775 0.00725 0.475
+0.018 0.007 0.475
+0.01825 0.00675 0.475
+0.0185 0.0065 0.475
+0.01875 0.00625 0.475
+0.019 0.006 0.475
+0.01925 0.00575 0.475
+0.0195 0.0055 0.475
+0.01975 0.00525 0.475
+0.02 0.005 0.475
+0.02025 0.00475 0.475
+0.0205 0.0045 0.475
+0.02075 0.00425 0.475
+0.021 0.004 0.475
+0.02125 0.00375 0.475
+0.0215 0.0035 0.475
+0.02175 0.00325 0.475
+0.022 0.003 0.475
+0.02225 0.00275 0.475
+0.0225 0.0025 0.475
+0.02275 0.00225 0.475
+0.023 0.002 0.475
+0.02325 0.00175 0.475
+0.0235 0.0015 0.475
+0.02375 0.00125 0.475
+0.024 0.001 0.475
+0.02425 0.00075 0.475
+0.0245 0.0005 0.475
+0.02475 0.00025 0.475
+0 0.03 0.47
+0.0003 0.0297 0.47
+0.0006 0.0294 0.47
+0.0009 0.0291 0.47
+0.0012 0.0288 0.47
+0.0015 0.0285 0.47
+0.0018 0.0282 0.47
+0.0021 0.0279 0.47
+0.0024 0.0276 0.47
+0.0027 0.0273 0.47
+0.003 0.027 0.47
+0.0033 0.0267 0.47
+0.0036 0.0264 0.47
+0.0039 0.0261 0.47
+0.0042 0.0258 0.47
+0.0045 0.0255 0.47
+0.0048 0.0252 0.47
+0.0051 0.0249 0.47
+0.0054 0.0246 0.47
+0.0057 0.0243 0.47
+0.006 0.024 0.47
+0.0063 0.0237 0.47
+0.0066 0.0234 0.47
+0.0069 0.0231 0.47
+0.0072 0.0228 0.47
+0.0075 0.0225 0.47
+0.0078 0.0222 0.47
+0.0081 0.0219 0.47
+0.0084 0.0216 0.47
+0.0087 0.0213 0.47
+0.009 0.021 0.47
+0.0093 0.0207 0.47
+0.0096 0.0204 0.47
+0.0099 0.0201 0.47
+0.0102 0.0198 0.47
+0.0105 0.0195 0.47
+0.0108 0.0192 0.47
+0.0111 0.0189 0.47
+0.0114 0.0186 0.47
+0.0117 0.0183 0.47
+0.012 0.018 0.47
+0.0123 0.0177 0.47
+0.0126 0.0174 0.47
+0.0129 0.0171 0.47
+0.0132 0.0168 0.47
+0.0135 0.0165 0.47
+0.0138 0.0162 0.47
+0.0141 0.0159 0.47
+0.0144 0.0156 0.47
+0.0147 0.0153 0.47
+0.015 0.015 0.47
+0.0153 0.0147 0.47
+0.0156 0.0144 0.47
+0.0159 0.0141 0.47
+0.0162 0.0138 0.47
+0.0165 0.0135 0.47
+0.0168 0.0132 0.47
+0.0171 0.0129 0.47
+0.0174 0.0126 0.47
+0.0177 0.0123 0.47
+0.018 0.012 0.47
+0.0183 0.0117 0.47
+0.0186 0.0114 0.47
+0.0189 0.0111 0.47
+0.0192 0.0108 0.47
+0.0195 0.0105 0.47
+0.0198 0.0102 0.47
+0.0201 0.0099 0.47
+0.0204 0.0096 0.47
+0.0207 0.0093 0.47
+0.021 0.009 0.47
+0.0213 0.0087 0.47
+0.0216 0.0084 0.47
+0.0219 0.0081 0.47
+0.0222 0.0078 0.47
+0.0225 0.0075 0.47
+0.0228 0.0072 0.47
+0.0231 0.0069 0.47
+0.0234 0.0066 0.47
+0.0237 0.0063 0.47
+0.024 0.006 0.47
+0.0243 0.0057 0.47
+0.0246 0.0054 0.47
+0.0249 0.0051 0.47
+0.0252 0.0048 0.47
+0.0255 0.0045 0.47
+0.0258 0.0042 0.47
+0.0261 0.0039 0.47
+0.0264 0.0036 0.47
+0.0267 0.0033 0.47
+0.027 0.003 0.47
+0.0273 0.0027 0.47
+0.0276 0.0024 0.47
+0.0279 0.0021 0.47
+0.0282 0.0018 0.47
+0.0285 0.0015 0.47
+0.0288 0.0012 0.47
+0.0291 0.0009 0.47
+0.0294 0.0006 0.47
+0.0297 0.0003 0.47
+0 0.035 0.465
+0.00035 0.03465 0.465
+0.0007 0.0343 0.465
+0.00105 0.03395 0.465
+0.0014 0.0336 0.465
+0.00175 0.03325 0.465
+0.0021 0.0329 0.465
+0.00245 0.03255 0.465
+0.0028 0.0322 0.465
+0.00315 0.03185 0.465
+0.0035 0.0315 0.465
+0.00385 0.03115 0.465
+0.0042 0.0308 0.465
+0.00455 0.03045 0.465
+0.0049 0.0301 0.465
+0.00525 0.02975 0.465
+0.0056 0.0294 0.465
+0.00595 0.02905 0.465
+0.0063 0.0287 0.465
+0.00665 0.02835 0.465
+0.007 0.028 0.465
+0.00735 0.02765 0.465
+0.0077 0.0273 0.465
+0.00805 0.02695 0.465
+0.0084 0.0266 0.465
+0.00875 0.02625 0.465
+0.0091 0.0259 0.465
+0.00945 0.02555 0.465
+0.0098 0.0252 0.465
+0.01015 0.02485 0.465
+0.0105 0.0245 0.465
+0.01085 0.02415 0.465
+0.0112 0.0238 0.465
+0.01155 0.02345 0.465
+0.0119 0.0231 0.465
+0.01225 0.02275 0.465
+0.0126 0.0224 0.465
+0.01295 0.02205 0.465
+0.0133 0.0217 0.465
+0.01365 0.02135 0.465
+0.014 0.021 0.465
+0.01435 0.02065 0.465
+0.0147 0.0203 0.465
+0.01505 0.01995 0.465
+0.0154 0.0196 0.465
+0.01575 0.01925 0.465
+0.0161 0.0189 0.465
+0.01645 0.01855 0.465
+0.0168 0.0182 0.465
+0.01715 0.01785 0.465
+0.0175 0.0175 0.465
+0.01785 0.01715 0.465
+0.0182 0.0168 0.465
+0.01855 0.01645 0.465
+0.0189 0.0161 0.465
+0.01925 0.01575 0.465
+0.0196 0.0154 0.465
+0.01995 0.01505 0.465
+0.0203 0.0147 0.465
+0.02065 0.01435 0.465
+0.021 0.014 0.465
+0.02135 0.01365 0.465
+0.0217 0.0133 0.465
+0.02205 0.01295 0.465
+0.0224 0.0126 0.465
+0.02275 0.01225 0.465
+0.0231 0.0119 0.465
+0.02345 0.01155 0.465
+0.0238 0.0112 0.465
+0.02415 0.01085 0.465
+0.0245 0.0105 0.465
+0.02485 0.01015 0.465
+0.0252 0.0098 0.465
+0.02555 0.00945 0.465
+0.0259 0.0091 0.465
+0.02625 0.00875 0.465
+0.0266 0.0084 0.465
+0.02695 0.00805 0.465
+0.0273 0.0077 0.465
+0.02765 0.00735 0.465
+0.028 0.007 0.465
+0.02835 0.00665 0.465
+0.0287 0.0063 0.465
+0.02905 0.00595 0.465
+0.0294 0.0056 0.465
+0.02975 0.00525 0.465
+0.0301 0.0049 0.465
+0.03045 0.00455 0.465
+0.0308 0.0042 0.465
+0.03115 0.00385 0.465
+0.0315 0.0035 0.465
+0.03185 0.00315 0.465
+0.0322 0.0028 0.465
+0.03255 0.00245 0.465
+0.0329 0.0021 0.465
+0.03325 0.00175 0.465
+0.0336 0.0014 0.465
+0.03395 0.00105 0.465
+0.0343 0.0007 0.465
+0.03465 0.00035 0.465
+0 0.04 0.46
+0.0004 0.0396 0.46
+0.0008 0.0392 0.46
+0.0012 0.0388 0.46
+0.0016 0.0384 0.46
+0.002 0.038 0.46
+0.0024 0.0376 0.46
+0.0028 0.0372 0.46
+0.0032 0.0368 0.46
+0.0036 0.0364 0.46
+0.004 0.036 0.46
+0.0044 0.0356 0.46
+0.0048 0.0352 0.46
+0.0052 0.0348 0.46
+0.0056 0.0344 0.46
+0.006 0.034 0.46
+0.0064 0.0336 0.46
+0.0068 0.0332 0.46
+0.0072 0.0328 0.46
+0.0076 0.0324 0.46
+0.008 0.032 0.46
+0.0084 0.0316 0.46
+0.0088 0.0312 0.46
+0.0092 0.0308 0.46
+0.0096 0.0304 0.46
+0.01 0.03 0.46
+0.0104 0.0296 0.46
+0.0108 0.0292 0.46
+0.0112 0.0288 0.46
+0.0116 0.0284 0.46
+0.012 0.028 0.46
+0.0124 0.0276 0.46
+0.0128 0.0272 0.46
+0.0132 0.0268 0.46
+0.0136 0.0264 0.46
+0.014 0.026 0.46
+0.0144 0.0256 0.46
+0.0148 0.0252 0.46
+0.0152 0.0248 0.46
+0.0156 0.0244 0.46
+0.016 0.024 0.46
+0.0164 0.0236 0.46
+0.0168 0.0232 0.46
+0.0172 0.0228 0.46
+0.0176 0.0224 0.46
+0.018 0.022 0.46
+0.0184 0.0216 0.46
+0.0188 0.0212 0.46
+0.0192 0.0208 0.46
+0.0196 0.0204 0.46
+0.02 0.02 0.46
+0.0204 0.0196 0.46
+0.0208 0.0192 0.46
+0.0212 0.0188 0.46
+0.0216 0.0184 0.46
+0.022 0.018 0.46
+0.0224 0.0176 0.46
+0.0228 0.0172 0.46
+0.0232 0.0168 0.46
+0.0236 0.0164 0.46
+0.024 0.016 0.46
+0.0244 0.0156 0.46
+0.0248 0.0152 0.46
+0.0252 0.0148 0.46
+0.0256 0.0144 0.46
+0.026 0.014 0.46
+0.0264 0.0136 0.46
+0.0268 0.0132 0.46
+0.0272 0.0128 0.46
+0.0276 0.0124 0.46
+0.028 0.012 0.46
+0.0284 0.0116 0.46
+0.0288 0.0112 0.46
+0.0292 0.0108 0.46
+0.0296 0.0104 0.46
+0.03 0.01 0.46
+0.0304 0.0096 0.46
+0.0308 0.0092 0.46
+0.0312 0.0088 0.46
+0.0316 0.0084 0.46
+0.032 0.008 0.46
+0.0324 0.0076 0.46
+0.0328 0.0072 0.46
+0.0332 0.0068 0.46
+0.0336 0.0064 0.46
+0.034 0.006 0.46
+0.0344 0.0056 0.46
+0.0348 0.0052 0.46
+0.0352 0.0048 0.46
+0.0356 0.0044 0.46
+0.036 0.004 0.46
+0.0364 0.0036 0.46
+0.0368 0.0032 0.46
+0.0372 0.0028 0.46
+0.0376 0.0024 0.46
+0.038 0.002 0.46
+0.0384 0.0016 0.46
+0.0388 0.0012 0.46
+0.0392 0.0008 0.46
+0.0396 0.0004 0.46
+0 0.045 0.455
+0.00045 0.04455 0.455
+0.0009 0.0441 0.455
+0.00135 0.04365 0.455
+0.0018 0.0432 0.455
+0.00225 0.04275 0.455
+0.0027 0.0423 0.455
+0.00315 0.04185 0.455
+0.0036 0.0414 0.455
+0.00405 0.04095 0.455
+0.0045 0.0405 0.455
+0.00495 0.04005 0.455
+0.0054 0.0396 0.455
+0.00585 0.03915 0.455
+0.0063 0.0387 0.455
+0.00675 0.03825 0.455
+0.0072 0.0378 0.455
+0.00765 0.03735 0.455
+0.0081 0.0369 0.455
+0.00855 0.03645 0.455
+0.009 0.036 0.455
+0.00945 0.03555 0.455
+0.0099 0.0351 0.455
+0.01035 0.03465 0.455
+0.0108 0.0342 0.455
+0.01125 0.03375 0.455
+0.0117 0.0333 0.455
+0.01215 0.03285 0.455
+0.0126 0.0324 0.455
+0.01305 0.03195 0.455
+0.0135 0.0315 0.455
+0.01395 0.03105 0.455
+0.0144 0.0306 0.455
+0.01485 0.03015 0.455
+0.0153 0.0297 0.455
+0.01575 0.02925 0.455
+0.0162 0.0288 0.455
+0.01665 0.02835 0.455
+0.0171 0.0279 0.455
+0.01755 0.02745 0.455
+0.018 0.027 0.455
+0.01845 0.02655 0.455
+0.0189 0.0261 0.455
+0.01935 0.02565 0.455
+0.0198 0.0252 0.455
+0.02025 0.02475 0.455
+0.0207 0.0243 0.455
+0.02115 0.02385 0.455
+0.0216 0.0234 0.455
+0.02205 0.02295 0.455
+0.0225 0.0225 0.455
+0.02295 0.02205 0.455
+0.0234 0.0216 0.455
+0.02385 0.02115 0.455
+0.0243 0.0207 0.455
+0.02475 0.02025 0.455
+0.0252 0.0198 0.455
+0.02565 0.01935 0.455
+0.0261 0.0189 0.455
+0.02655 0.01845 0.455
+0.027 0.018 0.455
+0.02745 0.01755 0.455
+0.0279 0.0171 0.455
+0.02835 0.01665 0.455
+0.0288 0.0162 0.455
+0.02925 0.01575 0.455
+0.0297 0.0153 0.455
+0.03015 0.01485 0.455
+0.0306 0.0144 0.455
+0.03105 0.01395 0.455
+0.0315 0.0135 0.455
+0.03195 0.01305 0.455
+0.0324 0.0126 0.455
+0.03285 0.01215 0.455
+0.0333 0.0117 0.455
+0.03375 0.01125 0.455
+0.0342 0.0108 0.455
+0.03465 0.01035 0.455
+0.0351 0.0099 0.455
+0.03555 0.00945 0.455
+0.036 0.009 0.455
+0.03645 0.00855 0.455
+0.0369 0.0081 0.455
+0.03735 0.00765 0.455
+0.0378 0.0072 0.455
+0.03825 0.00675 0.455
+0.0387 0.0063 0.455
+0.03915 0.00585 0.455
+0.0396 0.0054 0.455
+0.04005 0.00495 0.455
+0.0405 0.0045 0.455
+0.04095 0.00405 0.455
+0.0414 0.0036 0.455
+0.04185 0.00315 0.455
+0.0423 0.0027 0.455
+0.04275 0.00225 0.455
+0.0432 0.0018 0.455
+0.04365 0.00135 0.455
+0.0441 0.0009 0.455
+0.04455 0.00045 0.455
+0 0.05 0.45
+0.0005 0.0495 0.45
+0.001 0.049 0.45
+0.0015 0.0485 0.45
+0.002 0.048 0.45
+0.0025 0.0475 0.45
+0.003 0.047 0.45
+0.0035 0.0465 0.45
+0.004 0.046 0.45
+0.0045 0.0455 0.45
+0.005 0.045 0.45
+0.0055 0.0445 0.45
+0.006 0.044 0.45
+0.0065 0.0435 0.45
+0.007 0.043 0.45
+0.0075 0.0425 0.45
+0.008 0.042 0.45
+0.0085 0.0415 0.45
+0.009 0.041 0.45
+0.0095 0.0405 0.45
+0.01 0.04 0.45
+0.0105 0.0395 0.45
+0.011 0.039 0.45
+0.0115 0.0385 0.45
+0.012 0.038 0.45
+0.0125 0.0375 0.45
+0.013 0.037 0.45
+0.0135 0.0365 0.45
+0.014 0.036 0.45
+0.0145 0.0355 0.45
+0.015 0.035 0.45
+0.0155 0.0345 0.45
+0.016 0.034 0.45
+0.0165 0.0335 0.45
+0.017 0.033 0.45
+0.0175 0.0325 0.45
+0.018 0.032 0.45
+0.0185 0.0315 0.45
+0.019 0.031 0.45
+0.0195 0.0305 0.45
+0.02 0.03 0.45
+0.0205 0.0295 0.45
+0.021 0.029 0.45
+0.0215 0.0285 0.45
+0.022 0.028 0.45
+0.0225 0.0275 0.45
+0.023 0.027 0.45
+0.0235 0.0265 0.45
+0.024 0.026 0.45
+0.0245 0.0255 0.45
+0.025 0.025 0.45
+0.0255 0.0245 0.45
+0.026 0.024 0.45
+0.0265 0.0235 0.45
+0.027 0.023 0.45
+0.0275 0.0225 0.45
+0.028 0.022 0.45
+0.0285 0.0215 0.45
+0.029 0.021 0.45
+0.0295 0.0205 0.45
+0.03 0.02 0.45
+0.0305 0.0195 0.45
+0.031 0.019 0.45
+0.0315 0.0185 0.45
+0.032 0.018 0.45
+0.0325 0.0175 0.45
+0.033 0.017 0.45
+0.0335 0.0165 0.45
+0.034 0.016 0.45
+0.0345 0.0155 0.45
+0.035 0.015 0.45
+0.0355 0.0145 0.45
+0.036 0.014 0.45
+0.0365 0.0135 0.45
+0.037 0.013 0.45
+0.0375 0.0125 0.45
+0.038 0.012 0.45
+0.0385 0.0115 0.45
+0.039 0.011 0.45
+0.0395 0.0105 0.45
+0.04 0.01 0.45
+0.0405 0.0095 0.45
+0.041 0.009 0.45
+0.0415 0.0085 0.45
+0.042 0.008 0.45
+0.0425 0.0075 0.45
+0.043 0.007 0.45
+0.0435 0.0065 0.45
+0.044 0.006 0.45
+0.0445 0.0055 0.45
+0.045 0.005 0.45
+0.0455 0.0045 0.45
+0.046 0.004 0.45
+0.0465 0.0035 0.45
+0.047 0.003 0.45
+0.0475 0.0025 0.45
+0.048 0.002 0.45
+0.0485 0.0015 0.45
+0.049 0.001 0.45
+0.0495 0.0005 0.45
+0 0.055 0.445
+0.00055 0.05445 0.445
+0.0011 0.0539 0.445
+0.00165 0.05335 0.445
+0.0022 0.0528 0.445
+0.00275 0.05225 0.445
+0.0033 0.0517 0.445
+0.00385 0.05115 0.445
+0.0044 0.0506 0.445
+0.00495 0.05005 0.445
+0.0055 0.0495 0.445
+0.00605 0.04895 0.445
+0.0066 0.0484 0.445
+0.00715 0.04785 0.445
+0.0077 0.0473 0.445
+0.00825 0.04675 0.445
+0.0088 0.0462 0.445
+0.00935 0.04565 0.445
+0.0099 0.0451 0.445
+0.01045 0.04455 0.445
+0.011 0.044 0.445
+0.01155 0.04345 0.445
+0.0121 0.0429 0.445
+0.01265 0.04235 0.445
+0.0132 0.0418 0.445
+0.01375 0.04125 0.445
+0.0143 0.0407 0.445
+0.01485 0.04015 0.445
+0.0154 0.0396 0.445
+0.01595 0.03905 0.445
+0.0165 0.0385 0.445
+0.01705 0.03795 0.445
+0.0176 0.0374 0.445
+0.01815 0.03685 0.445
+0.0187 0.0363 0.445
+0.01925 0.03575 0.445
+0.0198 0.0352 0.445
+0.02035 0.03465 0.445
+0.0209 0.0341 0.445
+0.02145 0.03355 0.445
+0.022 0.033 0.445
+0.02255 0.03245 0.445
+0.0231 0.0319 0.445
+0.02365 0.03135 0.445
+0.0242 0.0308 0.445
+0.02475 0.03025 0.445
+0.0253 0.0297 0.445
+0.02585 0.02915 0.445
+0.0264 0.0286 0.445
+0.02695 0.02805 0.445
+0.0275 0.0275 0.445
+0.02805 0.02695 0.445
+0.0286 0.0264 0.445
+0.02915 0.02585 0.445
+0.0297 0.0253 0.445
+0.03025 0.02475 0.445
+0.0308 0.0242 0.445
+0.03135 0.02365 0.445
+0.0319 0.0231 0.445
+0.03245 0.02255 0.445
+0.033 0.022 0.445
+0.03355 0.02145 0.445
+0.0341 0.0209 0.445
+0.03465 0.02035 0.445
+0.0352 0.0198 0.445
+0.03575 0.01925 0.445
+0.0363 0.0187 0.445
+0.03685 0.01815 0.445
+0.0374 0.0176 0.445
+0.03795 0.01705 0.445
+0.0385 0.0165 0.445
+0.03905 0.01595 0.445
+0.0396 0.0154 0.445
+0.04015 0.01485 0.445
+0.0407 0.0143 0.445
+0.04125 0.01375 0.445
+0.0418 0.0132 0.445
+0.04235 0.01265 0.445
+0.0429 0.0121 0.445
+0.04345 0.01155 0.445
+0.044 0.011 0.445
+0.04455 0.01045 0.445
+0.0451 0.0099 0.445
+0.04565 0.00935 0.445
+0.0462 0.0088 0.445
+0.04675 0.00825 0.445
+0.0473 0.0077 0.445
+0.04785 0.00715 0.445
+0.0484 0.0066 0.445
+0.04895 0.00605 0.445
+0.0495 0.0055 0.445
+0.05005 0.00495 0.445
+0.0506 0.0044 0.445
+0.05115 0.00385 0.445
+0.0517 0.0033 0.445
+0.05225 0.00275 0.445
+0.0528 0.0022 0.445
+0.05335 0.00165 0.445
+0.0539 0.0011 0.445
+0.05445 0.00055 0.445
+0 0.06 0.44
+0.0006 0.0594 0.44
+0.0012 0.0588 0.44
+0.0018 0.0582 0.44
+0.0024 0.0576 0.44
+0.003 0.057 0.44
+0.0036 0.0564 0.44
+0.0042 0.0558 0.44
+0.0048 0.0552 0.44
+0.0054 0.0546 0.44
+0.006 0.054 0.44
+0.0066 0.0534 0.44
+0.0072 0.0528 0.44
+0.0078 0.0522 0.44
+0.0084 0.0516 0.44
+0.009 0.051 0.44
+0.0096 0.0504 0.44
+0.0102 0.0498 0.44
+0.0108 0.0492 0.44
+0.0114 0.0486 0.44
+0.012 0.048 0.44
+0.0126 0.0474 0.44
+0.0132 0.0468 0.44
+0.0138 0.0462 0.44
+0.0144 0.0456 0.44
+0.015 0.045 0.44
+0.0156 0.0444 0.44
+0.0162 0.0438 0.44
+0.0168 0.0432 0.44
+0.0174 0.0426 0.44
+0.018 0.042 0.44
+0.0186 0.0414 0.44
+0.0192 0.0408 0.44
+0.0198 0.0402 0.44
+0.0204 0.0396 0.44
+0.021 0.039 0.44
+0.0216 0.0384 0.44
+0.0222 0.0378 0.44
+0.0228 0.0372 0.44
+0.0234 0.0366 0.44
+0.024 0.036 0.44
+0.0246 0.0354 0.44
+0.0252 0.0348 0.44
+0.0258 0.0342 0.44
+0.0264 0.0336 0.44
+0.027 0.033 0.44
+0.0276 0.0324 0.44
+0.0282 0.0318 0.44
+0.0288 0.0312 0.44
+0.0294 0.0306 0.44
+0.03 0.03 0.44
+0.0306 0.0294 0.44
+0.0312 0.0288 0.44
+0.0318 0.0282 0.44
+0.0324 0.0276 0.44
+0.033 0.027 0.44
+0.0336 0.0264 0.44
+0.0342 0.0258 0.44
+0.0348 0.0252 0.44
+0.0354 0.0246 0.44
+0.036 0.024 0.44
+0.0366 0.0234 0.44
+0.0372 0.0228 0.44
+0.0378 0.0222 0.44
+0.0384 0.0216 0.44
+0.039 0.021 0.44
+0.0396 0.0204 0.44
+0.0402 0.0198 0.44
+0.0408 0.0192 0.44
+0.0414 0.0186 0.44
+0.042 0.018 0.44
+0.0426 0.0174 0.44
+0.0432 0.0168 0.44
+0.0438 0.0162 0.44
+0.0444 0.0156 0.44
+0.045 0.015 0.44
+0.0456 0.0144 0.44
+0.0462 0.0138 0.44
+0.0468 0.0132 0.44
+0.0474 0.0126 0.44
+0.048 0.012 0.44
+0.0486 0.0114 0.44
+0.0492 0.0108 0.44
+0.0498 0.0102 0.44
+0.0504 0.0096 0.44
+0.051 0.009 0.44
+0.0516 0.0084 0.44
+0.0522 0.0078 0.44
+0.0528 0.0072 0.44
+0.0534 0.0066 0.44
+0.054 0.006 0.44
+0.0546 0.0054 0.44
+0.0552 0.0048 0.44
+0.0558 0.0042 0.44
+0.0564 0.0036 0.44
+0.057 0.003 0.44
+0.0576 0.0024 0.44
+0.0582 0.0018 0.44
+0.0588 0.0012 0.44
+0.0594 0.0006 0.44
+0 0.065 0.435
+0.00065 0.06435 0.435
+0.0013 0.0637 0.435
+0.00195 0.06305 0.435
+0.0026 0.0624 0.435
+0.00325 0.06175 0.435
+0.0039 0.0611 0.435
+0.00455 0.06045 0.435
+0.0052 0.0598 0.435
+0.00585 0.05915 0.435
+0.0065 0.0585 0.435
+0.00715 0.05785 0.435
+0.0078 0.0572 0.435
+0.00845 0.05655 0.435
+0.0091 0.0559 0.435
+0.00975 0.05525 0.435
+0.0104 0.0546 0.435
+0.01105 0.05395 0.435
+0.0117 0.0533 0.435
+0.01235 0.05265 0.435
+0.013 0.052 0.435
+0.01365 0.05135 0.435
+0.0143 0.0507 0.435
+0.01495 0.05005 0.435
+0.0156 0.0494 0.435
+0.01625 0.04875 0.435
+0.0169 0.0481 0.435
+0.01755 0.04745 0.435
+0.0182 0.0468 0.435
+0.01885 0.04615 0.435
+0.0195 0.0455 0.435
+0.02015 0.04485 0.435
+0.0208 0.0442 0.435
+0.02145 0.04355 0.435
+0.0221 0.0429 0.435
+0.02275 0.04225 0.435
+0.0234 0.0416 0.435
+0.02405 0.04095 0.435
+0.0247 0.0403 0.435
+0.02535 0.03965 0.435
+0.026 0.039 0.435
+0.02665 0.03835 0.435
+0.0273 0.0377 0.435
+0.02795 0.03705 0.435
+0.0286 0.0364 0.435
+0.02925 0.03575 0.435
+0.0299 0.0351 0.435
+0.03055 0.03445 0.435
+0.0312 0.0338 0.435
+0.03185 0.03315 0.435
+0.0325 0.0325 0.435
+0.03315 0.03185 0.435
+0.0338 0.0312 0.435
+0.03445 0.03055 0.435
+0.0351 0.0299 0.435
+0.03575 0.02925 0.435
+0.0364 0.0286 0.435
+0.03705 0.02795 0.435
+0.0377 0.0273 0.435
+0.03835 0.02665 0.435
+0.039 0.026 0.435
+0.03965 0.02535 0.435
+0.0403 0.0247 0.435
+0.04095 0.02405 0.435
+0.0416 0.0234 0.435
+0.04225 0.02275 0.435
+0.0429 0.0221 0.435
+0.04355 0.02145 0.435
+0.0442 0.0208 0.435
+0.04485 0.02015 0.435
+0.0455 0.0195 0.435
+0.04615 0.01885 0.435
+0.0468 0.0182 0.435
+0.04745 0.01755 0.435
+0.0481 0.0169 0.435
+0.04875 0.01625 0.435
+0.0494 0.0156 0.435
+0.05005 0.01495 0.435
+0.0507 0.0143 0.435
+0.05135 0.01365 0.435
+0.052 0.013 0.435
+0.05265 0.01235 0.435
+0.0533 0.0117 0.435
+0.05395 0.01105 0.435
+0.0546 0.0104 0.435
+0.05525 0.00975 0.435
+0.0559 0.0091 0.435
+0.05655 0.00845 0.435
+0.0572 0.0078 0.435
+0.05785 0.00715 0.435
+0.0585 0.0065 0.435
+0.05915 0.00585 0.435
+0.0598 0.0052 0.435
+0.06045 0.00455 0.435
+0.0611 0.0039 0.435
+0.06175 0.00325 0.435
+0.0624 0.0026 0.435
+0.06305 0.00195 0.435
+0.0637 0.0013 0.435
+0.06435 0.00065 0.435
+0 0.07 0.43
+0.0007 0.0693 0.43
+0.0014 0.0686 0.43
+0.0021 0.0679 0.43
+0.0028 0.0672 0.43
+0.0035 0.0665 0.43
+0.0042 0.0658 0.43
+0.0049 0.0651 0.43
+0.0056 0.0644 0.43
+0.0063 0.0637 0.43
+0.007 0.063 0.43
+0.0077 0.0623 0.43
+0.0084 0.0616 0.43
+0.0091 0.0609 0.43
+0.0098 0.0602 0.43
+0.0105 0.0595 0.43
+0.0112 0.0588 0.43
+0.0119 0.0581 0.43
+0.0126 0.0574 0.43
+0.0133 0.0567 0.43
+0.014 0.056 0.43
+0.0147 0.0553 0.43
+0.0154 0.0546 0.43
+0.0161 0.0539 0.43
+0.0168 0.0532 0.43
+0.0175 0.0525 0.43
+0.0182 0.0518 0.43
+0.0189 0.0511 0.43
+0.0196 0.0504 0.43
+0.0203 0.0497 0.43
+0.021 0.049 0.43
+0.0217 0.0483 0.43
+0.0224 0.0476 0.43
+0.0231 0.0469 0.43
+0.0238 0.0462 0.43
+0.0245 0.0455 0.43
+0.0252 0.0448 0.43
+0.0259 0.0441 0.43
+0.0266 0.0434 0.43
+0.0273 0.0427 0.43
+0.028 0.042 0.43
+0.0287 0.0413 0.43
+0.0294 0.0406 0.43
+0.0301 0.0399 0.43
+0.0308 0.0392 0.43
+0.0315 0.0385 0.43
+0.0322 0.0378 0.43
+0.0329 0.0371 0.43
+0.0336 0.0364 0.43
+0.0343 0.0357 0.43
+0.035 0.035 0.43
+0.0357 0.0343 0.43
+0.0364 0.0336 0.43
+0.0371 0.0329 0.43
+0.0378 0.0322 0.43
+0.0385 0.0315 0.43
+0.0392 0.0308 0.43
+0.0399 0.0301 0.43
+0.0406 0.0294 0.43
+0.0413 0.0287 0.43
+0.042 0.028 0.43
+0.0427 0.0273 0.43
+0.0434 0.0266 0.43
+0.0441 0.0259 0.43
+0.0448 0.0252 0.43
+0.0455 0.0245 0.43
+0.0462 0.0238 0.43
+0.0469 0.0231 0.43
+0.0476 0.0224 0.43
+0.0483 0.0217 0.43
+0.049 0.021 0.43
+0.0497 0.0203 0.43
+0.0504 0.0196 0.43
+0.0511 0.0189 0.43
+0.0518 0.0182 0.43
+0.0525 0.0175 0.43
+0.0532 0.0168 0.43
+0.0539 0.0161 0.43
+0.0546 0.0154 0.43
+0.0553 0.0147 0.43
+0.056 0.014 0.43
+0.0567 0.0133 0.43
+0.0574 0.0126 0.43
+0.0581 0.0119 0.43
+0.0588 0.0112 0.43
+0.0595 0.0105 0.43
+0.0602 0.0098 0.43
+0.0609 0.0091 0.43
+0.0616 0.0084 0.43
+0.0623 0.0077 0.43
+0.063 0.007 0.43
+0.0637 0.0063 0.43
+0.0644 0.0056 0.43
+0.0651 0.0049 0.43
+0.0658 0.0042 0.43
+0.0665 0.0035 0.43
+0.0672 0.0028 0.43
+0.0679 0.0021 0.43
+0.0686 0.0014 0.43
+0.0693 0.0007 0.43
+0 0.075 0.425
+0.00075 0.07425 0.425
+0.0015 0.0735 0.425
+0.00225 0.07275 0.425
+0.003 0.072 0.425
+0.00375 0.07125 0.425
+0.0045 0.0705 0.425
+0.00525 0.06975 0.425
+0.006 0.069 0.425
+0.00675 0.06825 0.425
+0.0075 0.0675 0.425
+0.00825 0.06675 0.425
+0.009 0.066 0.425
+0.00975 0.06525 0.425
+0.0105 0.0645 0.425
+0.01125 0.06375 0.425
+0.012 0.063 0.425
+0.01275 0.06225 0.425
+0.0135 0.0615 0.425
+0.01425 0.06075 0.425
+0.015 0.06 0.425
+0.01575 0.05925 0.425
+0.0165 0.0585 0.425
+0.01725 0.05775 0.425
+0.018 0.057 0.425
+0.01875 0.05625 0.425
+0.0195 0.0555 0.425
+0.02025 0.05475 0.425
+0.021 0.054 0.425
+0.02175 0.05325 0.425
+0.0225 0.0525 0.425
+0.02325 0.05175 0.425
+0.024 0.051 0.425
+0.02475 0.05025 0.425
+0.0255 0.0495 0.425
+0.02625 0.04875 0.425
+0.027 0.048 0.425
+0.02775 0.04725 0.425
+0.0285 0.0465 0.425
+0.02925 0.04575 0.425
+0.03 0.045 0.425
+0.03075 0.04425 0.425
+0.0315 0.0435 0.425
+0.03225 0.04275 0.425
+0.033 0.042 0.425
+0.03375 0.04125 0.425
+0.0345 0.0405 0.425
+0.03525 0.03975 0.425
+0.036 0.039 0.425
+0.03675 0.03825 0.425
+0.0375 0.0375 0.425
+0.03825 0.03675 0.425
+0.039 0.036 0.425
+0.03975 0.03525 0.425
+0.0405 0.0345 0.425
+0.04125 0.03375 0.425
+0.042 0.033 0.425
+0.04275 0.03225 0.425
+0.0435 0.0315 0.425
+0.04425 0.03075 0.425
+0.045 0.03 0.425
+0.04575 0.02925 0.425
+0.0465 0.0285 0.425
+0.04725 0.02775 0.425
+0.048 0.027 0.425
+0.04875 0.02625 0.425
+0.0495 0.0255 0.425
+0.05025 0.02475 0.425
+0.051 0.024 0.425
+0.05175 0.02325 0.425
+0.0525 0.0225 0.425
+0.05325 0.02175 0.425
+0.054 0.021 0.425
+0.05475 0.02025 0.425
+0.0555 0.0195 0.425
+0.05625 0.01875 0.425
+0.057 0.018 0.425
+0.05775 0.01725 0.425
+0.0585 0.0165 0.425
+0.05925 0.01575 0.425
+0.06 0.015 0.425
+0.06075 0.01425 0.425
+0.0615 0.0135 0.425
+0.06225 0.01275 0.425
+0.063 0.012 0.425
+0.06375 0.01125 0.425
+0.0645 0.0105 0.425
+0.06525 0.00975 0.425
+0.066 0.009 0.425
+0.06675 0.00825 0.425
+0.0675 0.0075 0.425
+0.06825 0.00675 0.425
+0.069 0.006 0.425
+0.06975 0.00525 0.425
+0.0705 0.0045 0.425
+0.07125 0.00375 0.425
+0.072 0.003 0.425
+0.07275 0.00225 0.425
+0.0735 0.0015 0.425
+0.07425 0.00075 0.425
+0 0.08 0.42
+0.0008 0.0792 0.42
+0.0016 0.0784 0.42
+0.0024 0.0776 0.42
+0.0032 0.0768 0.42
+0.004 0.076 0.42
+0.0048 0.0752 0.42
+0.0056 0.0744 0.42
+0.0064 0.0736 0.42
+0.0072 0.0728 0.42
+0.008 0.072 0.42
+0.0088 0.0712 0.42
+0.0096 0.0704 0.42
+0.0104 0.0696 0.42
+0.0112 0.0688 0.42
+0.012 0.068 0.42
+0.0128 0.0672 0.42
+0.0136 0.0664 0.42
+0.0144 0.0656 0.42
+0.0152 0.0648 0.42
+0.016 0.064 0.42
+0.0168 0.0632 0.42
+0.0176 0.0624 0.42
+0.0184 0.0616 0.42
+0.0192 0.0608 0.42
+0.02 0.06 0.42
+0.0208 0.0592 0.42
+0.0216 0.0584 0.42
+0.0224 0.0576 0.42
+0.0232 0.0568 0.42
+0.024 0.056 0.42
+0.0248 0.0552 0.42
+0.0256 0.0544 0.42
+0.0264 0.0536 0.42
+0.0272 0.0528 0.42
+0.028 0.052 0.42
+0.0288 0.0512 0.42
+0.0296 0.0504 0.42
+0.0304 0.0496 0.42
+0.0312 0.0488 0.42
+0.032 0.048 0.42
+0.0328 0.0472 0.42
+0.0336 0.0464 0.42
+0.0344 0.0456 0.42
+0.0352 0.0448 0.42
+0.036 0.044 0.42
+0.0368 0.0432 0.42
+0.0376 0.0424 0.42
+0.0384 0.0416 0.42
+0.0392 0.0408 0.42
+0.04 0.04 0.42
+0.0408 0.0392 0.42
+0.0416 0.0384 0.42
+0.0424 0.0376 0.42
+0.0432 0.0368 0.42
+0.044 0.036 0.42
+0.0448 0.0352 0.42
+0.0456 0.0344 0.42
+0.0464 0.0336 0.42
+0.0472 0.0328 0.42
+0.048 0.032 0.42
+0.0488 0.0312 0.42
+0.0496 0.0304 0.42
+0.0504 0.0296 0.42
+0.0512 0.0288 0.42
+0.052 0.028 0.42
+0.0528 0.0272 0.42
+0.0536 0.0264 0.42
+0.0544 0.0256 0.42
+0.0552 0.0248 0.42
+0.056 0.024 0.42
+0.0568 0.0232 0.42
+0.0576 0.0224 0.42
+0.0584 0.0216 0.42
+0.0592 0.0208 0.42
+0.06 0.02 0.42
+0.0608 0.0192 0.42
+0.0616 0.0184 0.42
+0.0624 0.0176 0.42
+0.0632 0.0168 0.42
+0.064 0.016 0.42
+0.0648 0.0152 0.42
+0.0656 0.0144 0.42
+0.0664 0.0136 0.42
+0.0672 0.0128 0.42
+0.068 0.012 0.42
+0.0688 0.0112 0.42
+0.0696 0.0104 0.42
+0.0704 0.0096 0.42
+0.0712 0.0088 0.42
+0.072 0.008 0.42
+0.0728 0.0072 0.42
+0.0736 0.0064 0.42
+0.0744 0.0056 0.42
+0.0752 0.0048 0.42
+0.076 0.004 0.42
+0.0768 0.0032 0.42
+0.0776 0.0024 0.42
+0.0784 0.0016 0.42
+0.0792 0.0008 0.42
+0 0.085 0.415
+0.00085 0.08415 0.415
+0.0017 0.0833 0.415
+0.00255 0.08245 0.415
+0.0034 0.0816 0.415
+0.00425 0.08075 0.415
+0.0051 0.0799 0.415
+0.00595 0.07905 0.415
+0.0068 0.0782 0.415
+0.00765 0.07735 0.415
+0.0085 0.0765 0.415
+0.00935 0.07565 0.415
+0.0102 0.0748 0.415
+0.01105 0.07395 0.415
+0.0119 0.0731 0.415
+0.01275 0.07225 0.415
+0.0136 0.0714 0.415
+0.01445 0.07055 0.415
+0.0153 0.0697 0.415
+0.01615 0.06885 0.415
+0.017 0.068 0.415
+0.01785 0.06715 0.415
+0.0187 0.0663 0.415
+0.01955 0.06545 0.415
+0.0204 0.0646 0.415
+0.02125 0.06375 0.415
+0.0221 0.0629 0.415
+0.02295 0.06205 0.415
+0.0238 0.0612 0.415
+0.02465 0.06035 0.415
+0.0255 0.0595 0.415
+0.02635 0.05865 0.415
+0.0272 0.0578 0.415
+0.02805 0.05695 0.415
+0.0289 0.0561 0.415
+0.02975 0.05525 0.415
+0.0306 0.0544 0.415
+0.03145 0.05355 0.415
+0.0323 0.0527 0.415
+0.03315 0.05185 0.415
+0.034 0.051 0.415
+0.03485 0.05015 0.415
+0.0357 0.0493 0.415
+0.03655 0.04845 0.415
+0.0374 0.0476 0.415
+0.03825 0.04675 0.415
+0.0391 0.0459 0.415
+0.03995 0.04505 0.415
+0.0408 0.0442 0.415
+0.04165 0.04335 0.415
+0.0425 0.0425 0.415
+0.04335 0.04165 0.415
+0.0442 0.0408 0.415
+0.04505 0.03995 0.415
+0.0459 0.0391 0.415
+0.04675 0.03825 0.415
+0.0476 0.0374 0.415
+0.04845 0.03655 0.415
+0.0493 0.0357 0.415
+0.05015 0.03485 0.415
+0.051 0.034 0.415
+0.05185 0.03315 0.415
+0.0527 0.0323 0.415
+0.05355 0.03145 0.415
+0.0544 0.0306 0.415
+0.05525 0.02975 0.415
+0.0561 0.0289 0.415
+0.05695 0.02805 0.415
+0.0578 0.0272 0.415
+0.05865 0.02635 0.415
+0.0595 0.0255 0.415
+0.06035 0.02465 0.415
+0.0612 0.0238 0.415
+0.06205 0.02295 0.415
+0.0629 0.0221 0.415
+0.06375 0.02125 0.415
+0.0646 0.0204 0.415
+0.06545 0.01955 0.415
+0.0663 0.0187 0.415
+0.06715 0.01785 0.415
+0.068 0.017 0.415
+0.06885 0.01615 0.415
+0.0697 0.0153 0.415
+0.07055 0.01445 0.415
+0.0714 0.0136 0.415
+0.07225 0.01275 0.415
+0.0731 0.0119 0.415
+0.07395 0.01105 0.415
+0.0748 0.0102 0.415
+0.07565 0.00935 0.415
+0.0765 0.0085 0.415
+0.07735 0.00765 0.415
+0.0782 0.0068 0.415
+0.07905 0.00595 0.415
+0.0799 0.0051 0.415
+0.08075 0.00425 0.415
+0.0816 0.0034 0.415
+0.08245 0.00255 0.415
+0.0833 0.0017 0.415
+0.08415 0.00085 0.415
+0 0.09 0.41
+0.0009 0.0891 0.41
+0.0018 0.0882 0.41
+0.0027 0.0873 0.41
+0.0036 0.0864 0.41
+0.0045 0.0855 0.41
+0.0054 0.0846 0.41
+0.0063 0.0837 0.41
+0.0072 0.0828 0.41
+0.0081 0.0819 0.41
+0.009 0.081 0.41
+0.0099 0.0801 0.41
+0.0108 0.0792 0.41
+0.0117 0.0783 0.41
+0.0126 0.0774 0.41
+0.0135 0.0765 0.41
+0.0144 0.0756 0.41
+0.0153 0.0747 0.41
+0.0162 0.0738 0.41
+0.0171 0.0729 0.41
+0.018 0.072 0.41
+0.0189 0.0711 0.41
+0.0198 0.0702 0.41
+0.0207 0.0693 0.41
+0.0216 0.0684 0.41
+0.0225 0.0675 0.41
+0.0234 0.0666 0.41
+0.0243 0.0657 0.41
+0.0252 0.0648 0.41
+0.0261 0.0639 0.41
+0.027 0.063 0.41
+0.0279 0.0621 0.41
+0.0288 0.0612 0.41
+0.0297 0.0603 0.41
+0.0306 0.0594 0.41
+0.0315 0.0585 0.41
+0.0324 0.0576 0.41
+0.0333 0.0567 0.41
+0.0342 0.0558 0.41
+0.0351 0.0549 0.41
+0.036 0.054 0.41
+0.0369 0.0531 0.41
+0.0378 0.0522 0.41
+0.0387 0.0513 0.41
+0.0396 0.0504 0.41
+0.0405 0.0495 0.41
+0.0414 0.0486 0.41
+0.0423 0.0477 0.41
+0.0432 0.0468 0.41
+0.0441 0.0459 0.41
+0.045 0.045 0.41
+0.0459 0.0441 0.41
+0.0468 0.0432 0.41
+0.0477 0.0423 0.41
+0.0486 0.0414 0.41
+0.0495 0.0405 0.41
+0.0504 0.0396 0.41
+0.0513 0.0387 0.41
+0.0522 0.0378 0.41
+0.0531 0.0369 0.41
+0.054 0.036 0.41
+0.0549 0.0351 0.41
+0.0558 0.0342 0.41
+0.0567 0.0333 0.41
+0.0576 0.0324 0.41
+0.0585 0.0315 0.41
+0.0594 0.0306 0.41
+0.0603 0.0297 0.41
+0.0612 0.0288 0.41
+0.0621 0.0279 0.41
+0.063 0.027 0.41
+0.0639 0.0261 0.41
+0.0648 0.0252 0.41
+0.0657 0.0243 0.41
+0.0666 0.0234 0.41
+0.0675 0.0225 0.41
+0.0684 0.0216 0.41
+0.0693 0.0207 0.41
+0.0702 0.0198 0.41
+0.0711 0.0189 0.41
+0.072 0.018 0.41
+0.0729 0.0171 0.41
+0.0738 0.0162 0.41
+0.0747 0.0153 0.41
+0.0756 0.0144 0.41
+0.0765 0.0135 0.41
+0.0774 0.0126 0.41
+0.0783 0.0117 0.41
+0.0792 0.0108 0.41
+0.0801 0.0099 0.41
+0.081 0.009 0.41
+0.0819 0.0081 0.41
+0.0828 0.0072 0.41
+0.0837 0.0063 0.41
+0.0846 0.0054 0.41
+0.0855 0.0045 0.41
+0.0864 0.0036 0.41
+0.0873 0.0027 0.41
+0.0882 0.0018 0.41
+0.0891 0.0009 0.41
+0 0.095 0.405
+0.00095 0.09405 0.405
+0.0019 0.0931 0.405
+0.00285 0.09215 0.405
+0.0038 0.0912 0.405
+0.00475 0.09025 0.405
+0.0057 0.0893 0.405
+0.00665 0.08835 0.405
+0.0076 0.0874 0.405
+0.00855 0.08645 0.405
+0.0095 0.0855 0.405
+0.01045 0.08455 0.405
+0.0114 0.0836 0.405
+0.01235 0.08265 0.405
+0.0133 0.0817 0.405
+0.01425 0.08075 0.405
+0.0152 0.0798 0.405
+0.01615 0.07885 0.405
+0.0171 0.0779 0.405
+0.01805 0.07695 0.405
+0.019 0.076 0.405
+0.01995 0.07505 0.405
+0.0209 0.0741 0.405
+0.02185 0.07315 0.405
+0.0228 0.0722 0.405
+0.02375 0.07125 0.405
+0.0247 0.0703 0.405
+0.02565 0.06935 0.405
+0.0266 0.0684 0.405
+0.02755 0.06745 0.405
+0.0285 0.0665 0.405
+0.02945 0.06555 0.405
+0.0304 0.0646 0.405
+0.03135 0.06365 0.405
+0.0323 0.0627 0.405
+0.03325 0.06175 0.405
+0.0342 0.0608 0.405
+0.03515 0.05985 0.405
+0.0361 0.0589 0.405
+0.03705 0.05795 0.405
+0.038 0.057 0.405
+0.03895 0.05605 0.405
+0.0399 0.0551 0.405
+0.04085 0.05415 0.405
+0.0418 0.0532 0.405
+0.04275 0.05225 0.405
+0.0437 0.0513 0.405
+0.04465 0.05035 0.405
+0.0456 0.0494 0.405
+0.04655 0.04845 0.405
+0.0475 0.0475 0.405
+0.04845 0.04655 0.405
+0.0494 0.0456 0.405
+0.05035 0.04465 0.405
+0.0513 0.0437 0.405
+0.05225 0.04275 0.405
+0.0532 0.0418 0.405
+0.05415 0.04085 0.405
+0.0551 0.0399 0.405
+0.05605 0.03895 0.405
+0.057 0.038 0.405
+0.05795 0.03705 0.405
+0.0589 0.0361 0.405
+0.05985 0.03515 0.405
+0.0608 0.0342 0.405
+0.06175 0.03325 0.405
+0.0627 0.0323 0.405
+0.06365 0.03135 0.405
+0.0646 0.0304 0.405
+0.06555 0.02945 0.405
+0.0665 0.0285 0.405
+0.06745 0.02755 0.405
+0.0684 0.0266 0.405
+0.06935 0.02565 0.405
+0.0703 0.0247 0.405
+0.07125 0.02375 0.405
+0.0722 0.0228 0.405
+0.07315 0.02185 0.405
+0.0741 0.0209 0.405
+0.07505 0.01995 0.405
+0.076 0.019 0.405
+0.07695 0.01805 0.405
+0.0779 0.0171 0.405
+0.07885 0.01615 0.405
+0.0798 0.0152 0.405
+0.08075 0.01425 0.405
+0.0817 0.0133 0.405
+0.08265 0.01235 0.405
+0.0836 0.0114 0.405
+0.08455 0.01045 0.405
+0.0855 0.0095 0.405
+0.08645 0.00855 0.405
+0.0874 0.0076 0.405
+0.08835 0.00665 0.405
+0.0893 0.0057 0.405
+0.09025 0.00475 0.405
+0.0912 0.0038 0.405
+0.09215 0.00285 0.405
+0.0931 0.0019 0.405
+0.09405 0.00095 0.405
+0 0.1 0.4
+0.001 0.099 0.4
+0.002 0.098 0.4
+0.003 0.097 0.4
+0.004 0.096 0.4
+0.005 0.095 0.4
+0.006 0.094 0.4
+0.007 0.093 0.4
+0.008 0.092 0.4
+0.009 0.091 0.4
+0.01 0.09 0.4
+0.011 0.089 0.4
+0.012 0.088 0.4
+0.013 0.087 0.4
+0.014 0.086 0.4
+0.015 0.085 0.4
+0.016 0.084 0.4
+0.017 0.083 0.4
+0.018 0.082 0.4
+0.019 0.081 0.4
+0.02 0.08 0.4
+0.021 0.079 0.4
+0.022 0.078 0.4
+0.023 0.077 0.4
+0.024 0.076 0.4
+0.025 0.075 0.4
+0.026 0.074 0.4
+0.027 0.073 0.4
+0.028 0.072 0.4
+0.029 0.071 0.4
+0.03 0.07 0.4
+0.031 0.069 0.4
+0.032 0.068 0.4
+0.033 0.067 0.4
+0.034 0.066 0.4
+0.035 0.065 0.4
+0.036 0.064 0.4
+0.037 0.063 0.4
+0.038 0.062 0.4
+0.039 0.061 0.4
+0.04 0.06 0.4
+0.041 0.059 0.4
+0.042 0.058 0.4
+0.043 0.057 0.4
+0.044 0.056 0.4
+0.045 0.055 0.4
+0.046 0.054 0.4
+0.047 0.053 0.4
+0.048 0.052 0.4
+0.049 0.051 0.4
+0.05 0.05 0.4
+0.051 0.049 0.4
+0.052 0.048 0.4
+0.053 0.047 0.4
+0.054 0.046 0.4
+0.055 0.045 0.4
+0.056 0.044 0.4
+0.057 0.043 0.4
+0.058 0.042 0.4
+0.059 0.041 0.4
+0.06 0.04 0.4
+0.061 0.039 0.4
+0.062 0.038 0.4
+0.063 0.037 0.4
+0.064 0.036 0.4
+0.065 0.035 0.4
+0.066 0.034 0.4
+0.067 0.033 0.4
+0.068 0.032 0.4
+0.069 0.031 0.4
+0.07 0.03 0.4
+0.071 0.029 0.4
+0.072 0.028 0.4
+0.073 0.027 0.4
+0.074 0.026 0.4
+0.075 0.025 0.4
+0.076 0.024 0.4
+0.077 0.023 0.4
+0.078 0.022 0.4
+0.079 0.021 0.4
+0.08 0.02 0.4
+0.081 0.019 0.4
+0.082 0.018 0.4
+0.083 0.017 0.4
+0.084 0.016 0.4
+0.085 0.015 0.4
+0.086 0.014 0.4
+0.087 0.013 0.4
+0.088 0.012 0.4
+0.089 0.011 0.4
+0.09 0.01 0.4
+0.091 0.009 0.4
+0.092 0.008 0.4
+0.093 0.007 0.4
+0.094 0.006 0.4
+0.095 0.005 0.4
+0.096 0.004 0.4
+0.097 0.003 0.4
+0.098 0.002 0.4
+0.099 0.001 0.4
+0 0.105 0.395
+0.00105 0.10395 0.395
+0.0021 0.1029 0.395
+0.00315 0.10185 0.395
+0.0042 0.1008 0.395
+0.00525 0.09975 0.395
+0.0063 0.0987 0.395
+0.00735 0.09765 0.395
+0.0084 0.0966 0.395
+0.00945 0.09555 0.395
+0.0105 0.0945 0.395
+0.01155 0.09345 0.395
+0.0126 0.0924 0.395
+0.01365 0.09135 0.395
+0.0147 0.0903 0.395
+0.01575 0.08925 0.395
+0.0168 0.0882 0.395
+0.01785 0.08715 0.395
+0.0189 0.0861 0.395
+0.01995 0.08505 0.395
+0.021 0.084 0.395
+0.02205 0.08295 0.395
+0.0231 0.0819 0.395
+0.02415 0.08085 0.395
+0.0252 0.0798 0.395
+0.02625 0.07875 0.395
+0.0273 0.0777 0.395
+0.02835 0.07665 0.395
+0.0294 0.0756 0.395
+0.03045 0.07455 0.395
+0.0315 0.0735 0.395
+0.03255 0.07245 0.395
+0.0336 0.0714 0.395
+0.03465 0.07035 0.395
+0.0357 0.0693 0.395
+0.03675 0.06825 0.395
+0.0378 0.0672 0.395
+0.03885 0.06615 0.395
+0.0399 0.0651 0.395
+0.04095 0.06405 0.395
+0.042 0.063 0.395
+0.04305 0.06195 0.395
+0.0441 0.0609 0.395
+0.04515 0.05985 0.395
+0.0462 0.0588 0.395
+0.04725 0.05775 0.395
+0.0483 0.0567 0.395
+0.04935 0.05565 0.395
+0.0504 0.0546 0.395
+0.05145 0.05355 0.395
+0.0525 0.0525 0.395
+0.05355 0.05145 0.395
+0.0546 0.0504 0.395
+0.05565 0.04935 0.395
+0.0567 0.0483 0.395
+0.05775 0.04725 0.395
+0.0588 0.0462 0.395
+0.05985 0.04515 0.395
+0.0609 0.0441 0.395
+0.06195 0.04305 0.395
+0.063 0.042 0.395
+0.06405 0.04095 0.395
+0.0651 0.0399 0.395
+0.06615 0.03885 0.395
+0.0672 0.0378 0.395
+0.06825 0.03675 0.395
+0.0693 0.0357 0.395
+0.07035 0.03465 0.395
+0.0714 0.0336 0.395
+0.07245 0.03255 0.395
+0.0735 0.0315 0.395
+0.07455 0.03045 0.395
+0.0756 0.0294 0.395
+0.07665 0.02835 0.395
+0.0777 0.0273 0.395
+0.07875 0.02625 0.395
+0.0798 0.0252 0.395
+0.08085 0.02415 0.395
+0.0819 0.0231 0.395
+0.08295 0.02205 0.395
+0.084 0.021 0.395
+0.08505 0.01995 0.395
+0.0861 0.0189 0.395
+0.08715 0.01785 0.395
+0.0882 0.0168 0.395
+0.08925 0.01575 0.395
+0.0903 0.0147 0.395
+0.09135 0.01365 0.395
+0.0924 0.0126 0.395
+0.09345 0.01155 0.395
+0.0945 0.0105 0.395
+0.09555 0.00945 0.395
+0.0966 0.0084 0.395
+0.09765 0.00735 0.395
+0.0987 0.0063 0.395
+0.09975 0.00525 0.395
+0.1008 0.0042 0.395
+0.10185 0.00315 0.395
+0.1029 0.0021 0.395
+0.10395 0.00105 0.395
+0 0.11 0.39
+0.0011 0.1089 0.39
+0.0022 0.1078 0.39
+0.0033 0.1067 0.39
+0.0044 0.1056 0.39
+0.0055 0.1045 0.39
+0.0066 0.1034 0.39
+0.0077 0.1023 0.39
+0.0088 0.1012 0.39
+0.0099 0.1001 0.39
+0.011 0.099 0.39
+0.0121 0.0979 0.39
+0.0132 0.0968 0.39
+0.0143 0.0957 0.39
+0.0154 0.0946 0.39
+0.0165 0.0935 0.39
+0.0176 0.0924 0.39
+0.0187 0.0913 0.39
+0.0198 0.0902 0.39
+0.0209 0.0891 0.39
+0.022 0.088 0.39
+0.0231 0.0869 0.39
+0.0242 0.0858 0.39
+0.0253 0.0847 0.39
+0.0264 0.0836 0.39
+0.0275 0.0825 0.39
+0.0286 0.0814 0.39
+0.0297 0.0803 0.39
+0.0308 0.0792 0.39
+0.0319 0.0781 0.39
+0.033 0.077 0.39
+0.0341 0.0759 0.39
+0.0352 0.0748 0.39
+0.0363 0.0737 0.39
+0.0374 0.0726 0.39
+0.0385 0.0715 0.39
+0.0396 0.0704 0.39
+0.0407 0.0693 0.39
+0.0418 0.0682 0.39
+0.0429 0.0671 0.39
+0.044 0.066 0.39
+0.0451 0.0649 0.39
+0.0462 0.0638 0.39
+0.0473 0.0627 0.39
+0.0484 0.0616 0.39
+0.0495 0.0605 0.39
+0.0506 0.0594 0.39
+0.0517 0.0583 0.39
+0.0528 0.0572 0.39
+0.0539 0.0561 0.39
+0.055 0.055 0.39
+0.0561 0.0539 0.39
+0.0572 0.0528 0.39
+0.0583 0.0517 0.39
+0.0594 0.0506 0.39
+0.0605 0.0495 0.39
+0.0616 0.0484 0.39
+0.0627 0.0473 0.39
+0.0638 0.0462 0.39
+0.0649 0.0451 0.39
+0.066 0.044 0.39
+0.0671 0.0429 0.39
+0.0682 0.0418 0.39
+0.0693 0.0407 0.39
+0.0704 0.0396 0.39
+0.0715 0.0385 0.39
+0.0726 0.0374 0.39
+0.0737 0.0363 0.39
+0.0748 0.0352 0.39
+0.0759 0.0341 0.39
+0.077 0.033 0.39
+0.0781 0.0319 0.39
+0.0792 0.0308 0.39
+0.0803 0.0297 0.39
+0.0814 0.0286 0.39
+0.0825 0.0275 0.39
+0.0836 0.0264 0.39
+0.0847 0.0253 0.39
+0.0858 0.0242 0.39
+0.0869 0.0231 0.39
+0.088 0.022 0.39
+0.0891 0.0209 0.39
+0.0902 0.0198 0.39
+0.0913 0.0187 0.39
+0.0924 0.0176 0.39
+0.0935 0.0165 0.39
+0.0946 0.0154 0.39
+0.0957 0.0143 0.39
+0.0968 0.0132 0.39
+0.0979 0.0121 0.39
+0.099 0.011 0.39
+0.1001 0.0099 0.39
+0.1012 0.0088 0.39
+0.1023 0.0077 0.39
+0.1034 0.0066 0.39
+0.1045 0.0055 0.39
+0.1056 0.0044 0.39
+0.1067 0.0033 0.39
+0.1078 0.0022 0.39
+0.1089 0.0011 0.39
+0 0.115 0.385
+0.00115 0.11385 0.385
+0.0023 0.1127 0.385
+0.00345 0.11155 0.385
+0.0046 0.1104 0.385
+0.00575 0.10925 0.385
+0.0069 0.1081 0.385
+0.00805 0.10695 0.385
+0.0092 0.1058 0.385
+0.01035 0.10465 0.385
+0.0115 0.1035 0.385
+0.01265 0.10235 0.385
+0.0138 0.1012 0.385
+0.01495 0.10005 0.385
+0.0161 0.0989 0.385
+0.01725 0.09775 0.385
+0.0184 0.0966 0.385
+0.01955 0.09545 0.385
+0.0207 0.0943 0.385
+0.02185 0.09315 0.385
+0.023 0.092 0.385
+0.02415 0.09085 0.385
+0.0253 0.0897 0.385
+0.02645 0.08855 0.385
+0.0276 0.0874 0.385
+0.02875 0.08625 0.385
+0.0299 0.0851 0.385
+0.03105 0.08395 0.385
+0.0322 0.0828 0.385
+0.03335 0.08165 0.385
+0.0345 0.0805 0.385
+0.03565 0.07935 0.385
+0.0368 0.0782 0.385
+0.03795 0.07705 0.385
+0.0391 0.0759 0.385
+0.04025 0.07475 0.385
+0.0414 0.0736 0.385
+0.04255 0.07245 0.385
+0.0437 0.0713 0.385
+0.04485 0.07015 0.385
+0.046 0.069 0.385
+0.04715 0.06785 0.385
+0.0483 0.0667 0.385
+0.04945 0.06555 0.385
+0.0506 0.0644 0.385
+0.05175 0.06325 0.385
+0.0529 0.0621 0.385
+0.05405 0.06095 0.385
+0.0552 0.0598 0.385
+0.05635 0.05865 0.385
+0.0575 0.0575 0.385
+0.05865 0.05635 0.385
+0.0598 0.0552 0.385
+0.06095 0.05405 0.385
+0.0621 0.0529 0.385
+0.06325 0.05175 0.385
+0.0644 0.0506 0.385
+0.06555 0.04945 0.385
+0.0667 0.0483 0.385
+0.06785 0.04715 0.385
+0.069 0.046 0.385
+0.07015 0.04485 0.385
+0.0713 0.0437 0.385
+0.07245 0.04255 0.385
+0.0736 0.0414 0.385
+0.07475 0.04025 0.385
+0.0759 0.0391 0.385
+0.07705 0.03795 0.385
+0.0782 0.0368 0.385
+0.07935 0.03565 0.385
+0.0805 0.0345 0.385
+0.08165 0.03335 0.385
+0.0828 0.0322 0.385
+0.08395 0.03105 0.385
+0.0851 0.0299 0.385
+0.08625 0.02875 0.385
+0.0874 0.0276 0.385
+0.08855 0.02645 0.385
+0.0897 0.0253 0.385
+0.09085 0.02415 0.385
+0.092 0.023 0.385
+0.09315 0.02185 0.385
+0.0943 0.0207 0.385
+0.09545 0.01955 0.385
+0.0966 0.0184 0.385
+0.09775 0.01725 0.385
+0.0989 0.0161 0.385
+0.10005 0.01495 0.385
+0.1012 0.0138 0.385
+0.10235 0.01265 0.385
+0.1035 0.0115 0.385
+0.10465 0.01035 0.385
+0.1058 0.0092 0.385
+0.10695 0.00805 0.385
+0.1081 0.0069 0.385
+0.10925 0.00575 0.385
+0.1104 0.0046 0.385
+0.11155 0.00345 0.385
+0.1127 0.0023 0.385
+0.11385 0.00115 0.385
+0 0.12 0.38
+0.0012 0.1188 0.38
+0.0024 0.1176 0.38
+0.0036 0.1164 0.38
+0.0048 0.1152 0.38
+0.006 0.114 0.38
+0.0072 0.1128 0.38
+0.0084 0.1116 0.38
+0.0096 0.1104 0.38
+0.0108 0.1092 0.38
+0.012 0.108 0.38
+0.0132 0.1068 0.38
+0.0144 0.1056 0.38
+0.0156 0.1044 0.38
+0.0168 0.1032 0.38
+0.018 0.102 0.38
+0.0192 0.1008 0.38
+0.0204 0.0996 0.38
+0.0216 0.0984 0.38
+0.0228 0.0972 0.38
+0.024 0.096 0.38
+0.0252 0.0948 0.38
+0.0264 0.0936 0.38
+0.0276 0.0924 0.38
+0.0288 0.0912 0.38
+0.03 0.09 0.38
+0.0312 0.0888 0.38
+0.0324 0.0876 0.38
+0.0336 0.0864 0.38
+0.0348 0.0852 0.38
+0.036 0.084 0.38
+0.0372 0.0828 0.38
+0.0384 0.0816 0.38
+0.0396 0.0804 0.38
+0.0408 0.0792 0.38
+0.042 0.078 0.38
+0.0432 0.0768 0.38
+0.0444 0.0756 0.38
+0.0456 0.0744 0.38
+0.0468 0.0732 0.38
+0.048 0.072 0.38
+0.0492 0.0708 0.38
+0.0504 0.0696 0.38
+0.0516 0.0684 0.38
+0.0528 0.0672 0.38
+0.054 0.066 0.38
+0.0552 0.0648 0.38
+0.0564 0.0636 0.38
+0.0576 0.0624 0.38
+0.0588 0.0612 0.38
+0.06 0.06 0.38
+0.0612 0.0588 0.38
+0.0624 0.0576 0.38
+0.0636 0.0564 0.38
+0.0648 0.0552 0.38
+0.066 0.054 0.38
+0.0672 0.0528 0.38
+0.0684 0.0516 0.38
+0.0696 0.0504 0.38
+0.0708 0.0492 0.38
+0.072 0.048 0.38
+0.0732 0.0468 0.38
+0.0744 0.0456 0.38
+0.0756 0.0444 0.38
+0.0768 0.0432 0.38
+0.078 0.042 0.38
+0.0792 0.0408 0.38
+0.0804 0.0396 0.38
+0.0816 0.0384 0.38
+0.0828 0.0372 0.38
+0.084 0.036 0.38
+0.0852 0.0348 0.38
+0.0864 0.0336 0.38
+0.0876 0.0324 0.38
+0.0888 0.0312 0.38
+0.09 0.03 0.38
+0.0912 0.0288 0.38
+0.0924 0.0276 0.38
+0.0936 0.0264 0.38
+0.0948 0.0252 0.38
+0.096 0.024 0.38
+0.0972 0.0228 0.38
+0.0984 0.0216 0.38
+0.0996 0.0204 0.38
+0.1008 0.0192 0.38
+0.102 0.018 0.38
+0.1032 0.0168 0.38
+0.1044 0.0156 0.38
+0.1056 0.0144 0.38
+0.1068 0.0132 0.38
+0.108 0.012 0.38
+0.1092 0.0108 0.38
+0.1104 0.0096 0.38
+0.1116 0.0084 0.38
+0.1128 0.0072 0.38
+0.114 0.006 0.38
+0.1152 0.0048 0.38
+0.1164 0.0036 0.38
+0.1176 0.0024 0.38
+0.1188 0.0012 0.38
+0 0.125 0.375
+0.00125 0.12375 0.375
+0.0025 0.1225 0.375
+0.00375 0.12125 0.375
+0.005 0.12 0.375
+0.00625 0.11875 0.375
+0.0075 0.1175 0.375
+0.00875 0.11625 0.375
+0.01 0.115 0.375
+0.01125 0.11375 0.375
+0.0125 0.1125 0.375
+0.01375 0.11125 0.375
+0.015 0.11 0.375
+0.01625 0.10875 0.375
+0.0175 0.1075 0.375
+0.01875 0.10625 0.375
+0.02 0.105 0.375
+0.02125 0.10375 0.375
+0.0225 0.1025 0.375
+0.02375 0.10125 0.375
+0.025 0.1 0.375
+0.02625 0.09875 0.375
+0.0275 0.0975 0.375
+0.02875 0.09625 0.375
+0.03 0.095 0.375
+0.03125 0.09375 0.375
+0.0325 0.0925 0.375
+0.03375 0.09125 0.375
+0.035 0.09 0.375
+0.03625 0.08875 0.375
+0.0375 0.0875 0.375
+0.03875 0.08625 0.375
+0.04 0.085 0.375
+0.04125 0.08375 0.375
+0.0425 0.0825 0.375
+0.04375 0.08125 0.375
+0.045 0.08 0.375
+0.04625 0.07875 0.375
+0.0475 0.0775 0.375
+0.04875 0.07625 0.375
+0.05 0.075 0.375
+0.05125 0.07375 0.375
+0.0525 0.0725 0.375
+0.05375 0.07125 0.375
+0.055 0.07 0.375
+0.05625 0.06875 0.375
+0.0575 0.0675 0.375
+0.05875 0.06625 0.375
+0.06 0.065 0.375
+0.06125 0.06375 0.375
+0.0625 0.0625 0.375
+0.06375 0.06125 0.375
+0.065 0.06 0.375
+0.06625 0.05875 0.375
+0.0675 0.0575 0.375
+0.06875 0.05625 0.375
+0.07 0.055 0.375
+0.07125 0.05375 0.375
+0.0725 0.0525 0.375
+0.07375 0.05125 0.375
+0.075 0.05 0.375
+0.07625 0.04875 0.375
+0.0775 0.0475 0.375
+0.07875 0.04625 0.375
+0.08 0.045 0.375
+0.08125 0.04375 0.375
+0.0825 0.0425 0.375
+0.08375 0.04125 0.375
+0.085 0.04 0.375
+0.08625 0.03875 0.375
+0.0875 0.0375 0.375
+0.08875 0.03625 0.375
+0.09 0.035 0.375
+0.09125 0.03375 0.375
+0.0925 0.0325 0.375
+0.09375 0.03125 0.375
+0.095 0.03 0.375
+0.09625 0.02875 0.375
+0.0975 0.0275 0.375
+0.09875 0.02625 0.375
+0.1 0.025 0.375
+0.10125 0.02375 0.375
+0.1025 0.0225 0.375
+0.10375 0.02125 0.375
+0.105 0.02 0.375
+0.10625 0.01875 0.375
+0.1075 0.0175 0.375
+0.10875 0.01625 0.375
+0.11 0.015 0.375
+0.11125 0.01375 0.375
+0.1125 0.0125 0.375
+0.11375 0.01125 0.375
+0.115 0.01 0.375
+0.11625 0.00875 0.375
+0.1175 0.0075 0.375
+0.11875 0.00625 0.375
+0.12 0.005 0.375
+0.12125 0.00375 0.375
+0.1225 0.0025 0.375
+0.12375 0.00125 0.375
+0 0.13 0.37
+0.0013 0.1287 0.37
+0.0026 0.1274 0.37
+0.0039 0.1261 0.37
+0.0052 0.1248 0.37
+0.0065 0.1235 0.37
+0.0078 0.1222 0.37
+0.0091 0.1209 0.37
+0.0104 0.1196 0.37
+0.0117 0.1183 0.37
+0.013 0.117 0.37
+0.0143 0.1157 0.37
+0.0156 0.1144 0.37
+0.0169 0.1131 0.37
+0.0182 0.1118 0.37
+0.0195 0.1105 0.37
+0.0208 0.1092 0.37
+0.0221 0.1079 0.37
+0.0234 0.1066 0.37
+0.0247 0.1053 0.37
+0.026 0.104 0.37
+0.0273 0.1027 0.37
+0.0286 0.1014 0.37
+0.0299 0.1001 0.37
+0.0312 0.0988 0.37
+0.0325 0.0975 0.37
+0.0338 0.0962 0.37
+0.0351 0.0949 0.37
+0.0364 0.0936 0.37
+0.0377 0.0923 0.37
+0.039 0.091 0.37
+0.0403 0.0897 0.37
+0.0416 0.0884 0.37
+0.0429 0.0871 0.37
+0.0442 0.0858 0.37
+0.0455 0.0845 0.37
+0.0468 0.0832 0.37
+0.0481 0.0819 0.37
+0.0494 0.0806 0.37
+0.0507 0.0793 0.37
+0.052 0.078 0.37
+0.0533 0.0767 0.37
+0.0546 0.0754 0.37
+0.0559 0.0741 0.37
+0.0572 0.0728 0.37
+0.0585 0.0715 0.37
+0.0598 0.0702 0.37
+0.0611 0.0689 0.37
+0.0624 0.0676 0.37
+0.0637 0.0663 0.37
+0.065 0.065 0.37
+0.0663 0.0637 0.37
+0.0676 0.0624 0.37
+0.0689 0.0611 0.37
+0.0702 0.0598 0.37
+0.0715 0.0585 0.37
+0.0728 0.0572 0.37
+0.0741 0.0559 0.37
+0.0754 0.0546 0.37
+0.0767 0.0533 0.37
+0.078 0.052 0.37
+0.0793 0.0507 0.37
+0.0806 0.0494 0.37
+0.0819 0.0481 0.37
+0.0832 0.0468 0.37
+0.0845 0.0455 0.37
+0.0858 0.0442 0.37
+0.0871 0.0429 0.37
+0.0884 0.0416 0.37
+0.0897 0.0403 0.37
+0.091 0.039 0.37
+0.0923 0.0377 0.37
+0.0936 0.0364 0.37
+0.0949 0.0351 0.37
+0.0962 0.0338 0.37
+0.0975 0.0325 0.37
+0.0988 0.0312 0.37
+0.1001 0.0299 0.37
+0.1014 0.0286 0.37
+0.1027 0.0273 0.37
+0.104 0.026 0.37
+0.1053 0.0247 0.37
+0.1066 0.0234 0.37
+0.1079 0.0221 0.37
+0.1092 0.0208 0.37
+0.1105 0.0195 0.37
+0.1118 0.0182 0.37
+0.1131 0.0169 0.37
+0.1144 0.0156 0.37
+0.1157 0.0143 0.37
+0.117 0.013 0.37
+0.1183 0.0117 0.37
+0.1196 0.0104 0.37
+0.1209 0.0091 0.37
+0.1222 0.0078 0.37
+0.1235 0.0065 0.37
+0.1248 0.0052 0.37
+0.1261 0.0039 0.37
+0.1274 0.0026 0.37
+0.1287 0.0013 0.37
+0 0.135 0.365
+0.00135 0.13365 0.365
+0.0027 0.1323 0.365
+0.00405 0.13095 0.365
+0.0054 0.1296 0.365
+0.00675 0.12825 0.365
+0.0081 0.1269 0.365
+0.00945 0.12555 0.365
+0.0108 0.1242 0.365
+0.01215 0.12285 0.365
+0.0135 0.1215 0.365
+0.01485 0.12015 0.365
+0.0162 0.1188 0.365
+0.01755 0.11745 0.365
+0.0189 0.1161 0.365
+0.02025 0.11475 0.365
+0.0216 0.1134 0.365
+0.02295 0.11205 0.365
+0.0243 0.1107 0.365
+0.02565 0.10935 0.365
+0.027 0.108 0.365
+0.02835 0.10665 0.365
+0.0297 0.1053 0.365
+0.03105 0.10395 0.365
+0.0324 0.1026 0.365
+0.03375 0.10125 0.365
+0.0351 0.0999 0.365
+0.03645 0.09855 0.365
+0.0378 0.0972 0.365
+0.03915 0.09585 0.365
+0.0405 0.0945 0.365
+0.04185 0.09315 0.365
+0.0432 0.0918 0.365
+0.04455 0.09045 0.365
+0.0459 0.0891 0.365
+0.04725 0.08775 0.365
+0.0486 0.0864 0.365
+0.04995 0.08505 0.365
+0.0513 0.0837 0.365
+0.05265 0.08235 0.365
+0.054 0.081 0.365
+0.05535 0.07965 0.365
+0.0567 0.0783 0.365
+0.05805 0.07695 0.365
+0.0594 0.0756 0.365
+0.06075 0.07425 0.365
+0.0621 0.0729 0.365
+0.06345 0.07155 0.365
+0.0648 0.0702 0.365
+0.06615 0.06885 0.365
+0.0675 0.0675 0.365
+0.06885 0.06615 0.365
+0.0702 0.0648 0.365
+0.07155 0.06345 0.365
+0.0729 0.0621 0.365
+0.07425 0.06075 0.365
+0.0756 0.0594 0.365
+0.07695 0.05805 0.365
+0.0783 0.0567 0.365
+0.07965 0.05535 0.365
+0.081 0.054 0.365
+0.08235 0.05265 0.365
+0.0837 0.0513 0.365
+0.08505 0.04995 0.365
+0.0864 0.0486 0.365
+0.08775 0.04725 0.365
+0.0891 0.0459 0.365
+0.09045 0.04455 0.365
+0.0918 0.0432 0.365
+0.09315 0.04185 0.365
+0.0945 0.0405 0.365
+0.09585 0.03915 0.365
+0.0972 0.0378 0.365
+0.09855 0.03645 0.365
+0.0999 0.0351 0.365
+0.10125 0.03375 0.365
+0.1026 0.0324 0.365
+0.10395 0.03105 0.365
+0.1053 0.0297 0.365
+0.10665 0.02835 0.365
+0.108 0.027 0.365
+0.10935 0.02565 0.365
+0.1107 0.0243 0.365
+0.11205 0.02295 0.365
+0.1134 0.0216 0.365
+0.11475 0.02025 0.365
+0.1161 0.0189 0.365
+0.11745 0.01755 0.365
+0.1188 0.0162 0.365
+0.12015 0.01485 0.365
+0.1215 0.0135 0.365
+0.12285 0.01215 0.365
+0.1242 0.0108 0.365
+0.12555 0.00945 0.365
+0.1269 0.0081 0.365
+0.12825 0.00675 0.365
+0.1296 0.0054 0.365
+0.13095 0.00405 0.365
+0.1323 0.0027 0.365
+0.13365 0.00135 0.365
+0 0.14 0.36
+0.0014 0.1386 0.36
+0.0028 0.1372 0.36
+0.0042 0.1358 0.36
+0.0056 0.1344 0.36
+0.007 0.133 0.36
+0.0084 0.1316 0.36
+0.0098 0.1302 0.36
+0.0112 0.1288 0.36
+0.0126 0.1274 0.36
+0.014 0.126 0.36
+0.0154 0.1246 0.36
+0.0168 0.1232 0.36
+0.0182 0.1218 0.36
+0.0196 0.1204 0.36
+0.021 0.119 0.36
+0.0224 0.1176 0.36
+0.0238 0.1162 0.36
+0.0252 0.1148 0.36
+0.0266 0.1134 0.36
+0.028 0.112 0.36
+0.0294 0.1106 0.36
+0.0308 0.1092 0.36
+0.0322 0.1078 0.36
+0.0336 0.1064 0.36
+0.035 0.105 0.36
+0.0364 0.1036 0.36
+0.0378 0.1022 0.36
+0.0392 0.1008 0.36
+0.0406 0.0994 0.36
+0.042 0.098 0.36
+0.0434 0.0966 0.36
+0.0448 0.0952 0.36
+0.0462 0.0938 0.36
+0.0476 0.0924 0.36
+0.049 0.091 0.36
+0.0504 0.0896 0.36
+0.0518 0.0882 0.36
+0.0532 0.0868 0.36
+0.0546 0.0854 0.36
+0.056 0.084 0.36
+0.0574 0.0826 0.36
+0.0588 0.0812 0.36
+0.0602 0.0798 0.36
+0.0616 0.0784 0.36
+0.063 0.077 0.36
+0.0644 0.0756 0.36
+0.0658 0.0742 0.36
+0.0672 0.0728 0.36
+0.0686 0.0714 0.36
+0.07 0.07 0.36
+0.0714 0.0686 0.36
+0.0728 0.0672 0.36
+0.0742 0.0658 0.36
+0.0756 0.0644 0.36
+0.077 0.063 0.36
+0.0784 0.0616 0.36
+0.0798 0.0602 0.36
+0.0812 0.0588 0.36
+0.0826 0.0574 0.36
+0.084 0.056 0.36
+0.0854 0.0546 0.36
+0.0868 0.0532 0.36
+0.0882 0.0518 0.36
+0.0896 0.0504 0.36
+0.091 0.049 0.36
+0.0924 0.0476 0.36
+0.0938 0.0462 0.36
+0.0952 0.0448 0.36
+0.0966 0.0434 0.36
+0.098 0.042 0.36
+0.0994 0.0406 0.36
+0.1008 0.0392 0.36
+0.1022 0.0378 0.36
+0.1036 0.0364 0.36
+0.105 0.035 0.36
+0.1064 0.0336 0.36
+0.1078 0.0322 0.36
+0.1092 0.0308 0.36
+0.1106 0.0294 0.36
+0.112 0.028 0.36
+0.1134 0.0266 0.36
+0.1148 0.0252 0.36
+0.1162 0.0238 0.36
+0.1176 0.0224 0.36
+0.119 0.021 0.36
+0.1204 0.0196 0.36
+0.1218 0.0182 0.36
+0.1232 0.0168 0.36
+0.1246 0.0154 0.36
+0.126 0.014 0.36
+0.1274 0.0126 0.36
+0.1288 0.0112 0.36
+0.1302 0.0098 0.36
+0.1316 0.0084 0.36
+0.133 0.007 0.36
+0.1344 0.0056 0.36
+0.1358 0.0042 0.36
+0.1372 0.0028 0.36
+0.1386 0.0014 0.36
+0 0.145 0.355
+0.00145 0.14355 0.355
+0.0029 0.1421 0.355
+0.00435 0.14065 0.355
+0.0058 0.1392 0.355
+0.00725 0.13775 0.355
+0.0087 0.1363 0.355
+0.01015 0.13485 0.355
+0.0116 0.1334 0.355
+0.01305 0.13195 0.355
+0.0145 0.1305 0.355
+0.01595 0.12905 0.355
+0.0174 0.1276 0.355
+0.01885 0.12615 0.355
+0.0203 0.1247 0.355
+0.02175 0.12325 0.355
+0.0232 0.1218 0.355
+0.02465 0.12035 0.355
+0.0261 0.1189 0.355
+0.02755 0.11745 0.355
+0.029 0.116 0.355
+0.03045 0.11455 0.355
+0.0319 0.1131 0.355
+0.03335 0.11165 0.355
+0.0348 0.1102 0.355
+0.03625 0.10875 0.355
+0.0377 0.1073 0.355
+0.03915 0.10585 0.355
+0.0406 0.1044 0.355
+0.04205 0.10295 0.355
+0.0435 0.1015 0.355
+0.04495 0.10005 0.355
+0.0464 0.0986 0.355
+0.04785 0.09715 0.355
+0.0493 0.0957 0.355
+0.05075 0.09425 0.355
+0.0522 0.0928 0.355
+0.05365 0.09135 0.355
+0.0551 0.0899 0.355
+0.05655 0.08845 0.355
+0.058 0.087 0.355
+0.05945 0.08555 0.355
+0.0609 0.0841 0.355
+0.06235 0.08265 0.355
+0.0638 0.0812 0.355
+0.06525 0.07975 0.355
+0.0667 0.0783 0.355
+0.06815 0.07685 0.355
+0.0696 0.0754 0.355
+0.07105 0.07395 0.355
+0.0725 0.0725 0.355
+0.07395 0.07105 0.355
+0.0754 0.0696 0.355
+0.07685 0.06815 0.355
+0.0783 0.0667 0.355
+0.07975 0.06525 0.355
+0.0812 0.0638 0.355
+0.08265 0.06235 0.355
+0.0841 0.0609 0.355
+0.08555 0.05945 0.355
+0.087 0.058 0.355
+0.08845 0.05655 0.355
+0.0899 0.0551 0.355
+0.09135 0.05365 0.355
+0.0928 0.0522 0.355
+0.09425 0.05075 0.355
+0.0957 0.0493 0.355
+0.09715 0.04785 0.355
+0.0986 0.0464 0.355
+0.10005 0.04495 0.355
+0.1015 0.0435 0.355
+0.10295 0.04205 0.355
+0.1044 0.0406 0.355
+0.10585 0.03915 0.355
+0.1073 0.0377 0.355
+0.10875 0.03625 0.355
+0.1102 0.0348 0.355
+0.11165 0.03335 0.355
+0.1131 0.0319 0.355
+0.11455 0.03045 0.355
+0.116 0.029 0.355
+0.11745 0.02755 0.355
+0.1189 0.0261 0.355
+0.12035 0.02465 0.355
+0.1218 0.0232 0.355
+0.12325 0.02175 0.355
+0.1247 0.0203 0.355
+0.12615 0.01885 0.355
+0.1276 0.0174 0.355
+0.12905 0.01595 0.355
+0.1305 0.0145 0.355
+0.13195 0.01305 0.355
+0.1334 0.0116 0.355
+0.13485 0.01015 0.355
+0.1363 0.0087 0.355
+0.13775 0.00725 0.355
+0.1392 0.0058 0.355
+0.14065 0.00435 0.355
+0.1421 0.0029 0.355
+0.14355 0.00145 0.355
+0 0.15 0.35
+0.0015 0.1485 0.35
+0.003 0.147 0.35
+0.0045 0.1455 0.35
+0.006 0.144 0.35
+0.0075 0.1425 0.35
+0.009 0.141 0.35
+0.0105 0.1395 0.35
+0.012 0.138 0.35
+0.0135 0.1365 0.35
+0.015 0.135 0.35
+0.0165 0.1335 0.35
+0.018 0.132 0.35
+0.0195 0.1305 0.35
+0.021 0.129 0.35
+0.0225 0.1275 0.35
+0.024 0.126 0.35
+0.0255 0.1245 0.35
+0.027 0.123 0.35
+0.0285 0.1215 0.35
+0.03 0.12 0.35
+0.0315 0.1185 0.35
+0.033 0.117 0.35
+0.0345 0.1155 0.35
+0.036 0.114 0.35
+0.0375 0.1125 0.35
+0.039 0.111 0.35
+0.0405 0.1095 0.35
+0.042 0.108 0.35
+0.0435 0.1065 0.35
+0.045 0.105 0.35
+0.0465 0.1035 0.35
+0.048 0.102 0.35
+0.0495 0.1005 0.35
+0.051 0.099 0.35
+0.0525 0.0975 0.35
+0.054 0.096 0.35
+0.0555 0.0945 0.35
+0.057 0.093 0.35
+0.0585 0.0915 0.35
+0.06 0.09 0.35
+0.0615 0.0885 0.35
+0.063 0.087 0.35
+0.0645 0.0855 0.35
+0.066 0.084 0.35
+0.0675 0.0825 0.35
+0.069 0.081 0.35
+0.0705 0.0795 0.35
+0.072 0.078 0.35
+0.0735 0.0765 0.35
+0.075 0.075 0.35
+0.0765 0.0735 0.35
+0.078 0.072 0.35
+0.0795 0.0705 0.35
+0.081 0.069 0.35
+0.0825 0.0675 0.35
+0.084 0.066 0.35
+0.0855 0.0645 0.35
+0.087 0.063 0.35
+0.0885 0.0615 0.35
+0.09 0.06 0.35
+0.0915 0.0585 0.35
+0.093 0.057 0.35
+0.0945 0.0555 0.35
+0.096 0.054 0.35
+0.0975 0.0525 0.35
+0.099 0.051 0.35
+0.1005 0.0495 0.35
+0.102 0.048 0.35
+0.1035 0.0465 0.35
+0.105 0.045 0.35
+0.1065 0.0435 0.35
+0.108 0.042 0.35
+0.1095 0.0405 0.35
+0.111 0.039 0.35
+0.1125 0.0375 0.35
+0.114 0.036 0.35
+0.1155 0.0345 0.35
+0.117 0.033 0.35
+0.1185 0.0315 0.35
+0.12 0.03 0.35
+0.1215 0.0285 0.35
+0.123 0.027 0.35
+0.1245 0.0255 0.35
+0.126 0.024 0.35
+0.1275 0.0225 0.35
+0.129 0.021 0.35
+0.1305 0.0195 0.35
+0.132 0.018 0.35
+0.1335 0.0165 0.35
+0.135 0.015 0.35
+0.1365 0.0135 0.35
+0.138 0.012 0.35
+0.1395 0.0105 0.35
+0.141 0.009 0.35
+0.1425 0.0075 0.35
+0.144 0.006 0.35
+0.1455 0.0045 0.35
+0.147 0.003 0.35
+0.1485 0.0015 0.35
+0 0.155 0.345
+0.00155 0.15345 0.345
+0.0031 0.1519 0.345
+0.00465 0.15035 0.345
+0.0062 0.1488 0.345
+0.00775 0.14725 0.345
+0.0093 0.1457 0.345
+0.01085 0.14415 0.345
+0.0124 0.1426 0.345
+0.01395 0.14105 0.345
+0.0155 0.1395 0.345
+0.01705 0.13795 0.345
+0.0186 0.1364 0.345
+0.02015 0.13485 0.345
+0.0217 0.1333 0.345
+0.02325 0.13175 0.345
+0.0248 0.1302 0.345
+0.02635 0.12865 0.345
+0.0279 0.1271 0.345
+0.02945 0.12555 0.345
+0.031 0.124 0.345
+0.03255 0.12245 0.345
+0.0341 0.1209 0.345
+0.03565 0.11935 0.345
+0.0372 0.1178 0.345
+0.03875 0.11625 0.345
+0.0403 0.1147 0.345
+0.04185 0.11315 0.345
+0.0434 0.1116 0.345
+0.04495 0.11005 0.345
+0.0465 0.1085 0.345
+0.04805 0.10695 0.345
+0.0496 0.1054 0.345
+0.05115 0.10385 0.345
+0.0527 0.1023 0.345
+0.05425 0.10075 0.345
+0.0558 0.0992 0.345
+0.05735 0.09765 0.345
+0.0589 0.0961 0.345
+0.06045 0.09455 0.345
+0.062 0.093 0.345
+0.06355 0.09145 0.345
+0.0651 0.0899 0.345
+0.06665 0.08835 0.345
+0.0682 0.0868 0.345
+0.06975 0.08525 0.345
+0.0713 0.0837 0.345
+0.07285 0.08215 0.345
+0.0744 0.0806 0.345
+0.07595 0.07905 0.345
+0.0775 0.0775 0.345
+0.07905 0.07595 0.345
+0.0806 0.0744 0.345
+0.08215 0.07285 0.345
+0.0837 0.0713 0.345
+0.08525 0.06975 0.345
+0.0868 0.0682 0.345
+0.08835 0.06665 0.345
+0.0899 0.0651 0.345
+0.09145 0.06355 0.345
+0.093 0.062 0.345
+0.09455 0.06045 0.345
+0.0961 0.0589 0.345
+0.09765 0.05735 0.345
+0.0992 0.0558 0.345
+0.10075 0.05425 0.345
+0.1023 0.0527 0.345
+0.10385 0.05115 0.345
+0.1054 0.0496 0.345
+0.10695 0.04805 0.345
+0.1085 0.0465 0.345
+0.11005 0.04495 0.345
+0.1116 0.0434 0.345
+0.11315 0.04185 0.345
+0.1147 0.0403 0.345
+0.11625 0.03875 0.345
+0.1178 0.0372 0.345
+0.11935 0.03565 0.345
+0.1209 0.0341 0.345
+0.12245 0.03255 0.345
+0.124 0.031 0.345
+0.12555 0.02945 0.345
+0.1271 0.0279 0.345
+0.12865 0.02635 0.345
+0.1302 0.0248 0.345
+0.13175 0.02325 0.345
+0.1333 0.0217 0.345
+0.13485 0.02015 0.345
+0.1364 0.0186 0.345
+0.13795 0.01705 0.345
+0.1395 0.0155 0.345
+0.14105 0.01395 0.345
+0.1426 0.0124 0.345
+0.14415 0.01085 0.345
+0.1457 0.0093 0.345
+0.14725 0.00775 0.345
+0.1488 0.0062 0.345
+0.15035 0.00465 0.345
+0.1519 0.0031 0.345
+0.15345 0.00155 0.345
+0 0.16 0.34
+0.0016 0.1584 0.34
+0.0032 0.1568 0.34
+0.0048 0.1552 0.34
+0.0064 0.1536 0.34
+0.008 0.152 0.34
+0.0096 0.1504 0.34
+0.0112 0.1488 0.34
+0.0128 0.1472 0.34
+0.0144 0.1456 0.34
+0.016 0.144 0.34
+0.0176 0.1424 0.34
+0.0192 0.1408 0.34
+0.0208 0.1392 0.34
+0.0224 0.1376 0.34
+0.024 0.136 0.34
+0.0256 0.1344 0.34
+0.0272 0.1328 0.34
+0.0288 0.1312 0.34
+0.0304 0.1296 0.34
+0.032 0.128 0.34
+0.0336 0.1264 0.34
+0.0352 0.1248 0.34
+0.0368 0.1232 0.34
+0.0384 0.1216 0.34
+0.04 0.12 0.34
+0.0416 0.1184 0.34
+0.0432 0.1168 0.34
+0.0448 0.1152 0.34
+0.0464 0.1136 0.34
+0.048 0.112 0.34
+0.0496 0.1104 0.34
+0.0512 0.1088 0.34
+0.0528 0.1072 0.34
+0.0544 0.1056 0.34
+0.056 0.104 0.34
+0.0576 0.1024 0.34
+0.0592 0.1008 0.34
+0.0608 0.0992 0.34
+0.0624 0.0976 0.34
+0.064 0.096 0.34
+0.0656 0.0944 0.34
+0.0672 0.0928 0.34
+0.0688 0.0912 0.34
+0.0704 0.0896 0.34
+0.072 0.088 0.34
+0.0736 0.0864 0.34
+0.0752 0.0848 0.34
+0.0768 0.0832 0.34
+0.0784 0.0816 0.34
+0.08 0.08 0.34
+0.0816 0.0784 0.34
+0.0832 0.0768 0.34
+0.0848 0.0752 0.34
+0.0864 0.0736 0.34
+0.088 0.072 0.34
+0.0896 0.0704 0.34
+0.0912 0.0688 0.34
+0.0928 0.0672 0.34
+0.0944 0.0656 0.34
+0.096 0.064 0.34
+0.0976 0.0624 0.34
+0.0992 0.0608 0.34
+0.1008 0.0592 0.34
+0.1024 0.0576 0.34
+0.104 0.056 0.34
+0.1056 0.0544 0.34
+0.1072 0.0528 0.34
+0.1088 0.0512 0.34
+0.1104 0.0496 0.34
+0.112 0.048 0.34
+0.1136 0.0464 0.34
+0.1152 0.0448 0.34
+0.1168 0.0432 0.34
+0.1184 0.0416 0.34
+0.12 0.04 0.34
+0.1216 0.0384 0.34
+0.1232 0.0368 0.34
+0.1248 0.0352 0.34
+0.1264 0.0336 0.34
+0.128 0.032 0.34
+0.1296 0.0304 0.34
+0.1312 0.0288 0.34
+0.1328 0.0272 0.34
+0.1344 0.0256 0.34
+0.136 0.024 0.34
+0.1376 0.0224 0.34
+0.1392 0.0208 0.34
+0.1408 0.0192 0.34
+0.1424 0.0176 0.34
+0.144 0.016 0.34
+0.1456 0.0144 0.34
+0.1472 0.0128 0.34
+0.1488 0.0112 0.34
+0.1504 0.0096 0.34
+0.152 0.008 0.34
+0.1536 0.0064 0.34
+0.1552 0.0048 0.34
+0.1568 0.0032 0.34
+0.1584 0.0016 0.34
+0 0.165 0.335
+0.00165 0.16335 0.335
+0.0033 0.1617 0.335
+0.00495 0.16005 0.335
+0.0066 0.1584 0.335
+0.00825 0.15675 0.335
+0.0099 0.1551 0.335
+0.01155 0.15345 0.335
+0.0132 0.1518 0.335
+0.01485 0.15015 0.335
+0.0165 0.1485 0.335
+0.01815 0.14685 0.335
+0.0198 0.1452 0.335
+0.02145 0.14355 0.335
+0.0231 0.1419 0.335
+0.02475 0.14025 0.335
+0.0264 0.1386 0.335
+0.02805 0.13695 0.335
+0.0297 0.1353 0.335
+0.03135 0.13365 0.335
+0.033 0.132 0.335
+0.03465 0.13035 0.335
+0.0363 0.1287 0.335
+0.03795 0.12705 0.335
+0.0396 0.1254 0.335
+0.04125 0.12375 0.335
+0.0429 0.1221 0.335
+0.04455 0.12045 0.335
+0.0462 0.1188 0.335
+0.04785 0.11715 0.335
+0.0495 0.1155 0.335
+0.05115 0.11385 0.335
+0.0528 0.1122 0.335
+0.05445 0.11055 0.335
+0.0561 0.1089 0.335
+0.05775 0.10725 0.335
+0.0594 0.1056 0.335
+0.06105 0.10395 0.335
+0.0627 0.1023 0.335
+0.06435 0.10065 0.335
+0.066 0.099 0.335
+0.06765 0.09735 0.335
+0.0693 0.0957 0.335
+0.07095 0.09405 0.335
+0.0726 0.0924 0.335
+0.07425 0.09075 0.335
+0.0759 0.0891 0.335
+0.07755 0.08745 0.335
+0.0792 0.0858 0.335
+0.08085 0.08415 0.335
+0.0825 0.0825 0.335
+0.08415 0.08085 0.335
+0.0858 0.0792 0.335
+0.08745 0.07755 0.335
+0.0891 0.0759 0.335
+0.09075 0.07425 0.335
+0.0924 0.0726 0.335
+0.09405 0.07095 0.335
+0.0957 0.0693 0.335
+0.09735 0.06765 0.335
+0.099 0.066 0.335
+0.10065 0.06435 0.335
+0.1023 0.0627 0.335
+0.10395 0.06105 0.335
+0.1056 0.0594 0.335
+0.10725 0.05775 0.335
+0.1089 0.0561 0.335
+0.11055 0.05445 0.335
+0.1122 0.0528 0.335
+0.11385 0.05115 0.335
+0.1155 0.0495 0.335
+0.11715 0.04785 0.335
+0.1188 0.0462 0.335
+0.12045 0.04455 0.335
+0.1221 0.0429 0.335
+0.12375 0.04125 0.335
+0.1254 0.0396 0.335
+0.12705 0.03795 0.335
+0.1287 0.0363 0.335
+0.13035 0.03465 0.335
+0.132 0.033 0.335
+0.13365 0.03135 0.335
+0.1353 0.0297 0.335
+0.13695 0.02805 0.335
+0.1386 0.0264 0.335
+0.14025 0.02475 0.335
+0.1419 0.0231 0.335
+0.14355 0.02145 0.335
+0.1452 0.0198 0.335
+0.14685 0.01815 0.335
+0.1485 0.0165 0.335
+0.15015 0.01485 0.335
+0.1518 0.0132 0.335
+0.15345 0.01155 0.335
+0.1551 0.0099 0.335
+0.15675 0.00825 0.335
+0.1584 0.0066 0.335
+0.16005 0.00495 0.335
+0.1617 0.0033 0.335
+0.16335 0.00165 0.335
+0 0.17 0.33
+0.0017 0.1683 0.33
+0.0034 0.1666 0.33
+0.0051 0.1649 0.33
+0.0068 0.1632 0.33
+0.0085 0.1615 0.33
+0.0102 0.1598 0.33
+0.0119 0.1581 0.33
+0.0136 0.1564 0.33
+0.0153 0.1547 0.33
+0.017 0.153 0.33
+0.0187 0.1513 0.33
+0.0204 0.1496 0.33
+0.0221 0.1479 0.33
+0.0238 0.1462 0.33
+0.0255 0.1445 0.33
+0.0272 0.1428 0.33
+0.0289 0.1411 0.33
+0.0306 0.1394 0.33
+0.0323 0.1377 0.33
+0.034 0.136 0.33
+0.0357 0.1343 0.33
+0.0374 0.1326 0.33
+0.0391 0.1309 0.33
+0.0408 0.1292 0.33
+0.0425 0.1275 0.33
+0.0442 0.1258 0.33
+0.0459 0.1241 0.33
+0.0476 0.1224 0.33
+0.0493 0.1207 0.33
+0.051 0.119 0.33
+0.0527 0.1173 0.33
+0.0544 0.1156 0.33
+0.0561 0.1139 0.33
+0.0578 0.1122 0.33
+0.0595 0.1105 0.33
+0.0612 0.1088 0.33
+0.0629 0.1071 0.33
+0.0646 0.1054 0.33
+0.0663 0.1037 0.33
+0.068 0.102 0.33
+0.0697 0.1003 0.33
+0.0714 0.0986 0.33
+0.0731 0.0969 0.33
+0.0748 0.0952 0.33
+0.0765 0.0935 0.33
+0.0782 0.0918 0.33
+0.0799 0.0901 0.33
+0.0816 0.0884 0.33
+0.0833 0.0867 0.33
+0.085 0.085 0.33
+0.0867 0.0833 0.33
+0.0884 0.0816 0.33
+0.0901 0.0799 0.33
+0.0918 0.0782 0.33
+0.0935 0.0765 0.33
+0.0952 0.0748 0.33
+0.0969 0.0731 0.33
+0.0986 0.0714 0.33
+0.1003 0.0697 0.33
+0.102 0.068 0.33
+0.1037 0.0663 0.33
+0.1054 0.0646 0.33
+0.1071 0.0629 0.33
+0.1088 0.0612 0.33
+0.1105 0.0595 0.33
+0.1122 0.0578 0.33
+0.1139 0.0561 0.33
+0.1156 0.0544 0.33
+0.1173 0.0527 0.33
+0.119 0.051 0.33
+0.1207 0.0493 0.33
+0.1224 0.0476 0.33
+0.1241 0.0459 0.33
+0.1258 0.0442 0.33
+0.1275 0.0425 0.33
+0.1292 0.0408 0.33
+0.1309 0.0391 0.33
+0.1326 0.0374 0.33
+0.1343 0.0357 0.33
+0.136 0.034 0.33
+0.1377 0.0323 0.33
+0.1394 0.0306 0.33
+0.1411 0.0289 0.33
+0.1428 0.0272 0.33
+0.1445 0.0255 0.33
+0.1462 0.0238 0.33
+0.1479 0.0221 0.33
+0.1496 0.0204 0.33
+0.1513 0.0187 0.33
+0.153 0.017 0.33
+0.1547 0.0153 0.33
+0.1564 0.0136 0.33
+0.1581 0.0119 0.33
+0.1598 0.0102 0.33
+0.1615 0.0085 0.33
+0.1632 0.0068 0.33
+0.1649 0.0051 0.33
+0.1666 0.0034 0.33
+0.1683 0.0017 0.33
+0 0.175 0.325
+0.00175 0.17325 0.325
+0.0035 0.1715 0.325
+0.00525 0.16975 0.325
+0.007 0.168 0.325
+0.00875 0.16625 0.325
+0.0105 0.1645 0.325
+0.01225 0.16275 0.325
+0.014 0.161 0.325
+0.01575 0.15925 0.325
+0.0175 0.1575 0.325
+0.01925 0.15575 0.325
+0.021 0.154 0.325
+0.02275 0.15225 0.325
+0.0245 0.1505 0.325
+0.02625 0.14875 0.325
+0.028 0.147 0.325
+0.02975 0.14525 0.325
+0.0315 0.1435 0.325
+0.03325 0.14175 0.325
+0.035 0.14 0.325
+0.03675 0.13825 0.325
+0.0385 0.1365 0.325
+0.04025 0.13475 0.325
+0.042 0.133 0.325
+0.04375 0.13125 0.325
+0.0455 0.1295 0.325
+0.04725 0.12775 0.325
+0.049 0.126 0.325
+0.05075 0.12425 0.325
+0.0525 0.1225 0.325
+0.05425 0.12075 0.325
+0.056 0.119 0.325
+0.05775 0.11725 0.325
+0.0595 0.1155 0.325
+0.06125 0.11375 0.325
+0.063 0.112 0.325
+0.06475 0.11025 0.325
+0.0665 0.1085 0.325
+0.06825 0.10675 0.325
+0.07 0.105 0.325
+0.07175 0.10325 0.325
+0.0735 0.1015 0.325
+0.07525 0.09975 0.325
+0.077 0.098 0.325
+0.07875 0.09625 0.325
+0.0805 0.0945 0.325
+0.08225 0.09275 0.325
+0.084 0.091 0.325
+0.08575 0.08925 0.325
+0.0875 0.0875 0.325
+0.08925 0.08575 0.325
+0.091 0.084 0.325
+0.09275 0.08225 0.325
+0.0945 0.0805 0.325
+0.09625 0.07875 0.325
+0.098 0.077 0.325
+0.09975 0.07525 0.325
+0.1015 0.0735 0.325
+0.10325 0.07175 0.325
+0.105 0.07 0.325
+0.10675 0.06825 0.325
+0.1085 0.0665 0.325
+0.11025 0.06475 0.325
+0.112 0.063 0.325
+0.11375 0.06125 0.325
+0.1155 0.0595 0.325
+0.11725 0.05775 0.325
+0.119 0.056 0.325
+0.12075 0.05425 0.325
+0.1225 0.0525 0.325
+0.12425 0.05075 0.325
+0.126 0.049 0.325
+0.12775 0.04725 0.325
+0.1295 0.0455 0.325
+0.13125 0.04375 0.325
+0.133 0.042 0.325
+0.13475 0.04025 0.325
+0.1365 0.0385 0.325
+0.13825 0.03675 0.325
+0.14 0.035 0.325
+0.14175 0.03325 0.325
+0.1435 0.0315 0.325
+0.14525 0.02975 0.325
+0.147 0.028 0.325
+0.14875 0.02625 0.325
+0.1505 0.0245 0.325
+0.15225 0.02275 0.325
+0.154 0.021 0.325
+0.15575 0.01925 0.325
+0.1575 0.0175 0.325
+0.15925 0.01575 0.325
+0.161 0.014 0.325
+0.16275 0.01225 0.325
+0.1645 0.0105 0.325
+0.16625 0.00875 0.325
+0.168 0.007 0.325
+0.16975 0.00525 0.325
+0.1715 0.0035 0.325
+0.17325 0.00175 0.325
+0 0.18 0.32
+0.0018 0.1782 0.32
+0.0036 0.1764 0.32
+0.0054 0.1746 0.32
+0.0072 0.1728 0.32
+0.009 0.171 0.32
+0.0108 0.1692 0.32
+0.0126 0.1674 0.32
+0.0144 0.1656 0.32
+0.0162 0.1638 0.32
+0.018 0.162 0.32
+0.0198 0.1602 0.32
+0.0216 0.1584 0.32
+0.0234 0.1566 0.32
+0.0252 0.1548 0.32
+0.027 0.153 0.32
+0.0288 0.1512 0.32
+0.0306 0.1494 0.32
+0.0324 0.1476 0.32
+0.0342 0.1458 0.32
+0.036 0.144 0.32
+0.0378 0.1422 0.32
+0.0396 0.1404 0.32
+0.0414 0.1386 0.32
+0.0432 0.1368 0.32
+0.045 0.135 0.32
+0.0468 0.1332 0.32
+0.0486 0.1314 0.32
+0.0504 0.1296 0.32
+0.0522 0.1278 0.32
+0.054 0.126 0.32
+0.0558 0.1242 0.32
+0.0576 0.1224 0.32
+0.0594 0.1206 0.32
+0.0612 0.1188 0.32
+0.063 0.117 0.32
+0.0648 0.1152 0.32
+0.0666 0.1134 0.32
+0.0684 0.1116 0.32
+0.0702 0.1098 0.32
+0.072 0.108 0.32
+0.0738 0.1062 0.32
+0.0756 0.1044 0.32
+0.0774 0.1026 0.32
+0.0792 0.1008 0.32
+0.081 0.099 0.32
+0.0828 0.0972 0.32
+0.0846 0.0954 0.32
+0.0864 0.0936 0.32
+0.0882 0.0918 0.32
+0.09 0.09 0.32
+0.0918 0.0882 0.32
+0.0936 0.0864 0.32
+0.0954 0.0846 0.32
+0.0972 0.0828 0.32
+0.099 0.081 0.32
+0.1008 0.0792 0.32
+0.1026 0.0774 0.32
+0.1044 0.0756 0.32
+0.1062 0.0738 0.32
+0.108 0.072 0.32
+0.1098 0.0702 0.32
+0.1116 0.0684 0.32
+0.1134 0.0666 0.32
+0.1152 0.0648 0.32
+0.117 0.063 0.32
+0.1188 0.0612 0.32
+0.1206 0.0594 0.32
+0.1224 0.0576 0.32
+0.1242 0.0558 0.32
+0.126 0.054 0.32
+0.1278 0.0522 0.32
+0.1296 0.0504 0.32
+0.1314 0.0486 0.32
+0.1332 0.0468 0.32
+0.135 0.045 0.32
+0.1368 0.0432 0.32
+0.1386 0.0414 0.32
+0.1404 0.0396 0.32
+0.1422 0.0378 0.32
+0.144 0.036 0.32
+0.1458 0.0342 0.32
+0.1476 0.0324 0.32
+0.1494 0.0306 0.32
+0.1512 0.0288 0.32
+0.153 0.027 0.32
+0.1548 0.0252 0.32
+0.1566 0.0234 0.32
+0.1584 0.0216 0.32
+0.1602 0.0198 0.32
+0.162 0.018 0.32
+0.1638 0.0162 0.32
+0.1656 0.0144 0.32
+0.1674 0.0126 0.32
+0.1692 0.0108 0.32
+0.171 0.009 0.32
+0.1728 0.0072 0.32
+0.1746 0.0054 0.32
+0.1764 0.0036 0.32
+0.1782 0.0018 0.32
+0 0.185 0.315
+0.00185 0.18315 0.315
+0.0037 0.1813 0.315
+0.00555 0.17945 0.315
+0.0074 0.1776 0.315
+0.00925 0.17575 0.315
+0.0111 0.1739 0.315
+0.01295 0.17205 0.315
+0.0148 0.1702 0.315
+0.01665 0.16835 0.315
+0.0185 0.1665 0.315
+0.02035 0.16465 0.315
+0.0222 0.1628 0.315
+0.02405 0.16095 0.315
+0.0259 0.1591 0.315
+0.02775 0.15725 0.315
+0.0296 0.1554 0.315
+0.03145 0.15355 0.315
+0.0333 0.1517 0.315
+0.03515 0.14985 0.315
+0.037 0.148 0.315
+0.03885 0.14615 0.315
+0.0407 0.1443 0.315
+0.04255 0.14245 0.315
+0.0444 0.1406 0.315
+0.04625 0.13875 0.315
+0.0481 0.1369 0.315
+0.04995 0.13505 0.315
+0.0518 0.1332 0.315
+0.05365 0.13135 0.315
+0.0555 0.1295 0.315
+0.05735 0.12765 0.315
+0.0592 0.1258 0.315
+0.06105 0.12395 0.315
+0.0629 0.1221 0.315
+0.06475 0.12025 0.315
+0.0666 0.1184 0.315
+0.06845 0.11655 0.315
+0.0703 0.1147 0.315
+0.07215 0.11285 0.315
+0.074 0.111 0.315
+0.07585 0.10915 0.315
+0.0777 0.1073 0.315
+0.07955 0.10545 0.315
+0.0814 0.1036 0.315
+0.08325 0.10175 0.315
+0.0851 0.0999 0.315
+0.08695 0.09805 0.315
+0.0888 0.0962 0.315
+0.09065 0.09435 0.315
+0.0925 0.0925 0.315
+0.09435 0.09065 0.315
+0.0962 0.0888 0.315
+0.09805 0.08695 0.315
+0.0999 0.0851 0.315
+0.10175 0.08325 0.315
+0.1036 0.0814 0.315
+0.10545 0.07955 0.315
+0.1073 0.0777 0.315
+0.10915 0.07585 0.315
+0.111 0.074 0.315
+0.11285 0.07215 0.315
+0.1147 0.0703 0.315
+0.11655 0.06845 0.315
+0.1184 0.0666 0.315
+0.12025 0.06475 0.315
+0.1221 0.0629 0.315
+0.12395 0.06105 0.315
+0.1258 0.0592 0.315
+0.12765 0.05735 0.315
+0.1295 0.0555 0.315
+0.13135 0.05365 0.315
+0.1332 0.0518 0.315
+0.13505 0.04995 0.315
+0.1369 0.0481 0.315
+0.13875 0.04625 0.315
+0.1406 0.0444 0.315
+0.14245 0.04255 0.315
+0.1443 0.0407 0.315
+0.14615 0.03885 0.315
+0.148 0.037 0.315
+0.14985 0.03515 0.315
+0.1517 0.0333 0.315
+0.15355 0.03145 0.315
+0.1554 0.0296 0.315
+0.15725 0.02775 0.315
+0.1591 0.0259 0.315
+0.16095 0.02405 0.315
+0.1628 0.0222 0.315
+0.16465 0.02035 0.315
+0.1665 0.0185 0.315
+0.16835 0.01665 0.315
+0.1702 0.0148 0.315
+0.17205 0.01295 0.315
+0.1739 0.0111 0.315
+0.17575 0.00925 0.315
+0.1776 0.0074 0.315
+0.17945 0.00555 0.315
+0.1813 0.0037 0.315
+0.18315 0.00185 0.315
+0 0.19 0.31
+0.0019 0.1881 0.31
+0.0038 0.1862 0.31
+0.0057 0.1843 0.31
+0.0076 0.1824 0.31
+0.0095 0.1805 0.31
+0.0114 0.1786 0.31
+0.0133 0.1767 0.31
+0.0152 0.1748 0.31
+0.0171 0.1729 0.31
+0.019 0.171 0.31
+0.0209 0.1691 0.31
+0.0228 0.1672 0.31
+0.0247 0.1653 0.31
+0.0266 0.1634 0.31
+0.0285 0.1615 0.31
+0.0304 0.1596 0.31
+0.0323 0.1577 0.31
+0.0342 0.1558 0.31
+0.0361 0.1539 0.31
+0.038 0.152 0.31
+0.0399 0.1501 0.31
+0.0418 0.1482 0.31
+0.0437 0.1463 0.31
+0.0456 0.1444 0.31
+0.0475 0.1425 0.31
+0.0494 0.1406 0.31
+0.0513 0.1387 0.31
+0.0532 0.1368 0.31
+0.0551 0.1349 0.31
+0.057 0.133 0.31
+0.0589 0.1311 0.31
+0.0608 0.1292 0.31
+0.0627 0.1273 0.31
+0.0646 0.1254 0.31
+0.0665 0.1235 0.31
+0.0684 0.1216 0.31
+0.0703 0.1197 0.31
+0.0722 0.1178 0.31
+0.0741 0.1159 0.31
+0.076 0.114 0.31
+0.0779 0.1121 0.31
+0.0798 0.1102 0.31
+0.0817 0.1083 0.31
+0.0836 0.1064 0.31
+0.0855 0.1045 0.31
+0.0874 0.1026 0.31
+0.0893 0.1007 0.31
+0.0912 0.0988 0.31
+0.0931 0.0969 0.31
+0.095 0.095 0.31
+0.0969 0.0931 0.31
+0.0988 0.0912 0.31
+0.1007 0.0893 0.31
+0.1026 0.0874 0.31
+0.1045 0.0855 0.31
+0.1064 0.0836 0.31
+0.1083 0.0817 0.31
+0.1102 0.0798 0.31
+0.1121 0.0779 0.31
+0.114 0.076 0.31
+0.1159 0.0741 0.31
+0.1178 0.0722 0.31
+0.1197 0.0703 0.31
+0.1216 0.0684 0.31
+0.1235 0.0665 0.31
+0.1254 0.0646 0.31
+0.1273 0.0627 0.31
+0.1292 0.0608 0.31
+0.1311 0.0589 0.31
+0.133 0.057 0.31
+0.1349 0.0551 0.31
+0.1368 0.0532 0.31
+0.1387 0.0513 0.31
+0.1406 0.0494 0.31
+0.1425 0.0475 0.31
+0.1444 0.0456 0.31
+0.1463 0.0437 0.31
+0.1482 0.0418 0.31
+0.1501 0.0399 0.31
+0.152 0.038 0.31
+0.1539 0.0361 0.31
+0.1558 0.0342 0.31
+0.1577 0.0323 0.31
+0.1596 0.0304 0.31
+0.1615 0.0285 0.31
+0.1634 0.0266 0.31
+0.1653 0.0247 0.31
+0.1672 0.0228 0.31
+0.1691 0.0209 0.31
+0.171 0.019 0.31
+0.1729 0.0171 0.31
+0.1748 0.0152 0.31
+0.1767 0.0133 0.31
+0.1786 0.0114 0.31
+0.1805 0.0095 0.31
+0.1824 0.0076 0.31
+0.1843 0.0057 0.31
+0.1862 0.0038 0.31
+0.1881 0.0019 0.31
+0 0.195 0.305
+0.00195 0.19305 0.305
+0.0039 0.1911 0.305
+0.00585 0.18915 0.305
+0.0078 0.1872 0.305
+0.00975 0.18525 0.305
+0.0117 0.1833 0.305
+0.01365 0.18135 0.305
+0.0156 0.1794 0.305
+0.01755 0.17745 0.305
+0.0195 0.1755 0.305
+0.02145 0.17355 0.305
+0.0234 0.1716 0.305
+0.02535 0.16965 0.305
+0.0273 0.1677 0.305
+0.02925 0.16575 0.305
+0.0312 0.1638 0.305
+0.03315 0.16185 0.305
+0.0351 0.1599 0.305
+0.03705 0.15795 0.305
+0.039 0.156 0.305
+0.04095 0.15405 0.305
+0.0429 0.1521 0.305
+0.04485 0.15015 0.305
+0.0468 0.1482 0.305
+0.04875 0.14625 0.305
+0.0507 0.1443 0.305
+0.05265 0.14235 0.305
+0.0546 0.1404 0.305
+0.05655 0.13845 0.305
+0.0585 0.1365 0.305
+0.06045 0.13455 0.305
+0.0624 0.1326 0.305
+0.06435 0.13065 0.305
+0.0663 0.1287 0.305
+0.06825 0.12675 0.305
+0.0702 0.1248 0.305
+0.07215 0.12285 0.305
+0.0741 0.1209 0.305
+0.07605 0.11895 0.305
+0.078 0.117 0.305
+0.07995 0.11505 0.305
+0.0819 0.1131 0.305
+0.08385 0.11115 0.305
+0.0858 0.1092 0.305
+0.08775 0.10725 0.305
+0.0897 0.1053 0.305
+0.09165 0.10335 0.305
+0.0936 0.1014 0.305
+0.09555 0.09945 0.305
+0.0975 0.0975 0.305
+0.09945 0.09555 0.305
+0.1014 0.0936 0.305
+0.10335 0.09165 0.305
+0.1053 0.0897 0.305
+0.10725 0.08775 0.305
+0.1092 0.0858 0.305
+0.11115 0.08385 0.305
+0.1131 0.0819 0.305
+0.11505 0.07995 0.305
+0.117 0.078 0.305
+0.11895 0.07605 0.305
+0.1209 0.0741 0.305
+0.12285 0.07215 0.305
+0.1248 0.0702 0.305
+0.12675 0.06825 0.305
+0.1287 0.0663 0.305
+0.13065 0.06435 0.305
+0.1326 0.0624 0.305
+0.13455 0.06045 0.305
+0.1365 0.0585 0.305
+0.13845 0.05655 0.305
+0.1404 0.0546 0.305
+0.14235 0.05265 0.305
+0.1443 0.0507 0.305
+0.14625 0.04875 0.305
+0.1482 0.0468 0.305
+0.15015 0.04485 0.305
+0.1521 0.0429 0.305
+0.15405 0.04095 0.305
+0.156 0.039 0.305
+0.15795 0.03705 0.305
+0.1599 0.0351 0.305
+0.16185 0.03315 0.305
+0.1638 0.0312 0.305
+0.16575 0.02925 0.305
+0.1677 0.0273 0.305
+0.16965 0.02535 0.305
+0.1716 0.0234 0.305
+0.17355 0.02145 0.305
+0.1755 0.0195 0.305
+0.17745 0.01755 0.305
+0.1794 0.0156 0.305
+0.18135 0.01365 0.305
+0.1833 0.0117 0.305
+0.18525 0.00975 0.305
+0.1872 0.0078 0.305
+0.18915 0.00585 0.305
+0.1911 0.0039 0.305
+0.19305 0.00195 0.305
+0 0.2 0.3
+0.002 0.198 0.3
+0.004 0.196 0.3
+0.006 0.194 0.3
+0.008 0.192 0.3
+0.01 0.19 0.3
+0.012 0.188 0.3
+0.014 0.186 0.3
+0.016 0.184 0.3
+0.018 0.182 0.3
+0.02 0.18 0.3
+0.022 0.178 0.3
+0.024 0.176 0.3
+0.026 0.174 0.3
+0.028 0.172 0.3
+0.03 0.17 0.3
+0.032 0.168 0.3
+0.034 0.166 0.3
+0.036 0.164 0.3
+0.038 0.162 0.3
+0.04 0.16 0.3
+0.042 0.158 0.3
+0.044 0.156 0.3
+0.046 0.154 0.3
+0.048 0.152 0.3
+0.05 0.15 0.3
+0.052 0.148 0.3
+0.054 0.146 0.3
+0.056 0.144 0.3
+0.058 0.142 0.3
+0.06 0.14 0.3
+0.062 0.138 0.3
+0.064 0.136 0.3
+0.066 0.134 0.3
+0.068 0.132 0.3
+0.07 0.13 0.3
+0.072 0.128 0.3
+0.074 0.126 0.3
+0.076 0.124 0.3
+0.078 0.122 0.3
+0.08 0.12 0.3
+0.082 0.118 0.3
+0.084 0.116 0.3
+0.086 0.114 0.3
+0.088 0.112 0.3
+0.09 0.11 0.3
+0.092 0.108 0.3
+0.094 0.106 0.3
+0.096 0.104 0.3
+0.098 0.102 0.3
+0.1 0.1 0.3
+0.102 0.098 0.3
+0.104 0.096 0.3
+0.106 0.094 0.3
+0.108 0.092 0.3
+0.11 0.09 0.3
+0.112 0.088 0.3
+0.114 0.086 0.3
+0.116 0.084 0.3
+0.118 0.082 0.3
+0.12 0.08 0.3
+0.122 0.078 0.3
+0.124 0.076 0.3
+0.126 0.074 0.3
+0.128 0.072 0.3
+0.13 0.07 0.3
+0.132 0.068 0.3
+0.134 0.066 0.3
+0.136 0.064 0.3
+0.138 0.062 0.3
+0.14 0.06 0.3
+0.142 0.058 0.3
+0.144 0.056 0.3
+0.146 0.054 0.3
+0.148 0.052 0.3
+0.15 0.05 0.3
+0.152 0.048 0.3
+0.154 0.046 0.3
+0.156 0.044 0.3
+0.158 0.042 0.3
+0.16 0.04 0.3
+0.162 0.038 0.3
+0.164 0.036 0.3
+0.166 0.034 0.3
+0.168 0.032 0.3
+0.17 0.03 0.3
+0.172 0.028 0.3
+0.174 0.026 0.3
+0.176 0.024 0.3
+0.178 0.022 0.3
+0.18 0.02 0.3
+0.182 0.018 0.3
+0.184 0.016 0.3
+0.186 0.014 0.3
+0.188 0.012 0.3
+0.19 0.01 0.3
+0.192 0.008 0.3
+0.194 0.006 0.3
+0.196 0.004 0.3
+0.198 0.002 0.3
+0 0.205 0.295
+0.00205 0.20295 0.295
+0.0041 0.2009 0.295
+0.00615 0.19885 0.295
+0.0082 0.1968 0.295
+0.01025 0.19475 0.295
+0.0123 0.1927 0.295
+0.01435 0.19065 0.295
+0.0164 0.1886 0.295
+0.01845 0.18655 0.295
+0.0205 0.1845 0.295
+0.02255 0.18245 0.295
+0.0246 0.1804 0.295
+0.02665 0.17835 0.295
+0.0287 0.1763 0.295
+0.03075 0.17425 0.295
+0.0328 0.1722 0.295
+0.03485 0.17015 0.295
+0.0369 0.1681 0.295
+0.03895 0.16605 0.295
+0.041 0.164 0.295
+0.04305 0.16195 0.295
+0.0451 0.1599 0.295
+0.04715 0.15785 0.295
+0.0492 0.1558 0.295
+0.05125 0.15375 0.295
+0.0533 0.1517 0.295
+0.05535 0.14965 0.295
+0.0574 0.1476 0.295
+0.05945 0.14555 0.295
+0.0615 0.1435 0.295
+0.06355 0.14145 0.295
+0.0656 0.1394 0.295
+0.06765 0.13735 0.295
+0.0697 0.1353 0.295
+0.07175 0.13325 0.295
+0.0738 0.1312 0.295
+0.07585 0.12915 0.295
+0.0779 0.1271 0.295
+0.07995 0.12505 0.295
+0.082 0.123 0.295
+0.08405 0.12095 0.295
+0.0861 0.1189 0.295
+0.08815 0.11685 0.295
+0.0902 0.1148 0.295
+0.09225 0.11275 0.295
+0.0943 0.1107 0.295
+0.09635 0.10865 0.295
+0.0984 0.1066 0.295
+0.10045 0.10455 0.295
+0.1025 0.1025 0.295
+0.10455 0.10045 0.295
+0.1066 0.0984 0.295
+0.10865 0.09635 0.295
+0.1107 0.0943 0.295
+0.11275 0.09225 0.295
+0.1148 0.0902 0.295
+0.11685 0.08815 0.295
+0.1189 0.0861 0.295
+0.12095 0.08405 0.295
+0.123 0.082 0.295
+0.12505 0.07995 0.295
+0.1271 0.0779 0.295
+0.12915 0.07585 0.295
+0.1312 0.0738 0.295
+0.13325 0.07175 0.295
+0.1353 0.0697 0.295
+0.13735 0.06765 0.295
+0.1394 0.0656 0.295
+0.14145 0.06355 0.295
+0.1435 0.0615 0.295
+0.14555 0.05945 0.295
+0.1476 0.0574 0.295
+0.14965 0.05535 0.295
+0.1517 0.0533 0.295
+0.15375 0.05125 0.295
+0.1558 0.0492 0.295
+0.15785 0.04715 0.295
+0.1599 0.0451 0.295
+0.16195 0.04305 0.295
+0.164 0.041 0.295
+0.16605 0.03895 0.295
+0.1681 0.0369 0.295
+0.17015 0.03485 0.295
+0.1722 0.0328 0.295
+0.17425 0.03075 0.295
+0.1763 0.0287 0.295
+0.17835 0.02665 0.295
+0.1804 0.0246 0.295
+0.18245 0.02255 0.295
+0.1845 0.0205 0.295
+0.18655 0.01845 0.295
+0.1886 0.0164 0.295
+0.19065 0.01435 0.295
+0.1927 0.0123 0.295
+0.19475 0.01025 0.295
+0.1968 0.0082 0.295
+0.19885 0.00615 0.295
+0.2009 0.0041 0.295
+0.20295 0.00205 0.295
+0 0.21 0.29
+0.0021 0.2079 0.29
+0.0042 0.2058 0.29
+0.0063 0.2037 0.29
+0.0084 0.2016 0.29
+0.0105 0.1995 0.29
+0.0126 0.1974 0.29
+0.0147 0.1953 0.29
+0.0168 0.1932 0.29
+0.0189 0.1911 0.29
+0.021 0.189 0.29
+0.0231 0.1869 0.29
+0.0252 0.1848 0.29
+0.0273 0.1827 0.29
+0.0294 0.1806 0.29
+0.0315 0.1785 0.29
+0.0336 0.1764 0.29
+0.0357 0.1743 0.29
+0.0378 0.1722 0.29
+0.0399 0.1701 0.29
+0.042 0.168 0.29
+0.0441 0.1659 0.29
+0.0462 0.1638 0.29
+0.0483 0.1617 0.29
+0.0504 0.1596 0.29
+0.0525 0.1575 0.29
+0.0546 0.1554 0.29
+0.0567 0.1533 0.29
+0.0588 0.1512 0.29
+0.0609 0.1491 0.29
+0.063 0.147 0.29
+0.0651 0.1449 0.29
+0.0672 0.1428 0.29
+0.0693 0.1407 0.29
+0.0714 0.1386 0.29
+0.0735 0.1365 0.29
+0.0756 0.1344 0.29
+0.0777 0.1323 0.29
+0.0798 0.1302 0.29
+0.0819 0.1281 0.29
+0.084 0.126 0.29
+0.0861 0.1239 0.29
+0.0882 0.1218 0.29
+0.0903 0.1197 0.29
+0.0924 0.1176 0.29
+0.0945 0.1155 0.29
+0.0966 0.1134 0.29
+0.0987 0.1113 0.29
+0.1008 0.1092 0.29
+0.1029 0.1071 0.29
+0.105 0.105 0.29
+0.1071 0.1029 0.29
+0.1092 0.1008 0.29
+0.1113 0.0987 0.29
+0.1134 0.0966 0.29
+0.1155 0.0945 0.29
+0.1176 0.0924 0.29
+0.1197 0.0903 0.29
+0.1218 0.0882 0.29
+0.1239 0.0861 0.29
+0.126 0.084 0.29
+0.1281 0.0819 0.29
+0.1302 0.0798 0.29
+0.1323 0.0777 0.29
+0.1344 0.0756 0.29
+0.1365 0.0735 0.29
+0.1386 0.0714 0.29
+0.1407 0.0693 0.29
+0.1428 0.0672 0.29
+0.1449 0.0651 0.29
+0.147 0.063 0.29
+0.1491 0.0609 0.29
+0.1512 0.0588 0.29
+0.1533 0.0567 0.29
+0.1554 0.0546 0.29
+0.1575 0.0525 0.29
+0.1596 0.0504 0.29
+0.1617 0.0483 0.29
+0.1638 0.0462 0.29
+0.1659 0.0441 0.29
+0.168 0.042 0.29
+0.1701 0.0399 0.29
+0.1722 0.0378 0.29
+0.1743 0.0357 0.29
+0.1764 0.0336 0.29
+0.1785 0.0315 0.29
+0.1806 0.0294 0.29
+0.1827 0.0273 0.29
+0.1848 0.0252 0.29
+0.1869 0.0231 0.29
+0.189 0.021 0.29
+0.1911 0.0189 0.29
+0.1932 0.0168 0.29
+0.1953 0.0147 0.29
+0.1974 0.0126 0.29
+0.1995 0.0105 0.29
+0.2016 0.0084 0.29
+0.2037 0.0063 0.29
+0.2058 0.0042 0.29
+0.2079 0.0021 0.29
+0 0.215 0.285
+0.00215 0.21285 0.285
+0.0043 0.2107 0.285
+0.00645 0.20855 0.285
+0.0086 0.2064 0.285
+0.01075 0.20425 0.285
+0.0129 0.2021 0.285
+0.01505 0.19995 0.285
+0.0172 0.1978 0.285
+0.01935 0.19565 0.285
+0.0215 0.1935 0.285
+0.02365 0.19135 0.285
+0.0258 0.1892 0.285
+0.02795 0.18705 0.285
+0.0301 0.1849 0.285
+0.03225 0.18275 0.285
+0.0344 0.1806 0.285
+0.03655 0.17845 0.285
+0.0387 0.1763 0.285
+0.04085 0.17415 0.285
+0.043 0.172 0.285
+0.04515 0.16985 0.285
+0.0473 0.1677 0.285
+0.04945 0.16555 0.285
+0.0516 0.1634 0.285
+0.05375 0.16125 0.285
+0.0559 0.1591 0.285
+0.05805 0.15695 0.285
+0.0602 0.1548 0.285
+0.06235 0.15265 0.285
+0.0645 0.1505 0.285
+0.06665 0.14835 0.285
+0.0688 0.1462 0.285
+0.07095 0.14405 0.285
+0.0731 0.1419 0.285
+0.07525 0.13975 0.285
+0.0774 0.1376 0.285
+0.07955 0.13545 0.285
+0.0817 0.1333 0.285
+0.08385 0.13115 0.285
+0.086 0.129 0.285
+0.08815 0.12685 0.285
+0.0903 0.1247 0.285
+0.09245 0.12255 0.285
+0.0946 0.1204 0.285
+0.09675 0.11825 0.285
+0.0989 0.1161 0.285
+0.10105 0.11395 0.285
+0.1032 0.1118 0.285
+0.10535 0.10965 0.285
+0.1075 0.1075 0.285
+0.10965 0.10535 0.285
+0.1118 0.1032 0.285
+0.11395 0.10105 0.285
+0.1161 0.0989 0.285
+0.11825 0.09675 0.285
+0.1204 0.0946 0.285
+0.12255 0.09245 0.285
+0.1247 0.0903 0.285
+0.12685 0.08815 0.285
+0.129 0.086 0.285
+0.13115 0.08385 0.285
+0.1333 0.0817 0.285
+0.13545 0.07955 0.285
+0.1376 0.0774 0.285
+0.13975 0.07525 0.285
+0.1419 0.0731 0.285
+0.14405 0.07095 0.285
+0.1462 0.0688 0.285
+0.14835 0.06665 0.285
+0.1505 0.0645 0.285
+0.15265 0.06235 0.285
+0.1548 0.0602 0.285
+0.15695 0.05805 0.285
+0.1591 0.0559 0.285
+0.16125 0.05375 0.285
+0.1634 0.0516 0.285
+0.16555 0.04945 0.285
+0.1677 0.0473 0.285
+0.16985 0.04515 0.285
+0.172 0.043 0.285
+0.17415 0.04085 0.285
+0.1763 0.0387 0.285
+0.17845 0.03655 0.285
+0.1806 0.0344 0.285
+0.18275 0.03225 0.285
+0.1849 0.0301 0.285
+0.18705 0.02795 0.285
+0.1892 0.0258 0.285
+0.19135 0.02365 0.285
+0.1935 0.0215 0.285
+0.19565 0.01935 0.285
+0.1978 0.0172 0.285
+0.19995 0.01505 0.285
+0.2021 0.0129 0.285
+0.20425 0.01075 0.285
+0.2064 0.0086 0.285
+0.20855 0.00645 0.285
+0.2107 0.0043 0.285
+0.21285 0.00215 0.285
+0 0.22 0.28
+0.0022 0.2178 0.28
+0.0044 0.2156 0.28
+0.0066 0.2134 0.28
+0.0088 0.2112 0.28
+0.011 0.209 0.28
+0.0132 0.2068 0.28
+0.0154 0.2046 0.28
+0.0176 0.2024 0.28
+0.0198 0.2002 0.28
+0.022 0.198 0.28
+0.0242 0.1958 0.28
+0.0264 0.1936 0.28
+0.0286 0.1914 0.28
+0.0308 0.1892 0.28
+0.033 0.187 0.28
+0.0352 0.1848 0.28
+0.0374 0.1826 0.28
+0.0396 0.1804 0.28
+0.0418 0.1782 0.28
+0.044 0.176 0.28
+0.0462 0.1738 0.28
+0.0484 0.1716 0.28
+0.0506 0.1694 0.28
+0.0528 0.1672 0.28
+0.055 0.165 0.28
+0.0572 0.1628 0.28
+0.0594 0.1606 0.28
+0.0616 0.1584 0.28
+0.0638 0.1562 0.28
+0.066 0.154 0.28
+0.0682 0.1518 0.28
+0.0704 0.1496 0.28
+0.0726 0.1474 0.28
+0.0748 0.1452 0.28
+0.077 0.143 0.28
+0.0792 0.1408 0.28
+0.0814 0.1386 0.28
+0.0836 0.1364 0.28
+0.0858 0.1342 0.28
+0.088 0.132 0.28
+0.0902 0.1298 0.28
+0.0924 0.1276 0.28
+0.0946 0.1254 0.28
+0.0968 0.1232 0.28
+0.099 0.121 0.28
+0.1012 0.1188 0.28
+0.1034 0.1166 0.28
+0.1056 0.1144 0.28
+0.1078 0.1122 0.28
+0.11 0.11 0.28
+0.1122 0.1078 0.28
+0.1144 0.1056 0.28
+0.1166 0.1034 0.28
+0.1188 0.1012 0.28
+0.121 0.099 0.28
+0.1232 0.0968 0.28
+0.1254 0.0946 0.28
+0.1276 0.0924 0.28
+0.1298 0.0902 0.28
+0.132 0.088 0.28
+0.1342 0.0858 0.28
+0.1364 0.0836 0.28
+0.1386 0.0814 0.28
+0.1408 0.0792 0.28
+0.143 0.077 0.28
+0.1452 0.0748 0.28
+0.1474 0.0726 0.28
+0.1496 0.0704 0.28
+0.1518 0.0682 0.28
+0.154 0.066 0.28
+0.1562 0.0638 0.28
+0.1584 0.0616 0.28
+0.1606 0.0594 0.28
+0.1628 0.0572 0.28
+0.165 0.055 0.28
+0.1672 0.0528 0.28
+0.1694 0.0506 0.28
+0.1716 0.0484 0.28
+0.1738 0.0462 0.28
+0.176 0.044 0.28
+0.1782 0.0418 0.28
+0.1804 0.0396 0.28
+0.1826 0.0374 0.28
+0.1848 0.0352 0.28
+0.187 0.033 0.28
+0.1892 0.0308 0.28
+0.1914 0.0286 0.28
+0.1936 0.0264 0.28
+0.1958 0.0242 0.28
+0.198 0.022 0.28
+0.2002 0.0198 0.28
+0.2024 0.0176 0.28
+0.2046 0.0154 0.28
+0.2068 0.0132 0.28
+0.209 0.011 0.28
+0.2112 0.0088 0.28
+0.2134 0.0066 0.28
+0.2156 0.0044 0.28
+0.2178 0.0022 0.28
+0 0.225 0.275
+0.00225 0.22275 0.275
+0.0045 0.2205 0.275
+0.00675 0.21825 0.275
+0.009 0.216 0.275
+0.01125 0.21375 0.275
+0.0135 0.2115 0.275
+0.01575 0.20925 0.275
+0.018 0.207 0.275
+0.02025 0.20475 0.275
+0.0225 0.2025 0.275
+0.02475 0.20025 0.275
+0.027 0.198 0.275
+0.02925 0.19575 0.275
+0.0315 0.1935 0.275
+0.03375 0.19125 0.275
+0.036 0.189 0.275
+0.03825 0.18675 0.275
+0.0405 0.1845 0.275
+0.04275 0.18225 0.275
+0.045 0.18 0.275
+0.04725 0.17775 0.275
+0.0495 0.1755 0.275
+0.05175 0.17325 0.275
+0.054 0.171 0.275
+0.05625 0.16875 0.275
+0.0585 0.1665 0.275
+0.06075 0.16425 0.275
+0.063 0.162 0.275
+0.06525 0.15975 0.275
+0.0675 0.1575 0.275
+0.06975 0.15525 0.275
+0.072 0.153 0.275
+0.07425 0.15075 0.275
+0.0765 0.1485 0.275
+0.07875 0.14625 0.275
+0.081 0.144 0.275
+0.08325 0.14175 0.275
+0.0855 0.1395 0.275
+0.08775 0.13725 0.275
+0.09 0.135 0.275
+0.09225 0.13275 0.275
+0.0945 0.1305 0.275
+0.09675 0.12825 0.275
+0.099 0.126 0.275
+0.10125 0.12375 0.275
+0.1035 0.1215 0.275
+0.10575 0.11925 0.275
+0.108 0.117 0.275
+0.11025 0.11475 0.275
+0.1125 0.1125 0.275
+0.11475 0.11025 0.275
+0.117 0.108 0.275
+0.11925 0.10575 0.275
+0.1215 0.1035 0.275
+0.12375 0.10125 0.275
+0.126 0.099 0.275
+0.12825 0.09675 0.275
+0.1305 0.0945 0.275
+0.13275 0.09225 0.275
+0.135 0.09 0.275
+0.13725 0.08775 0.275
+0.1395 0.0855 0.275
+0.14175 0.08325 0.275
+0.144 0.081 0.275
+0.14625 0.07875 0.275
+0.1485 0.0765 0.275
+0.15075 0.07425 0.275
+0.153 0.072 0.275
+0.15525 0.06975 0.275
+0.1575 0.0675 0.275
+0.15975 0.06525 0.275
+0.162 0.063 0.275
+0.16425 0.06075 0.275
+0.1665 0.0585 0.275
+0.16875 0.05625 0.275
+0.171 0.054 0.275
+0.17325 0.05175 0.275
+0.1755 0.0495 0.275
+0.17775 0.04725 0.275
+0.18 0.045 0.275
+0.18225 0.04275 0.275
+0.1845 0.0405 0.275
+0.18675 0.03825 0.275
+0.189 0.036 0.275
+0.19125 0.03375 0.275
+0.1935 0.0315 0.275
+0.19575 0.02925 0.275
+0.198 0.027 0.275
+0.20025 0.02475 0.275
+0.2025 0.0225 0.275
+0.20475 0.02025 0.275
+0.207 0.018 0.275
+0.20925 0.01575 0.275
+0.2115 0.0135 0.275
+0.21375 0.01125 0.275
+0.216 0.009 0.275
+0.21825 0.00675 0.275
+0.2205 0.0045 0.275
+0.22275 0.00225 0.275
+0 0.23 0.27
+0.0023 0.2277 0.27
+0.0046 0.2254 0.27
+0.0069 0.2231 0.27
+0.0092 0.2208 0.27
+0.0115 0.2185 0.27
+0.0138 0.2162 0.27
+0.0161 0.2139 0.27
+0.0184 0.2116 0.27
+0.0207 0.2093 0.27
+0.023 0.207 0.27
+0.0253 0.2047 0.27
+0.0276 0.2024 0.27
+0.0299 0.2001 0.27
+0.0322 0.1978 0.27
+0.0345 0.1955 0.27
+0.0368 0.1932 0.27
+0.0391 0.1909 0.27
+0.0414 0.1886 0.27
+0.0437 0.1863 0.27
+0.046 0.184 0.27
+0.0483 0.1817 0.27
+0.0506 0.1794 0.27
+0.0529 0.1771 0.27
+0.0552 0.1748 0.27
+0.0575 0.1725 0.27
+0.0598 0.1702 0.27
+0.0621 0.1679 0.27
+0.0644 0.1656 0.27
+0.0667 0.1633 0.27
+0.069 0.161 0.27
+0.0713 0.1587 0.27
+0.0736 0.1564 0.27
+0.0759 0.1541 0.27
+0.0782 0.1518 0.27
+0.0805 0.1495 0.27
+0.0828 0.1472 0.27
+0.0851 0.1449 0.27
+0.0874 0.1426 0.27
+0.0897 0.1403 0.27
+0.092 0.138 0.27
+0.0943 0.1357 0.27
+0.0966 0.1334 0.27
+0.0989 0.1311 0.27
+0.1012 0.1288 0.27
+0.1035 0.1265 0.27
+0.1058 0.1242 0.27
+0.1081 0.1219 0.27
+0.1104 0.1196 0.27
+0.1127 0.1173 0.27
+0.115 0.115 0.27
+0.1173 0.1127 0.27
+0.1196 0.1104 0.27
+0.1219 0.1081 0.27
+0.1242 0.1058 0.27
+0.1265 0.1035 0.27
+0.1288 0.1012 0.27
+0.1311 0.0989 0.27
+0.1334 0.0966 0.27
+0.1357 0.0943 0.27
+0.138 0.092 0.27
+0.1403 0.0897 0.27
+0.1426 0.0874 0.27
+0.1449 0.0851 0.27
+0.1472 0.0828 0.27
+0.1495 0.0805 0.27
+0.1518 0.0782 0.27
+0.1541 0.0759 0.27
+0.1564 0.0736 0.27
+0.1587 0.0713 0.27
+0.161 0.069 0.27
+0.1633 0.0667 0.27
+0.1656 0.0644 0.27
+0.1679 0.0621 0.27
+0.1702 0.0598 0.27
+0.1725 0.0575 0.27
+0.1748 0.0552 0.27
+0.1771 0.0529 0.27
+0.1794 0.0506 0.27
+0.1817 0.0483 0.27
+0.184 0.046 0.27
+0.1863 0.0437 0.27
+0.1886 0.0414 0.27
+0.1909 0.0391 0.27
+0.1932 0.0368 0.27
+0.1955 0.0345 0.27
+0.1978 0.0322 0.27
+0.2001 0.0299 0.27
+0.2024 0.0276 0.27
+0.2047 0.0253 0.27
+0.207 0.023 0.27
+0.2093 0.0207 0.27
+0.2116 0.0184 0.27
+0.2139 0.0161 0.27
+0.2162 0.0138 0.27
+0.2185 0.0115 0.27
+0.2208 0.0092 0.27
+0.2231 0.0069 0.27
+0.2254 0.0046 0.27
+0.2277 0.0023 0.27
+0 0.235 0.265
+0.00235 0.23265 0.265
+0.0047 0.2303 0.265
+0.00705 0.22795 0.265
+0.0094 0.2256 0.265
+0.01175 0.22325 0.265
+0.0141 0.2209 0.265
+0.01645 0.21855 0.265
+0.0188 0.2162 0.265
+0.02115 0.21385 0.265
+0.0235 0.2115 0.265
+0.02585 0.20915 0.265
+0.0282 0.2068 0.265
+0.03055 0.20445 0.265
+0.0329 0.2021 0.265
+0.03525 0.19975 0.265
+0.0376 0.1974 0.265
+0.03995 0.19505 0.265
+0.0423 0.1927 0.265
+0.04465 0.19035 0.265
+0.047 0.188 0.265
+0.04935 0.18565 0.265
+0.0517 0.1833 0.265
+0.05405 0.18095 0.265
+0.0564 0.1786 0.265
+0.05875 0.17625 0.265
+0.0611 0.1739 0.265
+0.06345 0.17155 0.265
+0.0658 0.1692 0.265
+0.06815 0.16685 0.265
+0.0705 0.1645 0.265
+0.07285 0.16215 0.265
+0.0752 0.1598 0.265
+0.07755 0.15745 0.265
+0.0799 0.1551 0.265
+0.08225 0.15275 0.265
+0.0846 0.1504 0.265
+0.08695 0.14805 0.265
+0.0893 0.1457 0.265
+0.09165 0.14335 0.265
+0.094 0.141 0.265
+0.09635 0.13865 0.265
+0.0987 0.1363 0.265
+0.10105 0.13395 0.265
+0.1034 0.1316 0.265
+0.10575 0.12925 0.265
+0.1081 0.1269 0.265
+0.11045 0.12455 0.265
+0.1128 0.1222 0.265
+0.11515 0.11985 0.265
+0.1175 0.1175 0.265
+0.11985 0.11515 0.265
+0.1222 0.1128 0.265
+0.12455 0.11045 0.265
+0.1269 0.1081 0.265
+0.12925 0.10575 0.265
+0.1316 0.1034 0.265
+0.13395 0.10105 0.265
+0.1363 0.0987 0.265
+0.13865 0.09635 0.265
+0.141 0.094 0.265
+0.14335 0.09165 0.265
+0.1457 0.0893 0.265
+0.14805 0.08695 0.265
+0.1504 0.0846 0.265
+0.15275 0.08225 0.265
+0.1551 0.0799 0.265
+0.15745 0.07755 0.265
+0.1598 0.0752 0.265
+0.16215 0.07285 0.265
+0.1645 0.0705 0.265
+0.16685 0.06815 0.265
+0.1692 0.0658 0.265
+0.17155 0.06345 0.265
+0.1739 0.0611 0.265
+0.17625 0.05875 0.265
+0.1786 0.0564 0.265
+0.18095 0.05405 0.265
+0.1833 0.0517 0.265
+0.18565 0.04935 0.265
+0.188 0.047 0.265
+0.19035 0.04465 0.265
+0.1927 0.0423 0.265
+0.19505 0.03995 0.265
+0.1974 0.0376 0.265
+0.19975 0.03525 0.265
+0.2021 0.0329 0.265
+0.20445 0.03055 0.265
+0.2068 0.0282 0.265
+0.20915 0.02585 0.265
+0.2115 0.0235 0.265
+0.21385 0.02115 0.265
+0.2162 0.0188 0.265
+0.21855 0.01645 0.265
+0.2209 0.0141 0.265
+0.22325 0.01175 0.265
+0.2256 0.0094 0.265
+0.22795 0.00705 0.265
+0.2303 0.0047 0.265
+0.23265 0.00235 0.265
+0 0.24 0.26
+0.0024 0.2376 0.26
+0.0048 0.2352 0.26
+0.0072 0.2328 0.26
+0.0096 0.2304 0.26
+0.012 0.228 0.26
+0.0144 0.2256 0.26
+0.0168 0.2232 0.26
+0.0192 0.2208 0.26
+0.0216 0.2184 0.26
+0.024 0.216 0.26
+0.0264 0.2136 0.26
+0.0288 0.2112 0.26
+0.0312 0.2088 0.26
+0.0336 0.2064 0.26
+0.036 0.204 0.26
+0.0384 0.2016 0.26
+0.0408 0.1992 0.26
+0.0432 0.1968 0.26
+0.0456 0.1944 0.26
+0.048 0.192 0.26
+0.0504 0.1896 0.26
+0.0528 0.1872 0.26
+0.0552 0.1848 0.26
+0.0576 0.1824 0.26
+0.06 0.18 0.26
+0.0624 0.1776 0.26
+0.0648 0.1752 0.26
+0.0672 0.1728 0.26
+0.0696 0.1704 0.26
+0.072 0.168 0.26
+0.0744 0.1656 0.26
+0.0768 0.1632 0.26
+0.0792 0.1608 0.26
+0.0816 0.1584 0.26
+0.084 0.156 0.26
+0.0864 0.1536 0.26
+0.0888 0.1512 0.26
+0.0912 0.1488 0.26
+0.0936 0.1464 0.26
+0.096 0.144 0.26
+0.0984 0.1416 0.26
+0.1008 0.1392 0.26
+0.1032 0.1368 0.26
+0.1056 0.1344 0.26
+0.108 0.132 0.26
+0.1104 0.1296 0.26
+0.1128 0.1272 0.26
+0.1152 0.1248 0.26
+0.1176 0.1224 0.26
+0.12 0.12 0.26
+0.1224 0.1176 0.26
+0.1248 0.1152 0.26
+0.1272 0.1128 0.26
+0.1296 0.1104 0.26
+0.132 0.108 0.26
+0.1344 0.1056 0.26
+0.1368 0.1032 0.26
+0.1392 0.1008 0.26
+0.1416 0.0984 0.26
+0.144 0.096 0.26
+0.1464 0.0936 0.26
+0.1488 0.0912 0.26
+0.1512 0.0888 0.26
+0.1536 0.0864 0.26
+0.156 0.084 0.26
+0.1584 0.0816 0.26
+0.1608 0.0792 0.26
+0.1632 0.0768 0.26
+0.1656 0.0744 0.26
+0.168 0.072 0.26
+0.1704 0.0696 0.26
+0.1728 0.0672 0.26
+0.1752 0.0648 0.26
+0.1776 0.0624 0.26
+0.18 0.06 0.26
+0.1824 0.0576 0.26
+0.1848 0.0552 0.26
+0.1872 0.0528 0.26
+0.1896 0.0504 0.26
+0.192 0.048 0.26
+0.1944 0.0456 0.26
+0.1968 0.0432 0.26
+0.1992 0.0408 0.26
+0.2016 0.0384 0.26
+0.204 0.036 0.26
+0.2064 0.0336 0.26
+0.2088 0.0312 0.26
+0.2112 0.0288 0.26
+0.2136 0.0264 0.26
+0.216 0.024 0.26
+0.2184 0.0216 0.26
+0.2208 0.0192 0.26
+0.2232 0.0168 0.26
+0.2256 0.0144 0.26
+0.228 0.012 0.26
+0.2304 0.0096 0.26
+0.2328 0.0072 0.26
+0.2352 0.0048 0.26
+0.2376 0.0024 0.26
+0 0.245 0.255
+0.00245 0.24255 0.255
+0.0049 0.2401 0.255
+0.00735 0.23765 0.255
+0.0098 0.2352 0.255
+0.01225 0.23275 0.255
+0.0147 0.2303 0.255
+0.01715 0.22785 0.255
+0.0196 0.2254 0.255
+0.02205 0.22295 0.255
+0.0245 0.2205 0.255
+0.02695 0.21805 0.255
+0.0294 0.2156 0.255
+0.03185 0.21315 0.255
+0.0343 0.2107 0.255
+0.03675 0.20825 0.255
+0.0392 0.2058 0.255
+0.04165 0.20335 0.255
+0.0441 0.2009 0.255
+0.04655 0.19845 0.255
+0.049 0.196 0.255
+0.05145 0.19355 0.255
+0.0539 0.1911 0.255
+0.05635 0.18865 0.255
+0.0588 0.1862 0.255
+0.06125 0.18375 0.255
+0.0637 0.1813 0.255
+0.06615 0.17885 0.255
+0.0686 0.1764 0.255
+0.07105 0.17395 0.255
+0.0735 0.1715 0.255
+0.07595 0.16905 0.255
+0.0784 0.1666 0.255
+0.08085 0.16415 0.255
+0.0833 0.1617 0.255
+0.08575 0.15925 0.255
+0.0882 0.1568 0.255
+0.09065 0.15435 0.255
+0.0931 0.1519 0.255
+0.09555 0.14945 0.255
+0.098 0.147 0.255
+0.10045 0.14455 0.255
+0.1029 0.1421 0.255
+0.10535 0.13965 0.255
+0.1078 0.1372 0.255
+0.11025 0.13475 0.255
+0.1127 0.1323 0.255
+0.11515 0.12985 0.255
+0.1176 0.1274 0.255
+0.12005 0.12495 0.255
+0.1225 0.1225 0.255
+0.12495 0.12005 0.255
+0.1274 0.1176 0.255
+0.12985 0.11515 0.255
+0.1323 0.1127 0.255
+0.13475 0.11025 0.255
+0.1372 0.1078 0.255
+0.13965 0.10535 0.255
+0.1421 0.1029 0.255
+0.14455 0.10045 0.255
+0.147 0.098 0.255
+0.14945 0.09555 0.255
+0.1519 0.0931 0.255
+0.15435 0.09065 0.255
+0.1568 0.0882 0.255
+0.15925 0.08575 0.255
+0.1617 0.0833 0.255
+0.16415 0.08085 0.255
+0.1666 0.0784 0.255
+0.16905 0.07595 0.255
+0.1715 0.0735 0.255
+0.17395 0.07105 0.255
+0.1764 0.0686 0.255
+0.17885 0.06615 0.255
+0.1813 0.0637 0.255
+0.18375 0.06125 0.255
+0.1862 0.0588 0.255
+0.18865 0.05635 0.255
+0.1911 0.0539 0.255
+0.19355 0.05145 0.255
+0.196 0.049 0.255
+0.19845 0.04655 0.255
+0.2009 0.0441 0.255
+0.20335 0.04165 0.255
+0.2058 0.0392 0.255
+0.20825 0.03675 0.255
+0.2107 0.0343 0.255
+0.21315 0.03185 0.255
+0.2156 0.0294 0.255
+0.21805 0.02695 0.255
+0.2205 0.0245 0.255
+0.22295 0.02205 0.255
+0.2254 0.0196 0.255
+0.22785 0.01715 0.255
+0.2303 0.0147 0.255
+0.23275 0.01225 0.255
+0.2352 0.0098 0.255
+0.23765 0.00735 0.255
+0.2401 0.0049 0.255
+0.24255 0.00245 0.255
+0 0.25 0.25
+0.0025 0.2475 0.25
+0.005 0.245 0.25
+0.0075 0.2425 0.25
+0.01 0.24 0.25
+0.0125 0.2375 0.25
+0.015 0.235 0.25
+0.0175 0.2325 0.25
+0.02 0.23 0.25
+0.0225 0.2275 0.25
+0.025 0.225 0.25
+0.0275 0.2225 0.25
+0.03 0.22 0.25
+0.0325 0.2175 0.25
+0.035 0.215 0.25
+0.0375 0.2125 0.25
+0.04 0.21 0.25
+0.0425 0.2075 0.25
+0.045 0.205 0.25
+0.0475 0.2025 0.25
+0.05 0.2 0.25
+0.0525 0.1975 0.25
+0.055 0.195 0.25
+0.0575 0.1925 0.25
+0.06 0.19 0.25
+0.0625 0.1875 0.25
+0.065 0.185 0.25
+0.0675 0.1825 0.25
+0.07 0.18 0.25
+0.0725 0.1775 0.25
+0.075 0.175 0.25
+0.0775 0.1725 0.25
+0.08 0.17 0.25
+0.0825 0.1675 0.25
+0.085 0.165 0.25
+0.0875 0.1625 0.25
+0.09 0.16 0.25
+0.0925 0.1575 0.25
+0.095 0.155 0.25
+0.0975 0.1525 0.25
+0.1 0.15 0.25
+0.1025 0.1475 0.25
+0.105 0.145 0.25
+0.1075 0.1425 0.25
+0.11 0.14 0.25
+0.1125 0.1375 0.25
+0.115 0.135 0.25
+0.1175 0.1325 0.25
+0.12 0.13 0.25
+0.1225 0.1275 0.25
+0.125 0.125 0.25
+0.1275 0.1225 0.25
+0.13 0.12 0.25
+0.1325 0.1175 0.25
+0.135 0.115 0.25
+0.1375 0.1125 0.25
+0.14 0.11 0.25
+0.1425 0.1075 0.25
+0.145 0.105 0.25
+0.1475 0.1025 0.25
+0.15 0.1 0.25
+0.1525 0.0975 0.25
+0.155 0.095 0.25
+0.1575 0.0925 0.25
+0.16 0.09 0.25
+0.1625 0.0875 0.25
+0.165 0.085 0.25
+0.1675 0.0825 0.25
+0.17 0.08 0.25
+0.1725 0.0775 0.25
+0.175 0.075 0.25
+0.1775 0.0725 0.25
+0.18 0.07 0.25
+0.1825 0.0675 0.25
+0.185 0.065 0.25
+0.1875 0.0625 0.25
+0.19 0.06 0.25
+0.1925 0.0575 0.25
+0.195 0.055 0.25
+0.1975 0.0525 0.25
+0.2 0.05 0.25
+0.2025 0.0475 0.25
+0.205 0.045 0.25
+0.2075 0.0425 0.25
+0.21 0.04 0.25
+0.2125 0.0375 0.25
+0.215 0.035 0.25
+0.2175 0.0325 0.25
+0.22 0.03 0.25
+0.2225 0.0275 0.25
+0.225 0.025 0.25
+0.2275 0.0225 0.25
+0.23 0.02 0.25
+0.2325 0.0175 0.25
+0.235 0.015 0.25
+0.2375 0.0125 0.25
+0.24 0.01 0.25
+0.2425 0.0075 0.25
+0.245 0.005 0.25
+0.2475 0.0025 0.25
+0 0.255 0.245
+0.00255 0.25245 0.245
+0.0051 0.2499 0.245
+0.00765 0.24735 0.245
+0.0102 0.2448 0.245
+0.01275 0.24225 0.245
+0.0153 0.2397 0.245
+0.01785 0.23715 0.245
+0.0204 0.2346 0.245
+0.02295 0.23205 0.245
+0.0255 0.2295 0.245
+0.02805 0.22695 0.245
+0.0306 0.2244 0.245
+0.03315 0.22185 0.245
+0.0357 0.2193 0.245
+0.03825 0.21675 0.245
+0.0408 0.2142 0.245
+0.04335 0.21165 0.245
+0.0459 0.2091 0.245
+0.04845 0.20655 0.245
+0.051 0.204 0.245
+0.05355 0.20145 0.245
+0.0561 0.1989 0.245
+0.05865 0.19635 0.245
+0.0612 0.1938 0.245
+0.06375 0.19125 0.245
+0.0663 0.1887 0.245
+0.06885 0.18615 0.245
+0.0714 0.1836 0.245
+0.07395 0.18105 0.245
+0.0765 0.1785 0.245
+0.07905 0.17595 0.245
+0.0816 0.1734 0.245
+0.08415 0.17085 0.245
+0.0867 0.1683 0.245
+0.08925 0.16575 0.245
+0.0918 0.1632 0.245
+0.09435 0.16065 0.245
+0.0969 0.1581 0.245
+0.09945 0.15555 0.245
+0.102 0.153 0.245
+0.10455 0.15045 0.245
+0.1071 0.1479 0.245
+0.10965 0.14535 0.245
+0.1122 0.1428 0.245
+0.11475 0.14025 0.245
+0.1173 0.1377 0.245
+0.11985 0.13515 0.245
+0.1224 0.1326 0.245
+0.12495 0.13005 0.245
+0.1275 0.1275 0.245
+0.13005 0.12495 0.245
+0.1326 0.1224 0.245
+0.13515 0.11985 0.245
+0.1377 0.1173 0.245
+0.14025 0.11475 0.245
+0.1428 0.1122 0.245
+0.14535 0.10965 0.245
+0.1479 0.1071 0.245
+0.15045 0.10455 0.245
+0.153 0.102 0.245
+0.15555 0.09945 0.245
+0.1581 0.0969 0.245
+0.16065 0.09435 0.245
+0.1632 0.0918 0.245
+0.16575 0.08925 0.245
+0.1683 0.0867 0.245
+0.17085 0.08415 0.245
+0.1734 0.0816 0.245
+0.17595 0.07905 0.245
+0.1785 0.0765 0.245
+0.18105 0.07395 0.245
+0.1836 0.0714 0.245
+0.18615 0.06885 0.245
+0.1887 0.0663 0.245
+0.19125 0.06375 0.245
+0.1938 0.0612 0.245
+0.19635 0.05865 0.245
+0.1989 0.0561 0.245
+0.20145 0.05355 0.245
+0.204 0.051 0.245
+0.20655 0.04845 0.245
+0.2091 0.0459 0.245
+0.21165 0.04335 0.245
+0.2142 0.0408 0.245
+0.21675 0.03825 0.245
+0.2193 0.0357 0.245
+0.22185 0.03315 0.245
+0.2244 0.0306 0.245
+0.22695 0.02805 0.245
+0.2295 0.0255 0.245
+0.23205 0.02295 0.245
+0.2346 0.0204 0.245
+0.23715 0.01785 0.245
+0.2397 0.0153 0.245
+0.24225 0.01275 0.245
+0.2448 0.0102 0.245
+0.24735 0.00765 0.245
+0.2499 0.0051 0.245
+0.25245 0.00255 0.245
+0 0.26 0.24
+0.0026 0.2574 0.24
+0.0052 0.2548 0.24
+0.0078 0.2522 0.24
+0.0104 0.2496 0.24
+0.013 0.247 0.24
+0.0156 0.2444 0.24
+0.0182 0.2418 0.24
+0.0208 0.2392 0.24
+0.0234 0.2366 0.24
+0.026 0.234 0.24
+0.0286 0.2314 0.24
+0.0312 0.2288 0.24
+0.0338 0.2262 0.24
+0.0364 0.2236 0.24
+0.039 0.221 0.24
+0.0416 0.2184 0.24
+0.0442 0.2158 0.24
+0.0468 0.2132 0.24
+0.0494 0.2106 0.24
+0.052 0.208 0.24
+0.0546 0.2054 0.24
+0.0572 0.2028 0.24
+0.0598 0.2002 0.24
+0.0624 0.1976 0.24
+0.065 0.195 0.24
+0.0676 0.1924 0.24
+0.0702 0.1898 0.24
+0.0728 0.1872 0.24
+0.0754 0.1846 0.24
+0.078 0.182 0.24
+0.0806 0.1794 0.24
+0.0832 0.1768 0.24
+0.0858 0.1742 0.24
+0.0884 0.1716 0.24
+0.091 0.169 0.24
+0.0936 0.1664 0.24
+0.0962 0.1638 0.24
+0.0988 0.1612 0.24
+0.1014 0.1586 0.24
+0.104 0.156 0.24
+0.1066 0.1534 0.24
+0.1092 0.1508 0.24
+0.1118 0.1482 0.24
+0.1144 0.1456 0.24
+0.117 0.143 0.24
+0.1196 0.1404 0.24
+0.1222 0.1378 0.24
+0.1248 0.1352 0.24
+0.1274 0.1326 0.24
+0.13 0.13 0.24
+0.1326 0.1274 0.24
+0.1352 0.1248 0.24
+0.1378 0.1222 0.24
+0.1404 0.1196 0.24
+0.143 0.117 0.24
+0.1456 0.1144 0.24
+0.1482 0.1118 0.24
+0.1508 0.1092 0.24
+0.1534 0.1066 0.24
+0.156 0.104 0.24
+0.1586 0.1014 0.24
+0.1612 0.0988 0.24
+0.1638 0.0962 0.24
+0.1664 0.0936 0.24
+0.169 0.091 0.24
+0.1716 0.0884 0.24
+0.1742 0.0858 0.24
+0.1768 0.0832 0.24
+0.1794 0.0806 0.24
+0.182 0.078 0.24
+0.1846 0.0754 0.24
+0.1872 0.0728 0.24
+0.1898 0.0702 0.24
+0.1924 0.0676 0.24
+0.195 0.065 0.24
+0.1976 0.0624 0.24
+0.2002 0.0598 0.24
+0.2028 0.0572 0.24
+0.2054 0.0546 0.24
+0.208 0.052 0.24
+0.2106 0.0494 0.24
+0.2132 0.0468 0.24
+0.2158 0.0442 0.24
+0.2184 0.0416 0.24
+0.221 0.039 0.24
+0.2236 0.0364 0.24
+0.2262 0.0338 0.24
+0.2288 0.0312 0.24
+0.2314 0.0286 0.24
+0.234 0.026 0.24
+0.2366 0.0234 0.24
+0.2392 0.0208 0.24
+0.2418 0.0182 0.24
+0.2444 0.0156 0.24
+0.247 0.013 0.24
+0.2496 0.0104 0.24
+0.2522 0.0078 0.24
+0.2548 0.0052 0.24
+0.2574 0.0026 0.24
+0 0.265 0.235
+0.00265 0.26235 0.235
+0.0053 0.2597 0.235
+0.00795 0.25705 0.235
+0.0106 0.2544 0.235
+0.01325 0.25175 0.235
+0.0159 0.2491 0.235
+0.01855 0.24645 0.235
+0.0212 0.2438 0.235
+0.02385 0.24115 0.235
+0.0265 0.2385 0.235
+0.02915 0.23585 0.235
+0.0318 0.2332 0.235
+0.03445 0.23055 0.235
+0.0371 0.2279 0.235
+0.03975 0.22525 0.235
+0.0424 0.2226 0.235
+0.04505 0.21995 0.235
+0.0477 0.2173 0.235
+0.05035 0.21465 0.235
+0.053 0.212 0.235
+0.05565 0.20935 0.235
+0.0583 0.2067 0.235
+0.06095 0.20405 0.235
+0.0636 0.2014 0.235
+0.06625 0.19875 0.235
+0.0689 0.1961 0.235
+0.07155 0.19345 0.235
+0.0742 0.1908 0.235
+0.07685 0.18815 0.235
+0.0795 0.1855 0.235
+0.08215 0.18285 0.235
+0.0848 0.1802 0.235
+0.08745 0.17755 0.235
+0.0901 0.1749 0.235
+0.09275 0.17225 0.235
+0.0954 0.1696 0.235
+0.09805 0.16695 0.235
+0.1007 0.1643 0.235
+0.10335 0.16165 0.235
+0.106 0.159 0.235
+0.10865 0.15635 0.235
+0.1113 0.1537 0.235
+0.11395 0.15105 0.235
+0.1166 0.1484 0.235
+0.11925 0.14575 0.235
+0.1219 0.1431 0.235
+0.12455 0.14045 0.235
+0.1272 0.1378 0.235
+0.12985 0.13515 0.235
+0.1325 0.1325 0.235
+0.13515 0.12985 0.235
+0.1378 0.1272 0.235
+0.14045 0.12455 0.235
+0.1431 0.1219 0.235
+0.14575 0.11925 0.235
+0.1484 0.1166 0.235
+0.15105 0.11395 0.235
+0.1537 0.1113 0.235
+0.15635 0.10865 0.235
+0.159 0.106 0.235
+0.16165 0.10335 0.235
+0.1643 0.1007 0.235
+0.16695 0.09805 0.235
+0.1696 0.0954 0.235
+0.17225 0.09275 0.235
+0.1749 0.0901 0.235
+0.17755 0.08745 0.235
+0.1802 0.0848 0.235
+0.18285 0.08215 0.235
+0.1855 0.0795 0.235
+0.18815 0.07685 0.235
+0.1908 0.0742 0.235
+0.19345 0.07155 0.235
+0.1961 0.0689 0.235
+0.19875 0.06625 0.235
+0.2014 0.0636 0.235
+0.20405 0.06095 0.235
+0.2067 0.0583 0.235
+0.20935 0.05565 0.235
+0.212 0.053 0.235
+0.21465 0.05035 0.235
+0.2173 0.0477 0.235
+0.21995 0.04505 0.235
+0.2226 0.0424 0.235
+0.22525 0.03975 0.235
+0.2279 0.0371 0.235
+0.23055 0.03445 0.235
+0.2332 0.0318 0.235
+0.23585 0.02915 0.235
+0.2385 0.0265 0.235
+0.24115 0.02385 0.235
+0.2438 0.0212 0.235
+0.24645 0.01855 0.235
+0.2491 0.0159 0.235
+0.25175 0.01325 0.235
+0.2544 0.0106 0.235
+0.25705 0.00795 0.235
+0.2597 0.0053 0.235
+0.26235 0.00265 0.235
+0 0.27 0.23
+0.0027 0.2673 0.23
+0.0054 0.2646 0.23
+0.0081 0.2619 0.23
+0.0108 0.2592 0.23
+0.0135 0.2565 0.23
+0.0162 0.2538 0.23
+0.0189 0.2511 0.23
+0.0216 0.2484 0.23
+0.0243 0.2457 0.23
+0.027 0.243 0.23
+0.0297 0.2403 0.23
+0.0324 0.2376 0.23
+0.0351 0.2349 0.23
+0.0378 0.2322 0.23
+0.0405 0.2295 0.23
+0.0432 0.2268 0.23
+0.0459 0.2241 0.23
+0.0486 0.2214 0.23
+0.0513 0.2187 0.23
+0.054 0.216 0.23
+0.0567 0.2133 0.23
+0.0594 0.2106 0.23
+0.0621 0.2079 0.23
+0.0648 0.2052 0.23
+0.0675 0.2025 0.23
+0.0702 0.1998 0.23
+0.0729 0.1971 0.23
+0.0756 0.1944 0.23
+0.0783 0.1917 0.23
+0.081 0.189 0.23
+0.0837 0.1863 0.23
+0.0864 0.1836 0.23
+0.0891 0.1809 0.23
+0.0918 0.1782 0.23
+0.0945 0.1755 0.23
+0.0972 0.1728 0.23
+0.0999 0.1701 0.23
+0.1026 0.1674 0.23
+0.1053 0.1647 0.23
+0.108 0.162 0.23
+0.1107 0.1593 0.23
+0.1134 0.1566 0.23
+0.1161 0.1539 0.23
+0.1188 0.1512 0.23
+0.1215 0.1485 0.23
+0.1242 0.1458 0.23
+0.1269 0.1431 0.23
+0.1296 0.1404 0.23
+0.1323 0.1377 0.23
+0.135 0.135 0.23
+0.1377 0.1323 0.23
+0.1404 0.1296 0.23
+0.1431 0.1269 0.23
+0.1458 0.1242 0.23
+0.1485 0.1215 0.23
+0.1512 0.1188 0.23
+0.1539 0.1161 0.23
+0.1566 0.1134 0.23
+0.1593 0.1107 0.23
+0.162 0.108 0.23
+0.1647 0.1053 0.23
+0.1674 0.1026 0.23
+0.1701 0.0999 0.23
+0.1728 0.0972 0.23
+0.1755 0.0945 0.23
+0.1782 0.0918 0.23
+0.1809 0.0891 0.23
+0.1836 0.0864 0.23
+0.1863 0.0837 0.23
+0.189 0.081 0.23
+0.1917 0.0783 0.23
+0.1944 0.0756 0.23
+0.1971 0.0729 0.23
+0.1998 0.0702 0.23
+0.2025 0.0675 0.23
+0.2052 0.0648 0.23
+0.2079 0.0621 0.23
+0.2106 0.0594 0.23
+0.2133 0.0567 0.23
+0.216 0.054 0.23
+0.2187 0.0513 0.23
+0.2214 0.0486 0.23
+0.2241 0.0459 0.23
+0.2268 0.0432 0.23
+0.2295 0.0405 0.23
+0.2322 0.0378 0.23
+0.2349 0.0351 0.23
+0.2376 0.0324 0.23
+0.2403 0.0297 0.23
+0.243 0.027 0.23
+0.2457 0.0243 0.23
+0.2484 0.0216 0.23
+0.2511 0.0189 0.23
+0.2538 0.0162 0.23
+0.2565 0.0135 0.23
+0.2592 0.0108 0.23
+0.2619 0.0081 0.23
+0.2646 0.0054 0.23
+0.2673 0.0027 0.23
+0 0.275 0.225
+0.00275 0.27225 0.225
+0.0055 0.2695 0.225
+0.00825 0.26675 0.225
+0.011 0.264 0.225
+0.01375 0.26125 0.225
+0.0165 0.2585 0.225
+0.01925 0.25575 0.225
+0.022 0.253 0.225
+0.02475 0.25025 0.225
+0.0275 0.2475 0.225
+0.03025 0.24475 0.225
+0.033 0.242 0.225
+0.03575 0.23925 0.225
+0.0385 0.2365 0.225
+0.04125 0.23375 0.225
+0.044 0.231 0.225
+0.04675 0.22825 0.225
+0.0495 0.2255 0.225
+0.05225 0.22275 0.225
+0.055 0.22 0.225
+0.05775 0.21725 0.225
+0.0605 0.2145 0.225
+0.06325 0.21175 0.225
+0.066 0.209 0.225
+0.06875 0.20625 0.225
+0.0715 0.2035 0.225
+0.07425 0.20075 0.225
+0.077 0.198 0.225
+0.07975 0.19525 0.225
+0.0825 0.1925 0.225
+0.08525 0.18975 0.225
+0.088 0.187 0.225
+0.09075 0.18425 0.225
+0.0935 0.1815 0.225
+0.09625 0.17875 0.225
+0.099 0.176 0.225
+0.10175 0.17325 0.225
+0.1045 0.1705 0.225
+0.10725 0.16775 0.225
+0.11 0.165 0.225
+0.11275 0.16225 0.225
+0.1155 0.1595 0.225
+0.11825 0.15675 0.225
+0.121 0.154 0.225
+0.12375 0.15125 0.225
+0.1265 0.1485 0.225
+0.12925 0.14575 0.225
+0.132 0.143 0.225
+0.13475 0.14025 0.225
+0.1375 0.1375 0.225
+0.14025 0.13475 0.225
+0.143 0.132 0.225
+0.14575 0.12925 0.225
+0.1485 0.1265 0.225
+0.15125 0.12375 0.225
+0.154 0.121 0.225
+0.15675 0.11825 0.225
+0.1595 0.1155 0.225
+0.16225 0.11275 0.225
+0.165 0.11 0.225
+0.16775 0.10725 0.225
+0.1705 0.1045 0.225
+0.17325 0.10175 0.225
+0.176 0.099 0.225
+0.17875 0.09625 0.225
+0.1815 0.0935 0.225
+0.18425 0.09075 0.225
+0.187 0.088 0.225
+0.18975 0.08525 0.225
+0.1925 0.0825 0.225
+0.19525 0.07975 0.225
+0.198 0.077 0.225
+0.20075 0.07425 0.225
+0.2035 0.0715 0.225
+0.20625 0.06875 0.225
+0.209 0.066 0.225
+0.21175 0.06325 0.225
+0.2145 0.0605 0.225
+0.21725 0.05775 0.225
+0.22 0.055 0.225
+0.22275 0.05225 0.225
+0.2255 0.0495 0.225
+0.22825 0.04675 0.225
+0.231 0.044 0.225
+0.23375 0.04125 0.225
+0.2365 0.0385 0.225
+0.23925 0.03575 0.225
+0.242 0.033 0.225
+0.24475 0.03025 0.225
+0.2475 0.0275 0.225
+0.25025 0.02475 0.225
+0.253 0.022 0.225
+0.25575 0.01925 0.225
+0.2585 0.0165 0.225
+0.26125 0.01375 0.225
+0.264 0.011 0.225
+0.26675 0.00825 0.225
+0.2695 0.0055 0.225
+0.27225 0.00275 0.225
+0 0.28 0.22
+0.0028 0.2772 0.22
+0.0056 0.2744 0.22
+0.0084 0.2716 0.22
+0.0112 0.2688 0.22
+0.014 0.266 0.22
+0.0168 0.2632 0.22
+0.0196 0.2604 0.22
+0.0224 0.2576 0.22
+0.0252 0.2548 0.22
+0.028 0.252 0.22
+0.0308 0.2492 0.22
+0.0336 0.2464 0.22
+0.0364 0.2436 0.22
+0.0392 0.2408 0.22
+0.042 0.238 0.22
+0.0448 0.2352 0.22
+0.0476 0.2324 0.22
+0.0504 0.2296 0.22
+0.0532 0.2268 0.22
+0.056 0.224 0.22
+0.0588 0.2212 0.22
+0.0616 0.2184 0.22
+0.0644 0.2156 0.22
+0.0672 0.2128 0.22
+0.07 0.21 0.22
+0.0728 0.2072 0.22
+0.0756 0.2044 0.22
+0.0784 0.2016 0.22
+0.0812 0.1988 0.22
+0.084 0.196 0.22
+0.0868 0.1932 0.22
+0.0896 0.1904 0.22
+0.0924 0.1876 0.22
+0.0952 0.1848 0.22
+0.098 0.182 0.22
+0.1008 0.1792 0.22
+0.1036 0.1764 0.22
+0.1064 0.1736 0.22
+0.1092 0.1708 0.22
+0.112 0.168 0.22
+0.1148 0.1652 0.22
+0.1176 0.1624 0.22
+0.1204 0.1596 0.22
+0.1232 0.1568 0.22
+0.126 0.154 0.22
+0.1288 0.1512 0.22
+0.1316 0.1484 0.22
+0.1344 0.1456 0.22
+0.1372 0.1428 0.22
+0.14 0.14 0.22
+0.1428 0.1372 0.22
+0.1456 0.1344 0.22
+0.1484 0.1316 0.22
+0.1512 0.1288 0.22
+0.154 0.126 0.22
+0.1568 0.1232 0.22
+0.1596 0.1204 0.22
+0.1624 0.1176 0.22
+0.1652 0.1148 0.22
+0.168 0.112 0.22
+0.1708 0.1092 0.22
+0.1736 0.1064 0.22
+0.1764 0.1036 0.22
+0.1792 0.1008 0.22
+0.182 0.098 0.22
+0.1848 0.0952 0.22
+0.1876 0.0924 0.22
+0.1904 0.0896 0.22
+0.1932 0.0868 0.22
+0.196 0.084 0.22
+0.1988 0.0812 0.22
+0.2016 0.0784 0.22
+0.2044 0.0756 0.22
+0.2072 0.0728 0.22
+0.21 0.07 0.22
+0.2128 0.0672 0.22
+0.2156 0.0644 0.22
+0.2184 0.0616 0.22
+0.2212 0.0588 0.22
+0.224 0.056 0.22
+0.2268 0.0532 0.22
+0.2296 0.0504 0.22
+0.2324 0.0476 0.22
+0.2352 0.0448 0.22
+0.238 0.042 0.22
+0.2408 0.0392 0.22
+0.2436 0.0364 0.22
+0.2464 0.0336 0.22
+0.2492 0.0308 0.22
+0.252 0.028 0.22
+0.2548 0.0252 0.22
+0.2576 0.0224 0.22
+0.2604 0.0196 0.22
+0.2632 0.0168 0.22
+0.266 0.014 0.22
+0.2688 0.0112 0.22
+0.2716 0.0084 0.22
+0.2744 0.0056 0.22
+0.2772 0.0028 0.22
+0 0.285 0.215
+0.00285 0.28215 0.215
+0.0057 0.2793 0.215
+0.00855 0.27645 0.215
+0.0114 0.2736 0.215
+0.01425 0.27075 0.215
+0.0171 0.2679 0.215
+0.01995 0.26505 0.215
+0.0228 0.2622 0.215
+0.02565 0.25935 0.215
+0.0285 0.2565 0.215
+0.03135 0.25365 0.215
+0.0342 0.2508 0.215
+0.03705 0.24795 0.215
+0.0399 0.2451 0.215
+0.04275 0.24225 0.215
+0.0456 0.2394 0.215
+0.04845 0.23655 0.215
+0.0513 0.2337 0.215
+0.05415 0.23085 0.215
+0.057 0.228 0.215
+0.05985 0.22515 0.215
+0.0627 0.2223 0.215
+0.06555 0.21945 0.215
+0.0684 0.2166 0.215
+0.07125 0.21375 0.215
+0.0741 0.2109 0.215
+0.07695 0.20805 0.215
+0.0798 0.2052 0.215
+0.08265 0.20235 0.215
+0.0855 0.1995 0.215
+0.08835 0.19665 0.215
+0.0912 0.1938 0.215
+0.09405 0.19095 0.215
+0.0969 0.1881 0.215
+0.09975 0.18525 0.215
+0.1026 0.1824 0.215
+0.10545 0.17955 0.215
+0.1083 0.1767 0.215
+0.11115 0.17385 0.215
+0.114 0.171 0.215
+0.11685 0.16815 0.215
+0.1197 0.1653 0.215
+0.12255 0.16245 0.215
+0.1254 0.1596 0.215
+0.12825 0.15675 0.215
+0.1311 0.1539 0.215
+0.13395 0.15105 0.215
+0.1368 0.1482 0.215
+0.13965 0.14535 0.215
+0.1425 0.1425 0.215
+0.14535 0.13965 0.215
+0.1482 0.1368 0.215
+0.15105 0.13395 0.215
+0.1539 0.1311 0.215
+0.15675 0.12825 0.215
+0.1596 0.1254 0.215
+0.16245 0.12255 0.215
+0.1653 0.1197 0.215
+0.16815 0.11685 0.215
+0.171 0.114 0.215
+0.17385 0.11115 0.215
+0.1767 0.1083 0.215
+0.17955 0.10545 0.215
+0.1824 0.1026 0.215
+0.18525 0.09975 0.215
+0.1881 0.0969 0.215
+0.19095 0.09405 0.215
+0.1938 0.0912 0.215
+0.19665 0.08835 0.215
+0.1995 0.0855 0.215
+0.20235 0.08265 0.215
+0.2052 0.0798 0.215
+0.20805 0.07695 0.215
+0.2109 0.0741 0.215
+0.21375 0.07125 0.215
+0.2166 0.0684 0.215
+0.21945 0.06555 0.215
+0.2223 0.0627 0.215
+0.22515 0.05985 0.215
+0.228 0.057 0.215
+0.23085 0.05415 0.215
+0.2337 0.0513 0.215
+0.23655 0.04845 0.215
+0.2394 0.0456 0.215
+0.24225 0.04275 0.215
+0.2451 0.0399 0.215
+0.24795 0.03705 0.215
+0.2508 0.0342 0.215
+0.25365 0.03135 0.215
+0.2565 0.0285 0.215
+0.25935 0.02565 0.215
+0.2622 0.0228 0.215
+0.26505 0.01995 0.215
+0.2679 0.0171 0.215
+0.27075 0.01425 0.215
+0.2736 0.0114 0.215
+0.27645 0.00855 0.215
+0.2793 0.0057 0.215
+0.28215 0.00285 0.215
+0 0.29 0.21
+0.0029 0.2871 0.21
+0.0058 0.2842 0.21
+0.0087 0.2813 0.21
+0.0116 0.2784 0.21
+0.0145 0.2755 0.21
+0.0174 0.2726 0.21
+0.0203 0.2697 0.21
+0.0232 0.2668 0.21
+0.0261 0.2639 0.21
+0.029 0.261 0.21
+0.0319 0.2581 0.21
+0.0348 0.2552 0.21
+0.0377 0.2523 0.21
+0.0406 0.2494 0.21
+0.0435 0.2465 0.21
+0.0464 0.2436 0.21
+0.0493 0.2407 0.21
+0.0522 0.2378 0.21
+0.0551 0.2349 0.21
+0.058 0.232 0.21
+0.0609 0.2291 0.21
+0.0638 0.2262 0.21
+0.0667 0.2233 0.21
+0.0696 0.2204 0.21
+0.0725 0.2175 0.21
+0.0754 0.2146 0.21
+0.0783 0.2117 0.21
+0.0812 0.2088 0.21
+0.0841 0.2059 0.21
+0.087 0.203 0.21
+0.0899 0.2001 0.21
+0.0928 0.1972 0.21
+0.0957 0.1943 0.21
+0.0986 0.1914 0.21
+0.1015 0.1885 0.21
+0.1044 0.1856 0.21
+0.1073 0.1827 0.21
+0.1102 0.1798 0.21
+0.1131 0.1769 0.21
+0.116 0.174 0.21
+0.1189 0.1711 0.21
+0.1218 0.1682 0.21
+0.1247 0.1653 0.21
+0.1276 0.1624 0.21
+0.1305 0.1595 0.21
+0.1334 0.1566 0.21
+0.1363 0.1537 0.21
+0.1392 0.1508 0.21
+0.1421 0.1479 0.21
+0.145 0.145 0.21
+0.1479 0.1421 0.21
+0.1508 0.1392 0.21
+0.1537 0.1363 0.21
+0.1566 0.1334 0.21
+0.1595 0.1305 0.21
+0.1624 0.1276 0.21
+0.1653 0.1247 0.21
+0.1682 0.1218 0.21
+0.1711 0.1189 0.21
+0.174 0.116 0.21
+0.1769 0.1131 0.21
+0.1798 0.1102 0.21
+0.1827 0.1073 0.21
+0.1856 0.1044 0.21
+0.1885 0.1015 0.21
+0.1914 0.0986 0.21
+0.1943 0.0957 0.21
+0.1972 0.0928 0.21
+0.2001 0.0899 0.21
+0.203 0.087 0.21
+0.2059 0.0841 0.21
+0.2088 0.0812 0.21
+0.2117 0.0783 0.21
+0.2146 0.0754 0.21
+0.2175 0.0725 0.21
+0.2204 0.0696 0.21
+0.2233 0.0667 0.21
+0.2262 0.0638 0.21
+0.2291 0.0609 0.21
+0.232 0.058 0.21
+0.2349 0.0551 0.21
+0.2378 0.0522 0.21
+0.2407 0.0493 0.21
+0.2436 0.0464 0.21
+0.2465 0.0435 0.21
+0.2494 0.0406 0.21
+0.2523 0.0377 0.21
+0.2552 0.0348 0.21
+0.2581 0.0319 0.21
+0.261 0.029 0.21
+0.2639 0.0261 0.21
+0.2668 0.0232 0.21
+0.2697 0.0203 0.21
+0.2726 0.0174 0.21
+0.2755 0.0145 0.21
+0.2784 0.0116 0.21
+0.2813 0.0087 0.21
+0.2842 0.0058 0.21
+0.2871 0.0029 0.21
+0 0.295 0.205
+0.00295 0.29205 0.205
+0.0059 0.2891 0.205
+0.00885 0.28615 0.205
+0.0118 0.2832 0.205
+0.01475 0.28025 0.205
+0.0177 0.2773 0.205
+0.02065 0.27435 0.205
+0.0236 0.2714 0.205
+0.02655 0.26845 0.205
+0.0295 0.2655 0.205
+0.03245 0.26255 0.205
+0.0354 0.2596 0.205
+0.03835 0.25665 0.205
+0.0413 0.2537 0.205
+0.04425 0.25075 0.205
+0.0472 0.2478 0.205
+0.05015 0.24485 0.205
+0.0531 0.2419 0.205
+0.05605 0.23895 0.205
+0.059 0.236 0.205
+0.06195 0.23305 0.205
+0.0649 0.2301 0.205
+0.06785 0.22715 0.205
+0.0708 0.2242 0.205
+0.07375 0.22125 0.205
+0.0767 0.2183 0.205
+0.07965 0.21535 0.205
+0.0826 0.2124 0.205
+0.08555 0.20945 0.205
+0.0885 0.2065 0.205
+0.09145 0.20355 0.205
+0.0944 0.2006 0.205
+0.09735 0.19765 0.205
+0.1003 0.1947 0.205
+0.10325 0.19175 0.205
+0.1062 0.1888 0.205
+0.10915 0.18585 0.205
+0.1121 0.1829 0.205
+0.11505 0.17995 0.205
+0.118 0.177 0.205
+0.12095 0.17405 0.205
+0.1239 0.1711 0.205
+0.12685 0.16815 0.205
+0.1298 0.1652 0.205
+0.13275 0.16225 0.205
+0.1357 0.1593 0.205
+0.13865 0.15635 0.205
+0.1416 0.1534 0.205
+0.14455 0.15045 0.205
+0.1475 0.1475 0.205
+0.15045 0.14455 0.205
+0.1534 0.1416 0.205
+0.15635 0.13865 0.205
+0.1593 0.1357 0.205
+0.16225 0.13275 0.205
+0.1652 0.1298 0.205
+0.16815 0.12685 0.205
+0.1711 0.1239 0.205
+0.17405 0.12095 0.205
+0.177 0.118 0.205
+0.17995 0.11505 0.205
+0.1829 0.1121 0.205
+0.18585 0.10915 0.205
+0.1888 0.1062 0.205
+0.19175 0.10325 0.205
+0.1947 0.1003 0.205
+0.19765 0.09735 0.205
+0.2006 0.0944 0.205
+0.20355 0.09145 0.205
+0.2065 0.0885 0.205
+0.20945 0.08555 0.205
+0.2124 0.0826 0.205
+0.21535 0.07965 0.205
+0.2183 0.0767 0.205
+0.22125 0.07375 0.205
+0.2242 0.0708 0.205
+0.22715 0.06785 0.205
+0.2301 0.0649 0.205
+0.23305 0.06195 0.205
+0.236 0.059 0.205
+0.23895 0.05605 0.205
+0.2419 0.0531 0.205
+0.24485 0.05015 0.205
+0.2478 0.0472 0.205
+0.25075 0.04425 0.205
+0.2537 0.0413 0.205
+0.25665 0.03835 0.205
+0.2596 0.0354 0.205
+0.26255 0.03245 0.205
+0.2655 0.0295 0.205
+0.26845 0.02655 0.205
+0.2714 0.0236 0.205
+0.27435 0.02065 0.205
+0.2773 0.0177 0.205
+0.28025 0.01475 0.205
+0.2832 0.0118 0.205
+0.28615 0.00885 0.205
+0.2891 0.0059 0.205
+0.29205 0.00295 0.205
+0 0.3 0.2
+0.003 0.297 0.2
+0.006 0.294 0.2
+0.009 0.291 0.2
+0.012 0.288 0.2
+0.015 0.285 0.2
+0.018 0.282 0.2
+0.021 0.279 0.2
+0.024 0.276 0.2
+0.027 0.273 0.2
+0.03 0.27 0.2
+0.033 0.267 0.2
+0.036 0.264 0.2
+0.039 0.261 0.2
+0.042 0.258 0.2
+0.045 0.255 0.2
+0.048 0.252 0.2
+0.051 0.249 0.2
+0.054 0.246 0.2
+0.057 0.243 0.2
+0.06 0.24 0.2
+0.063 0.237 0.2
+0.066 0.234 0.2
+0.069 0.231 0.2
+0.072 0.228 0.2
+0.075 0.225 0.2
+0.078 0.222 0.2
+0.081 0.219 0.2
+0.084 0.216 0.2
+0.087 0.213 0.2
+0.09 0.21 0.2
+0.093 0.207 0.2
+0.096 0.204 0.2
+0.099 0.201 0.2
+0.102 0.198 0.2
+0.105 0.195 0.2
+0.108 0.192 0.2
+0.111 0.189 0.2
+0.114 0.186 0.2
+0.117 0.183 0.2
+0.12 0.18 0.2
+0.123 0.177 0.2
+0.126 0.174 0.2
+0.129 0.171 0.2
+0.132 0.168 0.2
+0.135 0.165 0.2
+0.138 0.162 0.2
+0.141 0.159 0.2
+0.144 0.156 0.2
+0.147 0.153 0.2
+0.15 0.15 0.2
+0.153 0.147 0.2
+0.156 0.144 0.2
+0.159 0.141 0.2
+0.162 0.138 0.2
+0.165 0.135 0.2
+0.168 0.132 0.2
+0.171 0.129 0.2
+0.174 0.126 0.2
+0.177 0.123 0.2
+0.18 0.12 0.2
+0.183 0.117 0.2
+0.186 0.114 0.2
+0.189 0.111 0.2
+0.192 0.108 0.2
+0.195 0.105 0.2
+0.198 0.102 0.2
+0.201 0.099 0.2
+0.204 0.096 0.2
+0.207 0.093 0.2
+0.21 0.09 0.2
+0.213 0.087 0.2
+0.216 0.084 0.2
+0.219 0.081 0.2
+0.222 0.078 0.2
+0.225 0.075 0.2
+0.228 0.072 0.2
+0.231 0.069 0.2
+0.234 0.066 0.2
+0.237 0.063 0.2
+0.24 0.06 0.2
+0.243 0.057 0.2
+0.246 0.054 0.2
+0.249 0.051 0.2
+0.252 0.048 0.2
+0.255 0.045 0.2
+0.258 0.042 0.2
+0.261 0.039 0.2
+0.264 0.036 0.2
+0.267 0.033 0.2
+0.27 0.03 0.2
+0.273 0.027 0.2
+0.276 0.024 0.2
+0.279 0.021 0.2
+0.282 0.018 0.2
+0.285 0.015 0.2
+0.288 0.012 0.2
+0.291 0.009 0.2
+0.294 0.006 0.2
+0.297 0.003 0.2
+0 0.305 0.195
+0.00305 0.30195 0.195
+0.0061 0.2989 0.195
+0.00915 0.29585 0.195
+0.0122 0.2928 0.195
+0.01525 0.28975 0.195
+0.0183 0.2867 0.195
+0.02135 0.28365 0.195
+0.0244 0.2806 0.195
+0.02745 0.27755 0.195
+0.0305 0.2745 0.195
+0.03355 0.27145 0.195
+0.0366 0.2684 0.195
+0.03965 0.26535 0.195
+0.0427 0.2623 0.195
+0.04575 0.25925 0.195
+0.0488 0.2562 0.195
+0.05185 0.25315 0.195
+0.0549 0.2501 0.195
+0.05795 0.24705 0.195
+0.061 0.244 0.195
+0.06405 0.24095 0.195
+0.0671 0.2379 0.195
+0.07015 0.23485 0.195
+0.0732 0.2318 0.195
+0.07625 0.22875 0.195
+0.0793 0.2257 0.195
+0.08235 0.22265 0.195
+0.0854 0.2196 0.195
+0.08845 0.21655 0.195
+0.0915 0.2135 0.195
+0.09455 0.21045 0.195
+0.0976 0.2074 0.195
+0.10065 0.20435 0.195
+0.1037 0.2013 0.195
+0.10675 0.19825 0.195
+0.1098 0.1952 0.195
+0.11285 0.19215 0.195
+0.1159 0.1891 0.195
+0.11895 0.18605 0.195
+0.122 0.183 0.195
+0.12505 0.17995 0.195
+0.1281 0.1769 0.195
+0.13115 0.17385 0.195
+0.1342 0.1708 0.195
+0.13725 0.16775 0.195
+0.1403 0.1647 0.195
+0.14335 0.16165 0.195
+0.1464 0.1586 0.195
+0.14945 0.15555 0.195
+0.1525 0.1525 0.195
+0.15555 0.14945 0.195
+0.1586 0.1464 0.195
+0.16165 0.14335 0.195
+0.1647 0.1403 0.195
+0.16775 0.13725 0.195
+0.1708 0.1342 0.195
+0.17385 0.13115 0.195
+0.1769 0.1281 0.195
+0.17995 0.12505 0.195
+0.183 0.122 0.195
+0.18605 0.11895 0.195
+0.1891 0.1159 0.195
+0.19215 0.11285 0.195
+0.1952 0.1098 0.195
+0.19825 0.10675 0.195
+0.2013 0.1037 0.195
+0.20435 0.10065 0.195
+0.2074 0.0976 0.195
+0.21045 0.09455 0.195
+0.2135 0.0915 0.195
+0.21655 0.08845 0.195
+0.2196 0.0854 0.195
+0.22265 0.08235 0.195
+0.2257 0.0793 0.195
+0.22875 0.07625 0.195
+0.2318 0.0732 0.195
+0.23485 0.07015 0.195
+0.2379 0.0671 0.195
+0.24095 0.06405 0.195
+0.244 0.061 0.195
+0.24705 0.05795 0.195
+0.2501 0.0549 0.195
+0.25315 0.05185 0.195
+0.2562 0.0488 0.195
+0.25925 0.04575 0.195
+0.2623 0.0427 0.195
+0.26535 0.03965 0.195
+0.2684 0.0366 0.195
+0.27145 0.03355 0.195
+0.2745 0.0305 0.195
+0.27755 0.02745 0.195
+0.2806 0.0244 0.195
+0.28365 0.02135 0.195
+0.2867 0.0183 0.195
+0.28975 0.01525 0.195
+0.2928 0.0122 0.195
+0.29585 0.00915 0.195
+0.2989 0.0061 0.195
+0.30195 0.00305 0.195
+0 0.31 0.19
+0.0031 0.3069 0.19
+0.0062 0.3038 0.19
+0.0093 0.3007 0.19
+0.0124 0.2976 0.19
+0.0155 0.2945 0.19
+0.0186 0.2914 0.19
+0.0217 0.2883 0.19
+0.0248 0.2852 0.19
+0.0279 0.2821 0.19
+0.031 0.279 0.19
+0.0341 0.2759 0.19
+0.0372 0.2728 0.19
+0.0403 0.2697 0.19
+0.0434 0.2666 0.19
+0.0465 0.2635 0.19
+0.0496 0.2604 0.19
+0.0527 0.2573 0.19
+0.0558 0.2542 0.19
+0.0589 0.2511 0.19
+0.062 0.248 0.19
+0.0651 0.2449 0.19
+0.0682 0.2418 0.19
+0.0713 0.2387 0.19
+0.0744 0.2356 0.19
+0.0775 0.2325 0.19
+0.0806 0.2294 0.19
+0.0837 0.2263 0.19
+0.0868 0.2232 0.19
+0.0899 0.2201 0.19
+0.093 0.217 0.19
+0.0961 0.2139 0.19
+0.0992 0.2108 0.19
+0.1023 0.2077 0.19
+0.1054 0.2046 0.19
+0.1085 0.2015 0.19
+0.1116 0.1984 0.19
+0.1147 0.1953 0.19
+0.1178 0.1922 0.19
+0.1209 0.1891 0.19
+0.124 0.186 0.19
+0.1271 0.1829 0.19
+0.1302 0.1798 0.19
+0.1333 0.1767 0.19
+0.1364 0.1736 0.19
+0.1395 0.1705 0.19
+0.1426 0.1674 0.19
+0.1457 0.1643 0.19
+0.1488 0.1612 0.19
+0.1519 0.1581 0.19
+0.155 0.155 0.19
+0.1581 0.1519 0.19
+0.1612 0.1488 0.19
+0.1643 0.1457 0.19
+0.1674 0.1426 0.19
+0.1705 0.1395 0.19
+0.1736 0.1364 0.19
+0.1767 0.1333 0.19
+0.1798 0.1302 0.19
+0.1829 0.1271 0.19
+0.186 0.124 0.19
+0.1891 0.1209 0.19
+0.1922 0.1178 0.19
+0.1953 0.1147 0.19
+0.1984 0.1116 0.19
+0.2015 0.1085 0.19
+0.2046 0.1054 0.19
+0.2077 0.1023 0.19
+0.2108 0.0992 0.19
+0.2139 0.0961 0.19
+0.217 0.093 0.19
+0.2201 0.0899 0.19
+0.2232 0.0868 0.19
+0.2263 0.0837 0.19
+0.2294 0.0806 0.19
+0.2325 0.0775 0.19
+0.2356 0.0744 0.19
+0.2387 0.0713 0.19
+0.2418 0.0682 0.19
+0.2449 0.0651 0.19
+0.248 0.062 0.19
+0.2511 0.0589 0.19
+0.2542 0.0558 0.19
+0.2573 0.0527 0.19
+0.2604 0.0496 0.19
+0.2635 0.0465 0.19
+0.2666 0.0434 0.19
+0.2697 0.0403 0.19
+0.2728 0.0372 0.19
+0.2759 0.0341 0.19
+0.279 0.031 0.19
+0.2821 0.0279 0.19
+0.2852 0.0248 0.19
+0.2883 0.0217 0.19
+0.2914 0.0186 0.19
+0.2945 0.0155 0.19
+0.2976 0.0124 0.19
+0.3007 0.0093 0.19
+0.3038 0.0062 0.19
+0.3069 0.0031 0.19
+0 0.315 0.185
+0.00315 0.31185 0.185
+0.0063 0.3087 0.185
+0.00945 0.30555 0.185
+0.0126 0.3024 0.185
+0.01575 0.29925 0.185
+0.0189 0.2961 0.185
+0.02205 0.29295 0.185
+0.0252 0.2898 0.185
+0.02835 0.28665 0.185
+0.0315 0.2835 0.185
+0.03465 0.28035 0.185
+0.0378 0.2772 0.185
+0.04095 0.27405 0.185
+0.0441 0.2709 0.185
+0.04725 0.26775 0.185
+0.0504 0.2646 0.185
+0.05355 0.26145 0.185
+0.0567 0.2583 0.185
+0.05985 0.25515 0.185
+0.063 0.252 0.185
+0.06615 0.24885 0.185
+0.0693 0.2457 0.185
+0.07245 0.24255 0.185
+0.0756 0.2394 0.185
+0.07875 0.23625 0.185
+0.0819 0.2331 0.185
+0.08505 0.22995 0.185
+0.0882 0.2268 0.185
+0.09135 0.22365 0.185
+0.0945 0.2205 0.185
+0.09765 0.21735 0.185
+0.1008 0.2142 0.185
+0.10395 0.21105 0.185
+0.1071 0.2079 0.185
+0.11025 0.20475 0.185
+0.1134 0.2016 0.185
+0.11655 0.19845 0.185
+0.1197 0.1953 0.185
+0.12285 0.19215 0.185
+0.126 0.189 0.185
+0.12915 0.18585 0.185
+0.1323 0.1827 0.185
+0.13545 0.17955 0.185
+0.1386 0.1764 0.185
+0.14175 0.17325 0.185
+0.1449 0.1701 0.185
+0.14805 0.16695 0.185
+0.1512 0.1638 0.185
+0.15435 0.16065 0.185
+0.1575 0.1575 0.185
+0.16065 0.15435 0.185
+0.1638 0.1512 0.185
+0.16695 0.14805 0.185
+0.1701 0.1449 0.185
+0.17325 0.14175 0.185
+0.1764 0.1386 0.185
+0.17955 0.13545 0.185
+0.1827 0.1323 0.185
+0.18585 0.12915 0.185
+0.189 0.126 0.185
+0.19215 0.12285 0.185
+0.1953 0.1197 0.185
+0.19845 0.11655 0.185
+0.2016 0.1134 0.185
+0.20475 0.11025 0.185
+0.2079 0.1071 0.185
+0.21105 0.10395 0.185
+0.2142 0.1008 0.185
+0.21735 0.09765 0.185
+0.2205 0.0945 0.185
+0.22365 0.09135 0.185
+0.2268 0.0882 0.185
+0.22995 0.08505 0.185
+0.2331 0.0819 0.185
+0.23625 0.07875 0.185
+0.2394 0.0756 0.185
+0.24255 0.07245 0.185
+0.2457 0.0693 0.185
+0.24885 0.06615 0.185
+0.252 0.063 0.185
+0.25515 0.05985 0.185
+0.2583 0.0567 0.185
+0.26145 0.05355 0.185
+0.2646 0.0504 0.185
+0.26775 0.04725 0.185
+0.2709 0.0441 0.185
+0.27405 0.04095 0.185
+0.2772 0.0378 0.185
+0.28035 0.03465 0.185
+0.2835 0.0315 0.185
+0.28665 0.02835 0.185
+0.2898 0.0252 0.185
+0.29295 0.02205 0.185
+0.2961 0.0189 0.185
+0.29925 0.01575 0.185
+0.3024 0.0126 0.185
+0.30555 0.00945 0.185
+0.3087 0.0063 0.185
+0.31185 0.00315 0.185
+0 0.32 0.18
+0.0032 0.3168 0.18
+0.0064 0.3136 0.18
+0.0096 0.3104 0.18
+0.0128 0.3072 0.18
+0.016 0.304 0.18
+0.0192 0.3008 0.18
+0.0224 0.2976 0.18
+0.0256 0.2944 0.18
+0.0288 0.2912 0.18
+0.032 0.288 0.18
+0.0352 0.2848 0.18
+0.0384 0.2816 0.18
+0.0416 0.2784 0.18
+0.0448 0.2752 0.18
+0.048 0.272 0.18
+0.0512 0.2688 0.18
+0.0544 0.2656 0.18
+0.0576 0.2624 0.18
+0.0608 0.2592 0.18
+0.064 0.256 0.18
+0.0672 0.2528 0.18
+0.0704 0.2496 0.18
+0.0736 0.2464 0.18
+0.0768 0.2432 0.18
+0.08 0.24 0.18
+0.0832 0.2368 0.18
+0.0864 0.2336 0.18
+0.0896 0.2304 0.18
+0.0928 0.2272 0.18
+0.096 0.224 0.18
+0.0992 0.2208 0.18
+0.1024 0.2176 0.18
+0.1056 0.2144 0.18
+0.1088 0.2112 0.18
+0.112 0.208 0.18
+0.1152 0.2048 0.18
+0.1184 0.2016 0.18
+0.1216 0.1984 0.18
+0.1248 0.1952 0.18
+0.128 0.192 0.18
+0.1312 0.1888 0.18
+0.1344 0.1856 0.18
+0.1376 0.1824 0.18
+0.1408 0.1792 0.18
+0.144 0.176 0.18
+0.1472 0.1728 0.18
+0.1504 0.1696 0.18
+0.1536 0.1664 0.18
+0.1568 0.1632 0.18
+0.16 0.16 0.18
+0.1632 0.1568 0.18
+0.1664 0.1536 0.18
+0.1696 0.1504 0.18
+0.1728 0.1472 0.18
+0.176 0.144 0.18
+0.1792 0.1408 0.18
+0.1824 0.1376 0.18
+0.1856 0.1344 0.18
+0.1888 0.1312 0.18
+0.192 0.128 0.18
+0.1952 0.1248 0.18
+0.1984 0.1216 0.18
+0.2016 0.1184 0.18
+0.2048 0.1152 0.18
+0.208 0.112 0.18
+0.2112 0.1088 0.18
+0.2144 0.1056 0.18
+0.2176 0.1024 0.18
+0.2208 0.0992 0.18
+0.224 0.096 0.18
+0.2272 0.0928 0.18
+0.2304 0.0896 0.18
+0.2336 0.0864 0.18
+0.2368 0.0832 0.18
+0.24 0.08 0.18
+0.2432 0.0768 0.18
+0.2464 0.0736 0.18
+0.2496 0.0704 0.18
+0.2528 0.0672 0.18
+0.256 0.064 0.18
+0.2592 0.0608 0.18
+0.2624 0.0576 0.18
+0.2656 0.0544 0.18
+0.2688 0.0512 0.18
+0.272 0.048 0.18
+0.2752 0.0448 0.18
+0.2784 0.0416 0.18
+0.2816 0.0384 0.18
+0.2848 0.0352 0.18
+0.288 0.032 0.18
+0.2912 0.0288 0.18
+0.2944 0.0256 0.18
+0.2976 0.0224 0.18
+0.3008 0.0192 0.18
+0.304 0.016 0.18
+0.3072 0.0128 0.18
+0.3104 0.0096 0.18
+0.3136 0.0064 0.18
+0.3168 0.0032 0.18
+0 0.325 0.175
+0.00325 0.32175 0.175
+0.0065 0.3185 0.175
+0.00975 0.31525 0.175
+0.013 0.312 0.175
+0.01625 0.30875 0.175
+0.0195 0.3055 0.175
+0.02275 0.30225 0.175
+0.026 0.299 0.175
+0.02925 0.29575 0.175
+0.0325 0.2925 0.175
+0.03575 0.28925 0.175
+0.039 0.286 0.175
+0.04225 0.28275 0.175
+0.0455 0.2795 0.175
+0.04875 0.27625 0.175
+0.052 0.273 0.175
+0.05525 0.26975 0.175
+0.0585 0.2665 0.175
+0.06175 0.26325 0.175
+0.065 0.26 0.175
+0.06825 0.25675 0.175
+0.0715 0.2535 0.175
+0.07475 0.25025 0.175
+0.078 0.247 0.175
+0.08125 0.24375 0.175
+0.0845 0.2405 0.175
+0.08775 0.23725 0.175
+0.091 0.234 0.175
+0.09425 0.23075 0.175
+0.0975 0.2275 0.175
+0.10075 0.22425 0.175
+0.104 0.221 0.175
+0.10725 0.21775 0.175
+0.1105 0.2145 0.175
+0.11375 0.21125 0.175
+0.117 0.208 0.175
+0.12025 0.20475 0.175
+0.1235 0.2015 0.175
+0.12675 0.19825 0.175
+0.13 0.195 0.175
+0.13325 0.19175 0.175
+0.1365 0.1885 0.175
+0.13975 0.18525 0.175
+0.143 0.182 0.175
+0.14625 0.17875 0.175
+0.1495 0.1755 0.175
+0.15275 0.17225 0.175
+0.156 0.169 0.175
+0.15925 0.16575 0.175
+0.1625 0.1625 0.175
+0.16575 0.15925 0.175
+0.169 0.156 0.175
+0.17225 0.15275 0.175
+0.1755 0.1495 0.175
+0.17875 0.14625 0.175
+0.182 0.143 0.175
+0.18525 0.13975 0.175
+0.1885 0.1365 0.175
+0.19175 0.13325 0.175
+0.195 0.13 0.175
+0.19825 0.12675 0.175
+0.2015 0.1235 0.175
+0.20475 0.12025 0.175
+0.208 0.117 0.175
+0.21125 0.11375 0.175
+0.2145 0.1105 0.175
+0.21775 0.10725 0.175
+0.221 0.104 0.175
+0.22425 0.10075 0.175
+0.2275 0.0975 0.175
+0.23075 0.09425 0.175
+0.234 0.091 0.175
+0.23725 0.08775 0.175
+0.2405 0.0845 0.175
+0.24375 0.08125 0.175
+0.247 0.078 0.175
+0.25025 0.07475 0.175
+0.2535 0.0715 0.175
+0.25675 0.06825 0.175
+0.26 0.065 0.175
+0.26325 0.06175 0.175
+0.2665 0.0585 0.175
+0.26975 0.05525 0.175
+0.273 0.052 0.175
+0.27625 0.04875 0.175
+0.2795 0.0455 0.175
+0.28275 0.04225 0.175
+0.286 0.039 0.175
+0.28925 0.03575 0.175
+0.2925 0.0325 0.175
+0.29575 0.02925 0.175
+0.299 0.026 0.175
+0.30225 0.02275 0.175
+0.3055 0.0195 0.175
+0.30875 0.01625 0.175
+0.312 0.013 0.175
+0.31525 0.00975 0.175
+0.3185 0.0065 0.175
+0.32175 0.00325 0.175
+0 0.33 0.17
+0.0033 0.3267 0.17
+0.0066 0.3234 0.17
+0.0099 0.3201 0.17
+0.0132 0.3168 0.17
+0.0165 0.3135 0.17
+0.0198 0.3102 0.17
+0.0231 0.3069 0.17
+0.0264 0.3036 0.17
+0.0297 0.3003 0.17
+0.033 0.297 0.17
+0.0363 0.2937 0.17
+0.0396 0.2904 0.17
+0.0429 0.2871 0.17
+0.0462 0.2838 0.17
+0.0495 0.2805 0.17
+0.0528 0.2772 0.17
+0.0561 0.2739 0.17
+0.0594 0.2706 0.17
+0.0627 0.2673 0.17
+0.066 0.264 0.17
+0.0693 0.2607 0.17
+0.0726 0.2574 0.17
+0.0759 0.2541 0.17
+0.0792 0.2508 0.17
+0.0825 0.2475 0.17
+0.0858 0.2442 0.17
+0.0891 0.2409 0.17
+0.0924 0.2376 0.17
+0.0957 0.2343 0.17
+0.099 0.231 0.17
+0.1023 0.2277 0.17
+0.1056 0.2244 0.17
+0.1089 0.2211 0.17
+0.1122 0.2178 0.17
+0.1155 0.2145 0.17
+0.1188 0.2112 0.17
+0.1221 0.2079 0.17
+0.1254 0.2046 0.17
+0.1287 0.2013 0.17
+0.132 0.198 0.17
+0.1353 0.1947 0.17
+0.1386 0.1914 0.17
+0.1419 0.1881 0.17
+0.1452 0.1848 0.17
+0.1485 0.1815 0.17
+0.1518 0.1782 0.17
+0.1551 0.1749 0.17
+0.1584 0.1716 0.17
+0.1617 0.1683 0.17
+0.165 0.165 0.17
+0.1683 0.1617 0.17
+0.1716 0.1584 0.17
+0.1749 0.1551 0.17
+0.1782 0.1518 0.17
+0.1815 0.1485 0.17
+0.1848 0.1452 0.17
+0.1881 0.1419 0.17
+0.1914 0.1386 0.17
+0.1947 0.1353 0.17
+0.198 0.132 0.17
+0.2013 0.1287 0.17
+0.2046 0.1254 0.17
+0.2079 0.1221 0.17
+0.2112 0.1188 0.17
+0.2145 0.1155 0.17
+0.2178 0.1122 0.17
+0.2211 0.1089 0.17
+0.2244 0.1056 0.17
+0.2277 0.1023 0.17
+0.231 0.099 0.17
+0.2343 0.0957 0.17
+0.2376 0.0924 0.17
+0.2409 0.0891 0.17
+0.2442 0.0858 0.17
+0.2475 0.0825 0.17
+0.2508 0.0792 0.17
+0.2541 0.0759 0.17
+0.2574 0.0726 0.17
+0.2607 0.0693 0.17
+0.264 0.066 0.17
+0.2673 0.0627 0.17
+0.2706 0.0594 0.17
+0.2739 0.0561 0.17
+0.2772 0.0528 0.17
+0.2805 0.0495 0.17
+0.2838 0.0462 0.17
+0.2871 0.0429 0.17
+0.2904 0.0396 0.17
+0.2937 0.0363 0.17
+0.297 0.033 0.17
+0.3003 0.0297 0.17
+0.3036 0.0264 0.17
+0.3069 0.0231 0.17
+0.3102 0.0198 0.17
+0.3135 0.0165 0.17
+0.3168 0.0132 0.17
+0.3201 0.0099 0.17
+0.3234 0.0066 0.17
+0.3267 0.0033 0.17
+0 0.335 0.165
+0.00335 0.33165 0.165
+0.0067 0.3283 0.165
+0.01005 0.32495 0.165
+0.0134 0.3216 0.165
+0.01675 0.31825 0.165
+0.0201 0.3149 0.165
+0.02345 0.31155 0.165
+0.0268 0.3082 0.165
+0.03015 0.30485 0.165
+0.0335 0.3015 0.165
+0.03685 0.29815 0.165
+0.0402 0.2948 0.165
+0.04355 0.29145 0.165
+0.0469 0.2881 0.165
+0.05025 0.28475 0.165
+0.0536 0.2814 0.165
+0.05695 0.27805 0.165
+0.0603 0.2747 0.165
+0.06365 0.27135 0.165
+0.067 0.268 0.165
+0.07035 0.26465 0.165
+0.0737 0.2613 0.165
+0.07705 0.25795 0.165
+0.0804 0.2546 0.165
+0.08375 0.25125 0.165
+0.0871 0.2479 0.165
+0.09045 0.24455 0.165
+0.0938 0.2412 0.165
+0.09715 0.23785 0.165
+0.1005 0.2345 0.165
+0.10385 0.23115 0.165
+0.1072 0.2278 0.165
+0.11055 0.22445 0.165
+0.1139 0.2211 0.165
+0.11725 0.21775 0.165
+0.1206 0.2144 0.165
+0.12395 0.21105 0.165
+0.1273 0.2077 0.165
+0.13065 0.20435 0.165
+0.134 0.201 0.165
+0.13735 0.19765 0.165
+0.1407 0.1943 0.165
+0.14405 0.19095 0.165
+0.1474 0.1876 0.165
+0.15075 0.18425 0.165
+0.1541 0.1809 0.165
+0.15745 0.17755 0.165
+0.1608 0.1742 0.165
+0.16415 0.17085 0.165
+0.1675 0.1675 0.165
+0.17085 0.16415 0.165
+0.1742 0.1608 0.165
+0.17755 0.15745 0.165
+0.1809 0.1541 0.165
+0.18425 0.15075 0.165
+0.1876 0.1474 0.165
+0.19095 0.14405 0.165
+0.1943 0.1407 0.165
+0.19765 0.13735 0.165
+0.201 0.134 0.165
+0.20435 0.13065 0.165
+0.2077 0.1273 0.165
+0.21105 0.12395 0.165
+0.2144 0.1206 0.165
+0.21775 0.11725 0.165
+0.2211 0.1139 0.165
+0.22445 0.11055 0.165
+0.2278 0.1072 0.165
+0.23115 0.10385 0.165
+0.2345 0.1005 0.165
+0.23785 0.09715 0.165
+0.2412 0.0938 0.165
+0.24455 0.09045 0.165
+0.2479 0.0871 0.165
+0.25125 0.08375 0.165
+0.2546 0.0804 0.165
+0.25795 0.07705 0.165
+0.2613 0.0737 0.165
+0.26465 0.07035 0.165
+0.268 0.067 0.165
+0.27135 0.06365 0.165
+0.2747 0.0603 0.165
+0.27805 0.05695 0.165
+0.2814 0.0536 0.165
+0.28475 0.05025 0.165
+0.2881 0.0469 0.165
+0.29145 0.04355 0.165
+0.2948 0.0402 0.165
+0.29815 0.03685 0.165
+0.3015 0.0335 0.165
+0.30485 0.03015 0.165
+0.3082 0.0268 0.165
+0.31155 0.02345 0.165
+0.3149 0.0201 0.165
+0.31825 0.01675 0.165
+0.3216 0.0134 0.165
+0.32495 0.01005 0.165
+0.3283 0.0067 0.165
+0.33165 0.00335 0.165
+0 0.34 0.16
+0.0034 0.3366 0.16
+0.0068 0.3332 0.16
+0.0102 0.3298 0.16
+0.0136 0.3264 0.16
+0.017 0.323 0.16
+0.0204 0.3196 0.16
+0.0238 0.3162 0.16
+0.0272 0.3128 0.16
+0.0306 0.3094 0.16
+0.034 0.306 0.16
+0.0374 0.3026 0.16
+0.0408 0.2992 0.16
+0.0442 0.2958 0.16
+0.0476 0.2924 0.16
+0.051 0.289 0.16
+0.0544 0.2856 0.16
+0.0578 0.2822 0.16
+0.0612 0.2788 0.16
+0.0646 0.2754 0.16
+0.068 0.272 0.16
+0.0714 0.2686 0.16
+0.0748 0.2652 0.16
+0.0782 0.2618 0.16
+0.0816 0.2584 0.16
+0.085 0.255 0.16
+0.0884 0.2516 0.16
+0.0918 0.2482 0.16
+0.0952 0.2448 0.16
+0.0986 0.2414 0.16
+0.102 0.238 0.16
+0.1054 0.2346 0.16
+0.1088 0.2312 0.16
+0.1122 0.2278 0.16
+0.1156 0.2244 0.16
+0.119 0.221 0.16
+0.1224 0.2176 0.16
+0.1258 0.2142 0.16
+0.1292 0.2108 0.16
+0.1326 0.2074 0.16
+0.136 0.204 0.16
+0.1394 0.2006 0.16
+0.1428 0.1972 0.16
+0.1462 0.1938 0.16
+0.1496 0.1904 0.16
+0.153 0.187 0.16
+0.1564 0.1836 0.16
+0.1598 0.1802 0.16
+0.1632 0.1768 0.16
+0.1666 0.1734 0.16
+0.17 0.17 0.16
+0.1734 0.1666 0.16
+0.1768 0.1632 0.16
+0.1802 0.1598 0.16
+0.1836 0.1564 0.16
+0.187 0.153 0.16
+0.1904 0.1496 0.16
+0.1938 0.1462 0.16
+0.1972 0.1428 0.16
+0.2006 0.1394 0.16
+0.204 0.136 0.16
+0.2074 0.1326 0.16
+0.2108 0.1292 0.16
+0.2142 0.1258 0.16
+0.2176 0.1224 0.16
+0.221 0.119 0.16
+0.2244 0.1156 0.16
+0.2278 0.1122 0.16
+0.2312 0.1088 0.16
+0.2346 0.1054 0.16
+0.238 0.102 0.16
+0.2414 0.0986 0.16
+0.2448 0.0952 0.16
+0.2482 0.0918 0.16
+0.2516 0.0884 0.16
+0.255 0.085 0.16
+0.2584 0.0816 0.16
+0.2618 0.0782 0.16
+0.2652 0.0748 0.16
+0.2686 0.0714 0.16
+0.272 0.068 0.16
+0.2754 0.0646 0.16
+0.2788 0.0612 0.16
+0.2822 0.0578 0.16
+0.2856 0.0544 0.16
+0.289 0.051 0.16
+0.2924 0.0476 0.16
+0.2958 0.0442 0.16
+0.2992 0.0408 0.16
+0.3026 0.0374 0.16
+0.306 0.034 0.16
+0.3094 0.0306 0.16
+0.3128 0.0272 0.16
+0.3162 0.0238 0.16
+0.3196 0.0204 0.16
+0.323 0.017 0.16
+0.3264 0.0136 0.16
+0.3298 0.0102 0.16
+0.3332 0.0068 0.16
+0.3366 0.0034 0.16
+0 0.345 0.155
+0.00345 0.34155 0.155
+0.0069 0.3381 0.155
+0.01035 0.33465 0.155
+0.0138 0.3312 0.155
+0.01725 0.32775 0.155
+0.0207 0.3243 0.155
+0.02415 0.32085 0.155
+0.0276 0.3174 0.155
+0.03105 0.31395 0.155
+0.0345 0.3105 0.155
+0.03795 0.30705 0.155
+0.0414 0.3036 0.155
+0.04485 0.30015 0.155
+0.0483 0.2967 0.155
+0.05175 0.29325 0.155
+0.0552 0.2898 0.155
+0.05865 0.28635 0.155
+0.0621 0.2829 0.155
+0.06555 0.27945 0.155
+0.069 0.276 0.155
+0.07245 0.27255 0.155
+0.0759 0.2691 0.155
+0.07935 0.26565 0.155
+0.0828 0.2622 0.155
+0.08625 0.25875 0.155
+0.0897 0.2553 0.155
+0.09315 0.25185 0.155
+0.0966 0.2484 0.155
+0.10005 0.24495 0.155
+0.1035 0.2415 0.155
+0.10695 0.23805 0.155
+0.1104 0.2346 0.155
+0.11385 0.23115 0.155
+0.1173 0.2277 0.155
+0.12075 0.22425 0.155
+0.1242 0.2208 0.155
+0.12765 0.21735 0.155
+0.1311 0.2139 0.155
+0.13455 0.21045 0.155
+0.138 0.207 0.155
+0.14145 0.20355 0.155
+0.1449 0.2001 0.155
+0.14835 0.19665 0.155
+0.1518 0.1932 0.155
+0.15525 0.18975 0.155
+0.1587 0.1863 0.155
+0.16215 0.18285 0.155
+0.1656 0.1794 0.155
+0.16905 0.17595 0.155
+0.1725 0.1725 0.155
+0.17595 0.16905 0.155
+0.1794 0.1656 0.155
+0.18285 0.16215 0.155
+0.1863 0.1587 0.155
+0.18975 0.15525 0.155
+0.1932 0.1518 0.155
+0.19665 0.14835 0.155
+0.2001 0.1449 0.155
+0.20355 0.14145 0.155
+0.207 0.138 0.155
+0.21045 0.13455 0.155
+0.2139 0.1311 0.155
+0.21735 0.12765 0.155
+0.2208 0.1242 0.155
+0.22425 0.12075 0.155
+0.2277 0.1173 0.155
+0.23115 0.11385 0.155
+0.2346 0.1104 0.155
+0.23805 0.10695 0.155
+0.2415 0.1035 0.155
+0.24495 0.10005 0.155
+0.2484 0.0966 0.155
+0.25185 0.09315 0.155
+0.2553 0.0897 0.155
+0.25875 0.08625 0.155
+0.2622 0.0828 0.155
+0.26565 0.07935 0.155
+0.2691 0.0759 0.155
+0.27255 0.07245 0.155
+0.276 0.069 0.155
+0.27945 0.06555 0.155
+0.2829 0.0621 0.155
+0.28635 0.05865 0.155
+0.2898 0.0552 0.155
+0.29325 0.05175 0.155
+0.2967 0.0483 0.155
+0.30015 0.04485 0.155
+0.3036 0.0414 0.155
+0.30705 0.03795 0.155
+0.3105 0.0345 0.155
+0.31395 0.03105 0.155
+0.3174 0.0276 0.155
+0.32085 0.02415 0.155
+0.3243 0.0207 0.155
+0.32775 0.01725 0.155
+0.3312 0.0138 0.155
+0.33465 0.01035 0.155
+0.3381 0.0069 0.155
+0.34155 0.00345 0.155
+0 0.35 0.15
+0.0035 0.3465 0.15
+0.007 0.343 0.15
+0.0105 0.3395 0.15
+0.014 0.336 0.15
+0.0175 0.3325 0.15
+0.021 0.329 0.15
+0.0245 0.3255 0.15
+0.028 0.322 0.15
+0.0315 0.3185 0.15
+0.035 0.315 0.15
+0.0385 0.3115 0.15
+0.042 0.308 0.15
+0.0455 0.3045 0.15
+0.049 0.301 0.15
+0.0525 0.2975 0.15
+0.056 0.294 0.15
+0.0595 0.2905 0.15
+0.063 0.287 0.15
+0.0665 0.2835 0.15
+0.07 0.28 0.15
+0.0735 0.2765 0.15
+0.077 0.273 0.15
+0.0805 0.2695 0.15
+0.084 0.266 0.15
+0.0875 0.2625 0.15
+0.091 0.259 0.15
+0.0945 0.2555 0.15
+0.098 0.252 0.15
+0.1015 0.2485 0.15
+0.105 0.245 0.15
+0.1085 0.2415 0.15
+0.112 0.238 0.15
+0.1155 0.2345 0.15
+0.119 0.231 0.15
+0.1225 0.2275 0.15
+0.126 0.224 0.15
+0.1295 0.2205 0.15
+0.133 0.217 0.15
+0.1365 0.2135 0.15
+0.14 0.21 0.15
+0.1435 0.2065 0.15
+0.147 0.203 0.15
+0.1505 0.1995 0.15
+0.154 0.196 0.15
+0.1575 0.1925 0.15
+0.161 0.189 0.15
+0.1645 0.1855 0.15
+0.168 0.182 0.15
+0.1715 0.1785 0.15
+0.175 0.175 0.15
+0.1785 0.1715 0.15
+0.182 0.168 0.15
+0.1855 0.1645 0.15
+0.189 0.161 0.15
+0.1925 0.1575 0.15
+0.196 0.154 0.15
+0.1995 0.1505 0.15
+0.203 0.147 0.15
+0.2065 0.1435 0.15
+0.21 0.14 0.15
+0.2135 0.1365 0.15
+0.217 0.133 0.15
+0.2205 0.1295 0.15
+0.224 0.126 0.15
+0.2275 0.1225 0.15
+0.231 0.119 0.15
+0.2345 0.1155 0.15
+0.238 0.112 0.15
+0.2415 0.1085 0.15
+0.245 0.105 0.15
+0.2485 0.1015 0.15
+0.252 0.098 0.15
+0.2555 0.0945 0.15
+0.259 0.091 0.15
+0.2625 0.0875 0.15
+0.266 0.084 0.15
+0.2695 0.0805 0.15
+0.273 0.077 0.15
+0.2765 0.0735 0.15
+0.28 0.07 0.15
+0.2835 0.0665 0.15
+0.287 0.063 0.15
+0.2905 0.0595 0.15
+0.294 0.056 0.15
+0.2975 0.0525 0.15
+0.301 0.049 0.15
+0.3045 0.0455 0.15
+0.308 0.042 0.15
+0.3115 0.0385 0.15
+0.315 0.035 0.15
+0.3185 0.0315 0.15
+0.322 0.028 0.15
+0.3255 0.0245 0.15
+0.329 0.021 0.15
+0.3325 0.0175 0.15
+0.336 0.014 0.15
+0.3395 0.0105 0.15
+0.343 0.007 0.15
+0.3465 0.0035 0.15
+0 0.355 0.145
+0.00355 0.35145 0.145
+0.0071 0.3479 0.145
+0.01065 0.34435 0.145
+0.0142 0.3408 0.145
+0.01775 0.33725 0.145
+0.0213 0.3337 0.145
+0.02485 0.33015 0.145
+0.0284 0.3266 0.145
+0.03195 0.32305 0.145
+0.0355 0.3195 0.145
+0.03905 0.31595 0.145
+0.0426 0.3124 0.145
+0.04615 0.30885 0.145
+0.0497 0.3053 0.145
+0.05325 0.30175 0.145
+0.0568 0.2982 0.145
+0.06035 0.29465 0.145
+0.0639 0.2911 0.145
+0.06745 0.28755 0.145
+0.071 0.284 0.145
+0.07455 0.28045 0.145
+0.0781 0.2769 0.145
+0.08165 0.27335 0.145
+0.0852 0.2698 0.145
+0.08875 0.26625 0.145
+0.0923 0.2627 0.145
+0.09585 0.25915 0.145
+0.0994 0.2556 0.145
+0.10295 0.25205 0.145
+0.1065 0.2485 0.145
+0.11005 0.24495 0.145
+0.1136 0.2414 0.145
+0.11715 0.23785 0.145
+0.1207 0.2343 0.145
+0.12425 0.23075 0.145
+0.1278 0.2272 0.145
+0.13135 0.22365 0.145
+0.1349 0.2201 0.145
+0.13845 0.21655 0.145
+0.142 0.213 0.145
+0.14555 0.20945 0.145
+0.1491 0.2059 0.145
+0.15265 0.20235 0.145
+0.1562 0.1988 0.145
+0.15975 0.19525 0.145
+0.1633 0.1917 0.145
+0.16685 0.18815 0.145
+0.1704 0.1846 0.145
+0.17395 0.18105 0.145
+0.1775 0.1775 0.145
+0.18105 0.17395 0.145
+0.1846 0.1704 0.145
+0.18815 0.16685 0.145
+0.1917 0.1633 0.145
+0.19525 0.15975 0.145
+0.1988 0.1562 0.145
+0.20235 0.15265 0.145
+0.2059 0.1491 0.145
+0.20945 0.14555 0.145
+0.213 0.142 0.145
+0.21655 0.13845 0.145
+0.2201 0.1349 0.145
+0.22365 0.13135 0.145
+0.2272 0.1278 0.145
+0.23075 0.12425 0.145
+0.2343 0.1207 0.145
+0.23785 0.11715 0.145
+0.2414 0.1136 0.145
+0.24495 0.11005 0.145
+0.2485 0.1065 0.145
+0.25205 0.10295 0.145
+0.2556 0.0994 0.145
+0.25915 0.09585 0.145
+0.2627 0.0923 0.145
+0.26625 0.08875 0.145
+0.2698 0.0852 0.145
+0.27335 0.08165 0.145
+0.2769 0.0781 0.145
+0.28045 0.07455 0.145
+0.284 0.071 0.145
+0.28755 0.06745 0.145
+0.2911 0.0639 0.145
+0.29465 0.06035 0.145
+0.2982 0.0568 0.145
+0.30175 0.05325 0.145
+0.3053 0.0497 0.145
+0.30885 0.04615 0.145
+0.3124 0.0426 0.145
+0.31595 0.03905 0.145
+0.3195 0.0355 0.145
+0.32305 0.03195 0.145
+0.3266 0.0284 0.145
+0.33015 0.02485 0.145
+0.3337 0.0213 0.145
+0.33725 0.01775 0.145
+0.3408 0.0142 0.145
+0.34435 0.01065 0.145
+0.3479 0.0071 0.145
+0.35145 0.00355 0.145
+0 0.36 0.14
+0.0036 0.3564 0.14
+0.0072 0.3528 0.14
+0.0108 0.3492 0.14
+0.0144 0.3456 0.14
+0.018 0.342 0.14
+0.0216 0.3384 0.14
+0.0252 0.3348 0.14
+0.0288 0.3312 0.14
+0.0324 0.3276 0.14
+0.036 0.324 0.14
+0.0396 0.3204 0.14
+0.0432 0.3168 0.14
+0.0468 0.3132 0.14
+0.0504 0.3096 0.14
+0.054 0.306 0.14
+0.0576 0.3024 0.14
+0.0612 0.2988 0.14
+0.0648 0.2952 0.14
+0.0684 0.2916 0.14
+0.072 0.288 0.14
+0.0756 0.2844 0.14
+0.0792 0.2808 0.14
+0.0828 0.2772 0.14
+0.0864 0.2736 0.14
+0.09 0.27 0.14
+0.0936 0.2664 0.14
+0.0972 0.2628 0.14
+0.1008 0.2592 0.14
+0.1044 0.2556 0.14
+0.108 0.252 0.14
+0.1116 0.2484 0.14
+0.1152 0.2448 0.14
+0.1188 0.2412 0.14
+0.1224 0.2376 0.14
+0.126 0.234 0.14
+0.1296 0.2304 0.14
+0.1332 0.2268 0.14
+0.1368 0.2232 0.14
+0.1404 0.2196 0.14
+0.144 0.216 0.14
+0.1476 0.2124 0.14
+0.1512 0.2088 0.14
+0.1548 0.2052 0.14
+0.1584 0.2016 0.14
+0.162 0.198 0.14
+0.1656 0.1944 0.14
+0.1692 0.1908 0.14
+0.1728 0.1872 0.14
+0.1764 0.1836 0.14
+0.18 0.18 0.14
+0.1836 0.1764 0.14
+0.1872 0.1728 0.14
+0.1908 0.1692 0.14
+0.1944 0.1656 0.14
+0.198 0.162 0.14
+0.2016 0.1584 0.14
+0.2052 0.1548 0.14
+0.2088 0.1512 0.14
+0.2124 0.1476 0.14
+0.216 0.144 0.14
+0.2196 0.1404 0.14
+0.2232 0.1368 0.14
+0.2268 0.1332 0.14
+0.2304 0.1296 0.14
+0.234 0.126 0.14
+0.2376 0.1224 0.14
+0.2412 0.1188 0.14
+0.2448 0.1152 0.14
+0.2484 0.1116 0.14
+0.252 0.108 0.14
+0.2556 0.1044 0.14
+0.2592 0.1008 0.14
+0.2628 0.0972 0.14
+0.2664 0.0936 0.14
+0.27 0.09 0.14
+0.2736 0.0864 0.14
+0.2772 0.0828 0.14
+0.2808 0.0792 0.14
+0.2844 0.0756 0.14
+0.288 0.072 0.14
+0.2916 0.0684 0.14
+0.2952 0.0648 0.14
+0.2988 0.0612 0.14
+0.3024 0.0576 0.14
+0.306 0.054 0.14
+0.3096 0.0504 0.14
+0.3132 0.0468 0.14
+0.3168 0.0432 0.14
+0.3204 0.0396 0.14
+0.324 0.036 0.14
+0.3276 0.0324 0.14
+0.3312 0.0288 0.14
+0.3348 0.0252 0.14
+0.3384 0.0216 0.14
+0.342 0.018 0.14
+0.3456 0.0144 0.14
+0.3492 0.0108 0.14
+0.3528 0.0072 0.14
+0.3564 0.0036 0.14
+0 0.365 0.135
+0.00365 0.36135 0.135
+0.0073 0.3577 0.135
+0.01095 0.35405 0.135
+0.0146 0.3504 0.135
+0.01825 0.34675 0.135
+0.0219 0.3431 0.135
+0.02555 0.33945 0.135
+0.0292 0.3358 0.135
+0.03285 0.33215 0.135
+0.0365 0.3285 0.135
+0.04015 0.32485 0.135
+0.0438 0.3212 0.135
+0.04745 0.31755 0.135
+0.0511 0.3139 0.135
+0.05475 0.31025 0.135
+0.0584 0.3066 0.135
+0.06205 0.30295 0.135
+0.0657 0.2993 0.135
+0.06935 0.29565 0.135
+0.073 0.292 0.135
+0.07665 0.28835 0.135
+0.0803 0.2847 0.135
+0.08395 0.28105 0.135
+0.0876 0.2774 0.135
+0.09125 0.27375 0.135
+0.0949 0.2701 0.135
+0.09855 0.26645 0.135
+0.1022 0.2628 0.135
+0.10585 0.25915 0.135
+0.1095 0.2555 0.135
+0.11315 0.25185 0.135
+0.1168 0.2482 0.135
+0.12045 0.24455 0.135
+0.1241 0.2409 0.135
+0.12775 0.23725 0.135
+0.1314 0.2336 0.135
+0.13505 0.22995 0.135
+0.1387 0.2263 0.135
+0.14235 0.22265 0.135
+0.146 0.219 0.135
+0.14965 0.21535 0.135
+0.1533 0.2117 0.135
+0.15695 0.20805 0.135
+0.1606 0.2044 0.135
+0.16425 0.20075 0.135
+0.1679 0.1971 0.135
+0.17155 0.19345 0.135
+0.1752 0.1898 0.135
+0.17885 0.18615 0.135
+0.1825 0.1825 0.135
+0.18615 0.17885 0.135
+0.1898 0.1752 0.135
+0.19345 0.17155 0.135
+0.1971 0.1679 0.135
+0.20075 0.16425 0.135
+0.2044 0.1606 0.135
+0.20805 0.15695 0.135
+0.2117 0.1533 0.135
+0.21535 0.14965 0.135
+0.219 0.146 0.135
+0.22265 0.14235 0.135
+0.2263 0.1387 0.135
+0.22995 0.13505 0.135
+0.2336 0.1314 0.135
+0.23725 0.12775 0.135
+0.2409 0.1241 0.135
+0.24455 0.12045 0.135
+0.2482 0.1168 0.135
+0.25185 0.11315 0.135
+0.2555 0.1095 0.135
+0.25915 0.10585 0.135
+0.2628 0.1022 0.135
+0.26645 0.09855 0.135
+0.2701 0.0949 0.135
+0.27375 0.09125 0.135
+0.2774 0.0876 0.135
+0.28105 0.08395 0.135
+0.2847 0.0803 0.135
+0.28835 0.07665 0.135
+0.292 0.073 0.135
+0.29565 0.06935 0.135
+0.2993 0.0657 0.135
+0.30295 0.06205 0.135
+0.3066 0.0584 0.135
+0.31025 0.05475 0.135
+0.3139 0.0511 0.135
+0.31755 0.04745 0.135
+0.3212 0.0438 0.135
+0.32485 0.04015 0.135
+0.3285 0.0365 0.135
+0.33215 0.03285 0.135
+0.3358 0.0292 0.135
+0.33945 0.02555 0.135
+0.3431 0.0219 0.135
+0.34675 0.01825 0.135
+0.3504 0.0146 0.135
+0.35405 0.01095 0.135
+0.3577 0.0073 0.135
+0.36135 0.00365 0.135
+0 0.37 0.13
+0.0037 0.3663 0.13
+0.0074 0.3626 0.13
+0.0111 0.3589 0.13
+0.0148 0.3552 0.13
+0.0185 0.3515 0.13
+0.0222 0.3478 0.13
+0.0259 0.3441 0.13
+0.0296 0.3404 0.13
+0.0333 0.3367 0.13
+0.037 0.333 0.13
+0.0407 0.3293 0.13
+0.0444 0.3256 0.13
+0.0481 0.3219 0.13
+0.0518 0.3182 0.13
+0.0555 0.3145 0.13
+0.0592 0.3108 0.13
+0.0629 0.3071 0.13
+0.0666 0.3034 0.13
+0.0703 0.2997 0.13
+0.074 0.296 0.13
+0.0777 0.2923 0.13
+0.0814 0.2886 0.13
+0.0851 0.2849 0.13
+0.0888 0.2812 0.13
+0.0925 0.2775 0.13
+0.0962 0.2738 0.13
+0.0999 0.2701 0.13
+0.1036 0.2664 0.13
+0.1073 0.2627 0.13
+0.111 0.259 0.13
+0.1147 0.2553 0.13
+0.1184 0.2516 0.13
+0.1221 0.2479 0.13
+0.1258 0.2442 0.13
+0.1295 0.2405 0.13
+0.1332 0.2368 0.13
+0.1369 0.2331 0.13
+0.1406 0.2294 0.13
+0.1443 0.2257 0.13
+0.148 0.222 0.13
+0.1517 0.2183 0.13
+0.1554 0.2146 0.13
+0.1591 0.2109 0.13
+0.1628 0.2072 0.13
+0.1665 0.2035 0.13
+0.1702 0.1998 0.13
+0.1739 0.1961 0.13
+0.1776 0.1924 0.13
+0.1813 0.1887 0.13
+0.185 0.185 0.13
+0.1887 0.1813 0.13
+0.1924 0.1776 0.13
+0.1961 0.1739 0.13
+0.1998 0.1702 0.13
+0.2035 0.1665 0.13
+0.2072 0.1628 0.13
+0.2109 0.1591 0.13
+0.2146 0.1554 0.13
+0.2183 0.1517 0.13
+0.222 0.148 0.13
+0.2257 0.1443 0.13
+0.2294 0.1406 0.13
+0.2331 0.1369 0.13
+0.2368 0.1332 0.13
+0.2405 0.1295 0.13
+0.2442 0.1258 0.13
+0.2479 0.1221 0.13
+0.2516 0.1184 0.13
+0.2553 0.1147 0.13
+0.259 0.111 0.13
+0.2627 0.1073 0.13
+0.2664 0.1036 0.13
+0.2701 0.0999 0.13
+0.2738 0.0962 0.13
+0.2775 0.0925 0.13
+0.2812 0.0888 0.13
+0.2849 0.0851 0.13
+0.2886 0.0814 0.13
+0.2923 0.0777 0.13
+0.296 0.074 0.13
+0.2997 0.0703 0.13
+0.3034 0.0666 0.13
+0.3071 0.0629 0.13
+0.3108 0.0592 0.13
+0.3145 0.0555 0.13
+0.3182 0.0518 0.13
+0.3219 0.0481 0.13
+0.3256 0.0444 0.13
+0.3293 0.0407 0.13
+0.333 0.037 0.13
+0.3367 0.0333 0.13
+0.3404 0.0296 0.13
+0.3441 0.0259 0.13
+0.3478 0.0222 0.13
+0.3515 0.0185 0.13
+0.3552 0.0148 0.13
+0.3589 0.0111 0.13
+0.3626 0.0074 0.13
+0.3663 0.0037 0.13
+0 0.375 0.125
+0.00375 0.37125 0.125
+0.0075 0.3675 0.125
+0.01125 0.36375 0.125
+0.015 0.36 0.125
+0.01875 0.35625 0.125
+0.0225 0.3525 0.125
+0.02625 0.34875 0.125
+0.03 0.345 0.125
+0.03375 0.34125 0.125
+0.0375 0.3375 0.125
+0.04125 0.33375 0.125
+0.045 0.33 0.125
+0.04875 0.32625 0.125
+0.0525 0.3225 0.125
+0.05625 0.31875 0.125
+0.06 0.315 0.125
+0.06375 0.31125 0.125
+0.0675 0.3075 0.125
+0.07125 0.30375 0.125
+0.075 0.3 0.125
+0.07875 0.29625 0.125
+0.0825 0.2925 0.125
+0.08625 0.28875 0.125
+0.09 0.285 0.125
+0.09375 0.28125 0.125
+0.0975 0.2775 0.125
+0.10125 0.27375 0.125
+0.105 0.27 0.125
+0.10875 0.26625 0.125
+0.1125 0.2625 0.125
+0.11625 0.25875 0.125
+0.12 0.255 0.125
+0.12375 0.25125 0.125
+0.1275 0.2475 0.125
+0.13125 0.24375 0.125
+0.135 0.24 0.125
+0.13875 0.23625 0.125
+0.1425 0.2325 0.125
+0.14625 0.22875 0.125
+0.15 0.225 0.125
+0.15375 0.22125 0.125
+0.1575 0.2175 0.125
+0.16125 0.21375 0.125
+0.165 0.21 0.125
+0.16875 0.20625 0.125
+0.1725 0.2025 0.125
+0.17625 0.19875 0.125
+0.18 0.195 0.125
+0.18375 0.19125 0.125
+0.1875 0.1875 0.125
+0.19125 0.18375 0.125
+0.195 0.18 0.125
+0.19875 0.17625 0.125
+0.2025 0.1725 0.125
+0.20625 0.16875 0.125
+0.21 0.165 0.125
+0.21375 0.16125 0.125
+0.2175 0.1575 0.125
+0.22125 0.15375 0.125
+0.225 0.15 0.125
+0.22875 0.14625 0.125
+0.2325 0.1425 0.125
+0.23625 0.13875 0.125
+0.24 0.135 0.125
+0.24375 0.13125 0.125
+0.2475 0.1275 0.125
+0.25125 0.12375 0.125
+0.255 0.12 0.125
+0.25875 0.11625 0.125
+0.2625 0.1125 0.125
+0.26625 0.10875 0.125
+0.27 0.105 0.125
+0.27375 0.10125 0.125
+0.2775 0.0975 0.125
+0.28125 0.09375 0.125
+0.285 0.09 0.125
+0.28875 0.08625 0.125
+0.2925 0.0825 0.125
+0.29625 0.07875 0.125
+0.3 0.075 0.125
+0.30375 0.07125 0.125
+0.3075 0.0675 0.125
+0.31125 0.06375 0.125
+0.315 0.06 0.125
+0.31875 0.05625 0.125
+0.3225 0.0525 0.125
+0.32625 0.04875 0.125
+0.33 0.045 0.125
+0.33375 0.04125 0.125
+0.3375 0.0375 0.125
+0.34125 0.03375 0.125
+0.345 0.03 0.125
+0.34875 0.02625 0.125
+0.3525 0.0225 0.125
+0.35625 0.01875 0.125
+0.36 0.015 0.125
+0.36375 0.01125 0.125
+0.3675 0.0075 0.125
+0.37125 0.00375 0.125
+0 0.38 0.12
+0.0038 0.3762 0.12
+0.0076 0.3724 0.12
+0.0114 0.3686 0.12
+0.0152 0.3648 0.12
+0.019 0.361 0.12
+0.0228 0.3572 0.12
+0.0266 0.3534 0.12
+0.0304 0.3496 0.12
+0.0342 0.3458 0.12
+0.038 0.342 0.12
+0.0418 0.3382 0.12
+0.0456 0.3344 0.12
+0.0494 0.3306 0.12
+0.0532 0.3268 0.12
+0.057 0.323 0.12
+0.0608 0.3192 0.12
+0.0646 0.3154 0.12
+0.0684 0.3116 0.12
+0.0722 0.3078 0.12
+0.076 0.304 0.12
+0.0798 0.3002 0.12
+0.0836 0.2964 0.12
+0.0874 0.2926 0.12
+0.0912 0.2888 0.12
+0.095 0.285 0.12
+0.0988 0.2812 0.12
+0.1026 0.2774 0.12
+0.1064 0.2736 0.12
+0.1102 0.2698 0.12
+0.114 0.266 0.12
+0.1178 0.2622 0.12
+0.1216 0.2584 0.12
+0.1254 0.2546 0.12
+0.1292 0.2508 0.12
+0.133 0.247 0.12
+0.1368 0.2432 0.12
+0.1406 0.2394 0.12
+0.1444 0.2356 0.12
+0.1482 0.2318 0.12
+0.152 0.228 0.12
+0.1558 0.2242 0.12
+0.1596 0.2204 0.12
+0.1634 0.2166 0.12
+0.1672 0.2128 0.12
+0.171 0.209 0.12
+0.1748 0.2052 0.12
+0.1786 0.2014 0.12
+0.1824 0.1976 0.12
+0.1862 0.1938 0.12
+0.19 0.19 0.12
+0.1938 0.1862 0.12
+0.1976 0.1824 0.12
+0.2014 0.1786 0.12
+0.2052 0.1748 0.12
+0.209 0.171 0.12
+0.2128 0.1672 0.12
+0.2166 0.1634 0.12
+0.2204 0.1596 0.12
+0.2242 0.1558 0.12
+0.228 0.152 0.12
+0.2318 0.1482 0.12
+0.2356 0.1444 0.12
+0.2394 0.1406 0.12
+0.2432 0.1368 0.12
+0.247 0.133 0.12
+0.2508 0.1292 0.12
+0.2546 0.1254 0.12
+0.2584 0.1216 0.12
+0.2622 0.1178 0.12
+0.266 0.114 0.12
+0.2698 0.1102 0.12
+0.2736 0.1064 0.12
+0.2774 0.1026 0.12
+0.2812 0.0988 0.12
+0.285 0.095 0.12
+0.2888 0.0912 0.12
+0.2926 0.0874 0.12
+0.2964 0.0836 0.12
+0.3002 0.0798 0.12
+0.304 0.076 0.12
+0.3078 0.0722 0.12
+0.3116 0.0684 0.12
+0.3154 0.0646 0.12
+0.3192 0.0608 0.12
+0.323 0.057 0.12
+0.3268 0.0532 0.12
+0.3306 0.0494 0.12
+0.3344 0.0456 0.12
+0.3382 0.0418 0.12
+0.342 0.038 0.12
+0.3458 0.0342 0.12
+0.3496 0.0304 0.12
+0.3534 0.0266 0.12
+0.3572 0.0228 0.12
+0.361 0.019 0.12
+0.3648 0.0152 0.12
+0.3686 0.0114 0.12
+0.3724 0.0076 0.12
+0.3762 0.0038 0.12
+0 0.385 0.115
+0.00385 0.38115 0.115
+0.0077 0.3773 0.115
+0.01155 0.37345 0.115
+0.0154 0.3696 0.115
+0.01925 0.36575 0.115
+0.0231 0.3619 0.115
+0.02695 0.35805 0.115
+0.0308 0.3542 0.115
+0.03465 0.35035 0.115
+0.0385 0.3465 0.115
+0.04235 0.34265 0.115
+0.0462 0.3388 0.115
+0.05005 0.33495 0.115
+0.0539 0.3311 0.115
+0.05775 0.32725 0.115
+0.0616 0.3234 0.115
+0.06545 0.31955 0.115
+0.0693 0.3157 0.115
+0.07315 0.31185 0.115
+0.077 0.308 0.115
+0.08085 0.30415 0.115
+0.0847 0.3003 0.115
+0.08855 0.29645 0.115
+0.0924 0.2926 0.115
+0.09625 0.28875 0.115
+0.1001 0.2849 0.115
+0.10395 0.28105 0.115
+0.1078 0.2772 0.115
+0.11165 0.27335 0.115
+0.1155 0.2695 0.115
+0.11935 0.26565 0.115
+0.1232 0.2618 0.115
+0.12705 0.25795 0.115
+0.1309 0.2541 0.115
+0.13475 0.25025 0.115
+0.1386 0.2464 0.115
+0.14245 0.24255 0.115
+0.1463 0.2387 0.115
+0.15015 0.23485 0.115
+0.154 0.231 0.115
+0.15785 0.22715 0.115
+0.1617 0.2233 0.115
+0.16555 0.21945 0.115
+0.1694 0.2156 0.115
+0.17325 0.21175 0.115
+0.1771 0.2079 0.115
+0.18095 0.20405 0.115
+0.1848 0.2002 0.115
+0.18865 0.19635 0.115
+0.1925 0.1925 0.115
+0.19635 0.18865 0.115
+0.2002 0.1848 0.115
+0.20405 0.18095 0.115
+0.2079 0.1771 0.115
+0.21175 0.17325 0.115
+0.2156 0.1694 0.115
+0.21945 0.16555 0.115
+0.2233 0.1617 0.115
+0.22715 0.15785 0.115
+0.231 0.154 0.115
+0.23485 0.15015 0.115
+0.2387 0.1463 0.115
+0.24255 0.14245 0.115
+0.2464 0.1386 0.115
+0.25025 0.13475 0.115
+0.2541 0.1309 0.115
+0.25795 0.12705 0.115
+0.2618 0.1232 0.115
+0.26565 0.11935 0.115
+0.2695 0.1155 0.115
+0.27335 0.11165 0.115
+0.2772 0.1078 0.115
+0.28105 0.10395 0.115
+0.2849 0.1001 0.115
+0.28875 0.09625 0.115
+0.2926 0.0924 0.115
+0.29645 0.08855 0.115
+0.3003 0.0847 0.115
+0.30415 0.08085 0.115
+0.308 0.077 0.115
+0.31185 0.07315 0.115
+0.3157 0.0693 0.115
+0.31955 0.06545 0.115
+0.3234 0.0616 0.115
+0.32725 0.05775 0.115
+0.3311 0.0539 0.115
+0.33495 0.05005 0.115
+0.3388 0.0462 0.115
+0.34265 0.04235 0.115
+0.3465 0.0385 0.115
+0.35035 0.03465 0.115
+0.3542 0.0308 0.115
+0.35805 0.02695 0.115
+0.3619 0.0231 0.115
+0.36575 0.01925 0.115
+0.3696 0.0154 0.115
+0.37345 0.01155 0.115
+0.3773 0.0077 0.115
+0.38115 0.00385 0.115
+0 0.39 0.11
+0.0039 0.3861 0.11
+0.0078 0.3822 0.11
+0.0117 0.3783 0.11
+0.0156 0.3744 0.11
+0.0195 0.3705 0.11
+0.0234 0.3666 0.11
+0.0273 0.3627 0.11
+0.0312 0.3588 0.11
+0.0351 0.3549 0.11
+0.039 0.351 0.11
+0.0429 0.3471 0.11
+0.0468 0.3432 0.11
+0.0507 0.3393 0.11
+0.0546 0.3354 0.11
+0.0585 0.3315 0.11
+0.0624 0.3276 0.11
+0.0663 0.3237 0.11
+0.0702 0.3198 0.11
+0.0741 0.3159 0.11
+0.078 0.312 0.11
+0.0819 0.3081 0.11
+0.0858 0.3042 0.11
+0.0897 0.3003 0.11
+0.0936 0.2964 0.11
+0.0975 0.2925 0.11
+0.1014 0.2886 0.11
+0.1053 0.2847 0.11
+0.1092 0.2808 0.11
+0.1131 0.2769 0.11
+0.117 0.273 0.11
+0.1209 0.2691 0.11
+0.1248 0.2652 0.11
+0.1287 0.2613 0.11
+0.1326 0.2574 0.11
+0.1365 0.2535 0.11
+0.1404 0.2496 0.11
+0.1443 0.2457 0.11
+0.1482 0.2418 0.11
+0.1521 0.2379 0.11
+0.156 0.234 0.11
+0.1599 0.2301 0.11
+0.1638 0.2262 0.11
+0.1677 0.2223 0.11
+0.1716 0.2184 0.11
+0.1755 0.2145 0.11
+0.1794 0.2106 0.11
+0.1833 0.2067 0.11
+0.1872 0.2028 0.11
+0.1911 0.1989 0.11
+0.195 0.195 0.11
+0.1989 0.1911 0.11
+0.2028 0.1872 0.11
+0.2067 0.1833 0.11
+0.2106 0.1794 0.11
+0.2145 0.1755 0.11
+0.2184 0.1716 0.11
+0.2223 0.1677 0.11
+0.2262 0.1638 0.11
+0.2301 0.1599 0.11
+0.234 0.156 0.11
+0.2379 0.1521 0.11
+0.2418 0.1482 0.11
+0.2457 0.1443 0.11
+0.2496 0.1404 0.11
+0.2535 0.1365 0.11
+0.2574 0.1326 0.11
+0.2613 0.1287 0.11
+0.2652 0.1248 0.11
+0.2691 0.1209 0.11
+0.273 0.117 0.11
+0.2769 0.1131 0.11
+0.2808 0.1092 0.11
+0.2847 0.1053 0.11
+0.2886 0.1014 0.11
+0.2925 0.0975 0.11
+0.2964 0.0936 0.11
+0.3003 0.0897 0.11
+0.3042 0.0858 0.11
+0.3081 0.0819 0.11
+0.312 0.078 0.11
+0.3159 0.0741 0.11
+0.3198 0.0702 0.11
+0.3237 0.0663 0.11
+0.3276 0.0624 0.11
+0.3315 0.0585 0.11
+0.3354 0.0546 0.11
+0.3393 0.0507 0.11
+0.3432 0.0468 0.11
+0.3471 0.0429 0.11
+0.351 0.039 0.11
+0.3549 0.0351 0.11
+0.3588 0.0312 0.11
+0.3627 0.0273 0.11
+0.3666 0.0234 0.11
+0.3705 0.0195 0.11
+0.3744 0.0156 0.11
+0.3783 0.0117 0.11
+0.3822 0.0078 0.11
+0.3861 0.0039 0.11
+0 0.395 0.105
+0.00395 0.39105 0.105
+0.0079 0.3871 0.105
+0.01185 0.38315 0.105
+0.0158 0.3792 0.105
+0.01975 0.37525 0.105
+0.0237 0.3713 0.105
+0.02765 0.36735 0.105
+0.0316 0.3634 0.105
+0.03555 0.35945 0.105
+0.0395 0.3555 0.105
+0.04345 0.35155 0.105
+0.0474 0.3476 0.105
+0.05135 0.34365 0.105
+0.0553 0.3397 0.105
+0.05925 0.33575 0.105
+0.0632 0.3318 0.105
+0.06715 0.32785 0.105
+0.0711 0.3239 0.105
+0.07505 0.31995 0.105
+0.079 0.316 0.105
+0.08295 0.31205 0.105
+0.0869 0.3081 0.105
+0.09085 0.30415 0.105
+0.0948 0.3002 0.105
+0.09875 0.29625 0.105
+0.1027 0.2923 0.105
+0.10665 0.28835 0.105
+0.1106 0.2844 0.105
+0.11455 0.28045 0.105
+0.1185 0.2765 0.105
+0.12245 0.27255 0.105
+0.1264 0.2686 0.105
+0.13035 0.26465 0.105
+0.1343 0.2607 0.105
+0.13825 0.25675 0.105
+0.1422 0.2528 0.105
+0.14615 0.24885 0.105
+0.1501 0.2449 0.105
+0.15405 0.24095 0.105
+0.158 0.237 0.105
+0.16195 0.23305 0.105
+0.1659 0.2291 0.105
+0.16985 0.22515 0.105
+0.1738 0.2212 0.105
+0.17775 0.21725 0.105
+0.1817 0.2133 0.105
+0.18565 0.20935 0.105
+0.1896 0.2054 0.105
+0.19355 0.20145 0.105
+0.1975 0.1975 0.105
+0.20145 0.19355 0.105
+0.2054 0.1896 0.105
+0.20935 0.18565 0.105
+0.2133 0.1817 0.105
+0.21725 0.17775 0.105
+0.2212 0.1738 0.105
+0.22515 0.16985 0.105
+0.2291 0.1659 0.105
+0.23305 0.16195 0.105
+0.237 0.158 0.105
+0.24095 0.15405 0.105
+0.2449 0.1501 0.105
+0.24885 0.14615 0.105
+0.2528 0.1422 0.105
+0.25675 0.13825 0.105
+0.2607 0.1343 0.105
+0.26465 0.13035 0.105
+0.2686 0.1264 0.105
+0.27255 0.12245 0.105
+0.2765 0.1185 0.105
+0.28045 0.11455 0.105
+0.2844 0.1106 0.105
+0.28835 0.10665 0.105
+0.2923 0.1027 0.105
+0.29625 0.09875 0.105
+0.3002 0.0948 0.105
+0.30415 0.09085 0.105
+0.3081 0.0869 0.105
+0.31205 0.08295 0.105
+0.316 0.079 0.105
+0.31995 0.07505 0.105
+0.3239 0.0711 0.105
+0.32785 0.06715 0.105
+0.3318 0.0632 0.105
+0.33575 0.05925 0.105
+0.3397 0.0553 0.105
+0.34365 0.05135 0.105
+0.3476 0.0474 0.105
+0.35155 0.04345 0.105
+0.3555 0.0395 0.105
+0.35945 0.03555 0.105
+0.3634 0.0316 0.105
+0.36735 0.02765 0.105
+0.3713 0.0237 0.105
+0.37525 0.01975 0.105
+0.3792 0.0158 0.105
+0.38315 0.01185 0.105
+0.3871 0.0079 0.105
+0.39105 0.00395 0.105
+0 0.4 0.1
+0.004 0.396 0.1
+0.008 0.392 0.1
+0.012 0.388 0.1
+0.016 0.384 0.1
+0.02 0.38 0.1
+0.024 0.376 0.1
+0.028 0.372 0.1
+0.032 0.368 0.1
+0.036 0.364 0.1
+0.04 0.36 0.1
+0.044 0.356 0.1
+0.048 0.352 0.1
+0.052 0.348 0.1
+0.056 0.344 0.1
+0.06 0.34 0.1
+0.064 0.336 0.1
+0.068 0.332 0.1
+0.072 0.328 0.1
+0.076 0.324 0.1
+0.08 0.32 0.1
+0.084 0.316 0.1
+0.088 0.312 0.1
+0.092 0.308 0.1
+0.096 0.304 0.1
+0.1 0.3 0.1
+0.104 0.296 0.1
+0.108 0.292 0.1
+0.112 0.288 0.1
+0.116 0.284 0.1
+0.12 0.28 0.1
+0.124 0.276 0.1
+0.128 0.272 0.1
+0.132 0.268 0.1
+0.136 0.264 0.1
+0.14 0.26 0.1
+0.144 0.256 0.1
+0.148 0.252 0.1
+0.152 0.248 0.1
+0.156 0.244 0.1
+0.16 0.24 0.1
+0.164 0.236 0.1
+0.168 0.232 0.1
+0.172 0.228 0.1
+0.176 0.224 0.1
+0.18 0.22 0.1
+0.184 0.216 0.1
+0.188 0.212 0.1
+0.192 0.208 0.1
+0.196 0.204 0.1
+0.2 0.2 0.1
+0.204 0.196 0.1
+0.208 0.192 0.1
+0.212 0.188 0.1
+0.216 0.184 0.1
+0.22 0.18 0.1
+0.224 0.176 0.1
+0.228 0.172 0.1
+0.232 0.168 0.1
+0.236 0.164 0.1
+0.24 0.16 0.1
+0.244 0.156 0.1
+0.248 0.152 0.1
+0.252 0.148 0.1
+0.256 0.144 0.1
+0.26 0.14 0.1
+0.264 0.136 0.1
+0.268 0.132 0.1
+0.272 0.128 0.1
+0.276 0.124 0.1
+0.28 0.12 0.1
+0.284 0.116 0.1
+0.288 0.112 0.1
+0.292 0.108 0.1
+0.296 0.104 0.1
+0.3 0.1 0.1
+0.304 0.096 0.1
+0.308 0.092 0.1
+0.312 0.088 0.1
+0.316 0.084 0.1
+0.32 0.08 0.1
+0.324 0.076 0.1
+0.328 0.072 0.1
+0.332 0.068 0.1
+0.336 0.064 0.1
+0.34 0.06 0.1
+0.344 0.056 0.1
+0.348 0.052 0.1
+0.352 0.048 0.1
+0.356 0.044 0.1
+0.36 0.04 0.1
+0.364 0.036 0.1
+0.368 0.032 0.1
+0.372 0.028 0.1
+0.376 0.024 0.1
+0.38 0.02 0.1
+0.384 0.016 0.1
+0.388 0.012 0.1
+0.392 0.008 0.1
+0.396 0.004 0.1
+0 0.405 0.095
+0.00405 0.40095 0.095
+0.0081 0.3969 0.095
+0.01215 0.39285 0.095
+0.0162 0.3888 0.095
+0.02025 0.38475 0.095
+0.0243 0.3807 0.095
+0.02835 0.37665 0.095
+0.0324 0.3726 0.095
+0.03645 0.36855 0.095
+0.0405 0.3645 0.095
+0.04455 0.36045 0.095
+0.0486 0.3564 0.095
+0.05265 0.35235 0.095
+0.0567 0.3483 0.095
+0.06075 0.34425 0.095
+0.0648 0.3402 0.095
+0.06885 0.33615 0.095
+0.0729 0.3321 0.095
+0.07695 0.32805 0.095
+0.081 0.324 0.095
+0.08505 0.31995 0.095
+0.0891 0.3159 0.095
+0.09315 0.31185 0.095
+0.0972 0.3078 0.095
+0.10125 0.30375 0.095
+0.1053 0.2997 0.095
+0.10935 0.29565 0.095
+0.1134 0.2916 0.095
+0.11745 0.28755 0.095
+0.1215 0.2835 0.095
+0.12555 0.27945 0.095
+0.1296 0.2754 0.095
+0.13365 0.27135 0.095
+0.1377 0.2673 0.095
+0.14175 0.26325 0.095
+0.1458 0.2592 0.095
+0.14985 0.25515 0.095
+0.1539 0.2511 0.095
+0.15795 0.24705 0.095
+0.162 0.243 0.095
+0.16605 0.23895 0.095
+0.1701 0.2349 0.095
+0.17415 0.23085 0.095
+0.1782 0.2268 0.095
+0.18225 0.22275 0.095
+0.1863 0.2187 0.095
+0.19035 0.21465 0.095
+0.1944 0.2106 0.095
+0.19845 0.20655 0.095
+0.2025 0.2025 0.095
+0.20655 0.19845 0.095
+0.2106 0.1944 0.095
+0.21465 0.19035 0.095
+0.2187 0.1863 0.095
+0.22275 0.18225 0.095
+0.2268 0.1782 0.095
+0.23085 0.17415 0.095
+0.2349 0.1701 0.095
+0.23895 0.16605 0.095
+0.243 0.162 0.095
+0.24705 0.15795 0.095
+0.2511 0.1539 0.095
+0.25515 0.14985 0.095
+0.2592 0.1458 0.095
+0.26325 0.14175 0.095
+0.2673 0.1377 0.095
+0.27135 0.13365 0.095
+0.2754 0.1296 0.095
+0.27945 0.12555 0.095
+0.2835 0.1215 0.095
+0.28755 0.11745 0.095
+0.2916 0.1134 0.095
+0.29565 0.10935 0.095
+0.2997 0.1053 0.095
+0.30375 0.10125 0.095
+0.3078 0.0972 0.095
+0.31185 0.09315 0.095
+0.3159 0.0891 0.095
+0.31995 0.08505 0.095
+0.324 0.081 0.095
+0.32805 0.07695 0.095
+0.3321 0.0729 0.095
+0.33615 0.06885 0.095
+0.3402 0.0648 0.095
+0.34425 0.06075 0.095
+0.3483 0.0567 0.095
+0.35235 0.05265 0.095
+0.3564 0.0486 0.095
+0.36045 0.04455 0.095
+0.3645 0.0405 0.095
+0.36855 0.03645 0.095
+0.3726 0.0324 0.095
+0.37665 0.02835 0.095
+0.3807 0.0243 0.095
+0.38475 0.02025 0.095
+0.3888 0.0162 0.095
+0.39285 0.01215 0.095
+0.3969 0.0081 0.095
+0.40095 0.00405 0.095
+0 0.41 0.09
+0.0041 0.4059 0.09
+0.0082 0.4018 0.09
+0.0123 0.3977 0.09
+0.0164 0.3936 0.09
+0.0205 0.3895 0.09
+0.0246 0.3854 0.09
+0.0287 0.3813 0.09
+0.0328 0.3772 0.09
+0.0369 0.3731 0.09
+0.041 0.369 0.09
+0.0451 0.3649 0.09
+0.0492 0.3608 0.09
+0.0533 0.3567 0.09
+0.0574 0.3526 0.09
+0.0615 0.3485 0.09
+0.0656 0.3444 0.09
+0.0697 0.3403 0.09
+0.0738 0.3362 0.09
+0.0779 0.3321 0.09
+0.082 0.328 0.09
+0.0861 0.3239 0.09
+0.0902 0.3198 0.09
+0.0943 0.3157 0.09
+0.0984 0.3116 0.09
+0.1025 0.3075 0.09
+0.1066 0.3034 0.09
+0.1107 0.2993 0.09
+0.1148 0.2952 0.09
+0.1189 0.2911 0.09
+0.123 0.287 0.09
+0.1271 0.2829 0.09
+0.1312 0.2788 0.09
+0.1353 0.2747 0.09
+0.1394 0.2706 0.09
+0.1435 0.2665 0.09
+0.1476 0.2624 0.09
+0.1517 0.2583 0.09
+0.1558 0.2542 0.09
+0.1599 0.2501 0.09
+0.164 0.246 0.09
+0.1681 0.2419 0.09
+0.1722 0.2378 0.09
+0.1763 0.2337 0.09
+0.1804 0.2296 0.09
+0.1845 0.2255 0.09
+0.1886 0.2214 0.09
+0.1927 0.2173 0.09
+0.1968 0.2132 0.09
+0.2009 0.2091 0.09
+0.205 0.205 0.09
+0.2091 0.2009 0.09
+0.2132 0.1968 0.09
+0.2173 0.1927 0.09
+0.2214 0.1886 0.09
+0.2255 0.1845 0.09
+0.2296 0.1804 0.09
+0.2337 0.1763 0.09
+0.2378 0.1722 0.09
+0.2419 0.1681 0.09
+0.246 0.164 0.09
+0.2501 0.1599 0.09
+0.2542 0.1558 0.09
+0.2583 0.1517 0.09
+0.2624 0.1476 0.09
+0.2665 0.1435 0.09
+0.2706 0.1394 0.09
+0.2747 0.1353 0.09
+0.2788 0.1312 0.09
+0.2829 0.1271 0.09
+0.287 0.123 0.09
+0.2911 0.1189 0.09
+0.2952 0.1148 0.09
+0.2993 0.1107 0.09
+0.3034 0.1066 0.09
+0.3075 0.1025 0.09
+0.3116 0.0984 0.09
+0.3157 0.0943 0.09
+0.3198 0.0902 0.09
+0.3239 0.0861 0.09
+0.328 0.082 0.09
+0.3321 0.0779 0.09
+0.3362 0.0738 0.09
+0.3403 0.0697 0.09
+0.3444 0.0656 0.09
+0.3485 0.0615 0.09
+0.3526 0.0574 0.09
+0.3567 0.0533 0.09
+0.3608 0.0492 0.09
+0.3649 0.0451 0.09
+0.369 0.041 0.09
+0.3731 0.0369 0.09
+0.3772 0.0328 0.09
+0.3813 0.0287 0.09
+0.3854 0.0246 0.09
+0.3895 0.0205 0.09
+0.3936 0.0164 0.09
+0.3977 0.0123 0.09
+0.4018 0.0082 0.09
+0.4059 0.0041 0.09
+0 0.415 0.085
+0.00415 0.41085 0.085
+0.0083 0.4067 0.085
+0.01245 0.40255 0.085
+0.0166 0.3984 0.085
+0.02075 0.39425 0.085
+0.0249 0.3901 0.085
+0.02905 0.38595 0.085
+0.0332 0.3818 0.085
+0.03735 0.37765 0.085
+0.0415 0.3735 0.085
+0.04565 0.36935 0.085
+0.0498 0.3652 0.085
+0.05395 0.36105 0.085
+0.0581 0.3569 0.085
+0.06225 0.35275 0.085
+0.0664 0.3486 0.085
+0.07055 0.34445 0.085
+0.0747 0.3403 0.085
+0.07885 0.33615 0.085
+0.083 0.332 0.085
+0.08715 0.32785 0.085
+0.0913 0.3237 0.085
+0.09545 0.31955 0.085
+0.0996 0.3154 0.085
+0.10375 0.31125 0.085
+0.1079 0.3071 0.085
+0.11205 0.30295 0.085
+0.1162 0.2988 0.085
+0.12035 0.29465 0.085
+0.1245 0.2905 0.085
+0.12865 0.28635 0.085
+0.1328 0.2822 0.085
+0.13695 0.27805 0.085
+0.1411 0.2739 0.085
+0.14525 0.26975 0.085
+0.1494 0.2656 0.085
+0.15355 0.26145 0.085
+0.1577 0.2573 0.085
+0.16185 0.25315 0.085
+0.166 0.249 0.085
+0.17015 0.24485 0.085
+0.1743 0.2407 0.085
+0.17845 0.23655 0.085
+0.1826 0.2324 0.085
+0.18675 0.22825 0.085
+0.1909 0.2241 0.085
+0.19505 0.21995 0.085
+0.1992 0.2158 0.085
+0.20335 0.21165 0.085
+0.2075 0.2075 0.085
+0.21165 0.20335 0.085
+0.2158 0.1992 0.085
+0.21995 0.19505 0.085
+0.2241 0.1909 0.085
+0.22825 0.18675 0.085
+0.2324 0.1826 0.085
+0.23655 0.17845 0.085
+0.2407 0.1743 0.085
+0.24485 0.17015 0.085
+0.249 0.166 0.085
+0.25315 0.16185 0.085
+0.2573 0.1577 0.085
+0.26145 0.15355 0.085
+0.2656 0.1494 0.085
+0.26975 0.14525 0.085
+0.2739 0.1411 0.085
+0.27805 0.13695 0.085
+0.2822 0.1328 0.085
+0.28635 0.12865 0.085
+0.2905 0.1245 0.085
+0.29465 0.12035 0.085
+0.2988 0.1162 0.085
+0.30295 0.11205 0.085
+0.3071 0.1079 0.085
+0.31125 0.10375 0.085
+0.3154 0.0996 0.085
+0.31955 0.09545 0.085
+0.3237 0.0913 0.085
+0.32785 0.08715 0.085
+0.332 0.083 0.085
+0.33615 0.07885 0.085
+0.3403 0.0747 0.085
+0.34445 0.07055 0.085
+0.3486 0.0664 0.085
+0.35275 0.06225 0.085
+0.3569 0.0581 0.085
+0.36105 0.05395 0.085
+0.3652 0.0498 0.085
+0.36935 0.04565 0.085
+0.3735 0.0415 0.085
+0.37765 0.03735 0.085
+0.3818 0.0332 0.085
+0.38595 0.02905 0.085
+0.3901 0.0249 0.085
+0.39425 0.02075 0.085
+0.3984 0.0166 0.085
+0.40255 0.01245 0.085
+0.4067 0.0083 0.085
+0.41085 0.00415 0.085
+0 0.42 0.08
+0.0042 0.4158 0.08
+0.0084 0.4116 0.08
+0.0126 0.4074 0.08
+0.0168 0.4032 0.08
+0.021 0.399 0.08
+0.0252 0.3948 0.08
+0.0294 0.3906 0.08
+0.0336 0.3864 0.08
+0.0378 0.3822 0.08
+0.042 0.378 0.08
+0.0462 0.3738 0.08
+0.0504 0.3696 0.08
+0.0546 0.3654 0.08
+0.0588 0.3612 0.08
+0.063 0.357 0.08
+0.0672 0.3528 0.08
+0.0714 0.3486 0.08
+0.0756 0.3444 0.08
+0.0798 0.3402 0.08
+0.084 0.336 0.08
+0.0882 0.3318 0.08
+0.0924 0.3276 0.08
+0.0966 0.3234 0.08
+0.1008 0.3192 0.08
+0.105 0.315 0.08
+0.1092 0.3108 0.08
+0.1134 0.3066 0.08
+0.1176 0.3024 0.08
+0.1218 0.2982 0.08
+0.126 0.294 0.08
+0.1302 0.2898 0.08
+0.1344 0.2856 0.08
+0.1386 0.2814 0.08
+0.1428 0.2772 0.08
+0.147 0.273 0.08
+0.1512 0.2688 0.08
+0.1554 0.2646 0.08
+0.1596 0.2604 0.08
+0.1638 0.2562 0.08
+0.168 0.252 0.08
+0.1722 0.2478 0.08
+0.1764 0.2436 0.08
+0.1806 0.2394 0.08
+0.1848 0.2352 0.08
+0.189 0.231 0.08
+0.1932 0.2268 0.08
+0.1974 0.2226 0.08
+0.2016 0.2184 0.08
+0.2058 0.2142 0.08
+0.21 0.21 0.08
+0.2142 0.2058 0.08
+0.2184 0.2016 0.08
+0.2226 0.1974 0.08
+0.2268 0.1932 0.08
+0.231 0.189 0.08
+0.2352 0.1848 0.08
+0.2394 0.1806 0.08
+0.2436 0.1764 0.08
+0.2478 0.1722 0.08
+0.252 0.168 0.08
+0.2562 0.1638 0.08
+0.2604 0.1596 0.08
+0.2646 0.1554 0.08
+0.2688 0.1512 0.08
+0.273 0.147 0.08
+0.2772 0.1428 0.08
+0.2814 0.1386 0.08
+0.2856 0.1344 0.08
+0.2898 0.1302 0.08
+0.294 0.126 0.08
+0.2982 0.1218 0.08
+0.3024 0.1176 0.08
+0.3066 0.1134 0.08
+0.3108 0.1092 0.08
+0.315 0.105 0.08
+0.3192 0.1008 0.08
+0.3234 0.0966 0.08
+0.3276 0.0924 0.08
+0.3318 0.0882 0.08
+0.336 0.084 0.08
+0.3402 0.0798 0.08
+0.3444 0.0756 0.08
+0.3486 0.0714 0.08
+0.3528 0.0672 0.08
+0.357 0.063 0.08
+0.3612 0.0588 0.08
+0.3654 0.0546 0.08
+0.3696 0.0504 0.08
+0.3738 0.0462 0.08
+0.378 0.042 0.08
+0.3822 0.0378 0.08
+0.3864 0.0336 0.08
+0.3906 0.0294 0.08
+0.3948 0.0252 0.08
+0.399 0.021 0.08
+0.4032 0.0168 0.08
+0.4074 0.0126 0.08
+0.4116 0.0084 0.08
+0.4158 0.0042 0.08
+0 0.425 0.075
+0.00425 0.42075 0.075
+0.0085 0.4165 0.075
+0.01275 0.41225 0.075
+0.017 0.408 0.075
+0.02125 0.40375 0.075
+0.0255 0.3995 0.075
+0.02975 0.39525 0.075
+0.034 0.391 0.075
+0.03825 0.38675 0.075
+0.0425 0.3825 0.075
+0.04675 0.37825 0.075
+0.051 0.374 0.075
+0.05525 0.36975 0.075
+0.0595 0.3655 0.075
+0.06375 0.36125 0.075
+0.068 0.357 0.075
+0.07225 0.35275 0.075
+0.0765 0.3485 0.075
+0.08075 0.34425 0.075
+0.085 0.34 0.075
+0.08925 0.33575 0.075
+0.0935 0.3315 0.075
+0.09775 0.32725 0.075
+0.102 0.323 0.075
+0.10625 0.31875 0.075
+0.1105 0.3145 0.075
+0.11475 0.31025 0.075
+0.119 0.306 0.075
+0.12325 0.30175 0.075
+0.1275 0.2975 0.075
+0.13175 0.29325 0.075
+0.136 0.289 0.075
+0.14025 0.28475 0.075
+0.1445 0.2805 0.075
+0.14875 0.27625 0.075
+0.153 0.272 0.075
+0.15725 0.26775 0.075
+0.1615 0.2635 0.075
+0.16575 0.25925 0.075
+0.17 0.255 0.075
+0.17425 0.25075 0.075
+0.1785 0.2465 0.075
+0.18275 0.24225 0.075
+0.187 0.238 0.075
+0.19125 0.23375 0.075
+0.1955 0.2295 0.075
+0.19975 0.22525 0.075
+0.204 0.221 0.075
+0.20825 0.21675 0.075
+0.2125 0.2125 0.075
+0.21675 0.20825 0.075
+0.221 0.204 0.075
+0.22525 0.19975 0.075
+0.2295 0.1955 0.075
+0.23375 0.19125 0.075
+0.238 0.187 0.075
+0.24225 0.18275 0.075
+0.2465 0.1785 0.075
+0.25075 0.17425 0.075
+0.255 0.17 0.075
+0.25925 0.16575 0.075
+0.2635 0.1615 0.075
+0.26775 0.15725 0.075
+0.272 0.153 0.075
+0.27625 0.14875 0.075
+0.2805 0.1445 0.075
+0.28475 0.14025 0.075
+0.289 0.136 0.075
+0.29325 0.13175 0.075
+0.2975 0.1275 0.075
+0.30175 0.12325 0.075
+0.306 0.119 0.075
+0.31025 0.11475 0.075
+0.3145 0.1105 0.075
+0.31875 0.10625 0.075
+0.323 0.102 0.075
+0.32725 0.09775 0.075
+0.3315 0.0935 0.075
+0.33575 0.08925 0.075
+0.34 0.085 0.075
+0.34425 0.08075 0.075
+0.3485 0.0765 0.075
+0.35275 0.07225 0.075
+0.357 0.068 0.075
+0.36125 0.06375 0.075
+0.3655 0.0595 0.075
+0.36975 0.05525 0.075
+0.374 0.051 0.075
+0.37825 0.04675 0.075
+0.3825 0.0425 0.075
+0.38675 0.03825 0.075
+0.391 0.034 0.075
+0.39525 0.02975 0.075
+0.3995 0.0255 0.075
+0.40375 0.02125 0.075
+0.408 0.017 0.075
+0.41225 0.01275 0.075
+0.4165 0.0085 0.075
+0.42075 0.00425 0.075
+0 0.43 0.07
+0.0043 0.4257 0.07
+0.0086 0.4214 0.07
+0.0129 0.4171 0.07
+0.0172 0.4128 0.07
+0.0215 0.4085 0.07
+0.0258 0.4042 0.07
+0.0301 0.3999 0.07
+0.0344 0.3956 0.07
+0.0387 0.3913 0.07
+0.043 0.387 0.07
+0.0473 0.3827 0.07
+0.0516 0.3784 0.07
+0.0559 0.3741 0.07
+0.0602 0.3698 0.07
+0.0645 0.3655 0.07
+0.0688 0.3612 0.07
+0.0731 0.3569 0.07
+0.0774 0.3526 0.07
+0.0817 0.3483 0.07
+0.086 0.344 0.07
+0.0903 0.3397 0.07
+0.0946 0.3354 0.07
+0.0989 0.3311 0.07
+0.1032 0.3268 0.07
+0.1075 0.3225 0.07
+0.1118 0.3182 0.07
+0.1161 0.3139 0.07
+0.1204 0.3096 0.07
+0.1247 0.3053 0.07
+0.129 0.301 0.07
+0.1333 0.2967 0.07
+0.1376 0.2924 0.07
+0.1419 0.2881 0.07
+0.1462 0.2838 0.07
+0.1505 0.2795 0.07
+0.1548 0.2752 0.07
+0.1591 0.2709 0.07
+0.1634 0.2666 0.07
+0.1677 0.2623 0.07
+0.172 0.258 0.07
+0.1763 0.2537 0.07
+0.1806 0.2494 0.07
+0.1849 0.2451 0.07
+0.1892 0.2408 0.07
+0.1935 0.2365 0.07
+0.1978 0.2322 0.07
+0.2021 0.2279 0.07
+0.2064 0.2236 0.07
+0.2107 0.2193 0.07
+0.215 0.215 0.07
+0.2193 0.2107 0.07
+0.2236 0.2064 0.07
+0.2279 0.2021 0.07
+0.2322 0.1978 0.07
+0.2365 0.1935 0.07
+0.2408 0.1892 0.07
+0.2451 0.1849 0.07
+0.2494 0.1806 0.07
+0.2537 0.1763 0.07
+0.258 0.172 0.07
+0.2623 0.1677 0.07
+0.2666 0.1634 0.07
+0.2709 0.1591 0.07
+0.2752 0.1548 0.07
+0.2795 0.1505 0.07
+0.2838 0.1462 0.07
+0.2881 0.1419 0.07
+0.2924 0.1376 0.07
+0.2967 0.1333 0.07
+0.301 0.129 0.07
+0.3053 0.1247 0.07
+0.3096 0.1204 0.07
+0.3139 0.1161 0.07
+0.3182 0.1118 0.07
+0.3225 0.1075 0.07
+0.3268 0.1032 0.07
+0.3311 0.0989 0.07
+0.3354 0.0946 0.07
+0.3397 0.0903 0.07
+0.344 0.086 0.07
+0.3483 0.0817 0.07
+0.3526 0.0774 0.07
+0.3569 0.0731 0.07
+0.3612 0.0688 0.07
+0.3655 0.0645 0.07
+0.3698 0.0602 0.07
+0.3741 0.0559 0.07
+0.3784 0.0516 0.07
+0.3827 0.0473 0.07
+0.387 0.043 0.07
+0.3913 0.0387 0.07
+0.3956 0.0344 0.07
+0.3999 0.0301 0.07
+0.4042 0.0258 0.07
+0.4085 0.0215 0.07
+0.4128 0.0172 0.07
+0.4171 0.0129 0.07
+0.4214 0.0086 0.07
+0.4257 0.0043 0.07
+0 0.435 0.065
+0.00435 0.43065 0.065
+0.0087 0.4263 0.065
+0.01305 0.42195 0.065
+0.0174 0.4176 0.065
+0.02175 0.41325 0.065
+0.0261 0.4089 0.065
+0.03045 0.40455 0.065
+0.0348 0.4002 0.065
+0.03915 0.39585 0.065
+0.0435 0.3915 0.065
+0.04785 0.38715 0.065
+0.0522 0.3828 0.065
+0.05655 0.37845 0.065
+0.0609 0.3741 0.065
+0.06525 0.36975 0.065
+0.0696 0.3654 0.065
+0.07395 0.36105 0.065
+0.0783 0.3567 0.065
+0.08265 0.35235 0.065
+0.087 0.348 0.065
+0.09135 0.34365 0.065
+0.0957 0.3393 0.065
+0.10005 0.33495 0.065
+0.1044 0.3306 0.065
+0.10875 0.32625 0.065
+0.1131 0.3219 0.065
+0.11745 0.31755 0.065
+0.1218 0.3132 0.065
+0.12615 0.30885 0.065
+0.1305 0.3045 0.065
+0.13485 0.30015 0.065
+0.1392 0.2958 0.065
+0.14355 0.29145 0.065
+0.1479 0.2871 0.065
+0.15225 0.28275 0.065
+0.1566 0.2784 0.065
+0.16095 0.27405 0.065
+0.1653 0.2697 0.065
+0.16965 0.26535 0.065
+0.174 0.261 0.065
+0.17835 0.25665 0.065
+0.1827 0.2523 0.065
+0.18705 0.24795 0.065
+0.1914 0.2436 0.065
+0.19575 0.23925 0.065
+0.2001 0.2349 0.065
+0.20445 0.23055 0.065
+0.2088 0.2262 0.065
+0.21315 0.22185 0.065
+0.2175 0.2175 0.065
+0.22185 0.21315 0.065
+0.2262 0.2088 0.065
+0.23055 0.20445 0.065
+0.2349 0.2001 0.065
+0.23925 0.19575 0.065
+0.2436 0.1914 0.065
+0.24795 0.18705 0.065
+0.2523 0.1827 0.065
+0.25665 0.17835 0.065
+0.261 0.174 0.065
+0.26535 0.16965 0.065
+0.2697 0.1653 0.065
+0.27405 0.16095 0.065
+0.2784 0.1566 0.065
+0.28275 0.15225 0.065
+0.2871 0.1479 0.065
+0.29145 0.14355 0.065
+0.2958 0.1392 0.065
+0.30015 0.13485 0.065
+0.3045 0.1305 0.065
+0.30885 0.12615 0.065
+0.3132 0.1218 0.065
+0.31755 0.11745 0.065
+0.3219 0.1131 0.065
+0.32625 0.10875 0.065
+0.3306 0.1044 0.065
+0.33495 0.10005 0.065
+0.3393 0.0957 0.065
+0.34365 0.09135 0.065
+0.348 0.087 0.065
+0.35235 0.08265 0.065
+0.3567 0.0783 0.065
+0.36105 0.07395 0.065
+0.3654 0.0696 0.065
+0.36975 0.06525 0.065
+0.3741 0.0609 0.065
+0.37845 0.05655 0.065
+0.3828 0.0522 0.065
+0.38715 0.04785 0.065
+0.3915 0.0435 0.065
+0.39585 0.03915 0.065
+0.4002 0.0348 0.065
+0.40455 0.03045 0.065
+0.4089 0.0261 0.065
+0.41325 0.02175 0.065
+0.4176 0.0174 0.065
+0.42195 0.01305 0.065
+0.4263 0.0087 0.065
+0.43065 0.00435 0.065
+0 0.44 0.06
+0.0044 0.4356 0.06
+0.0088 0.4312 0.06
+0.0132 0.4268 0.06
+0.0176 0.4224 0.06
+0.022 0.418 0.06
+0.0264 0.4136 0.06
+0.0308 0.4092 0.06
+0.0352 0.4048 0.06
+0.0396 0.4004 0.06
+0.044 0.396 0.06
+0.0484 0.3916 0.06
+0.0528 0.3872 0.06
+0.0572 0.3828 0.06
+0.0616 0.3784 0.06
+0.066 0.374 0.06
+0.0704 0.3696 0.06
+0.0748 0.3652 0.06
+0.0792 0.3608 0.06
+0.0836 0.3564 0.06
+0.088 0.352 0.06
+0.0924 0.3476 0.06
+0.0968 0.3432 0.06
+0.1012 0.3388 0.06
+0.1056 0.3344 0.06
+0.11 0.33 0.06
+0.1144 0.3256 0.06
+0.1188 0.3212 0.06
+0.1232 0.3168 0.06
+0.1276 0.3124 0.06
+0.132 0.308 0.06
+0.1364 0.3036 0.06
+0.1408 0.2992 0.06
+0.1452 0.2948 0.06
+0.1496 0.2904 0.06
+0.154 0.286 0.06
+0.1584 0.2816 0.06
+0.1628 0.2772 0.06
+0.1672 0.2728 0.06
+0.1716 0.2684 0.06
+0.176 0.264 0.06
+0.1804 0.2596 0.06
+0.1848 0.2552 0.06
+0.1892 0.2508 0.06
+0.1936 0.2464 0.06
+0.198 0.242 0.06
+0.2024 0.2376 0.06
+0.2068 0.2332 0.06
+0.2112 0.2288 0.06
+0.2156 0.2244 0.06
+0.22 0.22 0.06
+0.2244 0.2156 0.06
+0.2288 0.2112 0.06
+0.2332 0.2068 0.06
+0.2376 0.2024 0.06
+0.242 0.198 0.06
+0.2464 0.1936 0.06
+0.2508 0.1892 0.06
+0.2552 0.1848 0.06
+0.2596 0.1804 0.06
+0.264 0.176 0.06
+0.2684 0.1716 0.06
+0.2728 0.1672 0.06
+0.2772 0.1628 0.06
+0.2816 0.1584 0.06
+0.286 0.154 0.06
+0.2904 0.1496 0.06
+0.2948 0.1452 0.06
+0.2992 0.1408 0.06
+0.3036 0.1364 0.06
+0.308 0.132 0.06
+0.3124 0.1276 0.06
+0.3168 0.1232 0.06
+0.3212 0.1188 0.06
+0.3256 0.1144 0.06
+0.33 0.11 0.06
+0.3344 0.1056 0.06
+0.3388 0.1012 0.06
+0.3432 0.0968 0.06
+0.3476 0.0924 0.06
+0.352 0.088 0.06
+0.3564 0.0836 0.06
+0.3608 0.0792 0.06
+0.3652 0.0748 0.06
+0.3696 0.0704 0.06
+0.374 0.066 0.06
+0.3784 0.0616 0.06
+0.3828 0.0572 0.06
+0.3872 0.0528 0.06
+0.3916 0.0484 0.06
+0.396 0.044 0.06
+0.4004 0.0396 0.06
+0.4048 0.0352 0.06
+0.4092 0.0308 0.06
+0.4136 0.0264 0.06
+0.418 0.022 0.06
+0.4224 0.0176 0.06
+0.4268 0.0132 0.06
+0.4312 0.0088 0.06
+0.4356 0.0044 0.06
+0 0.445 0.055
+0.00445 0.44055 0.055
+0.0089 0.4361 0.055
+0.01335 0.43165 0.055
+0.0178 0.4272 0.055
+0.02225 0.42275 0.055
+0.0267 0.4183 0.055
+0.03115 0.41385 0.055
+0.0356 0.4094 0.055
+0.04005 0.40495 0.055
+0.0445 0.4005 0.055
+0.04895 0.39605 0.055
+0.0534 0.3916 0.055
+0.05785 0.38715 0.055
+0.0623 0.3827 0.055
+0.06675 0.37825 0.055
+0.0712 0.3738 0.055
+0.07565 0.36935 0.055
+0.0801 0.3649 0.055
+0.08455 0.36045 0.055
+0.089 0.356 0.055
+0.09345 0.35155 0.055
+0.0979 0.3471 0.055
+0.10235 0.34265 0.055
+0.1068 0.3382 0.055
+0.11125 0.33375 0.055
+0.1157 0.3293 0.055
+0.12015 0.32485 0.055
+0.1246 0.3204 0.055
+0.12905 0.31595 0.055
+0.1335 0.3115 0.055
+0.13795 0.30705 0.055
+0.1424 0.3026 0.055
+0.14685 0.29815 0.055
+0.1513 0.2937 0.055
+0.15575 0.28925 0.055
+0.1602 0.2848 0.055
+0.16465 0.28035 0.055
+0.1691 0.2759 0.055
+0.17355 0.27145 0.055
+0.178 0.267 0.055
+0.18245 0.26255 0.055
+0.1869 0.2581 0.055
+0.19135 0.25365 0.055
+0.1958 0.2492 0.055
+0.20025 0.24475 0.055
+0.2047 0.2403 0.055
+0.20915 0.23585 0.055
+0.2136 0.2314 0.055
+0.21805 0.22695 0.055
+0.2225 0.2225 0.055
+0.22695 0.21805 0.055
+0.2314 0.2136 0.055
+0.23585 0.20915 0.055
+0.2403 0.2047 0.055
+0.24475 0.20025 0.055
+0.2492 0.1958 0.055
+0.25365 0.19135 0.055
+0.2581 0.1869 0.055
+0.26255 0.18245 0.055
+0.267 0.178 0.055
+0.27145 0.17355 0.055
+0.2759 0.1691 0.055
+0.28035 0.16465 0.055
+0.2848 0.1602 0.055
+0.28925 0.15575 0.055
+0.2937 0.1513 0.055
+0.29815 0.14685 0.055
+0.3026 0.1424 0.055
+0.30705 0.13795 0.055
+0.3115 0.1335 0.055
+0.31595 0.12905 0.055
+0.3204 0.1246 0.055
+0.32485 0.12015 0.055
+0.3293 0.1157 0.055
+0.33375 0.11125 0.055
+0.3382 0.1068 0.055
+0.34265 0.10235 0.055
+0.3471 0.0979 0.055
+0.35155 0.09345 0.055
+0.356 0.089 0.055
+0.36045 0.08455 0.055
+0.3649 0.0801 0.055
+0.36935 0.07565 0.055
+0.3738 0.0712 0.055
+0.37825 0.06675 0.055
+0.3827 0.0623 0.055
+0.38715 0.05785 0.055
+0.3916 0.0534 0.055
+0.39605 0.04895 0.055
+0.4005 0.0445 0.055
+0.40495 0.04005 0.055
+0.4094 0.0356 0.055
+0.41385 0.03115 0.055
+0.4183 0.0267 0.055
+0.42275 0.02225 0.055
+0.4272 0.0178 0.055
+0.43165 0.01335 0.055
+0.4361 0.0089 0.055
+0.44055 0.00445 0.055
+0 0.45 0.05
+0.0045 0.4455 0.05
+0.009 0.441 0.05
+0.0135 0.4365 0.05
+0.018 0.432 0.05
+0.0225 0.4275 0.05
+0.027 0.423 0.05
+0.0315 0.4185 0.05
+0.036 0.414 0.05
+0.0405 0.4095 0.05
+0.045 0.405 0.05
+0.0495 0.4005 0.05
+0.054 0.396 0.05
+0.0585 0.3915 0.05
+0.063 0.387 0.05
+0.0675 0.3825 0.05
+0.072 0.378 0.05
+0.0765 0.3735 0.05
+0.081 0.369 0.05
+0.0855 0.3645 0.05
+0.09 0.36 0.05
+0.0945 0.3555 0.05
+0.099 0.351 0.05
+0.1035 0.3465 0.05
+0.108 0.342 0.05
+0.1125 0.3375 0.05
+0.117 0.333 0.05
+0.1215 0.3285 0.05
+0.126 0.324 0.05
+0.1305 0.3195 0.05
+0.135 0.315 0.05
+0.1395 0.3105 0.05
+0.144 0.306 0.05
+0.1485 0.3015 0.05
+0.153 0.297 0.05
+0.1575 0.2925 0.05
+0.162 0.288 0.05
+0.1665 0.2835 0.05
+0.171 0.279 0.05
+0.1755 0.2745 0.05
+0.18 0.27 0.05
+0.1845 0.2655 0.05
+0.189 0.261 0.05
+0.1935 0.2565 0.05
+0.198 0.252 0.05
+0.2025 0.2475 0.05
+0.207 0.243 0.05
+0.2115 0.2385 0.05
+0.216 0.234 0.05
+0.2205 0.2295 0.05
+0.225 0.225 0.05
+0.2295 0.2205 0.05
+0.234 0.216 0.05
+0.2385 0.2115 0.05
+0.243 0.207 0.05
+0.2475 0.2025 0.05
+0.252 0.198 0.05
+0.2565 0.1935 0.05
+0.261 0.189 0.05
+0.2655 0.1845 0.05
+0.27 0.18 0.05
+0.2745 0.1755 0.05
+0.279 0.171 0.05
+0.2835 0.1665 0.05
+0.288 0.162 0.05
+0.2925 0.1575 0.05
+0.297 0.153 0.05
+0.3015 0.1485 0.05
+0.306 0.144 0.05
+0.3105 0.1395 0.05
+0.315 0.135 0.05
+0.3195 0.1305 0.05
+0.324 0.126 0.05
+0.3285 0.1215 0.05
+0.333 0.117 0.05
+0.3375 0.1125 0.05
+0.342 0.108 0.05
+0.3465 0.1035 0.05
+0.351 0.099 0.05
+0.3555 0.0945 0.05
+0.36 0.09 0.05
+0.3645 0.0855 0.05
+0.369 0.081 0.05
+0.3735 0.0765 0.05
+0.378 0.072 0.05
+0.3825 0.0675 0.05
+0.387 0.063 0.05
+0.3915 0.0585 0.05
+0.396 0.054 0.05
+0.4005 0.0495 0.05
+0.405 0.045 0.05
+0.4095 0.0405 0.05
+0.414 0.036 0.05
+0.4185 0.0315 0.05
+0.423 0.027 0.05
+0.4275 0.0225 0.05
+0.432 0.018 0.05
+0.4365 0.0135 0.05
+0.441 0.009 0.05
+0.4455 0.0045 0.05
+0 0.455 0.045
+0.00455 0.45045 0.045
+0.0091 0.4459 0.045
+0.01365 0.44135 0.045
+0.0182 0.4368 0.045
+0.02275 0.43225 0.045
+0.0273 0.4277 0.045
+0.03185 0.42315 0.045
+0.0364 0.4186 0.045
+0.04095 0.41405 0.045
+0.0455 0.4095 0.045
+0.05005 0.40495 0.045
+0.0546 0.4004 0.045
+0.05915 0.39585 0.045
+0.0637 0.3913 0.045
+0.06825 0.38675 0.045
+0.0728 0.3822 0.045
+0.07735 0.37765 0.045
+0.0819 0.3731 0.045
+0.08645 0.36855 0.045
+0.091 0.364 0.045
+0.09555 0.35945 0.045
+0.1001 0.3549 0.045
+0.10465 0.35035 0.045
+0.1092 0.3458 0.045
+0.11375 0.34125 0.045
+0.1183 0.3367 0.045
+0.12285 0.33215 0.045
+0.1274 0.3276 0.045
+0.13195 0.32305 0.045
+0.1365 0.3185 0.045
+0.14105 0.31395 0.045
+0.1456 0.3094 0.045
+0.15015 0.30485 0.045
+0.1547 0.3003 0.045
+0.15925 0.29575 0.045
+0.1638 0.2912 0.045
+0.16835 0.28665 0.045
+0.1729 0.2821 0.045
+0.17745 0.27755 0.045
+0.182 0.273 0.045
+0.18655 0.26845 0.045
+0.1911 0.2639 0.045
+0.19565 0.25935 0.045
+0.2002 0.2548 0.045
+0.20475 0.25025 0.045
+0.2093 0.2457 0.045
+0.21385 0.24115 0.045
+0.2184 0.2366 0.045
+0.22295 0.23205 0.045
+0.2275 0.2275 0.045
+0.23205 0.22295 0.045
+0.2366 0.2184 0.045
+0.24115 0.21385 0.045
+0.2457 0.2093 0.045
+0.25025 0.20475 0.045
+0.2548 0.2002 0.045
+0.25935 0.19565 0.045
+0.2639 0.1911 0.045
+0.26845 0.18655 0.045
+0.273 0.182 0.045
+0.27755 0.17745 0.045
+0.2821 0.1729 0.045
+0.28665 0.16835 0.045
+0.2912 0.1638 0.045
+0.29575 0.15925 0.045
+0.3003 0.1547 0.045
+0.30485 0.15015 0.045
+0.3094 0.1456 0.045
+0.31395 0.14105 0.045
+0.3185 0.1365 0.045
+0.32305 0.13195 0.045
+0.3276 0.1274 0.045
+0.33215 0.12285 0.045
+0.3367 0.1183 0.045
+0.34125 0.11375 0.045
+0.3458 0.1092 0.045
+0.35035 0.10465 0.045
+0.3549 0.1001 0.045
+0.35945 0.09555 0.045
+0.364 0.091 0.045
+0.36855 0.08645 0.045
+0.3731 0.0819 0.045
+0.37765 0.07735 0.045
+0.3822 0.0728 0.045
+0.38675 0.06825 0.045
+0.3913 0.0637 0.045
+0.39585 0.05915 0.045
+0.4004 0.0546 0.045
+0.40495 0.05005 0.045
+0.4095 0.0455 0.045
+0.41405 0.04095 0.045
+0.4186 0.0364 0.045
+0.42315 0.03185 0.045
+0.4277 0.0273 0.045
+0.43225 0.02275 0.045
+0.4368 0.0182 0.045
+0.44135 0.01365 0.045
+0.4459 0.0091 0.045
+0.45045 0.00455 0.045
+0 0.46 0.04
+0.0046 0.4554 0.04
+0.0092 0.4508 0.04
+0.0138 0.4462 0.04
+0.0184 0.4416 0.04
+0.023 0.437 0.04
+0.0276 0.4324 0.04
+0.0322 0.4278 0.04
+0.0368 0.4232 0.04
+0.0414 0.4186 0.04
+0.046 0.414 0.04
+0.0506 0.4094 0.04
+0.0552 0.4048 0.04
+0.0598 0.4002 0.04
+0.0644 0.3956 0.04
+0.069 0.391 0.04
+0.0736 0.3864 0.04
+0.0782 0.3818 0.04
+0.0828 0.3772 0.04
+0.0874 0.3726 0.04
+0.092 0.368 0.04
+0.0966 0.3634 0.04
+0.1012 0.3588 0.04
+0.1058 0.3542 0.04
+0.1104 0.3496 0.04
+0.115 0.345 0.04
+0.1196 0.3404 0.04
+0.1242 0.3358 0.04
+0.1288 0.3312 0.04
+0.1334 0.3266 0.04
+0.138 0.322 0.04
+0.1426 0.3174 0.04
+0.1472 0.3128 0.04
+0.1518 0.3082 0.04
+0.1564 0.3036 0.04
+0.161 0.299 0.04
+0.1656 0.2944 0.04
+0.1702 0.2898 0.04
+0.1748 0.2852 0.04
+0.1794 0.2806 0.04
+0.184 0.276 0.04
+0.1886 0.2714 0.04
+0.1932 0.2668 0.04
+0.1978 0.2622 0.04
+0.2024 0.2576 0.04
+0.207 0.253 0.04
+0.2116 0.2484 0.04
+0.2162 0.2438 0.04
+0.2208 0.2392 0.04
+0.2254 0.2346 0.04
+0.23 0.23 0.04
+0.2346 0.2254 0.04
+0.2392 0.2208 0.04
+0.2438 0.2162 0.04
+0.2484 0.2116 0.04
+0.253 0.207 0.04
+0.2576 0.2024 0.04
+0.2622 0.1978 0.04
+0.2668 0.1932 0.04
+0.2714 0.1886 0.04
+0.276 0.184 0.04
+0.2806 0.1794 0.04
+0.2852 0.1748 0.04
+0.2898 0.1702 0.04
+0.2944 0.1656 0.04
+0.299 0.161 0.04
+0.3036 0.1564 0.04
+0.3082 0.1518 0.04
+0.3128 0.1472 0.04
+0.3174 0.1426 0.04
+0.322 0.138 0.04
+0.3266 0.1334 0.04
+0.3312 0.1288 0.04
+0.3358 0.1242 0.04
+0.3404 0.1196 0.04
+0.345 0.115 0.04
+0.3496 0.1104 0.04
+0.3542 0.1058 0.04
+0.3588 0.1012 0.04
+0.3634 0.0966 0.04
+0.368 0.092 0.04
+0.3726 0.0874 0.04
+0.3772 0.0828 0.04
+0.3818 0.0782 0.04
+0.3864 0.0736 0.04
+0.391 0.069 0.04
+0.3956 0.0644 0.04
+0.4002 0.0598 0.04
+0.4048 0.0552 0.04
+0.4094 0.0506 0.04
+0.414 0.046 0.04
+0.4186 0.0414 0.04
+0.4232 0.0368 0.04
+0.4278 0.0322 0.04
+0.4324 0.0276 0.04
+0.437 0.023 0.04
+0.4416 0.0184 0.04
+0.4462 0.0138 0.04
+0.4508 0.0092 0.04
+0.4554 0.0046 0.04
+0 0.465 0.035
+0.00465 0.46035 0.035
+0.0093 0.4557 0.035
+0.01395 0.45105 0.035
+0.0186 0.4464 0.035
+0.02325 0.44175 0.035
+0.0279 0.4371 0.035
+0.03255 0.43245 0.035
+0.0372 0.4278 0.035
+0.04185 0.42315 0.035
+0.0465 0.4185 0.035
+0.05115 0.41385 0.035
+0.0558 0.4092 0.035
+0.06045 0.40455 0.035
+0.0651 0.3999 0.035
+0.06975 0.39525 0.035
+0.0744 0.3906 0.035
+0.07905 0.38595 0.035
+0.0837 0.3813 0.035
+0.08835 0.37665 0.035
+0.093 0.372 0.035
+0.09765 0.36735 0.035
+0.1023 0.3627 0.035
+0.10695 0.35805 0.035
+0.1116 0.3534 0.035
+0.11625 0.34875 0.035
+0.1209 0.3441 0.035
+0.12555 0.33945 0.035
+0.1302 0.3348 0.035
+0.13485 0.33015 0.035
+0.1395 0.3255 0.035
+0.14415 0.32085 0.035
+0.1488 0.3162 0.035
+0.15345 0.31155 0.035
+0.1581 0.3069 0.035
+0.16275 0.30225 0.035
+0.1674 0.2976 0.035
+0.17205 0.29295 0.035
+0.1767 0.2883 0.035
+0.18135 0.28365 0.035
+0.186 0.279 0.035
+0.19065 0.27435 0.035
+0.1953 0.2697 0.035
+0.19995 0.26505 0.035
+0.2046 0.2604 0.035
+0.20925 0.25575 0.035
+0.2139 0.2511 0.035
+0.21855 0.24645 0.035
+0.2232 0.2418 0.035
+0.22785 0.23715 0.035
+0.2325 0.2325 0.035
+0.23715 0.22785 0.035
+0.2418 0.2232 0.035
+0.24645 0.21855 0.035
+0.2511 0.2139 0.035
+0.25575 0.20925 0.035
+0.2604 0.2046 0.035
+0.26505 0.19995 0.035
+0.2697 0.1953 0.035
+0.27435 0.19065 0.035
+0.279 0.186 0.035
+0.28365 0.18135 0.035
+0.2883 0.1767 0.035
+0.29295 0.17205 0.035
+0.2976 0.1674 0.035
+0.30225 0.16275 0.035
+0.3069 0.1581 0.035
+0.31155 0.15345 0.035
+0.3162 0.1488 0.035
+0.32085 0.14415 0.035
+0.3255 0.1395 0.035
+0.33015 0.13485 0.035
+0.3348 0.1302 0.035
+0.33945 0.12555 0.035
+0.3441 0.1209 0.035
+0.34875 0.11625 0.035
+0.3534 0.1116 0.035
+0.35805 0.10695 0.035
+0.3627 0.1023 0.035
+0.36735 0.09765 0.035
+0.372 0.093 0.035
+0.37665 0.08835 0.035
+0.3813 0.0837 0.035
+0.38595 0.07905 0.035
+0.3906 0.0744 0.035
+0.39525 0.06975 0.035
+0.3999 0.0651 0.035
+0.40455 0.06045 0.035
+0.4092 0.0558 0.035
+0.41385 0.05115 0.035
+0.4185 0.0465 0.035
+0.42315 0.04185 0.035
+0.4278 0.0372 0.035
+0.43245 0.03255 0.035
+0.4371 0.0279 0.035
+0.44175 0.02325 0.035
+0.4464 0.0186 0.035
+0.45105 0.01395 0.035
+0.4557 0.0093 0.035
+0.46035 0.00465 0.035
+0 0.47 0.03
+0.0047 0.4653 0.03
+0.0094 0.4606 0.03
+0.0141 0.4559 0.03
+0.0188 0.4512 0.03
+0.0235 0.4465 0.03
+0.0282 0.4418 0.03
+0.0329 0.4371 0.03
+0.0376 0.4324 0.03
+0.0423 0.4277 0.03
+0.047 0.423 0.03
+0.0517 0.4183 0.03
+0.0564 0.4136 0.03
+0.0611 0.4089 0.03
+0.0658 0.4042 0.03
+0.0705 0.3995 0.03
+0.0752 0.3948 0.03
+0.0799 0.3901 0.03
+0.0846 0.3854 0.03
+0.0893 0.3807 0.03
+0.094 0.376 0.03
+0.0987 0.3713 0.03
+0.1034 0.3666 0.03
+0.1081 0.3619 0.03
+0.1128 0.3572 0.03
+0.1175 0.3525 0.03
+0.1222 0.3478 0.03
+0.1269 0.3431 0.03
+0.1316 0.3384 0.03
+0.1363 0.3337 0.03
+0.141 0.329 0.03
+0.1457 0.3243 0.03
+0.1504 0.3196 0.03
+0.1551 0.3149 0.03
+0.1598 0.3102 0.03
+0.1645 0.3055 0.03
+0.1692 0.3008 0.03
+0.1739 0.2961 0.03
+0.1786 0.2914 0.03
+0.1833 0.2867 0.03
+0.188 0.282 0.03
+0.1927 0.2773 0.03
+0.1974 0.2726 0.03
+0.2021 0.2679 0.03
+0.2068 0.2632 0.03
+0.2115 0.2585 0.03
+0.2162 0.2538 0.03
+0.2209 0.2491 0.03
+0.2256 0.2444 0.03
+0.2303 0.2397 0.03
+0.235 0.235 0.03
+0.2397 0.2303 0.03
+0.2444 0.2256 0.03
+0.2491 0.2209 0.03
+0.2538 0.2162 0.03
+0.2585 0.2115 0.03
+0.2632 0.2068 0.03
+0.2679 0.2021 0.03
+0.2726 0.1974 0.03
+0.2773 0.1927 0.03
+0.282 0.188 0.03
+0.2867 0.1833 0.03
+0.2914 0.1786 0.03
+0.2961 0.1739 0.03
+0.3008 0.1692 0.03
+0.3055 0.1645 0.03
+0.3102 0.1598 0.03
+0.3149 0.1551 0.03
+0.3196 0.1504 0.03
+0.3243 0.1457 0.03
+0.329 0.141 0.03
+0.3337 0.1363 0.03
+0.3384 0.1316 0.03
+0.3431 0.1269 0.03
+0.3478 0.1222 0.03
+0.3525 0.1175 0.03
+0.3572 0.1128 0.03
+0.3619 0.1081 0.03
+0.3666 0.1034 0.03
+0.3713 0.0987 0.03
+0.376 0.094 0.03
+0.3807 0.0893 0.03
+0.3854 0.0846 0.03
+0.3901 0.0799 0.03
+0.3948 0.0752 0.03
+0.3995 0.0705 0.03
+0.4042 0.0658 0.03
+0.4089 0.0611 0.03
+0.4136 0.0564 0.03
+0.4183 0.0517 0.03
+0.423 0.047 0.03
+0.4277 0.0423 0.03
+0.4324 0.0376 0.03
+0.4371 0.0329 0.03
+0.4418 0.0282 0.03
+0.4465 0.0235 0.03
+0.4512 0.0188 0.03
+0.4559 0.0141 0.03
+0.4606 0.0094 0.03
+0.4653 0.0047 0.03
+0 0.475 0.025
+0.00475 0.47025 0.025
+0.0095 0.4655 0.025
+0.01425 0.46075 0.025
+0.019 0.456 0.025
+0.02375 0.45125 0.025
+0.0285 0.4465 0.025
+0.03325 0.44175 0.025
+0.038 0.437 0.025
+0.04275 0.43225 0.025
+0.0475 0.4275 0.025
+0.05225 0.42275 0.025
+0.057 0.418 0.025
+0.06175 0.41325 0.025
+0.0665 0.4085 0.025
+0.07125 0.40375 0.025
+0.076 0.399 0.025
+0.08075 0.39425 0.025
+0.0855 0.3895 0.025
+0.09025 0.38475 0.025
+0.095 0.38 0.025
+0.09975 0.37525 0.025
+0.1045 0.3705 0.025
+0.10925 0.36575 0.025
+0.114 0.361 0.025
+0.11875 0.35625 0.025
+0.1235 0.3515 0.025
+0.12825 0.34675 0.025
+0.133 0.342 0.025
+0.13775 0.33725 0.025
+0.1425 0.3325 0.025
+0.14725 0.32775 0.025
+0.152 0.323 0.025
+0.15675 0.31825 0.025
+0.1615 0.3135 0.025
+0.16625 0.30875 0.025
+0.171 0.304 0.025
+0.17575 0.29925 0.025
+0.1805 0.2945 0.025
+0.18525 0.28975 0.025
+0.19 0.285 0.025
+0.19475 0.28025 0.025
+0.1995 0.2755 0.025
+0.20425 0.27075 0.025
+0.209 0.266 0.025
+0.21375 0.26125 0.025
+0.2185 0.2565 0.025
+0.22325 0.25175 0.025
+0.228 0.247 0.025
+0.23275 0.24225 0.025
+0.2375 0.2375 0.025
+0.24225 0.23275 0.025
+0.247 0.228 0.025
+0.25175 0.22325 0.025
+0.2565 0.2185 0.025
+0.26125 0.21375 0.025
+0.266 0.209 0.025
+0.27075 0.20425 0.025
+0.2755 0.1995 0.025
+0.28025 0.19475 0.025
+0.285 0.19 0.025
+0.28975 0.18525 0.025
+0.2945 0.1805 0.025
+0.29925 0.17575 0.025
+0.304 0.171 0.025
+0.30875 0.16625 0.025
+0.3135 0.1615 0.025
+0.31825 0.15675 0.025
+0.323 0.152 0.025
+0.32775 0.14725 0.025
+0.3325 0.1425 0.025
+0.33725 0.13775 0.025
+0.342 0.133 0.025
+0.34675 0.12825 0.025
+0.3515 0.1235 0.025
+0.35625 0.11875 0.025
+0.361 0.114 0.025
+0.36575 0.10925 0.025
+0.3705 0.1045 0.025
+0.37525 0.09975 0.025
+0.38 0.095 0.025
+0.38475 0.09025 0.025
+0.3895 0.0855 0.025
+0.39425 0.08075 0.025
+0.399 0.076 0.025
+0.40375 0.07125 0.025
+0.4085 0.0665 0.025
+0.41325 0.06175 0.025
+0.418 0.057 0.025
+0.42275 0.05225 0.025
+0.4275 0.0475 0.025
+0.43225 0.04275 0.025
+0.437 0.038 0.025
+0.44175 0.03325 0.025
+0.4465 0.0285 0.025
+0.45125 0.02375 0.025
+0.456 0.019 0.025
+0.46075 0.01425 0.025
+0.4655 0.0095 0.025
+0.47025 0.00475 0.025
+0 0.48 0.02
+0.0048 0.4752 0.02
+0.0096 0.4704 0.02
+0.0144 0.4656 0.02
+0.0192 0.4608 0.02
+0.024 0.456 0.02
+0.0288 0.4512 0.02
+0.0336 0.4464 0.02
+0.0384 0.4416 0.02
+0.0432 0.4368 0.02
+0.048 0.432 0.02
+0.0528 0.4272 0.02
+0.0576 0.4224 0.02
+0.0624 0.4176 0.02
+0.0672 0.4128 0.02
+0.072 0.408 0.02
+0.0768 0.4032 0.02
+0.0816 0.3984 0.02
+0.0864 0.3936 0.02
+0.0912 0.3888 0.02
+0.096 0.384 0.02
+0.1008 0.3792 0.02
+0.1056 0.3744 0.02
+0.1104 0.3696 0.02
+0.1152 0.3648 0.02
+0.12 0.36 0.02
+0.1248 0.3552 0.02
+0.1296 0.3504 0.02
+0.1344 0.3456 0.02
+0.1392 0.3408 0.02
+0.144 0.336 0.02
+0.1488 0.3312 0.02
+0.1536 0.3264 0.02
+0.1584 0.3216 0.02
+0.1632 0.3168 0.02
+0.168 0.312 0.02
+0.1728 0.3072 0.02
+0.1776 0.3024 0.02
+0.1824 0.2976 0.02
+0.1872 0.2928 0.02
+0.192 0.288 0.02
+0.1968 0.2832 0.02
+0.2016 0.2784 0.02
+0.2064 0.2736 0.02
+0.2112 0.2688 0.02
+0.216 0.264 0.02
+0.2208 0.2592 0.02
+0.2256 0.2544 0.02
+0.2304 0.2496 0.02
+0.2352 0.2448 0.02
+0.24 0.24 0.02
+0.2448 0.2352 0.02
+0.2496 0.2304 0.02
+0.2544 0.2256 0.02
+0.2592 0.2208 0.02
+0.264 0.216 0.02
+0.2688 0.2112 0.02
+0.2736 0.2064 0.02
+0.2784 0.2016 0.02
+0.2832 0.1968 0.02
+0.288 0.192 0.02
+0.2928 0.1872 0.02
+0.2976 0.1824 0.02
+0.3024 0.1776 0.02
+0.3072 0.1728 0.02
+0.312 0.168 0.02
+0.3168 0.1632 0.02
+0.3216 0.1584 0.02
+0.3264 0.1536 0.02
+0.3312 0.1488 0.02
+0.336 0.144 0.02
+0.3408 0.1392 0.02
+0.3456 0.1344 0.02
+0.3504 0.1296 0.02
+0.3552 0.1248 0.02
+0.36 0.12 0.02
+0.3648 0.1152 0.02
+0.3696 0.1104 0.02
+0.3744 0.1056 0.02
+0.3792 0.1008 0.02
+0.384 0.096 0.02
+0.3888 0.0912 0.02
+0.3936 0.0864 0.02
+0.3984 0.0816 0.02
+0.4032 0.0768 0.02
+0.408 0.072 0.02
+0.4128 0.0672 0.02
+0.4176 0.0624 0.02
+0.4224 0.0576 0.02
+0.4272 0.0528 0.02
+0.432 0.048 0.02
+0.4368 0.0432 0.02
+0.4416 0.0384 0.02
+0.4464 0.0336 0.02
+0.4512 0.0288 0.02
+0.456 0.024 0.02
+0.4608 0.0192 0.02
+0.4656 0.0144 0.02
+0.4704 0.0096 0.02
+0.4752 0.0048 0.02
+0 0.485 0.015
+0.00485 0.48015 0.015
+0.0097 0.4753 0.015
+0.01455 0.47045 0.015
+0.0194 0.4656 0.015
+0.02425 0.46075 0.015
+0.0291 0.4559 0.015
+0.03395 0.45105 0.015
+0.0388 0.4462 0.015
+0.04365 0.44135 0.015
+0.0485 0.4365 0.015
+0.05335 0.43165 0.015
+0.0582 0.4268 0.015
+0.06305 0.42195 0.015
+0.0679 0.4171 0.015
+0.07275 0.41225 0.015
+0.0776 0.4074 0.015
+0.08245 0.40255 0.015
+0.0873 0.3977 0.015
+0.09215 0.39285 0.015
+0.097 0.388 0.015
+0.10185 0.38315 0.015
+0.1067 0.3783 0.015
+0.11155 0.37345 0.015
+0.1164 0.3686 0.015
+0.12125 0.36375 0.015
+0.1261 0.3589 0.015
+0.13095 0.35405 0.015
+0.1358 0.3492 0.015
+0.14065 0.34435 0.015
+0.1455 0.3395 0.015
+0.15035 0.33465 0.015
+0.1552 0.3298 0.015
+0.16005 0.32495 0.015
+0.1649 0.3201 0.015
+0.16975 0.31525 0.015
+0.1746 0.3104 0.015
+0.17945 0.30555 0.015
+0.1843 0.3007 0.015
+0.18915 0.29585 0.015
+0.194 0.291 0.015
+0.19885 0.28615 0.015
+0.2037 0.2813 0.015
+0.20855 0.27645 0.015
+0.2134 0.2716 0.015
+0.21825 0.26675 0.015
+0.2231 0.2619 0.015
+0.22795 0.25705 0.015
+0.2328 0.2522 0.015
+0.23765 0.24735 0.015
+0.2425 0.2425 0.015
+0.24735 0.23765 0.015
+0.2522 0.2328 0.015
+0.25705 0.22795 0.015
+0.2619 0.2231 0.015
+0.26675 0.21825 0.015
+0.2716 0.2134 0.015
+0.27645 0.20855 0.015
+0.2813 0.2037 0.015
+0.28615 0.19885 0.015
+0.291 0.194 0.015
+0.29585 0.18915 0.015
+0.3007 0.1843 0.015
+0.30555 0.17945 0.015
+0.3104 0.1746 0.015
+0.31525 0.16975 0.015
+0.3201 0.1649 0.015
+0.32495 0.16005 0.015
+0.3298 0.1552 0.015
+0.33465 0.15035 0.015
+0.3395 0.1455 0.015
+0.34435 0.14065 0.015
+0.3492 0.1358 0.015
+0.35405 0.13095 0.015
+0.3589 0.1261 0.015
+0.36375 0.12125 0.015
+0.3686 0.1164 0.015
+0.37345 0.11155 0.015
+0.3783 0.1067 0.015
+0.38315 0.10185 0.015
+0.388 0.097 0.015
+0.39285 0.09215 0.015
+0.3977 0.0873 0.015
+0.40255 0.08245 0.015
+0.4074 0.0776 0.015
+0.41225 0.07275 0.015
+0.4171 0.0679 0.015
+0.42195 0.06305 0.015
+0.4268 0.0582 0.015
+0.43165 0.05335 0.015
+0.4365 0.0485 0.015
+0.44135 0.04365 0.015
+0.4462 0.0388 0.015
+0.45105 0.03395 0.015
+0.4559 0.0291 0.015
+0.46075 0.02425 0.015
+0.4656 0.0194 0.015
+0.47045 0.01455 0.015
+0.4753 0.0097 0.015
+0.48015 0.00485 0.015
+0 0.49 0.01
+0.0049 0.4851 0.01
+0.0098 0.4802 0.01
+0.0147 0.4753 0.01
+0.0196 0.4704 0.01
+0.0245 0.4655 0.01
+0.0294 0.4606 0.01
+0.0343 0.4557 0.01
+0.0392 0.4508 0.01
+0.0441 0.4459 0.01
+0.049 0.441 0.01
+0.0539 0.4361 0.01
+0.0588 0.4312 0.01
+0.0637 0.4263 0.01
+0.0686 0.4214 0.01
+0.0735 0.4165 0.01
+0.0784 0.4116 0.01
+0.0833 0.4067 0.01
+0.0882 0.4018 0.01
+0.0931 0.3969 0.01
+0.098 0.392 0.01
+0.1029 0.3871 0.01
+0.1078 0.3822 0.01
+0.1127 0.3773 0.01
+0.1176 0.3724 0.01
+0.1225 0.3675 0.01
+0.1274 0.3626 0.01
+0.1323 0.3577 0.01
+0.1372 0.3528 0.01
+0.1421 0.3479 0.01
+0.147 0.343 0.01
+0.1519 0.3381 0.01
+0.1568 0.3332 0.01
+0.1617 0.3283 0.01
+0.1666 0.3234 0.01
+0.1715 0.3185 0.01
+0.1764 0.3136 0.01
+0.1813 0.3087 0.01
+0.1862 0.3038 0.01
+0.1911 0.2989 0.01
+0.196 0.294 0.01
+0.2009 0.2891 0.01
+0.2058 0.2842 0.01
+0.2107 0.2793 0.01
+0.2156 0.2744 0.01
+0.2205 0.2695 0.01
+0.2254 0.2646 0.01
+0.2303 0.2597 0.01
+0.2352 0.2548 0.01
+0.2401 0.2499 0.01
+0.245 0.245 0.01
+0.2499 0.2401 0.01
+0.2548 0.2352 0.01
+0.2597 0.2303 0.01
+0.2646 0.2254 0.01
+0.2695 0.2205 0.01
+0.2744 0.2156 0.01
+0.2793 0.2107 0.01
+0.2842 0.2058 0.01
+0.2891 0.2009 0.01
+0.294 0.196 0.01
+0.2989 0.1911 0.01
+0.3038 0.1862 0.01
+0.3087 0.1813 0.01
+0.3136 0.1764 0.01
+0.3185 0.1715 0.01
+0.3234 0.1666 0.01
+0.3283 0.1617 0.01
+0.3332 0.1568 0.01
+0.3381 0.1519 0.01
+0.343 0.147 0.01
+0.3479 0.1421 0.01
+0.3528 0.1372 0.01
+0.3577 0.1323 0.01
+0.3626 0.1274 0.01
+0.3675 0.1225 0.01
+0.3724 0.1176 0.01
+0.3773 0.1127 0.01
+0.3822 0.1078 0.01
+0.3871 0.1029 0.01
+0.392 0.098 0.01
+0.3969 0.0931 0.01
+0.4018 0.0882 0.01
+0.4067 0.0833 0.01
+0.4116 0.0784 0.01
+0.4165 0.0735 0.01
+0.4214 0.0686 0.01
+0.4263 0.0637 0.01
+0.4312 0.0588 0.01
+0.4361 0.0539 0.01
+0.441 0.049 0.01
+0.4459 0.0441 0.01
+0.4508 0.0392 0.01
+0.4557 0.0343 0.01
+0.4606 0.0294 0.01
+0.4655 0.0245 0.01
+0.4704 0.0196 0.01
+0.4753 0.0147 0.01
+0.4802 0.0098 0.01
+0.4851 0.0049 0.01
+0 0.495 0.005
+0.00495 0.49005 0.005
+0.0099 0.4851 0.005
+0.01485 0.48015 0.005
+0.0198 0.4752 0.005
+0.02475 0.47025 0.005
+0.0297 0.4653 0.005
+0.03465 0.46035 0.005
+0.0396 0.4554 0.005
+0.04455 0.45045 0.005
+0.0495 0.4455 0.005
+0.05445 0.44055 0.005
+0.0594 0.4356 0.005
+0.06435 0.43065 0.005
+0.0693 0.4257 0.005
+0.07425 0.42075 0.005
+0.0792 0.4158 0.005
+0.08415 0.41085 0.005
+0.0891 0.4059 0.005
+0.09405 0.40095 0.005
+0.099 0.396 0.005
+0.10395 0.39105 0.005
+0.1089 0.3861 0.005
+0.11385 0.38115 0.005
+0.1188 0.3762 0.005
+0.12375 0.37125 0.005
+0.1287 0.3663 0.005
+0.13365 0.36135 0.005
+0.1386 0.3564 0.005
+0.14355 0.35145 0.005
+0.1485 0.3465 0.005
+0.15345 0.34155 0.005
+0.1584 0.3366 0.005
+0.16335 0.33165 0.005
+0.1683 0.3267 0.005
+0.17325 0.32175 0.005
+0.1782 0.3168 0.005
+0.18315 0.31185 0.005
+0.1881 0.3069 0.005
+0.19305 0.30195 0.005
+0.198 0.297 0.005
+0.20295 0.29205 0.005
+0.2079 0.2871 0.005
+0.21285 0.28215 0.005
+0.2178 0.2772 0.005
+0.22275 0.27225 0.005
+0.2277 0.2673 0.005
+0.23265 0.26235 0.005
+0.2376 0.2574 0.005
+0.24255 0.25245 0.005
+0.2475 0.2475 0.005
+0.25245 0.24255 0.005
+0.2574 0.2376 0.005
+0.26235 0.23265 0.005
+0.2673 0.2277 0.005
+0.27225 0.22275 0.005
+0.2772 0.2178 0.005
+0.28215 0.21285 0.005
+0.2871 0.2079 0.005
+0.29205 0.20295 0.005
+0.297 0.198 0.005
+0.30195 0.19305 0.005
+0.3069 0.1881 0.005
+0.31185 0.18315 0.005
+0.3168 0.1782 0.005
+0.32175 0.17325 0.005
+0.3267 0.1683 0.005
+0.33165 0.16335 0.005
+0.3366 0.1584 0.005
+0.34155 0.15345 0.005
+0.3465 0.1485 0.005
+0.35145 0.14355 0.005
+0.3564 0.1386 0.005
+0.36135 0.13365 0.005
+0.3663 0.1287 0.005
+0.37125 0.12375 0.005
+0.3762 0.1188 0.005
+0.38115 0.11385 0.005
+0.3861 0.1089 0.005
+0.39105 0.10395 0.005
+0.396 0.099 0.005
+0.40095 0.09405 0.005
+0.4059 0.0891 0.005
+0.41085 0.08415 0.005
+0.4158 0.0792 0.005
+0.42075 0.07425 0.005
+0.4257 0.0693 0.005
+0.43065 0.06435 0.005
+0.4356 0.0594 0.005
+0.44055 0.05445 0.005
+0.4455 0.0495 0.005
+0.45045 0.04455 0.005
+0.4554 0.0396 0.005
+0.46035 0.03465 0.005
+0.4653 0.0297 0.005
+0.47025 0.02475 0.005
+0.4752 0.0198 0.005
+0.48015 0.01485 0.005
+0.4851 0.0099 0.005
+0.49005 0.00495 0.005
diff --git a/jmetal/problem/reference_front/ZDT1.pf b/jmetal/problem/reference_front/ZDT1.pf
new file mode 100644
index 00000000..78593afa
--- /dev/null
+++ b/jmetal/problem/reference_front/ZDT1.pf
@@ -0,0 +1,1001 @@
+0 1
+0.001 0.968377
+0.002 0.955279
+0.003 0.945228
+0.004 0.936754
+0.005 0.929289
+0.006 0.92254
+0.007 0.916334
+0.008 0.910557
+0.009 0.905132
+0.01 0.9
+0.011 0.895119
+0.012 0.890455
+0.013 0.885982
+0.014 0.881678
+0.015 0.877526
+0.016 0.873509
+0.017 0.869616
+0.018 0.865836
+0.019 0.86216
+0.02 0.858579
+0.021 0.855086
+0.022 0.851676
+0.023 0.848342
+0.024 0.845081
+0.025 0.841886
+0.026 0.838755
+0.027 0.835683
+0.028 0.832668
+0.029 0.829706
+0.03 0.826795
+0.031 0.823932
+0.032 0.821115
+0.033 0.818341
+0.034 0.815609
+0.035 0.812917
+0.036 0.810263
+0.037 0.807646
+0.038 0.805064
+0.039 0.802516
+0.04 0.8
+0.041 0.797515
+0.042 0.795061
+0.043 0.792636
+0.044 0.790238
+0.045 0.787868
+0.046 0.785524
+0.047 0.783205
+0.048 0.780911
+0.049 0.778641
+0.05 0.776393
+0.051 0.774168
+0.052 0.771965
+0.053 0.769783
+0.054 0.767621
+0.055 0.765479
+0.056 0.763357
+0.057 0.761253
+0.058 0.759168
+0.059 0.757101
+0.06 0.755051
+0.061 0.753018
+0.062 0.751002
+0.063 0.749002
+0.064 0.747018
+0.065 0.745049
+0.066 0.743095
+0.067 0.741156
+0.068 0.739232
+0.069 0.737321
+0.07 0.735425
+0.071 0.733542
+0.072 0.731672
+0.073 0.729815
+0.074 0.727971
+0.075 0.726139
+0.076 0.724319
+0.077 0.722511
+0.078 0.720715
+0.079 0.718931
+0.08 0.717157
+0.081 0.715395
+0.082 0.713644
+0.083 0.711903
+0.084 0.710172
+0.085 0.708452
+0.086 0.706742
+0.087 0.705042
+0.088 0.703352
+0.089 0.701671
+0.09 0.7
+0.091 0.698338
+0.092 0.696685
+0.093 0.695041
+0.094 0.693406
+0.095 0.691779
+0.096 0.690161
+0.097 0.688552
+0.098 0.68695
+0.099 0.685357
+0.1 0.683772
+0.101 0.682195
+0.102 0.680626
+0.103 0.679064
+0.104 0.67751
+0.105 0.675963
+0.106 0.674424
+0.107 0.672891
+0.108 0.671366
+0.109 0.669849
+0.11 0.668338
+0.111 0.666833
+0.112 0.665336
+0.113 0.663845
+0.114 0.662361
+0.115 0.660884
+0.116 0.659412
+0.117 0.657947
+0.118 0.656489
+0.119 0.655036
+0.12 0.65359
+0.121 0.652149
+0.122 0.650715
+0.123 0.649286
+0.124 0.647864
+0.125 0.646447
+0.126 0.645035
+0.127 0.643629
+0.128 0.642229
+0.129 0.640834
+0.13 0.639445
+0.131 0.638061
+0.132 0.636682
+0.133 0.635308
+0.134 0.63394
+0.135 0.632577
+0.136 0.631218
+0.137 0.629865
+0.138 0.628516
+0.139 0.627173
+0.14 0.625834
+0.141 0.6245
+0.142 0.623171
+0.143 0.621847
+0.144 0.620527
+0.145 0.619211
+0.146 0.617901
+0.147 0.616594
+0.148 0.615292
+0.149 0.613995
+0.15 0.612702
+0.151 0.611413
+0.152 0.610128
+0.153 0.608848
+0.154 0.607572
+0.155 0.6063
+0.156 0.605032
+0.157 0.603768
+0.158 0.602508
+0.159 0.601252
+0.16 0.6
+0.161 0.598752
+0.162 0.597508
+0.163 0.596267
+0.164 0.595031
+0.165 0.593798
+0.166 0.592569
+0.167 0.591344
+0.168 0.590122
+0.169 0.588904
+0.17 0.587689
+0.171 0.586479
+0.172 0.585271
+0.173 0.584067
+0.174 0.582867
+0.175 0.58167
+0.176 0.580476
+0.177 0.579286
+0.178 0.5781
+0.179 0.576916
+0.18 0.575736
+0.181 0.574559
+0.182 0.573385
+0.183 0.572215
+0.184 0.571048
+0.185 0.569884
+0.186 0.568723
+0.187 0.567565
+0.188 0.56641
+0.189 0.565259
+0.19 0.56411
+0.191 0.562965
+0.192 0.561822
+0.193 0.560682
+0.194 0.559546
+0.195 0.558412
+0.196 0.557281
+0.197 0.556153
+0.198 0.555028
+0.199 0.553906
+0.2 0.552786
+0.201 0.55167
+0.202 0.550556
+0.203 0.549445
+0.204 0.548336
+0.205 0.547231
+0.206 0.546128
+0.207 0.545027
+0.208 0.54393
+0.209 0.542835
+0.21 0.541742
+0.211 0.540653
+0.212 0.539565
+0.213 0.538481
+0.214 0.537399
+0.215 0.536319
+0.216 0.535242
+0.217 0.534167
+0.218 0.533095
+0.219 0.532026
+0.22 0.530958
+0.221 0.529894
+0.222 0.528831
+0.223 0.527771
+0.224 0.526714
+0.225 0.525658
+0.226 0.524605
+0.227 0.523555
+0.228 0.522507
+0.229 0.521461
+0.23 0.520417
+0.231 0.519375
+0.232 0.518336
+0.233 0.517299
+0.234 0.516265
+0.235 0.515232
+0.236 0.514202
+0.237 0.513174
+0.238 0.512148
+0.239 0.511124
+0.24 0.510102
+0.241 0.509082
+0.242 0.508065
+0.243 0.50705
+0.244 0.506036
+0.245 0.505025
+0.246 0.504016
+0.247 0.503009
+0.248 0.502004
+0.249 0.501001
+0.25 0.5
+0.251 0.499001
+0.252 0.498004
+0.253 0.497009
+0.254 0.496016
+0.255 0.495025
+0.256 0.494036
+0.257 0.493048
+0.258 0.492063
+0.259 0.49108
+0.26 0.490098
+0.261 0.489118
+0.262 0.488141
+0.263 0.487165
+0.264 0.486191
+0.265 0.485218
+0.266 0.484248
+0.267 0.48328
+0.268 0.482313
+0.269 0.481348
+0.27 0.480385
+0.271 0.479423
+0.272 0.478464
+0.273 0.477506
+0.274 0.47655
+0.275 0.475596
+0.276 0.474643
+0.277 0.473692
+0.278 0.472743
+0.279 0.471795
+0.28 0.47085
+0.281 0.469906
+0.282 0.468963
+0.283 0.468023
+0.284 0.467083
+0.285 0.466146
+0.286 0.46521
+0.287 0.464276
+0.288 0.463344
+0.289 0.462413
+0.29 0.461484
+0.291 0.460556
+0.292 0.45963
+0.293 0.458705
+0.294 0.457782
+0.295 0.456861
+0.296 0.455941
+0.297 0.455023
+0.298 0.454106
+0.299 0.453191
+0.3 0.452277
+0.301 0.451365
+0.302 0.450455
+0.303 0.449546
+0.304 0.448638
+0.305 0.447732
+0.306 0.446827
+0.307 0.445924
+0.308 0.445023
+0.309 0.444122
+0.31 0.443224
+0.311 0.442326
+0.312 0.44143
+0.313 0.440536
+0.314 0.439643
+0.315 0.438751
+0.316 0.437861
+0.317 0.436972
+0.318 0.436085
+0.319 0.435199
+0.32 0.434315
+0.321 0.433431
+0.322 0.43255
+0.323 0.431669
+0.324 0.43079
+0.325 0.429912
+0.326 0.429036
+0.327 0.428161
+0.328 0.427287
+0.329 0.426415
+0.33 0.425544
+0.331 0.424674
+0.332 0.423806
+0.333 0.422938
+0.334 0.422073
+0.335 0.421208
+0.336 0.420345
+0.337 0.419483
+0.338 0.418622
+0.339 0.417763
+0.34 0.416905
+0.341 0.416048
+0.342 0.415192
+0.343 0.414338
+0.344 0.413485
+0.345 0.412633
+0.346 0.411782
+0.347 0.410933
+0.348 0.410085
+0.349 0.409238
+0.35 0.408392
+0.351 0.407547
+0.352 0.406704
+0.353 0.405862
+0.354 0.405021
+0.355 0.404181
+0.356 0.403343
+0.357 0.402505
+0.358 0.401669
+0.359 0.400834
+0.36 0.4
+0.361 0.399167
+0.362 0.398336
+0.363 0.397505
+0.364 0.396676
+0.365 0.395848
+0.366 0.395021
+0.367 0.394195
+0.368 0.39337
+0.369 0.392546
+0.37 0.391724
+0.371 0.390902
+0.372 0.390082
+0.373 0.389263
+0.374 0.388445
+0.375 0.387628
+0.376 0.386812
+0.377 0.385997
+0.378 0.385183
+0.379 0.38437
+0.38 0.383559
+0.381 0.382748
+0.382 0.381939
+0.383 0.38113
+0.384 0.380323
+0.385 0.379516
+0.386 0.378711
+0.387 0.377907
+0.388 0.377104
+0.389 0.376301
+0.39 0.3755
+0.391 0.3747
+0.392 0.373901
+0.393 0.373103
+0.394 0.372306
+0.395 0.37151
+0.396 0.370715
+0.397 0.369921
+0.398 0.369128
+0.399 0.368336
+0.4 0.367544
+0.401 0.366754
+0.402 0.365965
+0.403 0.365177
+0.404 0.36439
+0.405 0.363604
+0.406 0.362819
+0.407 0.362034
+0.408 0.361251
+0.409 0.360469
+0.41 0.359688
+0.411 0.358907
+0.412 0.358128
+0.413 0.357349
+0.414 0.356572
+0.415 0.355795
+0.416 0.355019
+0.417 0.354245
+0.418 0.353471
+0.419 0.352698
+0.42 0.351926
+0.421 0.351155
+0.422 0.350385
+0.423 0.349615
+0.424 0.348847
+0.425 0.34808
+0.426 0.347313
+0.427 0.346548
+0.428 0.345783
+0.429 0.345019
+0.43 0.344256
+0.431 0.343494
+0.432 0.342733
+0.433 0.341973
+0.434 0.341213
+0.435 0.340455
+0.436 0.339697
+0.437 0.33894
+0.438 0.338184
+0.439 0.337429
+0.44 0.336675
+0.441 0.335922
+0.442 0.335169
+0.443 0.334418
+0.444 0.333667
+0.445 0.332917
+0.446 0.332168
+0.447 0.331419
+0.448 0.330672
+0.449 0.329925
+0.45 0.32918
+0.451 0.328435
+0.452 0.327691
+0.453 0.326947
+0.454 0.326205
+0.455 0.325463
+0.456 0.324722
+0.457 0.323982
+0.458 0.323243
+0.459 0.322505
+0.46 0.321767
+0.461 0.32103
+0.462 0.320294
+0.463 0.319559
+0.464 0.318825
+0.465 0.318091
+0.466 0.317358
+0.467 0.316626
+0.468 0.315895
+0.469 0.315164
+0.47 0.314435
+0.471 0.313706
+0.472 0.312977
+0.473 0.31225
+0.474 0.311523
+0.475 0.310798
+0.476 0.310072
+0.477 0.309348
+0.478 0.308625
+0.479 0.307902
+0.48 0.30718
+0.481 0.306458
+0.482 0.305738
+0.483 0.305018
+0.484 0.304299
+0.485 0.303581
+0.486 0.302863
+0.487 0.302146
+0.488 0.30143
+0.489 0.300715
+0.49 0.3
+0.491 0.299286
+0.492 0.298573
+0.493 0.29786
+0.494 0.297149
+0.495 0.296438
+0.496 0.295727
+0.497 0.295018
+0.498 0.294309
+0.499 0.293601
+0.5 0.292893
+0.501 0.292186
+0.502 0.29148
+0.503 0.290775
+0.504 0.29007
+0.505 0.289366
+0.506 0.288663
+0.507 0.287961
+0.508 0.287259
+0.509 0.286558
+0.51 0.285857
+0.511 0.285157
+0.512 0.284458
+0.513 0.28376
+0.514 0.283062
+0.515 0.282365
+0.516 0.281669
+0.517 0.280973
+0.518 0.280278
+0.519 0.279583
+0.52 0.27889
+0.521 0.278197
+0.522 0.277504
+0.523 0.276813
+0.524 0.276122
+0.525 0.275431
+0.526 0.274741
+0.527 0.274052
+0.528 0.273364
+0.529 0.272676
+0.53 0.271989
+0.531 0.271303
+0.532 0.270617
+0.533 0.269932
+0.534 0.269247
+0.535 0.268563
+0.536 0.26788
+0.537 0.267197
+0.538 0.266515
+0.539 0.265834
+0.54 0.265153
+0.541 0.264473
+0.542 0.263794
+0.543 0.263115
+0.544 0.262436
+0.545 0.261759
+0.546 0.261082
+0.547 0.260406
+0.548 0.25973
+0.549 0.259055
+0.55 0.25838
+0.551 0.257706
+0.552 0.257033
+0.553 0.25636
+0.554 0.255688
+0.555 0.255017
+0.556 0.254346
+0.557 0.253676
+0.558 0.253006
+0.559 0.252337
+0.56 0.251669
+0.561 0.251001
+0.562 0.250333
+0.563 0.249667
+0.564 0.249001
+0.565 0.248335
+0.566 0.24767
+0.567 0.247006
+0.568 0.246342
+0.569 0.245679
+0.57 0.245017
+0.571 0.244355
+0.572 0.243693
+0.573 0.243032
+0.574 0.242372
+0.575 0.241712
+0.576 0.241053
+0.577 0.240395
+0.578 0.239737
+0.579 0.23908
+0.58 0.238423
+0.581 0.237766
+0.582 0.237111
+0.583 0.236456
+0.584 0.235801
+0.585 0.235147
+0.586 0.234494
+0.587 0.233841
+0.588 0.233188
+0.589 0.232537
+0.59 0.231885
+0.591 0.231235
+0.592 0.230585
+0.593 0.229935
+0.594 0.229286
+0.595 0.228638
+0.596 0.22799
+0.597 0.227342
+0.598 0.226695
+0.599 0.226049
+0.6 0.225403
+0.601 0.224758
+0.602 0.224113
+0.603 0.223469
+0.604 0.222826
+0.605 0.222183
+0.606 0.22154
+0.607 0.220898
+0.608 0.220256
+0.609 0.219615
+0.61 0.218975
+0.611 0.218335
+0.612 0.217696
+0.613 0.217057
+0.614 0.216418
+0.615 0.215781
+0.616 0.215143
+0.617 0.214507
+0.618 0.21387
+0.619 0.213234
+0.62 0.212599
+0.621 0.211964
+0.622 0.21133
+0.623 0.210697
+0.624 0.210063
+0.625 0.209431
+0.626 0.208798
+0.627 0.208167
+0.628 0.207535
+0.629 0.206905
+0.63 0.206275
+0.631 0.205645
+0.632 0.205016
+0.633 0.204387
+0.634 0.203759
+0.635 0.203131
+0.636 0.202504
+0.637 0.201877
+0.638 0.201251
+0.639 0.200625
+0.64 0.2
+0.641 0.199375
+0.642 0.198751
+0.643 0.198127
+0.644 0.197504
+0.645 0.196881
+0.646 0.196259
+0.647 0.195637
+0.648 0.195016
+0.649 0.194395
+0.65 0.193774
+0.651 0.193154
+0.652 0.192535
+0.653 0.191916
+0.654 0.191297
+0.655 0.190679
+0.656 0.190062
+0.657 0.189445
+0.658 0.188828
+0.659 0.188212
+0.66 0.187596
+0.661 0.186981
+0.662 0.186366
+0.663 0.185752
+0.664 0.185138
+0.665 0.184525
+0.666 0.183912
+0.667 0.183299
+0.668 0.182687
+0.669 0.182076
+0.67 0.181465
+0.671 0.180854
+0.672 0.180244
+0.673 0.179634
+0.674 0.179025
+0.675 0.178416
+0.676 0.177808
+0.677 0.1772
+0.678 0.176592
+0.679 0.175985
+0.68 0.175379
+0.681 0.174773
+0.682 0.174167
+0.683 0.173562
+0.684 0.172957
+0.685 0.172353
+0.686 0.171749
+0.687 0.171145
+0.688 0.170542
+0.689 0.16994
+0.69 0.169338
+0.691 0.168736
+0.692 0.168135
+0.693 0.167534
+0.694 0.166933
+0.695 0.166333
+0.696 0.165734
+0.697 0.165135
+0.698 0.164536
+0.699 0.163938
+0.7 0.16334
+0.701 0.162743
+0.702 0.162146
+0.703 0.161549
+0.704 0.160953
+0.705 0.160357
+0.706 0.159762
+0.707 0.159167
+0.708 0.158573
+0.709 0.157979
+0.71 0.157385
+0.711 0.156792
+0.712 0.156199
+0.713 0.155607
+0.714 0.155015
+0.715 0.154423
+0.716 0.153832
+0.717 0.153241
+0.718 0.152651
+0.719 0.152061
+0.72 0.151472
+0.721 0.150883
+0.722 0.150294
+0.723 0.149706
+0.724 0.149118
+0.725 0.148531
+0.726 0.147944
+0.727 0.147357
+0.728 0.146771
+0.729 0.146185
+0.73 0.1456
+0.731 0.145015
+0.732 0.14443
+0.733 0.143846
+0.734 0.143262
+0.735 0.142679
+0.736 0.142096
+0.737 0.141513
+0.738 0.140931
+0.739 0.140349
+0.74 0.139767
+0.741 0.139186
+0.742 0.138606
+0.743 0.138026
+0.744 0.137446
+0.745 0.136866
+0.746 0.136287
+0.747 0.135708
+0.748 0.13513
+0.749 0.134552
+0.75 0.133975
+0.751 0.133397
+0.752 0.132821
+0.753 0.132244
+0.754 0.131668
+0.755 0.131093
+0.756 0.130517
+0.757 0.129943
+0.758 0.129368
+0.759 0.128794
+0.76 0.12822
+0.761 0.127647
+0.762 0.127074
+0.763 0.126501
+0.764 0.125929
+0.765 0.125357
+0.766 0.124786
+0.767 0.124215
+0.768 0.123644
+0.769 0.123074
+0.77 0.122504
+0.771 0.121934
+0.772 0.121365
+0.773 0.120796
+0.774 0.120227
+0.775 0.119659
+0.776 0.119091
+0.777 0.118524
+0.778 0.117957
+0.779 0.11739
+0.78 0.116824
+0.781 0.116258
+0.782 0.115692
+0.783 0.115127
+0.784 0.114562
+0.785 0.113998
+0.786 0.113434
+0.787 0.11287
+0.788 0.112306
+0.789 0.111743
+0.79 0.111181
+0.791 0.110618
+0.792 0.110056
+0.793 0.109495
+0.794 0.108933
+0.795 0.108372
+0.796 0.107812
+0.797 0.107251
+0.798 0.106692
+0.799 0.106132
+0.8 0.105573
+0.801 0.105014
+0.802 0.104455
+0.803 0.103897
+0.804 0.10334
+0.805 0.102782
+0.806 0.102225
+0.807 0.101668
+0.808 0.101112
+0.809 0.100556
+0.81 0.1
+0.811 0.0994446
+0.812 0.0988896
+0.813 0.0983349
+0.814 0.0977805
+0.815 0.0972265
+0.816 0.0966728
+0.817 0.0961195
+0.818 0.0955665
+0.819 0.0950138
+0.82 0.0944615
+0.821 0.0939095
+0.822 0.0933578
+0.823 0.0928065
+0.824 0.0922555
+0.825 0.0917049
+0.826 0.0911546
+0.827 0.0906046
+0.828 0.0900549
+0.829 0.0895056
+0.83 0.0889566
+0.831 0.088408
+0.832 0.0878597
+0.833 0.0873117
+0.834 0.086764
+0.835 0.0862167
+0.836 0.0856696
+0.837 0.085123
+0.838 0.0845766
+0.839 0.0840306
+0.84 0.0834849
+0.841 0.0829395
+0.842 0.0823944
+0.843 0.0818497
+0.844 0.0813053
+0.845 0.0807612
+0.846 0.0802174
+0.847 0.079674
+0.848 0.0791308
+0.849 0.078588
+0.85 0.0780456
+0.851 0.0775034
+0.852 0.0769615
+0.853 0.07642
+0.854 0.0758788
+0.855 0.0753379
+0.856 0.0747973
+0.857 0.0742571
+0.858 0.0737171
+0.859 0.0731775
+0.86 0.0726382
+0.861 0.0720991
+0.862 0.0715604
+0.863 0.0710221
+0.864 0.070484
+0.865 0.0699462
+0.866 0.0694088
+0.867 0.0688717
+0.868 0.0683348
+0.869 0.0677983
+0.87 0.0672621
+0.871 0.0667262
+0.872 0.0661906
+0.873 0.0656553
+0.874 0.0651203
+0.875 0.0645857
+0.876 0.0640513
+0.877 0.0635172
+0.878 0.0629835
+0.879 0.06245
+0.88 0.0619168
+0.881 0.061384
+0.882 0.0608514
+0.883 0.0603192
+0.884 0.0597873
+0.885 0.0592556
+0.886 0.0587243
+0.887 0.0581932
+0.888 0.0576625
+0.889 0.057132
+0.89 0.0566019
+0.891 0.056072
+0.892 0.0555425
+0.893 0.0550132
+0.894 0.0544843
+0.895 0.0539556
+0.896 0.0534272
+0.897 0.0528992
+0.898 0.0523714
+0.899 0.0518439
+0.9 0.0513167
+0.901 0.0507898
+0.902 0.0502632
+0.903 0.0497369
+0.904 0.0492109
+0.905 0.0486851
+0.906 0.0481597
+0.907 0.0476345
+0.908 0.0471097
+0.909 0.0465851
+0.91 0.0460608
+0.911 0.0455368
+0.912 0.0450131
+0.913 0.0444897
+0.914 0.0439665
+0.915 0.0434437
+0.916 0.0429211
+0.917 0.0423988
+0.918 0.0418768
+0.919 0.0413551
+0.92 0.0408337
+0.921 0.0403126
+0.922 0.0397917
+0.923 0.0392711
+0.924 0.0387508
+0.925 0.0382308
+0.926 0.0377111
+0.927 0.0371916
+0.928 0.0366724
+0.929 0.0361535
+0.93 0.0356349
+0.931 0.0351166
+0.932 0.0345985
+0.933 0.0340807
+0.934 0.0335632
+0.935 0.033046
+0.936 0.0325291
+0.937 0.0320124
+0.938 0.031496
+0.939 0.0309799
+0.94 0.030464
+0.941 0.0299485
+0.942 0.0294332
+0.943 0.0289181
+0.944 0.0284034
+0.945 0.0278889
+0.946 0.0273747
+0.947 0.0268607
+0.948 0.0263471
+0.949 0.0258337
+0.95 0.0253206
+0.951 0.0248077
+0.952 0.0242951
+0.953 0.0237828
+0.954 0.0232708
+0.955 0.022759
+0.956 0.0222475
+0.957 0.0217362
+0.958 0.0212253
+0.959 0.0207145
+0.96 0.0202041
+0.961 0.0196939
+0.962 0.019184
+0.963 0.0186744
+0.964 0.018165
+0.965 0.0176559
+0.966 0.017147
+0.967 0.0166384
+0.968 0.0161301
+0.969 0.015622
+0.97 0.0151142
+0.971 0.0146067
+0.972 0.0140994
+0.973 0.0135924
+0.974 0.0130856
+0.975 0.0125791
+0.976 0.0120729
+0.977 0.0115669
+0.978 0.0110612
+0.979 0.0105557
+0.98 0.0100505
+0.981 0.00954556
+0.982 0.00904087
+0.983 0.00853644
+0.984 0.00803226
+0.985 0.00752834
+0.986 0.00702467
+0.987 0.00652126
+0.988 0.00601811
+0.989 0.00551521
+0.99 0.00501256
+0.991 0.00451017
+0.992 0.00400803
+0.993 0.00350615
+0.994 0.00300451
+0.995 0.00250313
+0.996 0.002002
+0.997 0.00150113
+0.998 0.0010005
+0.999 0.000500125
+1 0
\ No newline at end of file
diff --git a/jmetal/problem/reference_front/ZDT2.pf b/jmetal/problem/reference_front/ZDT2.pf
new file mode 100644
index 00000000..9df822e4
--- /dev/null
+++ b/jmetal/problem/reference_front/ZDT2.pf
@@ -0,0 +1,1000 @@
+0 1
+0.003754873 0.999985901
+0.00563231 0.999968277
+0.007200271 0.999948156
+0.008597509 0.999926083
+0.009882778 0.999902331
+0.011102102 0.999876743
+0.012264475 0.999849583
+0.013371765 0.999821196
+0.014455677 0.999791033
+0.015498951 0.999759783
+0.016519826 0.999727095
+0.017509158 0.999693429
+0.018479218 0.999658519
+0.019438356 0.99962215
+0.020399442 0.999583863
+0.021350237 0.999544167
+0.022279862 0.999503608
+0.023213525 0.999461132
+0.024128412 0.99941782
+0.025054514 0.999372271
+0.0259635 0.999325897
+0.026883532 0.999277276
+0.027787821 0.999227837
+0.028698894 0.999176374
+0.029595506 0.999124106
+0.030500201 0.999069738
+0.031391478 0.999014575
+0.032299982 0.998956711
+0.03319571 0.998898045
+0.034102435 0.998837024
+0.035015421 0.99877392
+0.035916506 0.998710005
+0.036828477 0.998643663
+0.037729156 0.998576511
+0.038623319 0.998508239
+0.039534786 0.998437001
+0.040435746 0.99836495
+0.041383829 0.998287379
+0.042321051 0.998208929
+0.043259865 0.998128584
+0.044188493 0.998047377
+0.045127464 0.997963512
+0.046056667 0.997878783
+0.04699368 0.997791594
+0.047928593 0.99770285
+0.048854387 0.997613249
+0.049804185 0.997519543
+0.050755861 0.997423843
+0.051698616 0.997327253
+0.052643509 0.997228661
+0.053600651 0.99712697
+0.054549248 0.99702438
+0.055491619 0.99692068
+0.056449778 0.996813423
+0.057399805 0.996705262
+0.058367844 0.996593195
+0.059337093 0.996479109
+0.060298425 0.9963641
+0.061262107 0.996246954
+0.062218209 0.996128895
+0.063192226 0.996006743
+0.064158736 0.995883657
+0.065127027 0.99575847
+0.066097858 0.995631073
+0.06706156 0.995502747
+0.068027936 0.9953722
+0.06900275 0.995238621
+0.069970678 0.995104104
+0.070947611 0.994966437
+0.071917818 0.994827828
+0.072888719 0.994687235
+0.073866674 0.994543715
+0.074838154 0.994399251
+0.075810462 0.994252774
+0.076793322 0.994102786
+0.077769892 0.993951844
+0.078752878 0.993797984
+0.079735311 0.99364228
+0.080711692 0.993485623
+0.081695026 0.993325923
+0.082672441 0.993165268
+0.083652072 0.993002331
+0.084632485 0.992837342
+0.085612208 0.99267055
+0.086591595 0.992501896
+0.087565443 0.992332293
+0.088548617 0.992159143
+0.089526332 0.991985036
+0.090515945 0.991806864
+0.091500147 0.991627723
+0.092482981 0.991446898
+0.093471389 0.9912631
+0.094454571 0.991078334
+0.095446004 0.99089006
+0.096432288 0.990700814
+0.097423173 0.990508725
+0.098409018 0.990315665
+0.099393339 0.990120964
+0.100389139 0.989922021
+0.101380001 0.989722096
+0.102371646 0.989520046
+0.103358489 0.989317023
+0.104345726 0.98911197
+0.105336658 0.988904189
+0.106322929 0.988695435
+0.107317147 0.98848303
+0.108306759 0.988269646
+0.109294222 0.988054773
+0.110287174 0.987836739
+0.111279209 0.987616938
+0.112270294 0.987395381
+0.113257005 0.987172851
+0.114242858 0.986948569
+0.115228703 0.986722346
+0.116224291 0.986491914
+0.117217614 0.986260031
+0.118206729 0.986027169
+0.119200574 0.985791223
+0.120193704 0.985553473
+0.121182732 0.985314746
+0.122173842 0.985073552
+0.12316743 0.984829784
+0.124157011 0.984585037
+0.125151374 0.984337134
+0.126141787 0.98408825
+0.127130573 0.983837817
+0.128118845 0.983585562
+0.129112035 0.983330083
+0.130101405 0.983073625
+0.131098167 0.982813271
+0.13209114 0.982551931
+0.133082833 0.98228896
+0.134075717 0.982023702
+0.135066754 0.981756972
+0.136064006 0.981486586
+0.137057604 0.981215213
+0.138048207 0.980942692
+0.13904423 0.980666702
+0.140036685 0.980389727
+0.141028521 0.980110956
+0.14202975 0.97982755
+0.143027982 0.979542996
+0.14402273 0.979257453
+0.145020141 0.978969159
+0.146014123 0.978679876
+0.147010677 0.978387861
+0.148003855 0.978094859
+0.149000804 0.977798761
+0.149998797 0.977500361
+0.15099347 0.977200972
+0.151989217 0.976899278
+0.152984544 0.976595729
+0.153982473 0.976289398
+0.154981253 0.975980811
+0.155976814 0.975671234
+0.156973257 0.975359397
+0.157968263 0.975046028
+0.158963578 0.974730581
+0.159960237 0.974412723
+0.160953791 0.974093877
+0.161950816 0.973771933
+0.162944771 0.973449002
+0.163942018 0.973123015
+0.164936232 0.972796039
+0.16592856 0.972467713
+0.166926342 0.972135596
+0.167924272 0.971801439
+0.168919236 0.971466292
+0.169914381 0.971129103
+0.170913665 0.970788519
+0.171910027 0.970446943
+0.172909107 0.970102441
+0.17390752 0.969756175
+0.174903996 0.969408592
+0.175897633 0.969060023
+0.176893081 0.968708838
+0.177888598 0.968355647
+0.178885793 0.967999873
+0.179880967 0.967642838
+0.180873388 0.967284818
+0.181873751 0.966921939
+0.182871362 0.966558065
+0.183867528 0.966192732
+0.18486473 0.965825032
+0.185859242 0.965456342
+0.186857876 0.965084134
+0.187853842 0.964710934
+0.18884802 0.964336425
+0.18984793 0.963957763
+0.190845207 0.963578107
+0.191842618 0.96319641
+0.192837437 0.962813723
+0.193838641 0.962426581
+0.194837261 0.962038442
+0.195834564 0.961648823
+0.196834867 0.961256035
+0.197833873 0.960861759
+0.198830357 0.960466489
+0.199825584 0.960069736
+0.200822724 0.959670233
+0.201818526 0.959269283
+0.202816943 0.958865288
+0.203816095 0.958459
+0.204812798 0.958051718
+0.20580886 0.957642713
+0.206808496 0.957230246
+0.207805717 0.956816784
+0.208805291 0.956400351
+0.209802472 0.955982923
+0.210799601 0.955563528
+0.211801571 0.955140095
+0.212801691 0.954715441
+0.213800967 0.954289146
+0.214797909 0.953861858
+0.215794037 0.953432934
+0.216796225 0.952999397
+0.217798065 0.952564003
+0.218797601 0.95212761
+0.219796813 0.951689361
+0.220796814 0.951248767
+0.22179455 0.950807178
+0.222793474 0.950363068
+0.223790159 0.949917965
+0.224786745 0.949470919
+0.225787374 0.949020062
+0.226787411 0.94856747
+0.227787098 0.948113038
+0.228784592 0.947657611
+0.229781757 0.947200344
+0.230781535 0.946739883
+0.231779147 0.946278427
+0.23278029 0.945813337
+0.233780267 0.945346787
+0.234778866 0.944878884
+0.235775341 0.944409988
+0.236770468 0.943939746
+0.237771074 0.943464917
+0.238769574 0.94298909
+0.239769543 0.942510566
+0.240768517 0.942030521
+0.241765419 0.941549482
+0.242765057 0.941065127
+0.243763858 0.940579182
+0.244760612 0.940092243
+0.24575992 0.939602062
+0.246757197 0.939110886
+0.247753048 0.938618427
+0.248753037 0.938121926
+0.249751017 0.93762443
+0.250752523 0.937123172
+0.251754378 0.936619733
+0.25275424 0.936115294
+0.253754466 0.935608671
+0.254754003 0.935100398
+0.255752123 0.934590852
+0.256753691 0.934077542
+0.257754454 0.933562642
+0.258753847 0.933046447
+0.25975131 0.932529257
+0.260749971 0.932009453
+0.26174904 0.93148744
+0.262746202 0.930964433
+0.263745095 0.930438525
+0.264745097 0.929910033
+0.265744597 0.929379809
+0.266742217 0.92884859
+0.267739351 0.92831564
+0.26873679 0.927780538
+0.269737189 0.927241849
+0.270735732 0.926702163
+0.271736809 0.926159107
+0.272736189 0.925614971
+0.273736513 0.925068322
+0.274735008 0.924520675
+0.275735703 0.923969822
+0.276734582 0.923417971
+0.277735073 0.92286323
+0.278733762 0.92230749
+0.279733956 0.921748914
+0.28073421 0.921188303
+0.281733604 0.920626176
+0.282732653 0.920062247
+0.283729936 0.919497324
+0.284730615 0.918928477
+0.28573122 0.91835767
+0.286731613 0.917784982
+0.287730261 0.917211297
+0.288729785 0.916635111
+0.289729257 0.916056958
+0.290727841 0.915477322
+0.291724711 0.914896693
+0.292724743 0.914312225
+0.293723068 0.91372676
+0.294724221 0.913137633
+0.295723675 0.912547508
+0.296722291 0.911955882
+0.29772264 0.91136123
+0.298722642 0.910764783
+0.29972097 0.91016734
+0.300721162 0.909566783
+0.301719691 0.908965228
+0.302721345 0.908359787
+0.3037216 0.90775319
+0.304722428 0.907144242
+0.30572272 0.906533618
+0.306721376 0.905921998
+0.307721926 0.905307216
+0.308721783 0.90469086
+0.309720022 0.904073508
+0.310720442 0.903452807
+0.311719252 0.902831108
+0.312720231 0.902206057
+0.313720091 0.901579705
+0.314718357 0.900952356
+0.315718924 0.900321561
+0.316718644 0.8996893
+0.317716787 0.899056044
+0.318716733 0.898419644
+0.31971511 0.897782248
+0.320715026 0.897141872
+0.321713384 0.896500499
+0.322712288 0.895856779
+0.323713455 0.895209599
+0.324714549 0.894560462
+0.3257141 0.893910325
+0.326713269 0.89325844
+0.32771091 0.89260556
+0.328710354 0.891949504
+0.329708278 0.891292452
+0.330710659 0.89063046
+0.33171152 0.889967467
+0.332711717 0.889302913
+0.333712099 0.888636235
+0.334711776 0.887968027
+0.335713107 0.88729671
+0.336712945 0.886624393
+0.337714502 0.885948915
+0.338714573 0.885272438
+0.33971371 0.884594595
+0.340713135 0.88391456
+0.341713432 0.88323193
+0.342712758 0.882547965
+0.343710627 0.881863005
+0.34471121 0.881174182
+0.345711904 0.88048328
+0.346711149 0.879791379
+0.347711385 0.879096793
+0.348710182 0.878401209
+0.3497106 0.877702497
+0.350709586 0.877002786
+0.351709326 0.87630055
+0.352708223 0.875596909
+0.353706861 0.874891456
+0.354708467 0.874181903
+0.355708658 0.87347135
+0.356709672 0.87275821
+0.357709281 0.87204407
+0.358708778 0.871328013
+0.359706882 0.870610959
+0.360704206 0.869892476
+0.361705825 0.869168897
+0.362706056 0.868444317
+0.363707305 0.867716996
+0.364707177 0.866988675
+0.365707057 0.866258349
+0.366708627 0.865524783
+0.367709949 0.864789393
+0.368709935 0.864052984
+0.369710507 0.863314141
+0.370709726 0.862574299
+0.371710152 0.861831563
+0.372709539 0.861087599
+0.373707587 0.86034264
+0.374708412 0.859593606
+0.375709292 0.858842528
+0.376708838 0.858090452
+0.377709619 0.857335444
+0.378709074 0.856579437
+0.379708581 0.855821393
+0.380709731 0.855060101
+0.381709968 0.854297501
+0.382708893 0.853533903
+0.38371038 0.852766345
+0.384710559 0.851997786
+0.385711472 0.851226661
+0.386711085 0.850454537
+0.387710012 0.849680947
+0.388711615 0.848903281
+0.389711927 0.848124614
+0.390713005 0.847343348
+0.391713425 0.846560592
+0.392712568 0.845776839
+0.393711968 0.844990887
+0.394714017 0.844200844
+0.395714795 0.843409801
+0.396714891 0.842617295
+0.397715214 0.841822609
+0.398715654 0.841025827
+0.399716216 0.840226947
+0.400715525 0.839427068
+0.401716743 0.838623658
+0.402717603 0.837818533
+0.403717218 0.837012408
+0.404718153 0.836203216
+0.405719194 0.835391936
+0.406719 0.834579655
+0.407718505 0.833765621
+0.40871811 0.832949506
+0.409716971 0.832132004
+0.410715569 0.831312722
+0.411717243 0.830488912
+0.4127177 0.8296641
+0.413717405 0.828837909
+0.414718759 0.828008351
+0.415718903 0.827177793
+0.416718532 0.826345665
+0.417718333 0.825511395
+0.418719508 0.824673973
+0.419719487 0.823835552
+0.420719825 0.822994829
+0.421720476 0.82215184
+0.42271994 0.821307852
+0.423719721 0.820461598
+0.42472109 0.819611996
+0.425721279 0.818761393
+0.426722224 0.817908143
+0.427723227 0.817052841
+0.428723394 0.816196252
+0.429723685 0.815337555
+0.430723457 0.814477304
+0.431722069 0.813616055
+0.432722721 0.812751047
+0.433724258 0.811883268
+0.434724639 0.811014488
+0.435725666 0.810143144
+0.436725543 0.8092708
+0.437725425 0.808396452
+0.438725986 0.807519509
+0.43972581 0.806641213
+0.440726782 0.805759904
+0.441726618 0.804877595
+0.442728245 0.803991701
+0.443728738 0.803104807
+0.444728523 0.802216541
+0.44572962 0.801325106
+0.446729592 0.800432672
+0.447730039 0.799537812
+0.44873086 0.798640615
+0.449730565 0.797742419
+0.45073117 0.796841413
+0.451730664 0.795939407
+0.452730964 0.795034674
+0.453730159 0.794128943
+0.454731775 0.793219013
+0.455732287 0.792308082
+0.456733155 0.791394825
+0.457732927 0.790480568
+0.458734191 0.789562942
+0.459734994 0.788643735
+0.460735867 0.787722461
+0.461735653 0.786800187
+0.462735513 0.785875845
+0.463735666 0.784949233
+0.464737346 0.7840192
+0.46573913 0.783087063
+0.466740352 0.782153444
+0.4677405 0.781218825
+0.468741043 0.780281834
+0.46974148 0.779342942
+0.470740851 0.778403051
+0.471741786 0.777459687
+0.472741659 0.776515324
+0.473742137 0.775568388
+0.474742491 0.774619567
+0.475741792 0.773669747
+0.476742717 0.772716382
+0.47774312 0.771761512
+0.478742475 0.770805643
+0.479743722 0.769845962
+0.480744695 0.768884539
+0.481745407 0.767921363
+0.48274508 0.766957188
+0.483744498 0.765991261
+0.484744139 0.765023119
+0.48574275 0.764053981
+0.486743929 0.763080348
+0.487744078 0.762105715
+0.488744689 0.761128629
+0.489744275 0.760150545
+0.490743488 0.759170829
+0.491742974 0.758188848
+0.492744023 0.757203328
+0.493744056 0.756216808
+0.494744825 0.755227558
+0.495745017 0.754236879
+0.496745892 0.753243519
+0.497745759 0.75224916
+0.498746847 0.751251583
+0.49974693 0.750253006
+0.50074794 0.749251501
+0.501747949 0.748248996
+0.502748091 0.747244357
+0.503747238 0.74623872
+0.504747963 0.745229494
+0.505747696 0.744219269
+0.506748794 0.74320566
+0.507748903 0.742191051
+0.508748294 0.741175173
+0.509749451 0.740155497
+0.510750455 0.739133973
+0.511751386 0.738110519
+0.512751339 0.737086065
+0.513751222 0.736059682
+0.514752509 0.735029854
+0.515752905 0.733998941
+0.516752331 0.732967028
+0.517754385 0.731930397
+0.51875547 0.730892763
+0.519757093 0.729852564
+0.520757751 0.728811365
+0.521759212 0.727767324
+0.522759713 0.726722283
+0.523761102 0.725674308
+0.524762492 0.724624327
+0.525762927 0.723573345
+0.526764149 0.722519531
+0.52776442 0.721464717
+0.528765629 0.72040691
+0.529767331 0.719346575
+0.530768086 0.718285239
+0.531768474 0.71722229
+0.532769073 0.716157115
+0.533770758 0.715088778
+0.534771504 0.714019439
+0.535771803 0.712948575
+0.536772146 0.711875663
+0.537772898 0.71080031
+0.538772719 0.709723957
+0.539773599 0.708644462
+0.540773551 0.707563966
+0.541774944 0.70647991
+0.542775412 0.705394852
+0.543775105 0.704308636
+0.544776405 0.703218668
+0.545776786 0.7021277
+0.546777926 0.7010339
+0.547778149 0.699939099
+0.548779716 0.698840823
+0.549780369 0.697741546
+0.550780882 0.69664042
+0.551782293 0.695536301
+0.552782795 0.694431182
+0.553782752 0.693324663
+0.554783735 0.692215008
+0.555783933 0.69110422
+0.556783231 0.689992434
+0.557784579 0.688876364
+0.558785028 0.687759292
+0.559785073 0.686640672
+0.560786101 0.685518949
+0.561786236 0.684396225
+0.562786869 0.68327094
+0.563786613 0.682144655
+0.564786981 0.681015666
+0.565786463 0.679885678
+0.566786368 0.678753213
+0.567788081 0.677616695
+0.568788911 0.676479174
+0.569790337 0.675338972
+0.570791424 0.67419715
+0.571791633 0.673054328
+0.572792209 0.671909085
+0.573791911 0.670762842
+0.574792856 0.669613173
+0.575794003 0.668461266
+0.57679428 0.667308359
+0.577795454 0.666152414
+0.57879576 0.664995468
+0.579795893 0.663836723
+0.580795729 0.662676321
+0.581796603 0.661512713
+0.582796997 0.660347661
+0.583796532 0.659181609
+0.584798669 0.658010517
+0.585799946 0.656838423
+0.586801736 0.655663723
+0.58780267 0.654488021
+0.588803081 0.653310931
+0.589804416 0.652130751
+0.5908049 0.65094957
+0.591806087 0.649765556
+0.592806427 0.648580541
+0.593807246 0.647392954
+0.594808719 0.646202588
+0.595809913 0.645010548
+0.596810265 0.643817507
+0.597810315 0.642622827
+0.5988106 0.641425866
+0.599812183 0.640225345
+0.60081293 0.639023824
+0.601813408 0.637820622
+0.602814301 0.636614919
+0.60381475 0.635407748
+0.60481437 0.634199578
+0.605815641 0.632987409
+0.606816516 0.631773716
+0.607816566 0.630559023
+0.608817453 0.629341309
+0.609817517 0.628122596
+0.610818444 0.626900829
+0.61181855 0.625678062
+0.6128192 0.624452629
+0.613819032 0.623226196
+0.614818956 0.621997651
+0.615819256 0.620766644
+0.616820073 0.619532997
+0.617820079 0.618298351
+0.618821265 0.617060242
+0.619821642 0.615821133
+0.620822948 0.614578867
+0.621824386 0.613334433
+0.622825282 0.612088668
+0.623825373 0.610841904
+0.624824926 0.609593812
+0.625825621 0.608342292
+0.626825515 0.607089774
+0.62782689 0.605833397
+0.628827466 0.604576019
+0.629827741 0.603317017
+0.630828463 0.602055451
+0.63182839 0.600792885
+0.632829773 0.599526478
+0.633830364 0.59825907
+0.634831438 0.596989045
+0.635831724 0.595718019
+0.636832296 0.594444627
+0.637833406 0.593168546
+0.638833731 0.591891464
+0.639834603 0.59061168
+0.640835203 0.589330243
+0.641835022 0.588047805
+0.642836181 0.586761645
+0.64383656 0.585474484
+0.644838265 0.584183612
+0.645839811 0.582890939
+0.646841199 0.581596463
+0.647841812 0.580300986
+0.648841777 0.579004349
+0.649843084 0.577703966
+0.65084362 0.576402582
+0.651844427 0.575098843
+0.652845346 0.573792954
+0.653845497 0.572486066
+0.654845762 0.571177028
+0.655846618 0.569865214
+0.656846709 0.568552401
+0.65784831 0.567235601
+0.658849149 0.565917799
+0.65984954 0.564598585
+0.660850682 0.563276376
+0.66185203 0.561951891
+0.66285262 0.560626404
+0.663853235 0.559298882
+0.664854656 0.557968286
+0.665855748 0.556636122
+0.66685616 0.555302863
+0.667857028 0.553966991
+0.668857741 0.552629322
+0.669857706 0.551290654
+0.670858959 0.549948258
+0.671860472 0.548603506
+0.672861743 0.547257074
+0.67386227 0.545909642
+0.674863134 0.544559751
+0.67586426 0.543207502
+0.676864645 0.541854252
+0.677865707 0.540498083
+0.67886603 0.539140914
+0.679867373 0.537780355
+0.680867979 0.536418795
+0.681868987 0.535054685
+0.682870006 0.533688555
+0.683870291 0.532321425
+0.684871641 0.530950836
+0.685872258 0.529579246
+0.686873381 0.528204959
+0.687873774 0.526829671
+0.688874369 0.525452104
+0.689875499 0.524071796
+0.690876238 0.522690023
+0.691877025 0.521306182
+0.692877089 0.51992134
+0.693877201 0.51853443
+0.694877811 0.517144827
+0.695878921 0.515752528
+0.69687931 0.514359228
+0.697880198 0.512963229
+0.698880923 0.511565456
+0.699881174 0.510166342
+0.700880711 0.508766229
+0.701882425 0.507361061
+0.702883424 0.505954892
+0.703884444 0.50454669
+0.704884751 0.503137488
+0.705885202 0.501726082
+0.706885916 0.500312301
+0.707885923 0.49889752
+0.708887585 0.497478392
+0.70988854 0.496058261
+0.710888883 0.494636996
+0.711890387 0.493212077
+0.712891186 0.491786156
+0.713891983 0.490358237
+0.71489308 0.488927884
+0.71589424 0.487495438
+0.716895377 0.486061018
+0.717895816 0.484625598
+0.718896235 0.483188204
+0.719896551 0.481748956
+0.720896837 0.48030775
+0.721896915 0.478864844
+0.722898044 0.477418418
+0.723898479 0.475970992
+0.724898547 0.474522096
+0.725898573 0.473071263
+0.726899566 0.471617021
+0.72789987 0.47016178
+0.728900017 0.468704766
+0.729900778 0.467244855
+0.730901397 0.465783149
+0.731901331 0.464320442
+0.732901797 0.462854955
+0.733902934 0.461386483
+0.734903388 0.45991701
+0.735904183 0.458445033
+0.736905089 0.456970889
+0.737905316 0.455495745
+0.738906028 0.454017882
+0.739906062 0.452539019
+0.74090681 0.451057099
+0.741908464 0.449571832
+0.742909441 0.448085562
+0.743910566 0.44659707
+0.744911017 0.445107577
+0.745912131 0.443615093
+0.746912572 0.44212161
+0.747913078 0.440626028
+0.748914323 0.439127336
+0.74991549 0.437626758
+0.750915988 0.436125179
+0.751916409 0.434621713
+0.752917706 0.433114928
+0.753919107 0.43160598
+0.754919843 0.430096031
+0.755921335 0.428582935
+0.756922489 0.427068346
+0.75792298 0.425552757
+0.758924612 0.424033433
+0.759925584 0.422513107
+0.760926564 0.420990764
+0.761927881 0.419465904
+0.762929097 0.417939193
+0.763929656 0.416411481
+0.764930115 0.41488192
+0.765930379 0.413350654
+0.766930206 0.41181806
+0.767930802 0.410282284
+0.768930746 0.408745508
+0.769931032 0.407206206
+0.770932927 0.405662421
+0.771934172 0.404117635
+0.772935253 0.402571094
+0.773936362 0.401022507
+0.774936824 0.399472919
+0.7759378 0.397920531
+0.776938321 0.396366846
+0.777938197 0.394812161
+0.778939265 0.393253621
+0.779940598 0.391692664
+0.78094147 0.390130421
+0.7819417 0.388567177
+0.782942825 0.387000533
+0.783943309 0.385432888
+0.784944705 0.383861811
+0.785946188 0.382288589
+0.786947034 0.380714366
+0.787947541 0.379138673
+0.788947796 0.377561375
+0.78994862 0.375981177
+0.790949167 0.374399416
+0.791949081 0.372816654
+0.792949772 0.371230659
+0.793949832 0.369643664
+0.794950314 0.368053999
+0.795950301 0.366463118
+0.796951572 0.364868192
+0.797952893 0.363271181
+0.798953585 0.361673169
+0.7999548 0.360072318
+0.800955389 0.358470465
+0.801956101 0.356866413
+0.802956327 0.355261137
+0.803957644 0.353652107
+0.804958925 0.352041128
+0.805959584 0.350429149
+0.80696091 0.348814089
+0.807961615 0.347198029
+0.808962869 0.345579076
+0.809963578 0.343959003
+0.81096477 0.342336142
+0.811965852 0.340711455
+0.812966317 0.339085767
+0.813967717 0.337456556
+0.8149685 0.335826344
+0.815969566 0.334193668
+0.816970017 0.332559991
+0.817970544 0.33092419
+0.818971763 0.329285252
+0.819972946 0.327644368
+0.820973518 0.326002483
+0.821974056 0.324358651
+0.822974511 0.322712955
+0.823976062 0.321063449
+0.824977005 0.319412941
+0.825977698 0.317760843
+0.826978852 0.316105978
+0.827980067 0.314449009
+0.828980967 0.312790556
+0.829981264 0.311131102
+0.830981249 0.309470164
+0.831981775 0.307806327
+0.832983045 0.306139247
+0.833983844 0.304470949
+0.834984042 0.302801649
+0.835985856 0.301127649
+0.83698707 0.299452645
+0.837987785 0.297776473
+0.838988823 0.296097755
+0.839989264 0.294418036
+0.8409906 0.292734811
+0.841991339 0.291050584
+0.842991804 0.289364819
+0.843992911 0.287675966
+0.844993425 0.285986111
+0.845994522 0.28429327
+0.846995025 0.282599427
+0.847996062 0.28090268
+0.848996507 0.279204932
+0.849997551 0.277504163
+0.850998006 0.275802394
+0.851998515 0.27409853
+0.852999578 0.27239172
+0.854000053 0.27068391
+0.85500024 0.26897459
+0.856000438 0.267263251
+0.85700194 0.265547676
+0.858002856 0.263831099
+0.859003705 0.262112634
+0.860003971 0.260393169
+0.861005182 0.258670077
+0.86200581 0.256945983
+0.863006709 0.25521942
+0.864008061 0.25349007
+0.865008833 0.251759719
+0.866009708 0.250027186
+0.867010643 0.248292544
+0.868011255 0.246556462
+0.869011289 0.244819379
+0.870013027 0.243077333
+0.871014188 0.241334285
+0.872015265 0.239589377
+0.873016412 0.237842345
+0.874017562 0.236093302
+0.875018138 0.234343258
+0.876018719 0.232591204
+0.877019239 0.230837254
+0.878020612 0.229079804
+0.879021414 0.227321353
+0.880021966 0.225561339
+0.881022588 0.2237992
+0.882023921 0.222033803
+0.883024686 0.220267404
+0.884025646 0.218498658
+0.885026039 0.21672891
+0.886027052 0.214956064
+0.887027498 0.213182217
+0.888028349 0.211405652
+0.889028636 0.209628085
+0.8900303 0.207846065
+0.89103184 0.206062261
+0.892032816 0.204277455
+0.893034066 0.202490156
+0.894034755 0.200701857
+0.895036084 0.198910408
+0.896036854 0.197117957
+0.897037773 0.195323233
+0.898038573 0.193526722
+0.899039795 0.191727446
+0.90004046 0.18992717
+0.901040657 0.188125735
+0.902041837 0.186320525
+0.903042461 0.184514313
+0.904043745 0.182704907
+0.905044608 0.180894259
+0.90604568 0.179081225
+0.90704685 0.177266012
+0.908047468 0.175449797
+0.909048183 0.173631401
+0.91004892 0.171810963
+0.911049968 0.169987955
+0.912050467 0.168163946
+0.913051277 0.166337365
+0.914052372 0.164508262
+0.915052917 0.162678158
+0.916053465 0.160846049
+0.917054716 0.159010648
+0.91805542 0.157174245
+0.919056296 0.155335526
+0.920057176 0.153494793
+0.921057513 0.151653059
+0.922058521 0.149808085
+0.923058985 0.14796211
+0.924059762 0.146113556
+0.925060848 0.144262428
+0.92606148 0.142410135
+0.927061572 0.140556841
+0.928063085 0.13869891
+0.929064058 0.136839977
+0.930065542 0.134978088
+0.931066487 0.133115197
+0.932067584 0.13125002
+0.93306875 0.129382708
+0.934069379 0.127514396
+0.935070073 0.125643959
+0.936070232 0.123772521
+0.937071063 0.121897822
+0.938071361 0.120022122
+0.939072121 0.118143552
+0.940072347 0.116263982
+0.941073834 0.11438004
+0.942074787 0.112495096
+0.943076449 0.110606812
+0.944077578 0.108717526
+0.945078749 0.106826158
+0.946080071 0.1049325
+0.947080862 0.103037841
+0.948081834 0.101140836
+0.949082278 0.099242831
+0.95008348 0.097341382
+0.95108451 0.095438255
+0.952085014 0.093534126
+0.953085938 0.091627194
+0.954086337 0.089719261
+0.955086801 0.087809202
+0.95608777 0.085896177
+0.957088214 0.083982151
+0.958088406 0.082066607
+0.959088616 0.080149026
+0.960089678 0.078227811
+0.961090218 0.076305594
+0.962090446 0.074381974
+0.963091572 0.072454624
+0.964092178 0.070526272
+0.965092398 0.068596663
+0.966092367 0.066665539
+0.967092831 0.064731456
+0.968092778 0.062796373
+0.969092824 0.060859099
+0.970092534 0.058920476
+0.971092416 0.056979519
+0.972091784 0.055037563
+0.97309151 0.053092913
+0.974091408 0.051145929
+0.975090792 0.049197947
+0.976089889 0.047248528
+0.977088565 0.045297937
+0.978087703 0.043344446
+0.979086331 0.041389957
+0.980085274 0.039432855
+0.981083709 0.037474756
+0.982081926 0.035515091
+0.983080131 0.033553455
+0.984078117 0.03159026
+0.985075596 0.029626071
+0.986072881 0.027660274
+0.987069661 0.025693484
+0.988066574 0.023724446
+0.989062984 0.021754414
+0.99005913 0.01978292
+0.991054774 0.017810435
+0.992050319 0.015836164
+0.993045365 0.013860904
+0.994040223 0.011884036
+0.995034586 0.009906173
+0.996028452 0.007927323
+0.99702199 0.005947151
+0.998015124 0.003965813
+0.999007809 0.001983399
+1 0
\ No newline at end of file
diff --git a/jmetal/problem/reference_front/ZDT3.pf b/jmetal/problem/reference_front/ZDT3.pf
new file mode 100644
index 00000000..2025363b
--- /dev/null
+++ b/jmetal/problem/reference_front/ZDT3.pf
@@ -0,0 +1,1000 @@
+0 1
+0.000166987 0.98707679
+0.000355607 0.981138473
+0.000502083 0.977584873
+0.000593637 0.975624266
+0.000852686 0.970776381
+0.000959449 0.968996105
+0.001538384 0.960703436
+0.002057097 0.954511926
+0.00260491 0.94874874
+0.003076769 0.944234435
+0.003418068 0.941169425
+0.003671756 0.938982376
+0.003888964 0.937164487
+0.004263428 0.934135735
+0.004567716 0.931761905
+0.004802503 0.929978078
+0.004949127 0.928883571
+0.005223175 0.926875232
+0.005634825 0.923942232
+0.005996533 0.921439721
+0.006230375 0.919855557
+0.006430139 0.918521724
+0.006619943 0.917270109
+0.006821484 0.91595702
+0.00722916 0.913347789
+0.00767417 0.910565357
+0.008063922 0.908179559
+0.008526856 0.90540208
+0.008878581 0.903329273
+0.009136669 0.90182738
+0.009368111 0.900493519
+0.009552807 0.899437484
+0.00965735 0.898842941
+0.00997842 0.897030893
+0.010232227 0.895612687
+0.01053175 0.893954332
+0.010777834 0.892603659
+0.011084912 0.890932402
+0.011424811 0.889099967
+0.011681606 0.887727089
+0.011937598 0.886367931
+0.012245012 0.884747627
+0.01245631 0.883641137
+0.012669429 0.882530827
+0.012868345 0.881499526
+0.013058329 0.880518917
+0.013198679 0.879797165
+0.013410387 0.87871264
+0.013642969 0.877526811
+0.01393321 0.876054973
+0.014132701 0.875048293
+0.014306897 0.874172453
+0.014495654 0.873226671
+0.014929326 0.87106616
+0.01534834 0.868994346
+0.015631348 0.867603294
+0.015834666 0.866607901
+0.016201026 0.864822344
+0.01663272 0.862731102
+0.017053711 0.86070434
+0.01731916 0.859432527
+0.017534487 0.858404212
+0.01773941 0.857428309
+0.018109615 0.855671816
+0.018592095 0.853394764
+0.01895565 0.85168768
+0.019277794 0.850181042
+0.019469022 0.849289282
+0.019803716 0.847733007
+0.020297467 0.845447337
+0.020654696 0.84380096
+0.020983165 0.84229237
+0.021248701 0.841076395
+0.021501877 0.839919934
+0.021735923 0.838853341
+0.021935899 0.837943868
+0.022188499 0.836797477
+0.022411883 0.835785892
+0.022514211 0.835323187
+0.022705336 0.834460097
+0.022860718 0.833759504
+0.022957917 0.833321737
+0.02302251 0.833031029
+0.023195636 0.832252667
+0.023211686 0.832180567
+0.023512383 0.830831629
+0.023875195 0.829208665
+0.024226921 0.827640058
+0.024566863 0.826128388
+0.025031393 0.824069562
+0.02541358 0.822381551
+0.025656404 0.821311788
+0.025845806 0.820478834
+0.02595436 0.82000201
+0.026171246 0.819050581
+0.026266265 0.818634276
+0.026503558 0.817596017
+0.026906984 0.815835372
+0.027285938 0.814186694
+0.027627037 0.812706966
+0.027962482 0.8112557
+0.028138623 0.810495202
+0.028183847 0.81030012
+0.028824322 0.807544896
+0.029343034 0.805323904
+0.029767499 0.803513427
+0.030183699 0.80174433
+0.030529693 0.800278293
+0.030710755 0.799512794
+0.030833156 0.798995962
+0.031215392 0.797385439
+0.031486063 0.796248163
+0.031711983 0.795300944
+0.032068078 0.79381172
+0.032327483 0.792729788
+0.032558413 0.791768721
+0.032754558 0.790953974
+0.032908932 0.790313749
+0.03308775 0.789573275
+0.033257419 0.788871802
+0.033414587 0.788222994
+0.03370838 0.787012714
+0.033940435 0.786059118
+0.034109669 0.785365001
+0.034432558 0.784043777
+0.034752839 0.782737301
+0.034960108 0.78189401
+0.035343349 0.780339336
+0.035582444 0.779372453
+0.035812793 0.778443172
+0.036043283 0.777515538
+0.036224065 0.776789524
+0.036259701 0.776646573
+0.036498492 0.775690081
+0.03667653 0.774978527
+0.037017204 0.773620794
+0.037503679 0.771690792
+0.03786989 0.77024487
+0.038221355 0.76886287
+0.038563285 0.767523807
+0.038816341 0.766536293
+0.038923575 0.766118732
+0.039223535 0.76495361
+0.039419386 0.764195196
+0.039726415 0.763009979
+0.039899223 0.762344913
+0.040076221 0.761665242
+0.040255145 0.760979754
+0.040572065 0.759769509
+0.040801967 0.758894741
+0.040928906 0.758412893
+0.041108833 0.757731332
+0.041131237 0.757646584
+0.041426647 0.756531547
+0.041781592 0.755197841
+0.042092169 0.754036333
+0.042332294 0.753141856
+0.042467291 0.752640358
+0.042755635 0.751572532
+0.042937985 0.750899599
+0.043319976 0.749495937
+0.043731912 0.747991475
+0.044003434 0.747005143
+0.044172662 0.746392565
+0.044504403 0.745196573
+0.044779942 0.744208141
+0.045025348 0.743331624
+0.045346338 0.742190623
+0.045659982 0.741081808
+0.04604502 0.73972891
+0.046332549 0.73872467
+0.046563732 0.73792102
+0.046861215 0.736891913
+0.047143253 0.735921507
+0.047408718 0.735012859
+0.047583404 0.734417455
+0.047660632 0.734154875
+0.047904707 0.733327603
+0.048022761 0.732928897
+0.048243242 0.732186771
+0.048603076 0.730982666
+0.048890205 0.730028212
+0.049026409 0.729577443
+0.049122619 0.729259808
+0.049290632 0.728706672
+0.049455762 0.728164952
+0.049476271 0.728097805
+0.049680579 0.727430517
+0.049993754 0.726413417
+0.050141461 0.725936144
+0.050348432 0.725270023
+0.050447723 0.724951561
+0.050721169 0.724078242
+0.050994146 0.723211887
+0.051411166 0.721899044
+0.051699361 0.720999363
+0.051933356 0.720273499
+0.052013819 0.720024859
+0.052365544 0.718943803
+0.052709439 0.717896033
+0.053050501 0.716865981
+0.053324767 0.716044294
+0.053552203 0.715367421
+0.053696186 0.714941044
+0.053922679 0.714273687
+0.054272946 0.713249772
+0.054571875 0.712383813
+0.054842235 0.711606918
+0.054980734 0.711211266
+0.0552523 0.710440094
+0.055424561 0.709954103
+0.055464203 0.709842615
+0.05573551 0.709083139
+0.055925162 0.708555926
+0.056277246 0.707585265
+0.056795959 0.706174565
+0.057285635 0.704864199
+0.057650742 0.703900825
+0.057872275 0.703322019
+0.057982618 0.703035347
+0.05832337 0.70215691
+0.058510706 0.701678398
+0.058668316 0.701278258
+0.058915217 0.700655939
+0.059171206 0.700016555
+0.059331341 0.699619621
+0.059567926 0.699037486
+0.059687989 0.69874403
+0.059791927 0.698491056
+0.059853201 0.698342393
+0.060142042 0.697646276
+0.060373687 0.697093609
+0.060576078 0.69661484
+0.060764734 0.696172023
+0.060883573 0.695894798
+0.06114813 0.695282435
+0.06139336 0.694720733
+0.061625241 0.694194873
+0.06171148 0.694000608
+0.062079059 0.693180594
+0.062371947 0.692536518
+0.062586013 0.692071027
+0.063098731 0.690974247
+0.063506117 0.69012114
+0.06378443 0.689547729
+0.064091898 0.688923166
+0.064470128 0.68816777
+0.064702344 0.687711078
+0.065024953 0.687085594
+0.065233003 0.686687783
+0.065342354 0.686480448
+0.065448848 0.686279693
+0.06561723 0.685964618
+0.065656787 0.685891016
+0.065832723 0.685565591
+0.066007489 0.685245453
+0.066199541 0.684897247
+0.066307406 0.684703333
+0.066509473 0.684343279
+0.06676994 0.683885355
+0.067143616 0.683240613
+0.067362159 0.682870231
+0.067654875 0.682381906
+0.068047857 0.681740336
+0.068327052 0.681294333
+0.068733556 0.680659564
+0.069030097 0.680207468
+0.069329314 0.679760689
+0.069550522 0.679436478
+0.069753229 0.679143933
+0.070026135 0.678756964
+0.070391767 0.678250932
+0.070772901 0.677738621
+0.071291613 0.677066344
+0.071677462 0.676584983
+0.071977312 0.676221963
+0.072271235 0.67587552
+0.072496024 0.675616854
+0.072887544 0.675179364
+0.073236447 0.674803474
+0.073586173 0.674439936
+0.073837978 0.674186404
+0.074016656 0.674010677
+0.074221533 0.673813454
+0.074535368 0.673520196
+0.074832473 0.673252448
+0.075221067 0.672916761
+0.075596574 0.672608015
+0.075868863 0.672393751
+0.076078364 0.6722344
+0.07620904 0.67213743
+0.076272069 0.672091324
+0.076418791 0.671985675
+0.076574713 0.671875976
+0.076601145 0.671857642
+0.076749759 0.671755982
+0.07680785 0.6717169
+0.077048547 0.671558887
+0.077427398 0.671322979
+0.077699377 0.671163272
+0.078280084 0.670849264
+0.078852518 0.67057567
+0.079299756 0.670386711
+0.079703425 0.670234809
+0.0799847 0.670139411
+0.080152442 0.670086598
+0.080435941 0.67000426
+0.080671154 0.669942539
+0.080907606 0.669886512
+0.081119257 0.669841473
+0.081421147 0.669785578
+0.081690826 0.66974393
+0.081918188 0.669714879
+0.082376525 0.669673142
+0.082847367 0.66965362
+0.182474708 0.668295783
+0.182737304 0.666837918
+0.18299342 0.665406486
+0.183200883 0.664240102
+0.183532581 0.662362557
+0.184013092 0.65961518
+0.184413656 0.657300308
+0.184654795 0.65589608
+0.185032765 0.653679022
+0.185551477 0.650604919
+0.185903232 0.64849978
+0.186257144 0.646365211
+0.186578122 0.644415102
+0.186738136 0.643437942
+0.187056738 0.641482507
+0.187350681 0.639666921
+0.187590821 0.63817555
+0.187757285 0.637137494
+0.187838695 0.636628564
+0.18827652 0.633877463
+0.188844126 0.63027599
+0.189296192 0.627379928
+0.189647918 0.625109988
+0.189921684 0.623333209
+0.19015968 0.62178157
+0.190502156 0.619537458
+0.190743768 0.617946329
+0.190854193 0.617216964
+0.191001563 0.616241472
+0.191059222 0.615859163
+0.191379553 0.613728563
+0.191602209 0.612241076
+0.191854249 0.610550892
+0.192063063 0.609145494
+0.192270735 0.607743247
+0.192357481 0.607156192
+0.192539948 0.60591882
+0.192712783 0.604743624
+0.193225647 0.60123866
+0.193730363 0.597764016
+0.194412306 0.593030527
+0.194931018 0.58940117
+0.195290765 0.586869861
+0.195542823 0.585089515
+0.195733895 0.583736269
+0.19595069 0.582197082
+0.196147625 0.580795474
+0.19635128 0.579342656
+0.196534641 0.57803171
+0.196803376 0.576105495
+0.197060737 0.574255442
+0.197478125 0.571244137
+0.197823048 0.568745736
+0.19834176 0.564972203
+0.198758541 0.561926491
+0.199031193 0.559927655
+0.199235808 0.558424367
+0.199361432 0.557500077
+0.1995662 0.55599132
+0.199775161 0.554448959
+0.199966729 0.553032619
+0.200256494 0.550886081
+0.200381105 0.549961464
+0.200603841 0.548306528
+0.201002182 0.545339927
+0.20123379 0.543611105
+0.201529007 0.541403419
+0.201886037 0.538727626
+0.202086476 0.537222712
+0.20241467 0.534754552
+0.202772174 0.532060486
+0.202965291 0.53060293
+0.203649433 0.525427306
+0.203791847 0.524347696
+0.204075937 0.52219192
+0.204254597 0.520834769
+0.20437345 0.519931356
+0.204644532 0.517869154
+0.204856106 0.516258108
+0.205407351 0.512054736
+0.205497218 0.511368733
+0.205665061 0.510086965
+0.206061814 0.507054551
+0.206349903 0.504850604
+0.206380699 0.504614919
+0.206528998 0.503479703
+0.206538678 0.503405596
+0.206765283 0.501670195
+0.206875627 0.500824856
+0.207202589 0.498318984
+0.207986536 0.492305658
+0.208055274 0.491778134
+0.208232458 0.490418221
+0.208276792 0.490077919
+0.208457259 0.48869258
+0.2084982 0.488378283
+0.20890796 0.485232354
+0.209052098 0.484125676
+0.209632053 0.479673102
+0.209760646 0.478685982
+0.210321845 0.47437924
+0.210543329 0.472680258
+0.210613331 0.472143388
+0.211256944 0.467210172
+0.211466017 0.465608973
+0.212318702 0.459087165
+0.213171388 0.452582414
+0.214024073 0.446099191
+0.214174486 0.44495813
+0.214742981 0.440653153
+0.214876759 0.43964198
+0.215022657 0.438540054
+0.215161001 0.437496031
+0.215588042 0.434278733
+0.215671537 0.433650675
+0.215729444 0.433215281
+0.215769498 0.432914223
+0.215819374 0.432539441
+0.21640192 0.428171299
+0.21658213 0.426823601
+0.216586863 0.426788226
+0.216638298 0.426403906
+0.216671689 0.426154487
+0.216897192 0.424471674
+0.217434816 0.420471452
+0.217728662 0.418292397
+0.218287501 0.414163347
+0.219140187 0.4079038
+0.219209247 0.407399092
+0.219325954 0.406546968
+0.219773905 0.403285809
+0.219840681 0.402800985
+0.219992872 0.401697314
+0.220043496 0.401330601
+0.220366451 0.398995998
+0.220845558 0.395548386
+0.221185767 0.393112115
+0.221698243 0.3894615
+0.222484163 0.383910018
+0.222550929 0.383441118
+0.223070856 0.379804712
+0.223403614 0.377491688
+0.223674904 0.375614414
+0.224170567 0.372204697
+0.2242563 0.371617627
+0.224701246 0.368583833
+0.225108986 0.365823328
+0.225484697 0.363296681
+0.225638039 0.362270235
+0.225961671 0.36011315
+0.226814357 0.354491415
+0.226903761 0.353907269
+0.227667042 0.348962408
+0.228110395 0.346125656
+0.228452638 0.343954153
+0.228519728 0.343530368
+0.229320072 0.338523727
+0.229339646 0.338402424
+0.229372413 0.338199488
+0.229496885 0.337430013
+0.229680017 0.336302018
+0.229757772 0.335824577
+0.230027525 0.334175127
+0.230225099 0.33297391
+0.23047802 0.331444766
+0.230913944 0.328832102
+0.231077784 0.327857722
+0.231644752 0.324518398
+0.231746689 0.323923423
+0.23193047 0.322854953
+0.232264618 0.320926277
+0.23226751 0.320909664
+0.232616519 0.318914886
+0.232783155 0.317969572
+0.233412283 0.314442588
+0.233618536 0.313300932
+0.233635841 0.313205479
+0.234488527 0.308566509
+0.235078588 0.305431554
+0.235341212 0.304056423
+0.235357477 0.303971672
+0.235710637 0.302143383
+0.236149458 0.299903715
+0.236193898 0.299678906
+0.236215739 0.29956855
+0.236245157 0.299420056
+0.236522235 0.298029408
+0.236548616 0.297897757
+0.237046583 0.295437562
+0.237241238 0.29448879
+0.237354798 0.293938661
+0.237494398 0.293265818
+0.237899269 0.291335917
+0.238751954 0.287377405
+0.239147527 0.285590538
+0.239509683 0.283982539
+0.239580135 0.283672852
+0.23960464 0.283565376
+0.240457325 0.279903083
+0.24114905 0.277044304
+0.241310011 0.276393686
+0.241433614 0.275897847
+0.242088241 0.273326775
+0.242162697 0.273040247
+0.242573067 0.271482807
+0.243015382 0.269845722
+0.24320279 0.269165198
+0.243341945 0.268664967
+0.243365194 0.268581816
+0.243367401 0.268573925
+0.243710539 0.267360942
+0.24372179 0.267321618
+0.243732037 0.267285827
+0.243868068 0.266812966
+0.243983042 0.266416564
+0.244720753 0.263944725
+0.244892805 0.263386164
+0.244951724 0.263196453
+0.245176962 0.262478615
+0.245281604 0.262149119
+0.245381017 0.261838439
+0.245573439 0.261243633
+0.245573649 0.261242988
+0.245809229 0.260526552
+0.245877827 0.260320377
+0.246314 0.259035308
+0.246414109 0.258746694
+0.246426124 0.258712214
+0.24727881 0.256352872
+0.247387089 0.2560657
+0.247575938 0.255571586
+0.248018966 0.254446183
+0.248089183 0.254272174
+0.248131495 0.254167895
+0.248202017 0.253995061
+0.248684471 0.252845147
+0.248984181 0.252159448
+0.249255301 0.251558164
+0.24933718 0.251380135
+0.24934575 0.251361596
+0.249410452 0.251222222
+0.249437841 0.251163535
+0.249688818 0.250634393
+0.249755203 0.25049704
+0.249836866 0.250329575
+0.249880786 0.250240195
+0.250090145 0.24982072
+0.250525197 0.248983982
+0.250689552 0.248680191
+0.2510572 0.248025174
+0.251542238 0.247213084
+0.251662074 0.247021602
+0.251840664 0.246742991
+0.252259607 0.246121201
+0.252311552 0.246047218
+0.252394923 0.245929912
+0.25243763 0.24587051
+0.252566344 0.245694291
+0.253247609 0.244832201
+0.253532537 0.244506982
+0.253563943 0.244472413
+0.253564435 0.244471874
+0.253907663 0.24411071
+0.254100294 0.243921341
+0.254662195 0.243423853
+0.25495298 0.243198586
+0.255048859 0.243129132
+0.255193693 0.243028756
+0.255374261 0.242911274
+0.255805665 0.242665054
+0.255910039 0.242612794
+0.256421635 0.242397911
+0.256576675 0.242346346
+0.256658351 0.24232172
+0.256658883 0.242321565
+0.257018098 0.242234124
+0.257298927 0.242189415
+0.257511036 0.242169419
+0.409858202 0.234882855
+0.410004029 0.232936869
+0.41014175 0.231100335
+0.41019868 0.230341545
+0.410414178 0.227471313
+0.410883322 0.221234432
+0.410994436 0.219759724
+0.411171494 0.217411815
+0.411240429 0.216498381
+0.411308599 0.215595475
+0.411482978 0.213287588
+0.411847121 0.20847667
+0.412039628 0.205938132
+0.412699807 0.197259221
+0.413552492 0.186115408
+0.413911521 0.181447193
+0.414010512 0.180162712
+0.414106986 0.178911997
+0.414405178 0.175053238
+0.415143107 0.165551901
+0.415198612 0.164840093
+0.415257863 0.164080693
+0.415603732 0.159657348
+0.415646676 0.159109279
+0.415721443 0.158155682
+0.415808949 0.157040612
+0.416110549 0.153205718
+0.416546684 0.14768362
+0.416963234 0.142436218
+0.41781592 0.131780053
+0.418321705 0.125515908
+0.418668606 0.12124503
+0.418678787 0.121120006
+0.418681451 0.121087295
+0.418757318 0.120156245
+0.419521291 0.110838895
+0.419691299 0.108780218
+0.419744699 0.108134704
+0.420373977 0.100569333
+0.421226662 0.090443955
+0.422079348 0.080470297
+0.422842526 0.071678352
+0.422932033 0.070655812
+0.422937657 0.070591623
+0.423019187 0.069661919
+0.42315616 0.068103432
+0.423784719 0.061007865
+0.424065876 0.057864389
+0.424500296 0.053045104
+0.424637404 0.051533726
+0.424650785 0.051386476
+0.425416907 0.043030888
+0.425439343 0.042788451
+0.425457917 0.042587835
+0.42549009 0.042240565
+0.425917092 0.037657025
+0.426342776 0.033135446
+0.427195461 0.02422532
+0.427458565 0.021516447
+0.427714154 0.018903541
+0.428048147 0.015517025
+0.428797384 0.008037128
+0.428900832 0.007017271
+0.429092668 0.00513442
+0.429147886 0.004594495
+0.429268776 0.003415588
+0.429705028 -0.000802113
+0.429753518 -0.001267358
+0.429843984 -0.002133433
+0.429904663 -0.002712936
+0.43007071 -0.004292968
+0.430606203 -0.00933041
+0.430799144 -0.011123474
+0.430963078 -0.012637751
+0.431045881 -0.013399377
+0.431419174 -0.016805793
+0.431458889 -0.017165575
+0.431871141 -0.020870121
+0.432311574 -0.024766686
+0.432364093 -0.025227061
+0.432377828 -0.025347319
+0.432498439 -0.026400589
+0.432663257 -0.027832104
+0.43316426 -0.032127725
+0.433216403 -0.032569945
+0.433255957 -0.032904779
+0.433290822 -0.033199489
+0.433381994 -0.033968187
+0.433442658 -0.034478095
+0.43373407 -0.036910037
+0.43382585 -0.037669938
+0.433900165 -0.038283118
+0.434016946 -0.03924283
+0.434547667 -0.04354466
+0.434662882 -0.044465534
+0.434847861 -0.04593424
+0.434869631 -0.046106296
+0.435374956 -0.050052754
+0.435563236 -0.051499854
+0.435722317 -0.052712585
+0.436253906 -0.056698616
+0.436337888 -0.057318923
+0.436380779 -0.057634727
+0.436464632 -0.058250176
+0.436575002 -0.059056326
+0.437427688 -0.065132323
+0.437452968 -0.065308322
+0.437894024 -0.068340237
+0.438037418 -0.069310115
+0.438280373 -0.070935559
+0.438353457 -0.071420105
+0.438378751 -0.071587332
+0.438739844 -0.073947844
+0.439133059 -0.076461196
+0.439133288 -0.076462644
+0.43938526 -0.078041651
+0.439388854 -0.078063992
+0.439628825 -0.079544432
+0.439782203 -0.080478844
+0.439808569 -0.080638544
+0.439985744 -0.081704588
+0.440102581 -0.082400812
+0.440472457 -0.084569264
+0.44083843 -0.086661275
+0.441181065 -0.088571306
+0.44152638 -0.090448467
+0.441556108 -0.09060782
+0.441691115 -0.091326997
+0.441696609 -0.091356104
+0.441781296 -0.091803262
+0.441785162 -0.091823609
+0.442165858 -0.093797085
+0.442298595 -0.094471262
+0.442303225 -0.094494649
+0.442419999 -0.095081564
+0.442441563 -0.095189334
+0.442543801 -0.095697689
+0.442683391 -0.096384829
+0.442744746 -0.096684314
+0.443396487 -0.099769491
+0.443466635 -0.10009105
+0.443795099 -0.101569413
+0.443883056 -0.101957639
+0.444200092 -0.103330062
+0.444249172 -0.103538749
+0.4447258 -0.10551255
+0.445101858 -0.107002019
+0.44588935 -0.109925908
+0.445954543 -0.110156069
+0.446122009 -0.110738928
+0.446134283 -0.11078117
+0.446256835 -0.111199414
+0.446807229 -0.112997885
+0.446886282 -0.113245437
+0.447030093 -0.113688821
+0.447085841 -0.113858285
+0.447232033 -0.114296263
+0.447273521 -0.114418864
+0.447608723 -0.11538191
+0.447616724 -0.115404298
+0.447659914 -0.115524671
+0.448359614 -0.117360979
+0.4485126 -0.117733856
+0.448722179 -0.118227946
+0.449152622 -0.119181974
+0.449365285 -0.11962309
+0.44964936 -0.120181069
+0.449735342 -0.120342897
+0.449753698 -0.12037702
+0.449803967 -0.1204697
+0.450151561 -0.121079808
+0.450217971 -0.121190255
+0.450810413 -0.12208848
+0.450876298 -0.122178682
+0.451070657 -0.122433459
+0.451384306 -0.12280892
+0.45173611 -0.123177537
+0.451923342 -0.123351044
+0.452222849 -0.123595801
+0.452454762 -0.123757567
+0.452547099 -0.123815226
+0.452776028 -0.123941588
+0.452803217 -0.123955024
+0.45312425 -0.124088423
+0.453158182 -0.124099801
+0.45319617 -0.124111922
+0.453628713 -0.124203902
+0.618402076 -0.124310619
+0.618445487 -0.125067997
+0.61904971 -0.135553838
+0.619667106 -0.146157829
+0.619902396 -0.15016878
+0.6199588 -0.151127773
+0.620755081 -0.164560037
+0.620793444 -0.165202077
+0.620998308 -0.168622612
+0.621250878 -0.172820815
+0.621607767 -0.178716943
+0.621972709 -0.184701751
+0.621987621 -0.184945336
+0.622460452 -0.192628973
+0.622574606 -0.194472313
+0.623313138 -0.206285752
+0.623982575 -0.216822072
+0.623983971 -0.216843879
+0.624071076 -0.218202494
+0.62409674 -0.218602248
+0.624165823 -0.219677064
+0.624319238 -0.222057469
+0.624537804 -0.225433235
+0.624663148 -0.227360901
+0.625018509 -0.232792857
+0.625221019 -0.235866238
+0.625255576 -0.236389081
+0.625641517 -0.242195923
+0.625659114 -0.242459265
+0.625871194 -0.245623254
+0.625953237 -0.246842338
+0.62672388 -0.258158559
+0.627576566 -0.270389265
+0.627727026 -0.272515118
+0.628429251 -0.28230606
+0.628696132 -0.285969929
+0.628732575 -0.286467768
+0.629281937 -0.293899839
+0.62993944 -0.302613581
+0.630134622 -0.305161704
+0.630409901 -0.308725143
+0.630754612 -0.313136869
+0.630987308 -0.316082979
+0.631048751 -0.316856567
+0.631305113 -0.32006461
+0.631839993 -0.326655209
+0.631899944 -0.32738518
+0.632127644 -0.330141534
+0.632515107 -0.33477276
+0.632692679 -0.336870175
+0.633247821 -0.343324826
+0.633420462 -0.345300228
+0.633545364 -0.346719893
+0.633657346 -0.347985893
+0.633697176 -0.348434639
+0.633977389 -0.351568494
+0.63439805 -0.356196624
+0.634438846 -0.356640557
+0.634860799 -0.361180802
+0.635250736 -0.365292884
+0.635615442 -0.36906553
+0.636103421 -0.37400144
+0.636445264 -0.37738227
+0.636858305 -0.38138199
+0.636956107 -0.382315329
+0.636970575 -0.382452955
+0.637084518 -0.383532757
+0.637508025 -0.387483096
+0.637808792 -0.390227852
+0.638202022 -0.393739828
+0.638219477 -0.393893695
+0.638661478 -0.397732588
+0.6387381 -0.398386782
+0.638963837 -0.400294638
+0.639191805 -0.402191754
+0.639514163 -0.404823393
+0.640366849 -0.411494411
+0.64046511 -0.412235929
+0.640762708 -0.414447184
+0.640763819 -0.414455341
+0.641219534 -0.417740075
+0.642029206 -0.423272167
+0.64207222 -0.423555114
+0.642253232 -0.42473367
+0.642499118 -0.426303088
+0.642924905 -0.428934556
+0.643777591 -0.433873734
+0.643779673 -0.433885252
+0.643823459 -0.434126861
+0.644630277 -0.438368288
+0.644800747 -0.439213155
+0.644982075 -0.440092115
+0.645482962 -0.442414173
+0.646059821 -0.444894956
+0.646335648 -0.446007657
+0.646426477 -0.446363636
+0.647188333 -0.449145331
+0.647509136 -0.450207161
+0.64787214 -0.45133014
+0.648041019 -0.451824106
+0.648368061 -0.452729184
+0.64867364 -0.45351336
+0.648893704 -0.454041222
+0.649044596 -0.454385298
+0.649076965 -0.454457214
+0.649669178 -0.455654672
+0.649714196 -0.455736514
+0.64974639 -0.455794244
+0.650226236 -0.456575881
+0.650401406 -0.456824369
+0.650599075 -0.457081074
+0.65089151 -0.457414715
+0.651214227 -0.457718941
+0.651356164 -0.457831477
+0.651451761 -0.457899944
+0.651814836 -0.458106205
+0.652304447 -0.458249422
+0.823694242 -0.465639917
+0.824461132 -0.481028081
+0.824546928 -0.482730763
+0.82478499 -0.487435079
+0.824937958 -0.490442119
+0.825276478 -0.497052495
+0.82530525 -0.497611505
+0.825399613 -0.499441756
+0.825490092 -0.501192148
+0.825610895 -0.503522296
+0.825990152 -0.510785938
+0.826252299 -0.515760379
+0.826378122 -0.518134394
+0.826399899 -0.518544394
+0.826487909 -0.520198639
+0.826632393 -0.522904915
+0.826660917 -0.523437804
+0.826749317 -0.525086378
+0.826962482 -0.529043477
+0.827104985 -0.531674373
+0.827105862 -0.531690539
+0.827163132 -0.532744564
+0.82795767 -0.547171744
+0.828634118 -0.559161909
+0.828667588 -0.559748076
+0.828810356 -0.56224078
+0.82891172 -0.564003118
+0.829368248 -0.571862811
+0.829663041 -0.57687005
+0.830218057 -0.586150711
+0.830515727 -0.591048422
+0.830812672 -0.59587814
+0.831049984 -0.599697387
+0.831368412 -0.604765067
+0.832221098 -0.618009467
+0.832642596 -0.624378856
+0.833073783 -0.630771426
+0.833169062 -0.632167043
+0.83355794 -0.637799185
+0.833596218 -0.638347983
+0.833926469 -0.643041076
+0.834375646 -0.649303256
+0.83454594 -0.651640715
+0.834779154 -0.654808885
+0.834925395 -0.656776046
+0.83563184 -0.666065666
+0.835757056 -0.667675143
+0.836484526 -0.676802583
+0.836808855 -0.680748253
+0.836833229 -0.68104167
+0.837003108 -0.683074672
+0.837185378 -0.685232406
+0.837337211 -0.687011159
+0.837962168 -0.694153078
+0.838092858 -0.695609864
+0.838189897 -0.696683282
+0.838209485 -0.696899111
+0.838735166 -0.702583553
+0.838798229 -0.703251491
+0.839042582 -0.705811211
+0.83937427 -0.709213286
+0.839785209 -0.71331186
+0.839831249 -0.713762993
+0.839895268 -0.714387586
+0.840097618 -0.716341089
+0.840747953 -0.722405428
+0.841091873 -0.725479746
+0.841249875 -0.726861199
+0.841600639 -0.729858153
+0.84171139 -0.730784356
+0.842453324 -0.736739569
+0.84330601 -0.743043886
+0.843878956 -0.746953078
+0.844158696 -0.748765722
+0.844274793 -0.74949945
+0.84483828 -0.752905542
+0.845011381 -0.753900105
+0.845813994 -0.758192171
+0.845864067 -0.758442477
+0.846236939 -0.760241703
+0.846409879 -0.761037402
+0.846716752 -0.762388701
+0.846729749 -0.762444219
+0.846786533 -0.762685141
+0.847569438 -0.765735063
+0.847587321 -0.765798799
+0.847995837 -0.767182433
+0.848198255 -0.767816616
+0.848422123 -0.768478277
+0.848671685 -0.769166632
+0.848888334 -0.76972206
+0.848946663 -0.769864902
+0.849042471 -0.770093354
+0.849274809 -0.770615484
+0.849894076 -0.771786369
+0.84989561 -0.77178887
+0.850127494 -0.772144262
+0.85098018 -0.773062621
+0.851195663 -0.773197886
+0.851378205 -0.773281878
+0.851720144 -0.773363655
+0.851832865 -0.773369012
\ No newline at end of file
diff --git a/jmetal/problem/reference_front/ZDT4.pf b/jmetal/problem/reference_front/ZDT4.pf
new file mode 100644
index 00000000..2680c39e
--- /dev/null
+++ b/jmetal/problem/reference_front/ZDT4.pf
@@ -0,0 +1,1000 @@
+1E-10 0.999989473
+0.000210548 0.985489736
+0.000631265 0.974875018
+0.00116308 0.965896038
+0.001774631 0.957873636
+0.00245054 0.950497073
+0.003176897 0.943636034
+0.003950327 0.93714837
+0.004762835 0.930986705
+0.005613309 0.925077984
+0.006484427 0.91947406
+0.007382509 0.91407847
+0.008304651 0.908870141
+0.009251322 0.903816209
+0.010223535 0.898888505
+0.011203702 0.894152457
+0.012206301 0.889517873
+0.013228986 0.88498267
+0.01425332 0.880612732
+0.015286695 0.876360627
+0.01633815 0.872179227
+0.017392079 0.86812097
+0.018448234 0.864175724
+0.019514877 0.86030434
+0.020596508 0.856485163
+0.021666651 0.852804038
+0.022738313 0.849207716
+0.023822908 0.845653286
+0.024901955 0.842196467
+0.025992952 0.838776702
+0.027066063 0.835482331
+0.028150028 0.8322203
+0.029233371 0.829022309
+0.030312873 0.825894074
+0.031402162 0.822793449
+0.032491107 0.819747104
+0.03357658 0.816760867
+0.03467097 0.813798576
+0.035737015 0.810957638
+0.03681113 0.808137732
+0.03788959 0.805347514
+0.038953278 0.802634151
+0.040024329 0.799939187
+0.041089496 0.79729456
+0.042161656 0.794666963
+0.043221344 0.792102563
+0.044287608 0.789553788
+0.045341209 0.787065248
+0.046390983 0.784614338
+0.047446765 0.782177217
+0.048498354 0.779776582
+0.049545006 0.777412925
+0.050585378 0.775088066
+0.051631155 0.7727751
+0.052667329 0.770506363
+0.053708651 0.768248731
+0.054736876 0.766040867
+0.055769976 0.763843323
+0.056803762 0.761664603
+0.057831465 0.759518266
+0.058863774 0.757381422
+0.059898497 0.755258305
+0.060929865 0.753160245
+0.061960671 0.751080995
+0.062983676 0.749034513
+0.064010869 0.746996307
+0.065029993 0.74499021
+0.066045076 0.743007634
+0.06706409 0.741032647
+0.06808259 0.739073593
+0.069103523 0.737124511
+0.070117914 0.735202127
+0.071136 0.733286671
+0.07215315 0.731386616
+0.073170602 0.729499349
+0.074180682 0.727638692
+0.075192429 0.72578762
+0.076206216 0.723945266
+0.077223398 0.722109018
+0.078242556 0.720281291
+0.079251094 0.718484292
+0.080262861 0.716692992
+0.081275997 0.714910545
+0.082288448 0.713140369
+0.083301273 0.711380401
+0.084317196 0.709625766
+0.085333422 0.707881152
+0.086341193 0.706161281
+0.087351923 0.704446413
+0.08836372 0.702739644
+0.089373262 0.701046389
+0.090385671 0.699357902
+0.09139497 0.69768399
+0.09240707 0.696014688
+0.093420016 0.694353118
+0.094427542 0.692709353
+0.095437769 0.691069961
+0.096447533 0.689439968
+0.097455926 0.687820683
+0.098466941 0.686205576
+0.099473278 0.684606154
+0.100480551 0.683013327
+0.101490361 0.681424481
+0.102494993 0.679851609
+0.103502098 0.678282581
+0.104507411 0.676723939
+0.105512033 0.675173842
+0.106519058 0.673627425
+0.107523642 0.672092022
+0.108530584 0.670560196
+0.109535909 0.669037904
+0.110543551 0.667519096
+0.11155123 0.666007141
+0.112557001 0.664504842
+0.113563938 0.663007511
+0.114573116 0.661513493
+0.115578425 0.66003173
+0.116585929 0.658553183
+0.117589244 0.657087119
+0.118593086 0.655626531
+0.119599062 0.654169028
+0.120604064 0.652719041
+0.12161117 0.65127207
+0.122616893 0.64983305
+0.123622273 0.648400408
+0.124629705 0.646970674
+0.125634334 0.645550661
+0.126640979 0.644133482
+0.127647198 0.642722519
+0.128651341 0.641320002
+0.129656428 0.639921636
+0.13066347 0.638525976
+0.131666848 0.637140733
+0.132672144 0.635758124
+0.13367795 0.634380048
+0.134682449 0.633008925
+0.135685348 0.631645079
+0.136687337 0.630287494
+0.13769117 0.628932392
+0.138694059 0.627583488
+0.139696789 0.626239664
+0.140700662 0.624899131
+0.141703883 0.623564238
+0.142708885 0.622231704
+0.143711339 0.620907216
+0.144714066 0.619586979
+0.145718537 0.618269026
+0.146724196 0.616954055
+0.147728198 0.61564574
+0.148731772 0.614342416
+0.149737046 0.613041287
+0.150739561 0.61174807
+0.151743749 0.610457
+0.152749142 0.609168653
+0.153752109 0.607887633
+0.154756717 0.606608698
+0.155759238 0.605336552
+0.156762243 0.604067881
+0.157766859 0.602801236
+0.158768745 0.601542041
+0.159772217 0.60028483
+0.160774263 0.599033339
+0.161776554 0.597785438
+0.162780402 0.596539467
+0.163784477 0.595297051
+0.164786301 0.59406121
+0.165789653 0.592827244
+0.166791964 0.591598282
+0.167795785 0.590371162
+0.168799926 0.589147318
+0.169802577 0.587928917
+0.170806713 0.586712312
+0.171809342 0.585501096
+0.172813438 0.584291644
+0.173818632 0.583084382
+0.174821177 0.581883776
+0.175823924 0.580686366
+0.176826582 0.579492471
+0.177830666 0.578300266
+0.178833215 0.577113237
+0.179835826 0.575929456
+0.18083984 0.574747323
+0.18184185 0.573570815
+0.182845244 0.572395926
+0.183846892 0.571226293
+0.184849371 0.570058875
+0.185853213 0.568893038
+0.186855933 0.567731643
+0.187859267 0.56657265
+0.188862007 0.565417433
+0.189866082 0.564263748
+0.190867468 0.563116185
+0.191870172 0.561970125
+0.192873765 0.560826043
+0.193876162 0.559686291
+0.194878919 0.558549075
+0.19588297 0.55741332
+0.196883948 0.556283933
+0.197885174 0.555157136
+0.19888767 0.554031762
+0.1998904 0.552908958
+0.2008923 0.551789893
+0.201895452 0.550672222
+0.202898908 0.549556987
+0.203900702 0.548446346
+0.204901152 0.547339916
+0.205902825 0.546234835
+0.2069049 0.545131997
+0.207908192 0.544030492
+0.208909166 0.542934178
+0.209911342 0.541839175
+0.210913267 0.540747056
+0.21191524 0.539657475
+0.212918401 0.538569181
+0.213919823 0.537485327
+0.21492242 0.536402739
+0.215925047 0.535322643
+0.216927737 0.534244982
+0.217931589 0.533168565
+0.218935326 0.532094747
+0.219940216 0.531022158
+0.220940657 0.52995675
+0.221942232 0.528892547
+0.222944499 0.527830011
+0.223946892 0.526769726
+0.22495041 0.525710626
+0.225951107 0.524656853
+0.226952915 0.523604246
+0.227954623 0.522554063
+0.228956432 0.52150608
+0.229958345 0.520460278
+0.230960855 0.519416131
+0.231964455 0.518373116
+0.232965995 0.51733449
+0.233968613 0.516296979
+0.234970711 0.515262225
+0.23597182 0.514230693
+0.236973993 0.513200254
+0.237975164 0.512173019
+0.238976269 0.511148009
+0.239977453 0.510125064
+0.240978726 0.509104159
+0.241980564 0.5080848
+0.24298344 0.507066495
+0.243985524 0.506051091
+0.24498864 0.505036729
+0.245990666 0.504025539
+0.246992576 0.503016524
+0.247995503 0.502008532
+0.248997051 0.501003957
+0.249999608 0.500000392
+0.251001917 0.498999085
+0.252003884 0.498000116
+0.253005796 0.497003185
+0.254008701 0.496007241
+0.255010347 0.495014508
+0.256012979 0.494022749
+0.257015263 0.493033272
+0.25801714 0.492046124
+0.259019991 0.491059934
+0.260020818 0.490077636
+0.261022609 0.489096282
+0.262025236 0.488115994
+0.26302678 0.487138635
+0.264029279 0.486162205
+0.265031961 0.485187451
+0.266033348 0.484215793
+0.267034712 0.483245985
+0.268035788 0.482278271
+0.269037101 0.481312135
+0.270039347 0.480346897
+0.271041823 0.479383228
+0.272044069 0.47842156
+0.273045414 0.477462524
+0.274047173 0.476504849
+0.27504985 0.475548049
+0.276052615 0.474592906
+0.277056293 0.473638629
+0.278056966 0.472688929
+0.279057792 0.471740791
+0.280059517 0.470793503
+0.281060578 0.469848533
+0.282062532 0.468904404
+0.283063367 0.467963002
+0.284065089 0.467022431
+0.285066238 0.466084054
+0.286068267 0.4651465
+0.287069858 0.464210995
+0.288071283 0.463277276
+0.289073579 0.462344368
+0.290075702 0.461413237
+0.291078351 0.460483225
+0.292079886 0.459555843
+0.293082282 0.458629256
+0.294084239 0.457704658
+0.295085698 0.456782089
+0.296087073 0.455861164
+0.297088637 0.45494162
+0.298091048 0.454022851
+0.299093643 0.453105456
+0.300095032 0.452190697
+0.301096755 0.45127716
+0.302099312 0.450364382
+0.303101439 0.449453509
+0.304102902 0.448544742
+0.305105191 0.447636722
+0.306106738 0.446730864
+0.307108005 0.445826737
+0.30811009 0.444923348
+0.30911189 0.444021682
+0.310112773 0.4431223
+0.311114464 0.442223644
+0.312116751 0.441325899
+0.313118627 0.440429963
+0.314119953 0.439535949
+0.31512117 0.438643455
+0.316122977 0.437751855
+0.317125578 0.43686096
+0.318126401 0.43597305
+0.319128012 0.435085837
+0.320130103 0.434199591
+0.321131311 0.43331551
+0.322133301 0.432432118
+0.323135178 0.431550197
+0.324135816 0.430670732
+0.325137227 0.429791944
+0.326137921 0.428915137
+0.327139383 0.428039003
+0.328140137 0.427164826
+0.329141031 0.426291859
+0.330142687 0.425419556
+0.331144334 0.424548583
+0.332144619 0.423680107
+0.333145658 0.422812285
+0.334146954 0.421945545
+0.335148809 0.421079618
+0.336151033 0.420214667
+0.337152451 0.419351698
+0.338154615 0.418489369
+0.339156631 0.417628442
+0.34015939 0.416768151
+0.341160455 0.415910576
+0.34216203 0.415053823
+0.343164338 0.414197697
+0.344165195 0.413344058
+0.345166256 0.412491485
+0.346167658 0.411639857
+0.347169785 0.410788845
+0.348170901 0.409939917
+0.349172738 0.409091599
+0.350174624 0.408244456
+0.351175766 0.407399152
+0.352177419 0.40655462
+0.353179786 0.405710688
+0.354182695 0.404867498
+0.355182773 0.404027876
+0.356183556 0.403188844
+0.35718499 0.402350445
+0.35818578 0.401513759
+0.35918727 0.400677658
+0.360188287 0.399843115
+0.36119 0.399009152
+0.362190867 0.398177047
+0.363192426 0.397345517
+0.364193638 0.39651542
+0.365195539 0.395685894
+0.366196905 0.394857947
+0.367198467 0.394030969
+0.368200712 0.393204555
+0.36920194 0.392380102
+0.370203847 0.391556209
+0.371205538 0.390733607
+0.372207905 0.38991156
+0.373208988 0.38909167
+0.374210008 0.38827293
+0.375211699 0.387454737
+0.376213324 0.38663769
+0.377214826 0.385821829
+0.378215706 0.385007556
+0.379217249 0.384193822
+0.3802181 0.383381723
+0.381219611 0.382570157
+0.382220602 0.381760078
+0.383222249 0.380950528
+0.384223571 0.380142298
+0.385225176 0.379334892
+0.386227434 0.378528011
+0.387228228 0.377723351
+0.388229669 0.376919211
+0.389230742 0.376116404
+0.390232458 0.375314112
+0.39123468 0.374512446
+0.392236807 0.373711881
+0.393237813 0.372913233
+0.394239457 0.372115093
+0.395240585 0.371318376
+0.396242347 0.370522164
+0.397243596 0.369727364
+0.398245477 0.368933065
+0.399247219 0.368139874
+0.400248048 0.367348399
+0.401248956 0.366557851
+0.402249684 0.36576843
+0.403250353 0.364980037
+0.404251643 0.364192134
+0.405252743 0.363405354
+0.406254463 0.36261906
+0.407255769 0.361834059
+0.408257691 0.36104954
+0.409258995 0.360266465
+0.410260913 0.35948387
+0.411262607 0.358702404
+0.412263632 0.35792241
+0.413265265 0.357142889
+0.414267443 0.356363889
+0.41526888 0.355586406
+0.416270921 0.354809392
+0.417272012 0.354034047
+0.418273704 0.353259168
+0.419274758 0.352485708
+0.420276411 0.35171271
+0.421277298 0.350941221
+0.422278781 0.350170191
+0.423280403 0.349399967
+0.424281319 0.348631196
+0.425282826 0.347862878
+0.426283754 0.347095908
+0.427284657 0.346329856
+0.428285633 0.345564646
+0.429287194 0.344799882
+0.430288825 0.344035958
+0.431290432 0.343272939
+0.432291034 0.342511571
+0.433291987 0.341750817
+0.434293518 0.340990502
+0.435295398 0.3402308
+0.436297352 0.339471915
+0.437298238 0.338714708
+0.438299698 0.337957934
+0.439300627 0.337202424
+0.440302126 0.336447345
+0.44130349 0.335693226
+0.442305422 0.334939535
+0.443306896 0.334187041
+0.444308574 0.333435244
+0.445309687 0.332684717
+0.446310797 0.331935035
+0.44731247 0.331185773
+0.448313026 0.330438184
+0.44931414 0.329691011
+0.450315579 0.328944429
+0.451316367 0.328199162
+0.452317635 0.327454362
+0.453319459 0.326709974
+0.454320405 0.325967059
+0.455321904 0.325224553
+0.456323793 0.324482574
+0.457324275 0.323742449
+0.458325305 0.323002729
+0.459326281 0.322263856
+0.460327802 0.321525386
+0.461329145 0.32078785
+0.462331031 0.320050714
+0.463332062 0.319315005
+0.464333635 0.318579693
+0.465335654 0.317844846
+0.466336105 0.317111938
+0.467337093 0.316379423
+0.46833784 0.315647868
+0.469339123 0.314916704
+0.470340235 0.314186443
+0.471341017 0.313457199
+0.472342332 0.312728342
+0.473343453 0.312000398
+0.474345104 0.311272838
+0.475346708 0.31054608
+0.47634731 0.309820814
+0.477348437 0.309095928
+0.478349542 0.308371818
+0.479351171 0.307648087
+0.480352287 0.306925482
+0.481353925 0.306203254
+0.482355569 0.305481772
+0.483356552 0.304761514
+0.484358054 0.304041629
+0.485358432 0.303323294
+0.486358965 0.302605589
+0.487360013 0.301888252
+0.488361214 0.301171542
+0.489362079 0.300455807
+0.490363455 0.299740437
+0.491364286 0.299026188
+0.492365388 0.298312471
+0.493367 0.297599117
+0.494368883 0.296886294
+0.49537009 0.296174673
+0.496371804 0.295463412
+0.497373252 0.294753056
+0.498375204 0.294043058
+0.499377073 0.293333832
+0.5003794 0.292624994
+0.501379872 0.291918174
+0.502380844 0.291211707
+0.503381784 0.290505966
+0.504383223 0.289800576
+0.505384188 0.289096218
+0.50638565 0.288392208
+0.507386833 0.287689089
+0.508387758 0.286986846
+0.509389176 0.286284948
+0.510390754 0.285583627
+0.511392083 0.284883168
+0.512393903 0.284183052
+0.513395464 0.283483801
+0.51439631 0.28278573
+0.515397288 0.282088245
+0.516398318 0.281391402
+0.517399834 0.280694895
+0.5184014 0.279999028
+0.519402336 0.27930427
+0.52040323 0.278610209
+0.521404345 0.277916663
+0.522405453 0.277223788
+0.52340704 0.276531245
+0.524408322 0.275839575
+0.525410081 0.275148235
+0.526410989 0.274458141
+0.527412373 0.273768375
+0.528413336 0.273079553
+0.529414427 0.272391295
+0.53041535 0.271703803
+0.531416746 0.271016636
+0.532417804 0.270330346
+0.533419333 0.269644379
+0.534420269 0.268959461
+0.535421675 0.268274864
+0.536422998 0.267590963
+0.537424788 0.266907381
+0.538425652 0.266225067
+0.539426564 0.265543355
+0.54042794 0.264861959
+0.541428973 0.264181427
+0.542430468 0.26350121
+0.543431388 0.262822011
+0.544432768 0.262143125
+0.545433211 0.261465498
+0.546434114 0.260788181
+0.547435307 0.260111288
+0.548436619 0.259434933
+0.54943722 0.258759675
+0.550437921 0.258084964
+0.551439077 0.25741056
+0.552440331 0.256736702
+0.553441948 0.25606321
+0.554443144 0.25539061
+0.555444447 0.254718545
+0.556445625 0.25404717
+0.557447254 0.253376096
+0.55844788 0.252706296
+0.559448954 0.252036796
+0.560449962 0.25136794
+0.561451256 0.250699489
+0.562452996 0.250031337
+0.563454172 0.249364155
+0.564455029 0.248697778
+0.56545633 0.248031696
+0.56645738 0.247366371
+0.567458873 0.246701339
+0.568460314 0.246036928
+0.569461129 0.245373517
+0.570462383 0.244710398
+0.571463437 0.244047993
+0.57246493 0.243385878
+0.573465981 0.242724633
+0.57446747 0.242063677
+0.575468208 0.241403791
+0.576469382 0.240744192
+0.577470407 0.240085263
+0.578471866 0.23942662
+0.579472971 0.23876878
+0.580474509 0.238111223
+0.581475587 0.237454534
+0.582477098 0.236798128
+0.583478177 0.236142568
+0.584479686 0.235487288
+0.585481248 0.234832536
+0.586481962 0.234178897
+0.587482637 0.23352584
+0.588483348 0.232873317
+0.589484485 0.23222107
+0.590485656 0.231569355
+0.591486649 0.230918308
+0.592487852 0.230267675
+0.593489183 0.229617508
+0.594490938 0.228967616
+0.595491798 0.22831885
+0.596492587 0.227670675
+0.597493795 0.227022772
+0.598495325 0.226375204
+0.599496559 0.225728369
+0.600498211 0.225081804
+0.601500218 0.224435549
+0.602501343 0.2237904
+0.603502294 0.223145899
+0.604503365 0.222501855
+0.605504674 0.221858192
+0.606506397 0.221214794
+0.607506771 0.220572793
+0.608507557 0.219931057
+0.60950842 0.219289798
+0.610509695 0.218648802
+0.611510758 0.218008467
+0.612512231 0.217368394
+0.613513664 0.21672887
+0.614514997 0.216089931
+0.615516738 0.215451252
+0.616517872 0.21481348
+0.617519412 0.214175966
+0.618520247 0.213539418
+0.619521071 0.212903392
+0.620522299 0.212267622
+0.621523514 0.211632374
+0.62252478 0.210997605
+0.623526449 0.210363091
+0.624527035 0.209729771
+0.625527608 0.209096967
+0.626528581 0.208464416
+0.627529817 0.207832204
+0.628531179 0.207200417
+0.629532032 0.206569454
+0.630533283 0.205938741
+0.631534416 0.205308603
+0.632535485 0.204679005
+0.633536951 0.204049656
+0.634537941 0.203421102
+0.635539029 0.202792983
+0.636540511 0.202165111
+0.637541408 0.201538099
+0.638542217 0.200911634
+0.639543418 0.200285415
+0.640544112 0.199660002
+0.641545197 0.199034834
+0.64254649 0.198410024
+0.643547294 0.197786005
+0.644548487 0.197162229
+0.645549807 0.196538858
+0.646550989 0.195916056
+0.647552064 0.195293803
+0.648553526 0.19467179
+0.6495552 0.194050126
+0.650556178 0.193429372
+0.651557168 0.192809088
+0.652558542 0.192189043
+0.653559927 0.191569467
+0.654560847 0.190950652
+0.65556215 0.190332074
+0.656563074 0.189714202
+0.657564379 0.189096566
+0.658565016 0.188479812
+0.659565663 0.187863519
+0.66056669 0.187247461
+0.661567466 0.186632023
+0.66256849 0.186016898
+0.663569892 0.185402006
+0.664570991 0.184787763
+0.665572467 0.184173752
+0.666574278 0.183559997
+0.667575358 0.182947151
+0.668576814 0.182334534
+0.669577622 0.181722772
+0.670578805 0.181111238
+0.671579758 0.180500301
+0.672580737 0.179889802
+0.67358209 0.17927953
+0.674583469 0.178669696
+0.675585005 0.178060218
+0.676586221 0.177451387
+0.677587808 0.176842781
+0.67858923 0.176234724
+0.679591021 0.175626892
+0.680591809 0.175020116
+0.681592966 0.174413562
+0.682594232 0.173807388
+0.68359508 0.173201911
+0.684596293 0.172596656
+0.685597419 0.171991897
+0.686598911 0.171387358
+0.687599545 0.170783777
+0.688600269 0.17018058
+0.689601358 0.169577603
+0.690602536 0.168975009
+0.691603432 0.168373021
+0.692604692 0.167771251
+0.693605477 0.1671702
+0.694606261 0.166569583
+0.695607223 0.165969292
+0.696608545 0.165369216
+0.697610045 0.164769466
+0.698610572 0.164170728
+0.699611457 0.163572204
+0.700612126 0.162974238
+0.701613152 0.162376485
+0.702614378 0.16177904
+0.703615646 0.161181995
+0.704616604 0.160585559
+0.705617918 0.159989335
+0.706618814 0.159393782
+0.707619794 0.158798601
+0.708621129 0.15820363
+0.709622548 0.157609029
+0.710624199 0.15701471
+0.711625281 0.156421147
+0.712626376 0.155827994
+0.713627823 0.155235049
+0.714628796 0.1546428
+0.71563012 0.154050758
+0.716631665 0.153459
+0.717632687 0.152867964
+0.718634058 0.152277134
+0.719635024 0.151686954
+0.720636339 0.151096979
+0.721636966 0.150507819
+0.72263794 0.149918863
+0.723638853 0.14933035
+0.724640112 0.148742041
+0.725640761 0.148154497
+0.726641698 0.147567188
+0.727642981 0.146980082
+0.728644331 0.14639334
+0.729645722 0.145806976
+0.730647141 0.145220999
+0.731647945 0.144635783
+0.732649091 0.144050766
+0.733650241 0.143466147
+0.734651733 0.142881728
+0.735652824 0.14229794
+0.736654257 0.14171435
+0.73765549 0.141131273
+0.738656039 0.14054899
+0.739656926 0.139966904
+0.740657753 0.139385247
+0.741658918 0.138803787
+0.742659881 0.138222836
+0.743661181 0.137642081
+0.744662119 0.137061926
+0.745663393 0.136481967
+0.746664314 0.135902601
+0.747665571 0.13532343
+0.748666737 0.134744699
+0.749667809 0.134166408
+0.750669216 0.13358831
+0.751670091 0.133010905
+0.752671298 0.132433692
+0.753672654 0.131856778
+0.754673667 0.131280444
+0.755675013 0.130704301
+0.756675972 0.130128762
+0.757677262 0.129553413
+0.758678308 0.128978584
+0.759679684 0.128403944
+0.760680729 0.127829874
+0.761682104 0.127255992
+0.762683589 0.126682424
+0.763684422 0.126109605
+0.764685583 0.125536975
+0.765686692 0.124964748
+0.766688128 0.124392709
+0.767689005 0.123821362
+0.768689889 0.123250384
+0.7696911 0.122679591
+0.770692133 0.12210927
+0.771693493 0.121539134
+0.77269404 0.12096983
+0.773694911 0.12040071
+0.774695721 0.119831993
+0.775696499 0.119263661
+0.7766976 0.118695512
+0.777698621 0.118127775
+0.778699964 0.117560221
+0.779701391 0.116992984
+0.780702839 0.116426099
+0.781703234 0.115860173
+0.782703818 0.115294502
+0.783704723 0.114729012
+0.784705817 0.114163775
+0.785706744 0.113598994
+0.786707661 0.113034577
+0.787708897 0.11247034
+0.788710123 0.111906468
+0.789711097 0.111343094
+0.790712141 0.110780038
+0.791713502 0.11021716
+0.792714519 0.109654832
+0.793715852 0.10909268
+0.794716824 0.108531087
+0.79571811 0.10796967
+0.796719447 0.107408578
+0.797720293 0.106848113
+0.798721454 0.106287824
+0.799722298 0.105728062
+0.800723456 0.105168476
+0.801724835 0.104609116
+0.802725503 0.104050502
+0.803726484 0.103492062
+0.804727656 0.102933862
+0.805728455 0.102376218
+0.806729565 0.101818746
+0.807730547 0.101261692
+0.808731439 0.100705032
+0.809732641 0.100148545
+0.810734043 0.099592291
+0.811735538 0.099036328
+0.812736432 0.098481042
+0.813737634 0.097925927
+0.814738943 0.097371093
+0.815739877 0.096816809
+0.816741119 0.096262694
+0.817741965 0.095709137
+0.818743117 0.09515575
+0.819744154 0.094602764
+0.820745167 0.09405013
+0.821746485 0.093497664
+0.82274736 0.092945779
+0.823748245 0.092394224
+0.824749433 0.091842837
+0.825750629 0.09129178
+0.826752045 0.090740936
+0.827753079 0.090190636
+0.828754415 0.089640502
+0.82975574 0.089090707
+0.830757366 0.088541078
+0.831758642 0.087991973
+0.832759871 0.087443223
+0.833761401 0.086894638
+0.83476259 0.08634657
+0.835763692 0.085798878
+0.836765094 0.085251349
+0.837766409 0.084704196
+0.838767089 0.084157716
+0.839768067 0.083611399
+0.840769119 0.083065368
+0.841770221 0.082519635
+0.842771621 0.081974063
+0.843772283 0.081429217
+0.844773242 0.080884533
+0.845774443 0.08034004
+0.846775502 0.079795945
+0.847776858 0.079252012
+0.848777719 0.078708668
+0.849778876 0.078165483
+0.850780088 0.077622589
+0.851781595 0.077079855
+0.852782292 0.076537877
+0.853783283 0.075996059
+0.854784193 0.075454602
+0.855785231 0.074913393
+0.856786562 0.074372342
+0.857787302 0.073831926
+0.858788335 0.073291667
+0.859789487 0.072751658
+0.860790301 0.072212146
+0.861791407 0.071672791
+0.86279227 0.071133879
+0.863793424 0.070595124
+0.864794379 0.070056787
+0.865795501 0.069518672
+0.866796913 0.068980713
+0.867797847 0.068443321
+0.86879907 0.067906083
+0.869799865 0.067369385
+0.870800744 0.06683295
+0.871801652 0.066296807
+0.872802848 0.065760819
+0.873804073 0.065225122
+0.87480493 0.064689928
+0.875806074 0.064154888
+0.876807161 0.063620183
+0.877808238 0.063085789
+0.878809601 0.062551548
+0.879810501 0.062017857
+0.880811362 0.06148449
+0.881812507 0.060951275
+0.882813614 0.060418384
+0.88381461 0.059885853
+0.884815527 0.059353665
+0.885816728 0.058821628
+0.886817538 0.058290099
+0.88781863 0.05775872
+0.888819906 0.057227543
+0.8898209 0.056696814
+0.890822176 0.056166235
+0.891822967 0.05563621
+0.892824039 0.055106334
+0.893824892 0.054576871
+0.894825699 0.054047729
+0.895826786 0.053518734
+0.896827827 0.05299006
+0.897828832 0.052461699
+0.898830116 0.051933486
+0.899831131 0.051405708
+0.900832425 0.050878077
+0.901833502 0.050350853
+0.902834379 0.049824027
+0.903835533 0.049297348
+0.904836832 0.048770884
+0.905838142 0.048244705
+0.906839163 0.047718969
+0.907840035 0.0471936
+0.908841183 0.046668377
+0.909842365 0.046143426
+0.910843129 0.045618981
+0.91184408 0.045094727
+0.912845306 0.044570617
+0.913846175 0.044046981
+0.914847317 0.043523489
+0.91584854 0.04300024
+0.916849703 0.04247731
+0.917850803 0.041954697
+0.918852008 0.041432315
+0.919853485 0.040910074
+0.920854219 0.040388506
+0.921855225 0.039867079
+0.92285629 0.039345905
+0.923857541 0.038824917
+0.924858469 0.038304378
+0.925859668 0.037783981
+0.926860612 0.037263997
+0.927861825 0.036744154
+0.92886271 0.036224762
+0.929863864 0.03570551
+0.930865196 0.035186445
+0.931866615 0.034667614
+0.932867402 0.034149389
+0.933868458 0.033631304
+0.934869383 0.033113563
+0.935870577 0.03259596
+0.936871497 0.032078775
+0.937872686 0.031561729
+0.938874082 0.031044851
+0.939874896 0.030528548
+0.940875818 0.030012465
+0.941877007 0.029496519
+0.942878304 0.028980791
+0.943879368 0.028465457
+0.94488035 0.027950439
+0.945881425 0.027435645
+0.946882764 0.026920988
+0.947883916 0.026406699
+0.948885333 0.025892546
+0.949886316 0.025378886
+0.950887563 0.024865362
+0.951888409 0.024352313
+0.952889519 0.023839399
+0.953890777 0.023326679
+0.954892066 0.022814211
+0.955893 0.022302194
+0.956894195 0.021790311
+0.957895178 0.021278805
+0.958896422 0.020767432
+0.959897632 0.020256344
+0.960898621 0.019745635
+0.961899872 0.019235058
+0.962900965 0.018724827
+0.963902319 0.018214729
+0.964903805 0.017704828
+0.965905057 0.017195311
+0.966906568 0.016685926
+0.967907673 0.016177011
+0.968909038 0.015668228
+0.96991048 0.015159668
+0.970912181 0.014651239
+0.971914114 0.014142955
+0.97291547 0.013635225
+0.973916926 0.013127705
+0.97491864 0.012620316
+0.975920408 0.01211316
+0.976922433 0.011606135
+0.977924167 0.011099516
+0.978926069 0.010593072
+0.979928199 0.010086772
+0.980930586 0.009580601
+0.981933085 0.009074632
+0.982935517 0.008568955
+0.983938206 0.008063407
+0.984941084 0.00755802
+0.985943789 0.007052978
+0.986946632 0.006548123
+0.987949729 0.006043397
+0.988952849 0.005538915
+0.989956223 0.005034562
+0.990959736 0.004530394
+0.991963354 0.004026429
+0.992967226 0.003522592
+0.993971225 0.003018945
+0.994975478 0.002515425
+0.995979929 0.00201206
+0.996984613 0.001508832
+0.997989495 0.001005758
+0.998994621 0.000502816
+1 0
\ No newline at end of file
diff --git a/jmetal/problem/reference_front/ZDT6.pf b/jmetal/problem/reference_front/ZDT6.pf
new file mode 100644
index 00000000..6e240aaf
--- /dev/null
+++ b/jmetal/problem/reference_front/ZDT6.pf
@@ -0,0 +1,1000 @@
+0.280775319 0.92116522
+0.281499068 0.920758275
+0.282222229 0.920350613
+0.282944464 0.91994243
+0.283665793 0.919533718
+0.284387387 0.919123814
+0.285109031 0.91871284
+0.285829762 0.918301347
+0.286549863 0.917889176
+0.287269615 0.917476168
+0.287989783 0.917061885
+0.28870905 0.916647084
+0.289429667 0.916230468
+0.290150028 0.915812961
+0.290869496 0.915394937
+0.291588714 0.914976022
+0.292308153 0.914555944
+0.293028387 0.914134364
+0.293747736 0.913712268
+0.294468657 0.91328821
+0.295188697 0.912863634
+0.295909219 0.912437734
+0.296628864 0.912011317
+0.297348605 0.911583807
+0.298068798 0.911154992
+0.298788994 0.910725137
+0.299508759 0.910294503
+0.300227658 0.909863353
+0.300948579 0.909429953
+0.301669222 0.908995681
+0.302389003 0.908560891
+0.303109371 0.908124709
+0.303828883 0.90768801
+0.3045484 0.907250272
+0.305268871 0.906810916
+0.305988492 0.906371043
+0.306708669 0.905929793
+0.307428 0.905488025
+0.308148104 0.905044746
+0.308867366 0.90460095
+0.309587509 0.904155574
+0.310306815 0.903709681
+0.311026996 0.903262208
+0.311746779 0.902813946
+0.312465731 0.902365167
+0.313185512 0.901914835
+0.313905711 0.901463204
+0.314626023 0.901010466
+0.315345509 0.90055721
+0.316065112 0.900102845
+0.316785545 0.899646918
+0.317505159 0.899190474
+0.318225646 0.898732438
+0.318945318 0.898273884
+0.319665319 0.897814084
+0.320385434 0.897353174
+0.32110474 0.896891746
+0.321825549 0.896428316
+0.322545551 0.895964367
+0.323265416 0.895499471
+0.323984746 0.895033884
+0.324705403 0.894566402
+0.32542526 0.8940984
+0.326146153 0.893628687
+0.326866249 0.893158455
+0.327585737 0.892687585
+0.328305373 0.892215582
+0.32902613 0.891741806
+0.329746098 0.891267511
+0.330466369 0.890791979
+0.331186705 0.890315367
+0.331906257 0.889838236
+0.332625465 0.8893603
+0.333345893 0.888880516
+0.334065542 0.888400214
+0.334785756 0.887918498
+0.335505195 0.887436264
+0.33622541 0.886952474
+0.336944854 0.886468166
+0.337664781 0.885982496
+0.338383941 0.885496309
+0.33910425 0.885008308
+0.339824202 0.884519512
+0.340544537 0.884029418
+0.341264111 0.883538807
+0.341983154 0.883047522
+0.342703317 0.882554436
+0.343423772 0.882060113
+0.344143712 0.881565105
+0.3448629 0.88106958
+0.345582548 0.880572703
+0.346302137 0.88007483
+0.347022403 0.879575452
+0.347743009 0.8790748
+0.348462869 0.878573629
+0.349183069 0.878071184
+0.349903006 0.877567886
+0.350622546 0.87706383
+0.351341348 0.876559257
+0.352061845 0.876052458
+0.352782289 0.875544656
+0.353501998 0.875036337
+0.354222955 0.874526098
+0.354943179 0.87401534
+0.355662955 0.873503863
+0.356382569 0.872991465
+0.35710254 0.872477776
+0.357823192 0.871962564
+0.358543117 0.871446833
+0.359263435 0.870929784
+0.359983032 0.870412217
+0.360702707 0.869893557
+0.361421665 0.86937438
+0.362142066 0.868853124
+0.362862305 0.868330948
+0.36358183 0.867808253
+0.364301196 0.867284639
+0.365020451 0.86676007
+0.365740585 0.866233825
+0.36646001 0.865707061
+0.367179589 0.865179149
+0.367900454 0.864649256
+0.368620672 0.8641188
+0.3693408 0.863587373
+0.370060227 0.863055429
+0.370779936 0.862522239
+0.371498946 0.861988533
+0.372218264 0.861453564
+0.372936887 0.860918078
+0.373657933 0.860379749
+0.374378283 0.859840901
+0.375098148 0.85930138
+0.375817997 0.858760834
+0.376537156 0.85821977
+0.377258115 0.857676314
+0.377978386 0.85713234
+0.378698031 0.856587802
+0.379417552 0.856042322
+0.380138236 0.855494921
+0.380858238 0.854947003
+0.381579057 0.854397423
+0.382299701 0.853846939
+0.383019666 0.853295935
+0.38373946 0.852744027
+0.384459889 0.852190594
+0.385179643 0.851636642
+0.385899355 0.851081688
+0.386618396 0.850526216
+0.387337639 0.849969554
+0.388057454 0.849411413
+0.388777149 0.848852329
+0.389496177 0.848292728
+0.390216268 0.847731264
+0.390936155 0.847168923
+0.39165538 0.846606064
+0.392376004 0.846041072
+0.393095966 0.845475562
+0.39381683 0.844908305
+0.394537034 0.844340529
+0.395257448 0.84377155
+0.39597735 0.843201938
+0.396697341 0.84263122
+0.397416678 0.842059984
+0.398136719 0.841487153
+0.398856558 0.840913446
+0.399575747 0.840339222
+0.40029527 0.839763697
+0.401015708 0.839186402
+0.401736077 0.838608125
+0.4024558 0.838029329
+0.403175458 0.83744955
+0.40389572 0.836868248
+0.404615635 0.836286188
+0.405335108 0.83570345
+0.406053942 0.835120196
+0.406774652 0.834534382
+0.407494724 0.83394805
+0.408214975 0.833360535
+0.40893459 0.832772501
+0.40965434 0.832183322
+0.41037509 0.831592286
+0.411095598 0.831000409
+0.411815475 0.830408015
+0.412535718 0.829814282
+0.413255633 0.829219782
+0.413975929 0.828623931
+0.414695598 0.828027561
+0.415415679 0.827429813
+0.41613594 0.82683088
+0.416855577 0.826231428
+0.417575823 0.825630433
+0.418295986 0.825028468
+0.419015529 0.824425987
+0.419735696 0.823821945
+0.420455686 0.823217017
+0.421175058 0.82261157
+0.421895113 0.822004514
+0.422614981 0.821396578
+0.423335018 0.820787463
+0.424054443 0.82017783
+0.424774038 0.819567017
+0.42549453 0.818954405
+0.426214412 0.818341275
+0.4269345 0.817726933
+0.427654348 0.817111759
+0.428373589 0.816496068
+0.429092594 0.815879546
+0.429812895 0.815260876
+0.430533279 0.814641095
+0.431253062 0.814020797
+0.43197293 0.813399388
+0.432692908 0.812776847
+0.433412793 0.812153351
+0.434132332 0.811529118
+0.43485231 0.810903468
+0.435571692 0.810277301
+0.436291514 0.809649715
+0.437011463 0.809020982
+0.437731468 0.808391162
+0.438451463 0.807760314
+0.439170867 0.80712895
+0.43989148 0.806495486
+0.440611502 0.805861504
+0.441332152 0.805225932
+0.442052342 0.804589727
+0.442772313 0.803952679
+0.443491699 0.803315113
+0.44421222 0.802675504
+0.444932157 0.802035376
+0.445651744 0.801394523
+0.446371908 0.80075212
+0.44709208 0.800108672
+0.447811967 0.799464442
+0.448532274 0.798818799
+0.4492525 0.798172191
+0.449972149 0.797525065
+0.450692414 0.796876348
+0.451412815 0.796226471
+0.45213264 0.795576076
+0.452853116 0.794924055
+0.45357302 0.794271516
+0.454292866 0.793617992
+0.455012393 0.792963722
+0.455731792 0.792308534
+0.456451547 0.791651985
+0.457171639 0.790994093
+0.457891163 0.790335683
+0.458610237 0.78967665
+0.459330328 0.78901565
+0.460049855 0.788354131
+0.460770106 0.787690909
+0.461489795 0.787027169
+0.462209778 0.786362122
+0.462929554 0.785696228
+0.463649678 0.785028976
+0.464369243 0.784361206
+0.46508959 0.783691673
+0.465809379 0.783021622
+0.466529455 0.782350268
+0.467248974 0.781678396
+0.467969159 0.781004867
+0.468689412 0.780330235
+0.469409112 0.779655086
+0.470128882 0.778978834
+0.470848171 0.778302
+0.471568624 0.777623033
+0.472289087 0.776943018
+0.47300944 0.776262069
+0.473729245 0.775580602
+0.474449523 0.77489765
+0.475170063 0.774213411
+0.475890057 0.773528653
+0.476609926 0.772842979
+0.477329903 0.772156164
+0.478049337 0.771468831
+0.478768882 0.770780358
+0.479489194 0.770090113
+0.480208964 0.769399351
+0.480929234 0.768707072
+0.481648965 0.768014275
+0.482368899 0.767320245
+0.483089055 0.766624965
+0.483808675 0.765929167
+0.484529217 0.765231438
+0.485249507 0.764532916
+0.485969262 0.763833877
+0.48668874 0.763134071
+0.487408762 0.762432698
+0.488128253 0.761730809
+0.488847778 0.76102785
+0.489567255 0.760323903
+0.490287164 0.759618497
+0.4910075 0.758911635
+0.491727307 0.758204255
+0.492447587 0.757495374
+0.49316734 0.756785975
+0.493887251 0.756075384
+0.49460738 0.755363539
+0.495327846 0.754650325
+0.496047788 0.753936592
+0.496768153 0.753221402
+0.497487995 0.752505694
+0.49820804 0.751788749
+0.498927564 0.751071286
+0.499646927 0.750352949
+0.500367235 0.74963263
+0.501087299 0.748911519
+0.501807256 0.748189477
+0.502526698 0.747466918
+0.503246034 0.746743429
+0.503966512 0.746017755
+0.504686907 0.745291126
+0.505406788 0.744563979
+0.506126445 0.743836022
+0.506846167 0.743106963
+0.507566505 0.742376243
+0.508286331 0.741645006
+0.509005835 0.740913061
+0.509725902 0.740179505
+0.510445462 0.739445431
+0.51116529 0.738710046
+0.511884612 0.737974144
+0.512604924 0.737236192
+0.513325271 0.736497166
+0.514045384 0.735757344
+0.5147657 0.735016274
+0.515485512 0.734274687
+0.516205843 0.733531527
+0.516925672 0.73278785
+0.517645313 0.73204333
+0.518365146 0.731297575
+0.51908448 0.730551303
+0.519804909 0.729802857
+0.520524991 0.729053734
+0.521245296 0.728303341
+0.521965104 0.72755243
+0.522685136 0.726800249
+0.523405048 0.726047155
+0.524124466 0.725293544
+0.524844433 0.724538322
+0.525564561 0.723781892
+0.526284197 0.723024944
+0.527003472 0.722267341
+0.527723858 0.72150753
+0.528443753 0.720747201
+0.529163406 0.71998609
+0.529883944 0.719223006
+0.530603991 0.718459404
+0.531323778 0.717695043
+0.53204353 0.716929682
+0.53276325 0.716163319
+0.533483447 0.715395412
+0.534203659 0.714626451
+0.534923385 0.713856972
+0.535643343 0.713086209
+0.536362818 0.712314928
+0.537083413 0.711541407
+0.537803575 0.710767315
+0.538523254 0.709992705
+0.539243552 0.709216392
+0.539963369 0.70843956
+0.540684104 0.7076607
+0.541404461 0.706881209
+0.54212434 0.7061012
+0.542843977 0.705320417
+0.54356319 0.704539058
+0.54428352 0.70375545
+0.545003373 0.702971323
+0.545723475 0.702185889
+0.546443553 0.701399444
+0.547163156 0.70061248
+0.547883081 0.69982413
+0.548602532 0.699035262
+0.54932259 0.698244692
+0.550042176 0.697453605
+0.550762423 0.696660754
+0.551482199 0.695867385
+0.5522019 0.695073061
+0.552922253 0.694276982
+0.553642137 0.693480384
+0.554362493 0.692682226
+0.555082381 0.69188355
+0.555802685 0.691083375
+0.556522523 0.690282682
+0.557242353 0.68948096
+0.557962353 0.688678013
+0.558681888 0.687874548
+0.559401678 0.687069763
+0.560121005 0.686264459
+0.560841093 0.685457268
+0.561561269 0.684648941
+0.562280984 0.683840095
+0.563001208 0.68302964
+0.563721434 0.682218145
+0.564441199 0.681406133
+0.565160966 0.680593083
+0.565881572 0.679778046
+0.56660172 0.678962491
+0.567321445 0.678146378
+0.568041456 0.677328904
+0.568761011 0.676510912
+0.569480963 0.675691433
+0.570200904 0.674870929
+0.570920391 0.674049907
+0.571639868 0.673227861
+0.572360008 0.672404021
+0.57308021 0.671579073
+0.57379996 0.670753606
+0.574520201 0.669926539
+0.575240453 0.669098421
+0.575960255 0.668269785
+0.576680542 0.667439553
+0.577400379 0.666608803
+0.578120718 0.665776436
+0.578840608 0.664943551
+0.579560618 0.66410949
+0.580280181 0.663274912
+0.580999991 0.66243901
+0.581719565 0.661602348
+0.582438694 0.660765168
+0.583159249 0.65992529
+0.583879359 0.659084894
+0.584599654 0.658243244
+0.585319506 0.657401077
+0.586039405 0.656557815
+0.586758863 0.655714036
+0.587479261 0.654868118
+0.588199217 0.654021682
+0.588919204 0.653174171
+0.589638823 0.652326058
+0.590358967 0.65147629
+0.591078672 0.650626003
+0.591798025 0.649775098
+0.592517803 0.648922654
+0.593238327 0.648068288
+0.593958413 0.647213403
+0.594678581 0.646357385
+0.595398313 0.645500849
+0.596118406 0.644642846
+0.596838604 0.643783681
+0.597558367 0.642923998
+0.598278646 0.642062662
+0.598998491 0.641200808
+0.599718578 0.640337627
+0.600438687 0.639473383
+0.601158364 0.638608621
+0.601878333 0.637742472
+0.602597871 0.636875805
+0.603317849 0.636007573
+0.604037397 0.635138823
+0.604757117 0.63426883
+0.605476508 0.633398198
+0.606197287 0.632524849
+0.606917638 0.631650981
+0.607637693 0.630776435
+0.608357706 0.629900901
+0.609077604 0.629024472
+0.609797701 0.628146764
+0.610517373 0.627268537
+0.611237245 0.62638903
+0.611957367 0.625508182
+0.612677458 0.624626333
+0.613397126 0.623743966
+0.614116937 0.622860387
+0.614836327 0.621976291
+0.615556648 0.621090014
+0.616276547 0.620203218
+0.616996626 0.619315164
+0.617716589 0.618426215
+0.618436134 0.617536749
+0.619156226 0.616645568
+0.619875899 0.61575387
+0.620595816 0.614860833
+0.621316243 0.613966126
+0.622036668 0.613070384
+0.622756901 0.612173842
+0.623476718 0.611276782
+0.624196934 0.610378187
+0.624916735 0.609479075
+0.625636149 0.60857941
+0.626356178 0.607677939
+0.627075876 0.606775846
+0.627795371 0.605872973
+0.62851513 0.604968732
+0.629234477 0.604063973
+0.629954089 0.603157846
+0.630674305 0.602249921
+0.63139411 0.601341477
+0.63211444 0.600431334
+0.63283436 0.599520673
+0.633554509 0.598608684
+0.634274556 0.597695788
+0.634995022 0.596781322
+0.635715079 0.595866338
+0.63643539 0.594949995
+0.637155535 0.594032824
+0.637875274 0.593115136
+0.638595066 0.592196342
+0.639314452 0.591277031
+0.640033652 0.590356925
+0.640753919 0.589434416
+0.641473802 0.588511362
+0.642194044 0.58758681
+0.642913882 0.58666174
+0.643634079 0.585735172
+0.644353913 0.584808035
+0.645073968 0.583879575
+0.645794069 0.58295002
+0.646513768 0.582019947
+0.647233766 0.581088453
+0.647953362 0.58015644
+0.648673815 0.579222281
+0.649393943 0.578287506
+0.650113672 0.577352213
+0.650833279 0.576416043
+0.651553738 0.575477727
+0.652273798 0.574538893
+0.652993817 0.573599075
+0.65371344 0.572658739
+0.654433576 0.571716695
+0.655153315 0.570774134
+0.655873467 0.569829996
+0.656593223 0.56888534
+0.657313018 0.567939597
+0.658032904 0.566992697
+0.658752989 0.5660445
+0.659472679 0.565095785
+0.660192648 0.564145668
+0.660912224 0.563195032
+0.661631805 0.562243354
+0.662351781 0.561290118
+0.663071748 0.560335857
+0.66379214 0.559379995
+0.664512141 0.558423614
+0.665231956 0.557466445
+0.665951894 0.556508075
+0.666671442 0.555549188
+0.667391397 0.554588724
+0.668110963 0.553627741
+0.668831342 0.552664636
+0.669551333 0.551701013
+0.670270945 0.55073686
+0.670991047 0.549771016
+0.671710762 0.548804653
+0.672430881 0.547836711
+0.67315135 0.54686726
+0.673871605 0.54589706
+0.674591475 0.544926342
+0.675311131 0.543954877
+0.676031102 0.542981949
+0.67675069 0.542008503
+0.67747112 0.541032881
+0.678191384 0.540056446
+0.678911266 0.539079494
+0.679631201 0.538101431
+0.680350754 0.537122851
+0.681070857 0.536142487
+0.68179058 0.535161606
+0.682510189 0.534179842
+0.683230422 0.53319619
+0.683950276 0.53221202
+0.684670518 0.531226282
+0.685390381 0.530240026
+0.686110612 0.529252228
+0.686830465 0.528263912
+0.687550502 0.527274307
+0.688270679 0.526283473
+0.688990479 0.52529212
+0.68971042 0.524299537
+0.690430162 0.523306192
+0.691149881 0.522311842
+0.691870038 0.521315851
+0.692589926 0.520319194
+0.69330944 0.51932202
+0.694029111 0.518323593
+0.694749245 0.517323486
+0.695469006 0.516322862
+0.696189274 0.515320495
+0.696909169 0.51431761
+0.697629439 0.513313166
+0.698349361 0.51230817
+0.699069513 0.511301815
+0.699789295 0.510294943
+0.700509308 0.50928671
+0.701229481 0.508277215
+0.701949424 0.507267007
+0.702668997 0.506256281
+0.703388933 0.505244009
+0.704108886 0.504230677
+0.704828471 0.503216827
+0.705548328 0.502201557
+0.706268057 0.501185431
+0.70698742 0.500168788
+0.707707659 0.49914987
+0.708427531 0.498130433
+0.709147857 0.497109316
+0.709868203 0.496087134
+0.710588183 0.495064434
+0.711308327 0.494040464
+0.712028107 0.493015975
+0.712747888 0.491990448
+0.713467838 0.490963645
+0.714187424 0.489936324
+0.714907453 0.488907333
+0.715627684 0.487877019
+0.716347551 0.486846186
+0.717067687 0.485813933
+0.717787627 0.484780923
+0.718507206 0.483747396
+0.719227364 0.482712
+0.719947377 0.481675774
+0.720667467 0.480638402
+0.721387197 0.479600512
+0.72210727 0.478561091
+0.722826984 0.477521152
+0.723546964 0.476479791
+0.724266586 0.475437912
+0.724986899 0.474393996
+0.725706855 0.473349561
+0.726426656 0.472304314
+0.727146832 0.471257484
+0.727866653 0.470210136
+0.728586473 0.469161751
+0.729305939 0.468112848
+0.730026104 0.467061888
+0.730746398 0.466009702
+0.731466337 0.464956999
+0.732186576 0.463902818
+0.732906461 0.462848119
+0.733626088 0.461792763
+0.734346273 0.460735552
+0.735066104 0.459677823
+0.735786087 0.458618834
+0.736506325 0.457558433
+0.737226398 0.456497239
+0.737946295 0.455435265
+0.738665842 0.454372774
+0.739385646 0.453308867
+0.7401051 0.452244442
+0.740825242 0.45117796
+0.741545245 0.45011065
+0.742265222 0.44904234
+0.74298485 0.447973512
+0.743704903 0.446903018
+0.744424607 0.445832005
+0.74514441 0.444759808
+0.745864321 0.443686415
+0.746584344 0.442611818
+0.747304178 0.441536466
+0.748023665 0.440460596
+0.748743831 0.439382676
+0.749464118 0.438303536
+0.750184059 0.437223878
+0.750904501 0.43614243
+0.751624599 0.435060463
+0.752344894 0.433977161
+0.753064844 0.432893341
+0.753785101 0.431808022
+0.754505013 0.430722185
+0.75522507 0.429635093
+0.75594524 0.428546794
+0.756665553 0.427457242
+0.757385522 0.426367171
+0.758105437 0.425276146
+0.758825011 0.424184603
+0.759544622 0.423091967
+0.760264555 0.421997806
+0.760984418 0.420902716
+0.761704589 0.41980612
+0.762424419 0.418709005
+0.763144089 0.4176111
+0.763863902 0.41651194
+0.764583618 0.415411891
+0.765302996 0.414311324
+0.766023383 0.413208177
+0.76674343 0.412104512
+0.76746323 0.41100019
+0.768182873 0.409895073
+0.768903203 0.408787864
+0.769623196 0.407680137
+0.7703434 0.406571046
+0.771063268 0.405461436
+0.771783301 0.404350537
+0.772502998 0.403239119
+0.773223112 0.402126019
+0.773942891 0.401012401
+0.774662735 0.399897647
+0.775382811 0.398781496
+0.776102932 0.397664239
+0.776822719 0.396546463
+0.777542552 0.39542758
+0.778262363 0.394307695
+0.778982203 0.393186727
+0.779701711 0.392065242
+0.780421856 0.390941726
+0.781141988 0.389817194
+0.781861788 0.388692144
+0.782581911 0.387565553
+0.783302085 0.386437844
+0.784021928 0.385309617
+0.78474212 0.384179805
+0.785461982 0.383049475
+0.78618181 0.381918162
+0.786901984 0.380785268
+0.787622198 0.379651273
+0.788342083 0.37851676
+0.789061759 0.377381541
+0.789781344 0.37624543
+0.790501423 0.3751075
+0.791221175 0.373969052
+0.791941198 0.37282914
+0.792661003 0.371688535
+0.793380701 0.370547063
+0.79410048 0.369404428
+0.794820884 0.368259763
+0.795540961 0.367114579
+0.796261015 0.365968396
+0.796981136 0.364821068
+0.797700932 0.363673223
+0.798420795 0.362524234
+0.799141056 0.361373573
+0.799861131 0.360222171
+0.800581306 0.359069572
+0.801301157 0.357916455
+0.802021108 0.356762142
+0.802740896 0.355607054
+0.803460946 0.354450509
+0.804180673 0.353293445
+0.804900614 0.352135002
+0.805620379 0.350975805
+0.806340305 0.349815312
+0.80705991 0.348654301
+0.807779676 0.347491994
+0.808499969 0.3463278
+0.809219941 0.345163087
+0.809939772 0.343997566
+0.810659981 0.342830396
+0.81137987 0.341662707
+0.812099883 0.34049378
+0.812819578 0.339324334
+0.813539103 0.338154129
+0.814259122 0.336982083
+0.81497908 0.3358091
+0.815698719 0.334635599
+0.816418395 0.333461004
+0.817138554 0.332284584
+0.817858395 0.331107646
+0.818578526 0.329929197
+0.819298695 0.328749649
+0.820018547 0.327569583
+0.820738132 0.326388918
+0.821458447 0.32520602
+0.822178446 0.324022603
+0.822898598 0.322837897
+0.823618694 0.321652247
+0.824338475 0.320466079
+0.8250582 0.319278967
+0.825777883 0.318090888
+0.826498198 0.316900729
+0.8272182 0.31571005
+0.827938273 0.314518216
+0.828658033 0.313325865
+0.829377739 0.312132567
+0.830097636 0.310937916
+0.83081722 0.309742746
+0.831537703 0.308545049
+0.832257873 0.307346832
+0.832977931 0.306147766
+0.833697993 0.304947656
+0.834417744 0.303747028
+0.8351375 0.302545356
+0.835857665 0.301341964
+0.836577519 0.300138055
+0.837297617 0.2989327
+0.838017577 0.29772654
+0.838737228 0.296519862
+0.839457369 0.295311325
+0.840177202 0.29410227
+0.840897458 0.292891466
+0.841617405 0.291680143
+0.84233717 0.290468092
+0.843056879 0.289255099
+0.843777079 0.288040241
+0.844497074 0.286824693
+0.845216761 0.285608627
+0.845937093 0.284390434
+0.846657163 0.283171649
+0.847376926 0.281952345
+0.848096871 0.280731697
+0.848816511 0.279510531
+0.84953662 0.278287531
+0.850256424 0.277064014
+0.850976572 0.275838874
+0.851696667 0.274612787
+0.852416457 0.273386183
+0.853136403 0.272158277
+0.853856045 0.270929854
+0.854575664 0.269700434
+0.855295949 0.26846884
+0.85601593 0.267236727
+0.856735769 0.266003823
+0.857455369 0.264770291
+0.858175456 0.263534886
+0.858895242 0.262298963
+0.859615427 0.261061318
+0.86033531 0.259823154
+0.861055335 0.258583709
+0.861775476 0.257343028
+0.862495553 0.256101422
+0.863215329 0.254859296
+0.863935041 0.253616246
+0.864655336 0.252371151
+0.865375331 0.251125537
+0.866095351 0.249878842
+0.866815073 0.248631629
+0.867535266 0.247382563
+0.868255483 0.246132417
+0.868975401 0.244881753
+0.869695164 0.243630322
+0.870414917 0.242377872
+0.871135112 0.241123617
+0.871855252 0.239868419
+0.872575095 0.238612703
+0.873294957 0.237355919
+0.874014521 0.236098617
+0.874734274 0.23483995
+0.875454392 0.233579608
+0.876174691 0.232317911
+0.876894694 0.231055695
+0.877614574 0.22979266
+0.878334671 0.228528205
+0.879054653 0.227262917
+0.87977434 0.225997111
+0.880493912 0.224730471
+0.881213845 0.22346216
+0.881933716 0.22219292
+0.882653595 0.220922632
+0.88337318 0.219651825
+0.884092947 0.21837966
+0.884813276 0.217105467
+0.885533608 0.21583023
+0.886253646 0.214554475
+0.886973496 0.213278017
+0.887693373 0.212000475
+0.888413313 0.210721785
+0.889132961 0.209442578
+0.889853017 0.208161608
+0.890573126 0.206879507
+0.891292944 0.205596888
+0.892013125 0.204312585
+0.892733015 0.203027764
+0.893452924 0.201741873
+0.894173085 0.200454494
+0.894892956 0.199166597
+0.895612805 0.197877704
+0.896332775 0.196587557
+0.897052781 0.195296308
+0.897772499 0.19400454
+0.898492409 0.19271139
+0.899212568 0.191416757
+0.899932526 0.190121449
+0.900652196 0.188825622
+0.901371665 0.187529122
+0.902091707 0.186230552
+0.902811462 0.184931464
+0.903531337 0.183631124
+0.904251405 0.182329398
+0.904971186 0.181027153
+0.905691252 0.179723357
+0.906411031 0.178419043
+0.907131418 0.17711259
+0.907851519 0.17580562
+0.908571502 0.174497827
+0.909291671 0.173188658
+0.910011593 0.171878902
+0.910731695 0.17056778
+0.911451513 0.16925614
+0.912171596 0.16794298
+0.912891394 0.166629302
+0.913610993 0.165314953
+0.914330915 0.163998978
+0.91505089 0.162681869
+0.915770581 0.161364243
+0.916490671 0.160044851
+0.917210806 0.158724338
+0.917930928 0.157402811
+0.918650768 0.156080766
+0.919370597 0.154757706
+0.920090525 0.153433426
+0.920810171 0.152108628
+0.921530541 0.150781462
+0.922250629 0.149453778
+0.922970826 0.148124854
+0.923690743 0.146795412
+0.924410652 0.145464946
+0.925130608 0.144133359
+0.92585056 0.14280074
+0.926570233 0.141467603
+0.927289903 0.140133435
+0.928010009 0.138797423
+0.928729835 0.137460893
+0.929449835 0.136123003
+0.930169557 0.134784596
+0.930889867 0.133444056
+0.931609898 0.132102998
+0.93232984 0.13076107
+0.933049674 0.129418305
+0.933769652 0.128074237
+0.934489352 0.126729651
+0.935209535 0.125383126
+0.935929628 0.124035731
+0.936649752 0.122687242
+0.937369599 0.121338234
+0.938089327 0.119988414
+0.938809222 0.118637246
+0.939529243 0.117284801
+0.940248989 0.115931839
+0.940968671 0.114577961
+0.9416885 0.113222769
+0.942408655 0.111865927
+0.943128535 0.110508567
+0.943848578 0.109149861
+0.944568569 0.107790219
+0.945288285 0.106430058
+0.946007949 0.105068961
+0.946728064 0.103705973
+0.947448213 0.102341885
+0.948168087 0.100977278
+0.948887996 0.099611571
+0.94960831 0.098244058
+0.950328351 0.096876026
+0.951048301 0.09550713
+0.951767978 0.094137716
+0.952488054 0.092766508
+0.953207857 0.091394782
+0.95392805 0.090021275
+0.95464825 0.088646719
+0.955368178 0.087271644
+0.956088114 0.085895519
+0.9568081 0.08451826
+0.957527815 0.083140483
+0.958247949 0.081760869
+0.958967989 0.080380395
+0.95968776 0.078999404
+0.960407437 0.077617554
+0.961127634 0.07623367
+0.961847636 0.074849125
+0.962567368 0.073464062
+0.963287571 0.072077055
+0.964007505 0.07068953
+0.964727265 0.069301304
+0.96544734 0.067911434
+0.966167147 0.066521045
+0.966887145 0.065129248
+0.967606876 0.063736934
+0.968326861 0.06234309
+0.969046579 0.060948728
+0.969766384 0.059553161
+0.970485937 0.058157046
+0.971205224 0.056760413
+0.971925803 0.055360234
+0.972646115 0.053959536
+0.973366468 0.052557719
+0.974086555 0.051155383
+0.97480661 0.049752073
+0.975526658 0.04834774
+0.976246439 0.04694289
+0.976966397 0.045536659
+0.977686326 0.044129448
+0.978406108 0.042721488
+0.979125626 0.04131301
+0.979845639 0.039902524
+0.980565589 0.038491125
+0.981285785 0.037078208
+0.982005717 0.035664772
+0.982725894 0.034249817
+0.983446051 0.032833865
+0.984165944 0.031417394
+0.984885748 0.030000064
+0.985605798 0.028581211
+0.986325585 0.027161841
+0.987045123 0.025741926
+0.987765355 0.024319604
+0.988485324 0.022896765
+0.989205132 0.021473206
+0.989925181 0.020048137
+0.990644967 0.01862255
+0.991364789 0.017195855
+0.99208481 0.015767731
+0.992804569 0.014339088
+0.993524516 0.012909036
+0.994244202 0.011478466
+0.994964247 0.010046147
+0.995684151 0.008613071
+0.996403807 0.007179454
+0.9971234 0.005744926
+0.997842733 0.00430988
+0.998562004 0.002873923
+0.999281132 0.00143722
+1 0
\ No newline at end of file
diff --git a/jmetal/problem/singleobjective/test/test_unconstrained.py b/jmetal/problem/singleobjective/test/test_unconstrained.py
index a3672045..5f2ae81c 100644
--- a/jmetal/problem/singleobjective/test/test_unconstrained.py
+++ b/jmetal/problem/singleobjective/test/test_unconstrained.py
@@ -2,14 +2,9 @@
from jmetal.problem.singleobjective.unconstrained import OneMax, Sphere
-__author__ = "Antonio J. Nebro"
-
class OneMaxTestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self) -> None:
problem = OneMax()
self.assertIsNotNone(problem)
@@ -33,17 +28,10 @@ def test_should_create_solution_a_valid_binary_solution(self) -> None:
solution = problem.create_solution()
self.assertEqual(256, len(solution.variables[0]))
- # def test_should_evaluate_work_properly_if_the_bitset_only_contains_ones(self) -> None:
- # problem = OneMax(512)
- # solution = problem.create_solution()
- # solution.variables[0] = [True for i in range(problem.number_of_bits)]
- # problem.evaluate(solution)
- # self.assertEqual(512.0, solution.objectives[0])
-
def test_should_evaluate_work_properly_if_the_bitset_only_contains_zeroes(self) -> None:
problem = OneMax(512)
solution = problem.create_solution()
- solution.variables[0] = [False for i in range(problem.number_of_bits)]
+ solution.variables[0] = [False for _ in range(problem.number_of_bits)]
problem.evaluate(solution)
self.assertEqual(0.0, solution.objectives[0])
@@ -54,9 +42,6 @@ def test_should_get_name_return_the_right_name(self):
class SphereTestCases(unittest.TestCase):
- def setUp(self):
- pass
-
def test_should_constructor_create_a_non_null_object(self):
problem = Sphere(3)
self.assertIsNotNone(problem)
@@ -67,8 +52,8 @@ def test_should_constructor_create_a_valid_problem_with_default_settings(self):
self.assertEqual(1, problem.number_of_objectives)
self.assertEqual(0, problem.number_of_constraints)
- self.assertEqual([-5.12 for i in range(10)], problem.lower_bound)
- self.assertEqual([5.12 for i in range(10)], problem.upper_bound)
+ self.assertEqual([-5.12 for _ in range(10)], problem.lower_bound)
+ self.assertEqual([5.12 for _ in range(10)], problem.upper_bound)
def test_should_constructor_create_a_valid_problem_with_5_variables(self):
problem = Sphere(5)
diff --git a/jmetal/problem/singleobjective/unconstrained.py b/jmetal/problem/singleobjective/unconstrained.py
index 61c9523e..f27bcaf4 100644
--- a/jmetal/problem/singleobjective/unconstrained.py
+++ b/jmetal/problem/singleobjective/unconstrained.py
@@ -3,19 +3,25 @@
from jmetal.core.problem import BinaryProblem, FloatProblem
from jmetal.core.solution import BinarySolution, FloatSolution
-__author__ = "Antonio J. Nebro"
+"""
+.. module:: unconstrained
+ :platform: Unix, Windows
+ :synopsis: Unconstrained test problems for single-objective optimization
+
+.. moduleauthor:: Antonio J. Nebro
+"""
class OneMax(BinaryProblem):
- """ Class representing problem Kursawe """
def __init__(self, number_of_bits: int = 256):
+ super(OneMax, self).__init__()
self.number_of_bits = number_of_bits
self.number_of_objectives = 1
self.number_of_variables = 1
self.number_of_constraints = 0
- def evaluate(self, solution: BinarySolution) -> None:
+ def evaluate(self, solution: BinarySolution) -> BinarySolution:
counter_of_ones = 0
for bits in solution.variables[0]:
if bits:
@@ -23,34 +29,40 @@ def evaluate(self, solution: BinarySolution) -> None:
solution.objectives[0] = -1.0 * counter_of_ones
+ return solution
+
def create_solution(self) -> BinarySolution:
new_solution = BinarySolution(number_of_variables=1, number_of_objectives=1)
new_solution.variables[0] = \
- [True if random.randint(0, 1) == 0 else False for i in range(self.number_of_bits)]
+ [True if random.randint(0, 1) == 0 else False for _ in range(self.number_of_bits)]
return new_solution
def get_name(self) -> str:
- return "OneMax"
+ return 'OneMax'
class Sphere(FloatProblem):
+
def __init__(self, number_of_variables: int = 10):
+ super(Sphere, self).__init__()
self.number_of_objectives = 1
self.number_of_variables = number_of_variables
self.number_of_constraints = 0
- self.lower_bound = [-5.12 for i in range(number_of_variables)]
- self.upper_bound = [5.12 for i in range(number_of_variables)]
+ self.lower_bound = [-5.12 for _ in range(number_of_variables)]
+ self.upper_bound = [5.12 for _ in range(number_of_variables)]
FloatSolution.lower_bound = self.lower_bound
FloatSolution.upper_bound = self.upper_bound
- def evaluate(self, solution: FloatSolution):
+ def evaluate(self, solution: FloatSolution) -> FloatSolution:
total = 0.0
for x in solution.variables:
total += x * x
solution.objectives[0] = total
+ return solution
+
def get_name(self) -> str:
- return "Sphere"
+ return 'Sphere'
diff --git a/jmetal/runner/__init__.py b/jmetal/runner/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/jmetal/runner/multiobjective/__init__.py b/jmetal/runner/multiobjective/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/jmetal/runner/multiobjective/nsgaII_standard_settings_plot_interactive.py b/jmetal/runner/multiobjective/nsgaII_standard_settings_plot_interactive.py
deleted file mode 100644
index 744df195..00000000
--- a/jmetal/runner/multiobjective/nsgaII_standard_settings_plot_interactive.py
+++ /dev/null
@@ -1,37 +0,0 @@
-import logging
-from typing import List
-
-from jmetal.algorithm.multiobjective.nsgaii import NSGAII
-from jmetal.core.solution import FloatSolution
-from jmetal.operator.crossover import SBX
-from jmetal.operator.mutation import Polynomial
-from jmetal.operator.selection import BinaryTournamentSelection
-from jmetal.problem.multiobjective.unconstrained import Kursawe
-from jmetal.util.solution_list_output import SolutionListOutput
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-
-def main() -> None:
- problem = Kursawe()
- algorithm = NSGAII[FloatSolution, List[FloatSolution]](
- problem,
- population_size=100,
- max_evaluations=25000,
- mutation=Polynomial(1.0/problem.number_of_variables, distribution_index=20),
- crossover=SBX(1.0, distribution_index=20),
- selection=BinaryTournamentSelection())
-
- algorithm.run()
- result = algorithm.get_result()
-
- SolutionListOutput[FloatSolution].plot_scatter_to_file(result, file_name="FUN."+problem.get_name(),
- output_format='eps', dpi=200)
- SolutionListOutput[FloatSolution].plot_scatter_to_screen(result)
-
- logger.info("Algorithm (continuous problem): " + algorithm.get_name())
- logger.info("Problem: " + problem.get_name())
-
-if __name__ == '__main__':
- main()
diff --git a/jmetal/runner/multiobjective/nsgaII_standard_settings_with_observer_basic.py b/jmetal/runner/multiobjective/nsgaII_standard_settings_with_observer_basic.py
deleted file mode 100644
index c40c99bb..00000000
--- a/jmetal/runner/multiobjective/nsgaII_standard_settings_with_observer_basic.py
+++ /dev/null
@@ -1,40 +0,0 @@
-import logging
-from typing import List
-
-from jmetal.algorithm.multiobjective.nsgaii import NSGAII
-from jmetal.component.observer import BasicAlgorithmObserver
-from jmetal.core.solution import FloatSolution
-from jmetal.operator.crossover import SBX
-from jmetal.operator.mutation import Polynomial
-from jmetal.operator.selection import BinaryTournamentSelection
-from jmetal.problem.multiobjective.zdt import ZDT1
-from jmetal.util.solution_list_output import SolutionListOutput
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-
-def main() -> None:
- problem = ZDT1()
- algorithm = NSGAII[FloatSolution, List[FloatSolution]](
- problem,
- population_size=100,
- max_evaluations=25000,
- mutation=Polynomial(1.0/problem.number_of_variables, distribution_index=20),
- crossover=SBX(1.0, distribution_index=20),
- selection=BinaryTournamentSelection())
-
- observer = BasicAlgorithmObserver(1000)
- algorithm.observable.register(observer=observer)
-
- algorithm.run()
- result = algorithm.get_result()
-
- SolutionListOutput[FloatSolution].print_function_values_to_file("FUN."+problem.get_name(), result)
-
- logger.info("Algorithm (continuous problem): " + algorithm.get_name())
- logger.info("Problem: " + problem.get_name())
- logger.info("Computing time: " + str(algorithm.total_computing_time))
-
-if __name__ == '__main__':
- main()
diff --git a/jmetal/runner/multiobjective/nsgaii_standard_settings.py b/jmetal/runner/multiobjective/nsgaii_standard_settings.py
deleted file mode 100644
index df3334d1..00000000
--- a/jmetal/runner/multiobjective/nsgaii_standard_settings.py
+++ /dev/null
@@ -1,39 +0,0 @@
-import logging
-from typing import List
-
-from jmetal.algorithm.multiobjective.nsgaii import NSGAII
-from jmetal.core.solution import FloatSolution
-from jmetal.operator.crossover import SBX
-from jmetal.operator.mutation import Polynomial
-from jmetal.operator.selection import BinaryTournament2Selection
-from jmetal.problem.multiobjective.zdt import ZDT1
-from jmetal.util.comparator import SolutionAttributeComparator
-from jmetal.util.solution_list_output import SolutionListOutput
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-
-def main() -> None:
- problem = ZDT1()
- algorithm = NSGAII[FloatSolution, List[FloatSolution]](
- problem=problem,
- population_size=100,
- max_evaluations=25000,
- mutation=Polynomial(1.0/problem.number_of_variables, distribution_index=20),
- crossover=SBX(1.0, distribution_index=20),
- #selection=BinaryTournamentSelection(RankingAndCrowdingDistanceComparator()))
- selection = BinaryTournament2Selection([SolutionAttributeComparator("dominance_ranking"),
- SolutionAttributeComparator("crowding_distance", lowest_is_best=False)]))
-
- algorithm.run()
- result = algorithm.get_result()
-
- SolutionListOutput[FloatSolution].print_function_values_to_file("FUN."+problem.get_name(), result)
-
- logger.info("Algorithm (continuous problem): " + algorithm.get_name())
- logger.info("Problem: " + problem.get_name())
- logger.info("Computing time: " + str(algorithm.total_computing_time))
-
-if __name__ == '__main__':
- main()
diff --git a/jmetal/runner/multiobjective/nsgaii_standard_settings_with_observer.py b/jmetal/runner/multiobjective/nsgaii_standard_settings_with_observer.py
deleted file mode 100644
index 9f7e2116..00000000
--- a/jmetal/runner/multiobjective/nsgaii_standard_settings_with_observer.py
+++ /dev/null
@@ -1,40 +0,0 @@
-import logging
-from typing import List
-
-from jmetal.algorithm.multiobjective.nsgaii import NSGAII
-from jmetal.component.observer import WriteFrontToFileObserver
-from jmetal.core.solution import FloatSolution
-from jmetal.operator.crossover import SBX
-from jmetal.operator.mutation import Polynomial
-from jmetal.operator.selection import BinaryTournamentSelection
-from jmetal.problem.multiobjective.unconstrained import Kursawe
-from jmetal.util.comparator import RankingAndCrowdingDistanceComparator
-from jmetal.util.solution_list_output import SolutionListOutput
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-
-def main() -> None:
- problem = Kursawe()
- algorithm = NSGAII[FloatSolution, List[FloatSolution]](
- problem,
- population_size=100,
- max_evaluations=25000,
- mutation=Polynomial(1.0/problem.number_of_variables, distribution_index=20),
- crossover=SBX(1.0, distribution_index=20),
- selection=BinaryTournamentSelection(RankingAndCrowdingDistanceComparator()))
-
- observer = WriteFrontToFileObserver("output_directory")
- algorithm.observable.register(observer=observer)
-
- algorithm.run()
- result = algorithm.get_result()
-
- SolutionListOutput[FloatSolution].print_function_values_to_file("FUN."+problem.get_name(), result)
-
- logger.info("Algorithm (continuous problem): " + algorithm.get_name())
- logger.info("Problem: " + problem.get_name())
-
-if __name__ == '__main__':
- main()
diff --git a/jmetal/runner/multiobjective/nsgaii_standard_settings_with_observer_plot_realtime.py b/jmetal/runner/multiobjective/nsgaii_standard_settings_with_observer_plot_realtime.py
deleted file mode 100644
index 87a00d5a..00000000
--- a/jmetal/runner/multiobjective/nsgaii_standard_settings_with_observer_plot_realtime.py
+++ /dev/null
@@ -1,37 +0,0 @@
-import logging
-from typing import List
-
-from jmetal.algorithm.multiobjective.nsgaii import NSGAII
-from jmetal.component.observer import AlgorithmObserver
-from jmetal.core.solution import FloatSolution
-from jmetal.operator.crossover import SBX
-from jmetal.operator.mutation import Polynomial
-from jmetal.operator.selection import BinaryTournament2Selection
-from jmetal.problem.multiobjective.zdt import ZDT4
-from jmetal.util.comparator import SolutionAttributeComparator
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-
-def main() -> None:
- problem = ZDT4()
- algorithm = NSGAII[FloatSolution, List[FloatSolution]](
- problem,
- population_size=100,
- max_evaluations=25000,
- mutation=Polynomial(1.0/problem.number_of_variables, distribution_index=20),
- crossover=SBX(1.0, distribution_index=20),
- selection=BinaryTournament2Selection([SolutionAttributeComparator("dominance_ranking"),
- SolutionAttributeComparator("crowding_distance", lowest_is_best=False)]))
-
- observer = AlgorithmObserver(animation_speed=1*10e-8)
- algorithm.observable.register(observer=observer)
-
- algorithm.run()
-
- logger.info("Algorithm (continuous problem): " + algorithm.get_name())
- logger.info("Problem: " + problem.get_name())
-
-if __name__ == '__main__':
- main()
diff --git a/jmetal/runner/multiobjective/nsgaii_stopping_by_time.py b/jmetal/runner/multiobjective/nsgaii_stopping_by_time.py
deleted file mode 100644
index 3070201e..00000000
--- a/jmetal/runner/multiobjective/nsgaii_stopping_by_time.py
+++ /dev/null
@@ -1,49 +0,0 @@
-import logging
-from typing import List, TypeVar
-
-from jmetal.algorithm.multiobjective.nsgaii import NSGAII
-from jmetal.core.solution import FloatSolution
-from jmetal.operator.crossover import SBX
-from jmetal.operator.mutation import Polynomial
-from jmetal.operator.selection import BinaryTournamentSelection
-from jmetal.problem.multiobjective.unconstrained import Fonseca
-from jmetal.util.comparator import RankingAndCrowdingDistanceComparator
-from jmetal.util.solution_list_output import SolutionListOutput
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-S = TypeVar('S')
-R = TypeVar(List[S])
-
-
-def main() -> None:
- class NSGA2b(NSGAII[S, R]):
- def is_stopping_condition_reached(self):
- # Re-define the stopping condition
- reached = [False, True][self.get_current_computing_time() > 4]
-
- if reached:
- logger.info("Stopping condition reached!")
-
- return reached
-
- problem = Fonseca()
- algorithm = NSGA2b[FloatSolution, List[FloatSolution]](
- problem,
- population_size=100,
- max_evaluations=25000,
- mutation=Polynomial(1.0/problem.number_of_variables, distribution_index=20),
- crossover=SBX(1.0, distribution_index=20),
- selection=BinaryTournamentSelection(RankingAndCrowdingDistanceComparator()))
-
- algorithm.run()
- result = algorithm.get_result()
-
- SolutionListOutput[FloatSolution].print_function_values_to_file("FUN."+problem.get_name(), result)
-
- logger.info("Algorithm (continuous problem): " + algorithm.get_name())
- logger.info("Problem: " + problem.get_name())
-
-if __name__ == '__main__':
- main()
diff --git a/jmetal/runner/multiobjective/smpso_standard_settings.py b/jmetal/runner/multiobjective/smpso_standard_settings.py
deleted file mode 100644
index 799053f1..00000000
--- a/jmetal/runner/multiobjective/smpso_standard_settings.py
+++ /dev/null
@@ -1,32 +0,0 @@
-import logging
-
-from jmetal.algorithm.multiobjective.smpso import SMPSO
-from jmetal.component.archive import CrowdingDistanceArchive
-from jmetal.core.solution import FloatSolution
-from jmetal.operator.mutation import Polynomial
-from jmetal.problem.multiobjective.unconstrained import Kursawe
-from jmetal.util.solution_list_output import SolutionListOutput
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-
-def main() -> None:
- problem = Kursawe()
- algorithm = SMPSO(
- problem=problem,
- swarm_size=100,
- max_evaluations=25000,
- mutation=Polynomial(1.0/problem.number_of_variables, distribution_index=20),
- leaders=CrowdingDistanceArchive(100))
-
- algorithm.run()
- result = algorithm.get_result()
-
- SolutionListOutput[FloatSolution].print_function_values_to_file("FUN."+problem.get_name(), result)
-
- logger.info("Algorithm (continuous problem): " + algorithm.get_name())
- logger.info("Problem: " + problem.get_name())
-
-if __name__ == '__main__':
- main()
diff --git a/jmetal/runner/singleobjective/__init__.py b/jmetal/runner/singleobjective/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/jmetal/runner/singleobjective/evolution_strategy/__init__.py b/jmetal/runner/singleobjective/evolution_strategy/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/jmetal/runner/singleobjective/genetic_algorithm/__init__.py b/jmetal/runner/singleobjective/genetic_algorithm/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/jmetal/runner/singleobjective/genetic_algorithm/generational_genetic_algorithm_binary.py b/jmetal/runner/singleobjective/genetic_algorithm/generational_genetic_algorithm_binary.py
deleted file mode 100644
index e998481c..00000000
--- a/jmetal/runner/singleobjective/genetic_algorithm/generational_genetic_algorithm_binary.py
+++ /dev/null
@@ -1,34 +0,0 @@
-import logging
-
-from jmetal.algorithm.singleobjective.evolutionaryalgorithm import GenerationalGeneticAlgorithm
-from jmetal.core.solution import BinarySolution
-from jmetal.operator.crossover import SinglePoint
-from jmetal.operator.mutation import BitFlip
-from jmetal.operator.selection import BinaryTournamentSelection
-from jmetal.problem.singleobjective.unconstrained import OneMax
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-
-def main() -> None:
- bits = 256
- problem = OneMax(bits)
- algorithm = GenerationalGeneticAlgorithm[BinarySolution, BinarySolution](
- problem,
- population_size = 100,
- max_evaluations = 150000,
- mutation = BitFlip(1.0/bits),
- crossover = SinglePoint(0.9),
- selection = BinaryTournamentSelection())
-
- algorithm.run()
- result = algorithm.get_result()
-
- logger.info("Algorithm (binary problem): " + algorithm.get_name())
- logger.info("Problem: " + problem.get_name())
- logger.info("Solution: " + str(result.variables[0]))
- logger.info("Fitness: " + str(result.objectives[0]))
-
-if __name__ == '__main__':
- main()
diff --git a/jmetal/runner/singleobjective/genetic_algorithm/generational_genetic_algorithm_running_as_a_thread.py b/jmetal/runner/singleobjective/genetic_algorithm/generational_genetic_algorithm_running_as_a_thread.py
deleted file mode 100644
index fa751c12..00000000
--- a/jmetal/runner/singleobjective/genetic_algorithm/generational_genetic_algorithm_running_as_a_thread.py
+++ /dev/null
@@ -1,38 +0,0 @@
-import logging
-
-from jmetal.algorithm.singleobjective.evolutionaryalgorithm import GenerationalGeneticAlgorithm
-from jmetal.core.solution import FloatSolution
-from jmetal.operator.crossover import SBX
-from jmetal.operator.mutation import Polynomial
-from jmetal.operator.selection import BinaryTournamentSelection
-from jmetal.problem.singleobjective.unconstrained import Sphere
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-
-def main() -> None:
- variables = 10
- problem = Sphere(variables)
- algorithm = GenerationalGeneticAlgorithm[FloatSolution, FloatSolution](
- problem,
- population_size = 100,
- max_evaluations = 25000,
- mutation = Polynomial(1.0/variables, distribution_index=20),
- crossover = SBX(1.0, distribution_index=20),
- selection = BinaryTournamentSelection())
-
- algorithm.start()
- logger.info("Algorithm (running as a thread): " + algorithm.get_name())
- logger.info("Problem: " + problem.get_name())
-
- algorithm.join()
- result = algorithm.get_result()
-
- logger.info("Solution: " + str(result.variables))
- logger.info("Fitness: " + str(result.objectives[0]))
- logger.info("Computing time: " + str(algorithm.total_computing_time))
-
-
-if __name__ == '__main__':
- main()
diff --git a/jmetal/util/__init__.py b/jmetal/util/__init__.py
index e69de29b..8869c71d 100644
--- a/jmetal/util/__init__.py
+++ b/jmetal/util/__init__.py
@@ -0,0 +1,11 @@
+from .front_file import read_front_from_file, read_front_from_file_as_solutions
+from .graphic import ScatterBokeh, ScatterMatplotlib
+from .laboratory import experiment, display
+from .solution_list_output import SolutionList
+
+__all__ = [
+ 'read_front_from_file', 'read_front_from_file_as_solutions',
+ 'ScatterBokeh', 'ScatterMatplotlib',
+ 'experiment', 'display',
+ 'SolutionList'
+]
diff --git a/jmetal/util/front_file.py b/jmetal/util/front_file.py
new file mode 100644
index 00000000..362007cb
--- /dev/null
+++ b/jmetal/util/front_file.py
@@ -0,0 +1,37 @@
+from jmetal.core.solution import FloatSolution
+
+"""
+.. module:: Front file
+ :platform: Unix, Windows
+ :synopsis: Utils to read reference frontiers from files.
+
+.. moduleauthor:: Antonio J. Nebro
+"""
+
+
+def read_front_from_file(file_name: str):
+ """ Reads a front from a file and returns a list.
+ """
+ front = []
+ with open(file_name) as file:
+ for line in file:
+ vector = [float(x) for x in line.split()]
+ front.append(vector)
+ return front
+
+
+def read_front_from_file_as_solutions(file_path: str):
+ """ Reads a front from a file and returns a list of solution objects.
+
+ :return: List of solution objects.
+ """
+ front = []
+ with open(file_path) as file:
+ for line in file:
+ vector = [float(x) for x in line.split()]
+ solution = FloatSolution(2, 2, 0, [], [])
+ solution.objectives = vector
+
+ front.append(solution)
+
+ return front
diff --git a/jmetal/util/graphic.py b/jmetal/util/graphic.py
index 9c29174a..0619ce03 100644
--- a/jmetal/util/graphic.py
+++ b/jmetal/util/graphic.py
@@ -1,142 +1,322 @@
import logging
+import warnings
+from abc import ABCMeta
from typing import TypeVar, List, Tuple
+from bokeh.embed import file_html
+from bokeh.resources import CDN
+from bokeh.client import ClientSession
+from bokeh.io import curdoc, reset_output
+from bokeh.layouts import column, row
+from bokeh.models import HoverTool, ColumnDataSource, TapTool, CustomJS, WheelZoomTool
+from bokeh.plotting import Figure
+from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from jmetal.core.solution import Solution
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
+warnings.filterwarnings("ignore", ".*GUI is implemented.*")
+jMetalPyLogger = logging.getLogger('jMetalPy')
S = TypeVar('S')
"""
-.. module:: graphics
+.. module:: Visualization
:platform: Unix, Windows
- :synopsis: Class for plotting solutions.
+ :synopsis: Classes for plotting solutions.
-.. moduleauthor:: Antonio Benítez
+.. moduleauthor:: Antonio Benítez-Hidalgo
"""
-class ScatterPlot():
+class Plot:
- def __init__(self, plot_title: str, animation_speed: float = 1*10e-10):
- """ Creates a new :class:`ScatterPlot` instance.
- Args:
- plot_title (str): Title of the scatter diagram.
- animation_speed (float): Delay (for live plot only). Allow time for the gui event loops to trigger
- and update the display.
- """
+ __metaclass__ = ABCMeta
+
+ def __init__(self, plot_title: str, number_of_objectives: int,
+ xaxis_label: str='', yaxis_label: str='', zaxis_label: str=''):
self.plot_title = plot_title
- self.fig = plt.figure()
- self.axis = self.fig.add_subplot(111)
- self.sc = None
+ self.number_of_objectives = number_of_objectives
- # Real-time plotting options
- self.animation_speed = animation_speed
+ self.xaxis_label = xaxis_label
+ self.yaxis_label = yaxis_label
+ self.zaxis_label = zaxis_label
- def __init_plot(self, is_auto_scalable: bool = True) -> None:
- """ Initialize the scatter plot the first time. """
- if is_auto_scalable:
- self.axis.set_autoscale_on(True)
- self.axis.autoscale_view(True, True, True)
+ def get_objectives(self, front: List[S]) -> Tuple[list, list, list]:
+ if front is None:
+ raise Exception('Front is none!')
- logger.info("Generating plot...")
+ points = list(solution.objectives for solution in front)
- # Style options
- self.axis.grid(color='#f0f0f5', linestyle='-', linewidth=2, alpha=0.5)
- self.fig.suptitle(self.plot_title, fontsize=14, fontweight='bold')
+ x_values, y_values = [point[0] for point in points], [point[1] for point in points]
- def __get_data_points(self, solution_list: List[S]) -> Tuple[list, list]:
- """ Get coords (x,y) from a solution_list. """
+ try:
+ z_values = [point[2] for point in points]
+ except IndexError:
+ z_values = [0]*len(points)
- if solution_list is None:
- raise Exception("Solution list is none!")
+ return x_values, y_values, z_values
- points = list(solution.objectives for solution in solution_list)
- x_values, y_values = [point[0] for point in points], [point[1] for point in points]
- return x_values, y_values
+class ScatterMatplotlib(Plot):
- def retrieve_info(self, solution: Solution) -> None:
- """ Retrieve more information about a solution object. """
- pass
+ def __init__(self, plot_title: str, number_of_objectives: int):
+ """ Creates a new :class:`ScatterPlot` instance. Suitable for problems with 2 or 3 objectives.
- def __search_solution(self, solution_list: List[S], x_val: float, y_val: float) -> None:
- """ Return a solution object associated with some values of (x,y). """
+ :param plot_title: Title of the scatter diagram.
+ :param number_of_objectives: Number of objectives to be used (2D/3D).
+ """
+ super(ScatterMatplotlib, self).__init__(plot_title, number_of_objectives)
- sol = next((solution for solution in solution_list
- if solution.objectives[0] == x_val and solution.objectives[1]), None)
+ # Initialize a plot
+ self.fig = plt.figure()
+ self.sc = None
+ self.axis = None
- if sol is not None:
- logger.info('Solution associated to ({0}, {1}): {2}'.format(x_val, y_val, sol))
- self.retrieve_info(sol)
- else:
- raise Exception("Solution is none.")
+ self.__initialize()
- def __pick_handler(self, event, solution_list: List[S]):
- """ Handler for picking points from the plot. """
- line, ind = event.artist, event.ind[0]
- x, y = line.get_xdata(), line.get_ydata()
+ def __initialize(self) -> None:
+ """ Initialize the scatter plot for the first time. """
+ jMetalPyLogger.info("Generating plot...")
- logger.info('Selected data point ({0}): ({1}, {2})'.format(ind, x[ind], y[ind]))
- self.__search_solution(solution_list, x[ind], y[ind])
+ # Initialize a plot
+ self.fig.canvas.set_window_title('jMetalPy')
- def simple_plot(self, solution_list: List[S], file_name: str = "output",
- fmt: str = 'eps', dpi: int = 200, save: bool = True) -> None:
- """ Create a simple plot. """
- self.__init_plot()
- x_values, y_values = self.__get_data_points(solution_list)
+ if self.number_of_objectives == 2:
+ self.axis = self.fig.add_subplot(111)
- self.sc, = self.axis.plot(x_values, y_values, 'go', markersize=5, picker=10)
+ # Stylize axis
+ self.axis.spines['top'].set_visible(False)
+ self.axis.spines['right'].set_visible(False)
+ self.axis.get_xaxis().tick_bottom()
+ self.axis.get_yaxis().tick_left()
+ else:
+ self.axis = Axes3D(self.fig)
+ self.axis.autoscale(enable=True, axis='both')
- if save:
- supported_formats = ["eps", "jpeg", "jpg", "pdf", "pgf", "png", "ps",
- "raw", "rgba", "svg", "svgz", "tif", "tiff"]
- if fmt not in supported_formats:
- raise Exception(fmt + " is not a valid format! Use one of these instead: "
- + str(supported_formats))
+ self.axis.set_autoscale_on(True)
+ self.axis.autoscale_view(True, True, True)
- self.fig.savefig(file_name + '.' + fmt, format=fmt, dpi=dpi)
- logger.info("Output file (function plot): " + file_name + '.' + fmt)
+ # Style options
+ self.axis.grid(color='#f0f0f5', linestyle='-', linewidth=1, alpha=0.5)
+ self.fig.suptitle(self.plot_title, fontsize=13)
- def interactive_plot(self, solution_list: List[S]) -> None:
- """ Create a plot to get to directly access the coords (x,y) of a point by a mouse click. """
+ jMetalPyLogger.info("Plot initialized")
- self.__init_plot()
- x_values, y_values = self.__get_data_points(solution_list)
+ def __plot(self, x_values, y_values, z_values, color: str = '#98FB98', marker: str = 'o', msize: int = 3):
+ if self.number_of_objectives == 2:
+ self.sc, = self.axis.plot(x_values, y_values,
+ color=color, marker=marker, markersize=msize, ls='None', picker=10)
+ else:
+ self.sc, = self.axis.plot(x_values, y_values, z_values,
+ color=color, marker=marker, markersize=msize, ls='None', picker=10)
- self.sc, = self.axis.plot(x_values, y_values, 'go', markersize=5, picker=10)
- self.fig.canvas.mpl_connect('pick_event', lambda event: self.__pick_handler(event, solution_list))
+ def plot(self, front: List[S], reference: List[S], output: str= '', show: bool=True) -> None:
+ if reference:
+ jMetalPyLogger.info('Reference front found')
+ ref_x_values, ref_y_values, ref_z_values = self.get_objectives(reference)
+ self.__plot(ref_x_values, ref_y_values, ref_z_values, color='#323232', marker='*')
- plt.show()
+ x_values, y_values, z_values = self.get_objectives(front)
+ self.__plot(x_values, y_values, z_values)
- def update(self, solution_list: List[S], evaluations: int = 0, computing_time: float = 0) -> None:
- """ Update a simple_plot(). Note that the plot must be initialized first. """
+ if output:
+ self.__save(output)
+ if show:
+ self.fig.canvas.mpl_connect('pick_event', lambda event: self.__pick_handler(event, front))
+ plt.show()
+ def update(self, front: List[S], reference: List[S], new_title: str= '', persistence: bool=True) -> None:
if self.sc is None:
- raise Exception("Error while updating! Initialize plot first with "
- "simple_plot(solution_list: List[S])")
+ jMetalPyLogger.warning("Plot is none! Generating first plot...")
+ self.plot(front, reference, show=False)
- x_values, y_values = self.__get_data_points(solution_list)
+ x_values, y_values, z_values = self.get_objectives(front)
- # Update points
- self.sc.set_data(x_values, y_values)
- event_handler = self.fig.canvas.mpl_connect('pick_event', lambda event: self.__pick_handler(event, solution_list))
+ if persistence:
+ # Replace with new points
+ self.sc.set_data(x_values, y_values)
- # Update title
- self.fig.suptitle(self.plot_title
- + ', \n Eval: ' + str(evaluations)
- + ', Time: ' + str('%.3f'%computing_time), fontsize=14, fontweight='bold')
+ if self.number_of_objectives == 3:
+ self.sc.set_3d_properties(z_values)
+ else:
+ # Add new points
+ self.__plot(x_values, y_values, z_values)
- # Re-align the axis.
+ # Also, add event handler
+ event_handler = \
+ self.fig.canvas.mpl_connect('pick_event', lambda event: self.__pick_handler(event, front))
+
+ # Update title with new times and evaluations
+ self.fig.suptitle(new_title, fontsize=13)
+
+ # Re-align the axis
self.axis.relim()
self.axis.autoscale_view(True, True, True)
# Draw
- self.fig.canvas.draw()
- plt.pause(self.animation_speed)
+ try:
+ self.fig.canvas.draw()
+ except KeyboardInterrupt:
+ pass
+
+ plt.pause(0.01)
# Disconnect the pick event for the next update
self.fig.canvas.mpl_disconnect(event_handler)
+
+ def __save(self, file_name: str, fmt: str = 'png', dpi: int = 200):
+ supported_formats = ["eps", "jpeg", "jpg", "pdf", "pgf", "png", "ps",
+ "raw", "rgba", "svg", "svgz", "tif", "tiff"]
+
+ if fmt not in supported_formats:
+ raise Exception('{0} is not a valid format! Use one of these instead: {0}'.format(fmt, supported_formats))
+
+ self.fig.savefig(file_name + '.' + fmt, format=fmt, dpi=dpi)
+
+ def __retrieve_info(self, x_val: float, y_val: float, solution: Solution) -> None:
+ jMetalPyLogger.info("Output file: " + '{0}-{1}'.format(x_val, y_val))
+
+ with open('{0}-{1}'.format(x_val, y_val), 'w') as of:
+ of.write(solution.__str__())
+
+ def __pick_handler(self, event, front: List[S]):
+ """ Handler for picking points from the plot. """
+ line, ind = event.artist, event.ind[0]
+ x, y = line.get_xdata(), line.get_ydata()
+
+ jMetalPyLogger.debug('Selected front point ({0}): ({1}, {2})'.format(ind, x[ind], y[ind]))
+
+ sol = next((solution for solution in front
+ if solution.objectives[0] == x[ind] and solution.objectives[1] == y[ind]), None)
+
+ if sol is not None:
+ self.__retrieve_info(x[ind], y[ind], sol)
+ else:
+ jMetalPyLogger.warning('Solution is none')
+ return True
+
+
+class ScatterBokeh(Plot):
+
+ def __init__(self, plot_title: str, number_of_objectives: int, ws_url: str='localhost:5006'):
+ super(ScatterBokeh, self).__init__(plot_title, number_of_objectives)
+
+ if self.number_of_objectives == 2:
+ self.source = ColumnDataSource(data=dict(x=[], y=[], str=[]))
+ elif self.number_of_objectives == 3:
+ self.source = ColumnDataSource(data=dict(x=[], y=[], z=[], str=[]))
+ else:
+ raise Exception('Wrong number of objectives: {0}'.format(number_of_objectives))
+
+ self.client = ClientSession(websocket_url='ws://{0}/ws'.format(ws_url))
+ self.doc = curdoc()
+ self.doc.title = plot_title
+ self.figure_xy = None
+ self.figure_xz = None
+ self.figure_yz = None
+
+ self.__initialize()
+
+ def __initialize(self) -> None:
+ """ Set-up tools for plot. """
+ code = '''
+ selected = source.selected['1d']['indices'][0]
+ var str = source.front.str[selected]
+ alert(str)
+ '''
+
+ callback = CustomJS(args=dict(source=self.source), code=code)
+ self.plot_tools = [TapTool(callback=callback), WheelZoomTool(), 'save', 'pan',
+ HoverTool(tooltips=[('index', '$index'), ('(x,y)', '($x, $y)')])]
+
+ def plot(self, front: List[S], reference: List[S]=None, output: str= '', show: bool=True) -> None:
+ # This is important to purge front (if any) between calls
+ reset_output()
+
+ # Set up figure
+ self.figure_xy = Figure(output_backend='webgl',
+ sizing_mode='scale_width',
+ title=self.plot_title,
+ tools=self.plot_tools)
+ self.figure_xy.scatter(x='x', y='y', legend='solution', fill_alpha=0.7, source=self.source)
+ self.figure_xy.xaxis.axis_label = self.xaxis_label
+ self.figure_xy.yaxis.axis_label = self.yaxis_label
+
+ x_values, y_values, z_values = self.get_objectives(front)
+
+ if self.number_of_objectives == 2:
+ # Plot reference solution list (if any)
+ if reference:
+ ref_x_values, ref_y_values, _ = self.get_objectives(reference)
+ self.figure_xy.line(x=ref_x_values, y=ref_y_values, legend='reference', color='green')
+
+ # Push front to server
+ self.source.stream({'x': x_values, 'y': y_values, 'str': [s.__str__() for s in front]})
+ self.doc.add_root(column(self.figure_xy))
+ else:
+ # Add new figures for each axis
+ self.figure_xz = Figure(title='xz', output_backend='webgl',
+ sizing_mode='scale_width', tools=self.plot_tools)
+ self.figure_xz.scatter(x='x', y='z', legend='solution', fill_alpha=0.7, source=self.source)
+ self.figure_xz.xaxis.axis_label = self.xaxis_label
+ self.figure_xz.yaxis.axis_label = self.zaxis_label
+
+ self.figure_yz = Figure(title='yz', output_backend='webgl',
+ sizing_mode='scale_width', tools=self.plot_tools)
+ self.figure_yz.scatter(x='y', y='z', legend='solution', fill_alpha=0.7, source=self.source)
+ self.figure_yz.xaxis.axis_label = self.yaxis_label
+ self.figure_yz.yaxis.axis_label = self.zaxis_label
+
+ # Plot reference solution list (if any)
+ if reference:
+ ref_x_values, ref_y_values, ref_z_values = self.get_objectives(reference)
+ self.figure_xy.line(x=ref_x_values, y=ref_y_values, legend='reference', color='green')
+ self.figure_xz.line(x=ref_x_values, y=ref_z_values, legend='reference', color='green')
+ self.figure_yz.line(x=ref_y_values, y=ref_z_values, legend='reference', color='green')
+
+ # Push front to server
+ self.source.stream({'x': x_values, 'y': y_values, 'z': z_values, 'str': [s.__str__() for s in front]})
+ self.doc.add_root(row(self.figure_xy, self.figure_xz, self.figure_yz))
+
+ self.client.push(self.doc)
+
+ if output:
+ self.__save(output)
+ if show:
+ self.client.show()
+
+ def update(self, front: List[S], reference: List[S], new_title: str= '', persistence: bool=False) -> None:
+ # Check if plot has not been initialized first
+ if self.figure_xy is None:
+ self.plot(front, reference)
+
+ if not persistence:
+ rollover = len(front)
+ else:
+ rollover = None
+
+ self.figure_xy.title.text = new_title
+ x_values, y_values, z_values = self.get_objectives(front)
+
+ if self.number_of_objectives == 2:
+ self.source.stream({'x': x_values, 'y': y_values, 'str': [s.__str__() for s in front]},
+ rollover=rollover)
+ else:
+ self.source.stream({'x': x_values, 'y': y_values, 'z': z_values, 'str': [s.__str__() for s in front]},
+ rollover=rollover)
+
+ def __save(self, file_name: str):
+ # env = Environment(loader=FileSystemLoader(BASE_PATH + '/util/'))
+ # env.filters['json'] = lambda obj: Markup(json.dumps(obj))
+
+ html = file_html(models=self.doc, resources=CDN)
+ with open(file_name + '.html', 'w') as of:
+ of.write(html)
+
+ def disconnect(self):
+ if self.is_connected():
+ self.client.close()
+
+ def is_connected(self) -> bool:
+ return self.client.connected
diff --git a/jmetal/util/laboratory.py b/jmetal/util/laboratory.py
new file mode 100644
index 00000000..db00fb6f
--- /dev/null
+++ b/jmetal/util/laboratory.py
@@ -0,0 +1,62 @@
+import logging
+from concurrent.futures import ProcessPoolExecutor
+
+jMetalPyLogger = logging.getLogger('jMetalPy')
+
+"""
+.. module:: laboratory
+ :platform: Unix, Windows
+ :synopsis: Run experiments. WIP!
+
+.. moduleauthor:: Antonio Benítez-Hidalgo
+"""
+
+
+def experiment(algorithm_list: list, metric_list: list, problem_list: list, g_params: dict=None, m_workers: int=3):
+ """ :param algorithm_list: List of algorithms as Tuple(Algorithm, dic() with parameters).
+ :param metric_list: List of metrics.
+ :param problem_list: List of problems as Tuple(Problem, dic() with parameters).
+ :param g_params: Global parameters (will override those from algorithm_list).
+ :param m_workers: Maximum number of workers for ProcessPoolExecutor.
+ :return: Stats.
+ """
+
+ with ProcessPoolExecutor(max_workers=m_workers) as pool:
+ result = dict()
+
+ for p_index, (problem, problem_params) in enumerate(problem_list):
+ if isinstance(problem, type):
+ jMetalPyLogger.debug('Problem is not instantiated by default')
+ problem = problem(**problem_params)
+
+ for a_index, (algorithm, algorithm_params) in enumerate(algorithm_list):
+ if g_params:
+ algorithm_params.update(g_params)
+ if isinstance(algorithm, type):
+ jMetalPyLogger.debug('Algorithm {} is not instantiated by default'.format(algorithm))
+ algorithm_list[a_index] = (algorithm(problem=problem, **algorithm_params), {})
+
+ jMetalPyLogger.info('Running experiment: problem {0}, algorithm {1}'.format(problem, algorithm))
+
+ pool.submit(algorithm_list[a_index][0].run())
+
+ jMetalPyLogger.debug('Waiting')
+
+ # Wait until all computation is done for this problem
+ pool.shutdown(wait=True)
+
+ for algorithm, _ in algorithm_list:
+ front = algorithm.get_result()
+ result[algorithm.get_name()] = {'front': front,
+ 'problem': algorithm.problem.get_name(),
+ 'time': algorithm.total_computing_time}
+
+ for metric in metric_list:
+ result[algorithm.get_name()].setdefault('metric', dict()).update({metric.get_name(): metric.compute(front)})
+
+ return result
+
+
+def display(table: dict):
+ for k, v in table.items():
+ print('{0}: {1}'.format(k, v['metric']))
diff --git a/jmetal/util/solution_list_output.py b/jmetal/util/solution_list_output.py
index 5b0a8f95..e2051056 100644
--- a/jmetal/util/solution_list_output.py
+++ b/jmetal/util/solution_list_output.py
@@ -1,61 +1,44 @@
import logging
-from typing import TypeVar, List, Generic
+from typing import TypeVar, Generic
-import matplotlib.pyplot as plt
-
-from jmetal.util.graphic import ScatterPlot
-
-logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
S = TypeVar('S')
+"""
+.. module:: solution_list
+ :platform: Unix, Windows
+ :synopsis: Utils to print solutions.
-class SolutionListOutput(Generic[S]):
- @staticmethod
- def plot_scatter_to_file(solution_list: List[S], file_name, output_format: str, dpi: int,
- plot_title="Pareto frontier"):
- """ Plot non-dominated solutions. For problems with TWO variables.
- """
- sc = ScatterPlot(plot_title=plot_title)
- sc.simple_plot(solution_list=solution_list, file_name=file_name, fmt=output_format, dpi=dpi)
-
- @staticmethod
- def plot_scatter_to_screen(solution_list: List[S],
- plot_title="Pareto frontier (interactive)"):
- """ Plot non-dominated solutions. For problems with TWO variables.
- """
- sc = ScatterPlot(plot_title=plot_title)
- sc.interactive_plot(solution_list=solution_list)
+.. moduleauthor:: Antonio J. Nebro
+"""
- @staticmethod
- def plot_scatter_real_time(solution_list: List[S], evaluations: int, computing_time: float, animation_speed: float,
- plot_title="Pareto frontier (real-time)"):
- """ Plot non-dominated solutions in real-time. For problems with TWO variables.
- """
- global sc
- if not plt.get_fignums():
- # The first time, set up plot
- sc = ScatterPlot(plot_title=plot_title, animation_speed=animation_speed)
- sc.simple_plot(solution_list=solution_list, save=False)
- else:
- sc.update(solution_list=solution_list, evaluations=evaluations, computing_time=computing_time)
+class SolutionList(Generic[S]):
@staticmethod
- def print_variables_to_screen(solution_list: List[S]):
+ def print_variables_to_screen(solution_list: list):
for solution in solution_list:
print(solution.variables[0])
@staticmethod
- def print_function_values_to_screen(solution_list: List[S]):
+ def print_variables_to_file(solution_list: list, file_name):
+ logger.info("Output file (variables): " + file_name)
+ with open(file_name, 'w') as of:
+ for solution in solution_list:
+ for variables in solution.variables:
+ of.write(str(variables) + " ")
+ of.write("\n")
+
+ @staticmethod
+ def print_function_values_to_screen(solution_list: list):
for solution in solution_list:
print(str(solution_list.index(solution)) + ": ", sep=' ', end='', flush=True)
print(solution.objectives, sep=' ', end='', flush=True)
print()
@staticmethod
- def print_function_values_to_file(file_name, solution_list: List[S]):
+ def print_function_values_to_file(solution_list: list, file_name):
logger.info("Output file (function values): " + file_name)
with open(file_name, 'w') as of:
for solution in solution_list:
diff --git a/jmetal/util/test/conftest.py b/jmetal/util/test/conftest.py
deleted file mode 100644
index d93458ce..00000000
--- a/jmetal/util/test/conftest.py
+++ /dev/null
@@ -1,12 +0,0 @@
-#from jmetal.util.test.test_ranking import DominanceRankingTestCases
-
-
-def pytest_addoption(parser):
- parser.addoption('--self', default=1, help="run many tests")
-
-
-def pytest_generate_tests(metafunc):
- self = metafunc.config.getoption('--self')
- if 'self' in metafunc.fixturenames:
- for x in range(1, self):
- metafunc.parametrize("self", self)
\ No newline at end of file
diff --git a/jmetal/util/time.py b/jmetal/util/time.py
deleted file mode 100644
index 0d623a7d..00000000
--- a/jmetal/util/time.py
+++ /dev/null
@@ -1,18 +0,0 @@
-import logging
-import time
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-
-def get_time_of_execution(fn):
- """ Decorator to get time of execution of any method inside a class. """
-
- def wrapped(*args, **kwargs):
- start_time = time.time()
- res = fn(*args, **kwargs)
- logger.info("Computing time to " + fn.__name__ + " (in seconds): " + str(time.time() - start_time))
-
- return res
-
- return wrapped
diff --git a/requirements.txt b/requirements.txt
index ba424c05..14dac7a2 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,5 @@
+tqdm==4.23.4
+bokeh==0.12.16
pytest==3.1.2
PyHamcrest==1.9.0
mockito==1.0.11
diff --git a/resources/pages/auto_doc.md b/resources/pages/auto_doc.md
deleted file mode 100644
index 46e1a659..00000000
--- a/resources/pages/auto_doc.md
+++ /dev/null
@@ -1,123 +0,0 @@
-# Create automatic documentation files with Sphinx
-
-First, you need to know how to correctly document your code.
-
-## How to write docs directly from source code
-
-It is **important** to follow these simple rules in order to automatically create good documentation for the project.
-
-When you create a new module file (testDoc.py in this example), you should mention it using this format:
-
-```python
-"""
-.. module:: testDoc
- :platform: Unix, Windows
- :synopsis: A useful module indeed.
-
-.. moduleauthor:: Andrew Carter
-
-
-"""
-
-
-class testDoc(object):
- """We use this as a public class example class.
-
- This class is ruled by the very trendy important method :func:`public_fn_with_sphinxy_docstring`.
-
- .. note::
-
- An example of intersphinx is this: you **cannot** use :mod:`pickle` on this class.
-
- """
-
- def __init__(self, foo: str, bar: str):
- """A really simple class.
-
- Args:
- foo (str): We all know what foo does.
- bar (str): Really, same as foo.
-
- """
- self.__foo = foo
- self.__bar = bar
-```
-
-This code snippet generates the following documentation:
-
-
-![jMetal architecture](../../resources/class_header.png)
-
-Now, you can document your methods using the following sintax:
-
- ```python
- def public_fn_with_sphinxy_docstring(self, name: str, state: bool = False) -> int:
- """This function does something.
-
- :param name: The name to use.
- :type name: str.
- :param state: Current state to be in.
- :type state: bool.
- :returns: int -- the return code.
- :raises: AttributeError, KeyError
-
- """
- return 0
-
- def public_fn_without_docstring(self):
- return True
-```
-
-And the produced output doc will be:
-
-![jMetal architecture](../../resources/method_way_sphinx.png)
-
-As you may notice, if you don't use any docstring, the method documentation will be empty.
-
-In addition, if you only use "::members", even though you have a docstring, it won't be imported in the documentation.
-
-For example, this chunk of code does not produce any output doc:
-
- ```python
- def __private_fn_with_docstring(self, foo: str, bar: str = 'baz', foobarbas: int = None) -> int:
- """I have a docstring, but won't be imported if you just use ``:members:``.
- """
- return 20
-```
-## How to compile and produce the docs
-
-After you have properly commented your code, you are now able to generate the documentation.
-
-> Note: You need to have previously installed the Sphinx dependency.
-
-In order to do that, from the root directory of **jMetalPy** you have to change your directory to the **auto-docs** one.
-
-```sh
-$ cd auto-docs/
-```
-Now, you can generate all the .rst files (which is the documentation project "skeleton").
-
-```sh
-$ sphinx-apidoc -f -o source/ ../jmetal/
-```
-
-After that, if you want to produce your docs in *html* format you onle have to run this shell command.
-
-```sh
-$ make html
-```
-Your documentation is now served in this path
-
-```
-jMetalPy/auto-docs/build/html
-```
-
-Inside that folder it exists a file called *index.html*. If you open it using a web browser, you will be able to visualize the generated docs.
-
-You should clean this folder if you want to perform another compilation. You can perform that operation with this command:
-
-```sh
-$ make clean
-```
-
-> Note: Whenever you create another module or file (.py), if you want to add it to the docs, you have to re-run *sphinx-apidoc -f -o source/ ../jmetal/* inside the *auto-docs* folder.
\ No newline at end of file
diff --git a/resources/pages/code_style.md b/resources/pages/code_style.md
deleted file mode 100644
index 23ea4ed5..00000000
--- a/resources/pages/code_style.md
+++ /dev/null
@@ -1,17 +0,0 @@
-## PEP8!
-
-It is really important to follow some standards when a team develops an application. If all team members format the code in the same format, then it is much easier to read the code. PEP8 is Python's style guide. It's a set of rules for how to format your Python code.
-
-Some style rules:
-
- - Package and module names:
-Modules should have short, **all-lowercase** names. Underscores can be used in the module name if it improves readability. Python packages should also have short, **all-lowercase** names, although the use of underscores is discouraged. In Python, a module is a file with the suffix '.py'.
-
- - Class names:
-Class names should normally use the **CapWords** convention.
-
- - Method names and instance variables:
-**Lowercase with words separated by underscores** as necessary to improve readability.
-
-There are many more style standards in PEP8! → [PEP8 documentation](https://www.python.org/dev/peps/pep-0008).
-The most appropriate is to use an IDE that has support for PEP8. For example, [PyCharm](https://www.jetbrains.com/pycharm/).
\ No newline at end of file
diff --git a/resources/pages/features_python3.md b/resources/pages/features_python3.md
deleted file mode 100644
index 9fe4ab91..00000000
--- a/resources/pages/features_python3.md
+++ /dev/null
@@ -1,58 +0,0 @@
-## Python 3.5!
-
-We use the new features of python 3. Concretely, up to version **3.5**.
-
-### Typing
-
-We **always** define types in the parameters of the arguments and the return value:
-
-![jMetal architecture](../../resources/types_in_methods.png)
-
-### Abstract class
-
-We can define abstract classes (ABCs) in Python:
-
-![jMetal architecture](../../resources/abstract.png)
-
-In the case that we want to define an **interface** class, it is done in the same way. We just have to define all the methods of the class as abstract.
-
-### Generic types
-
-Example of use of generic types:
-
-![jMetal architecture](../../resources/generic_types.png)
-
-In the code below, the IDE displays a **warning**, since although the 2nd parameter is a float type, which is a type allowed in the definition of the generic type X, it is not of the same type as the first, since the first 2 parameters must be of the same generic type (S):
-
-![jMetal architecture](../../resources/instance_with_generic_types1_wearning.png)
-
-In the code below, the IDE displays a **warning**, since the 2nd parameter is a type not allowed in the definition of the generic type ( *TypeVar('S', int, float)* ):
-
-![jMetal architecture](../../resources/instance_with_generic_types2_wearning.png)
-
-### Generic class
-
-When the class inherits from *Generic[...]*, the **class is defined as generic**. In this way we can indicate the types that will have the values of the generic types, when using the class as type. Look at the *add_car()* method of the *Parking* class.
-
-NOTE: The generic classes inherit from abc.ABCMeta, so they are abstract classes and **abstract methods can be used** .
-
-![jMetal architecture](../../resources/generic_class1.png)
-![jMetal architecture](../../resources/generic_class2.png)
-
-In the code below, the IDE displays a **warning** in the call to the *add_car()* method when adding the car, since the 3rd parameter of the init must be a *str* type, as defined in the *add_car()* method of the *Parking* class.
-
-![jMetal architecture](../../resources/instance_with_generic_class_wearning.png)
-
-When inheriting from generic classes, some type variables could be fixed:
-
-![jMetal architecture](../../resources/generic_types_fixed.png)
-
-Example of inheritance from non-generic class to generic class:
-
-![jMetal architecture](../../resources/inheritance_non_generic_to_generic.png)
-
-Example of inheritance from generic class to another generic class:
-
-![jMetal architecture](../../resources/inheritance_generic_to_generic.png)
-
-There are more features in Python3.5! → [Python3.5 documentation](https://docs.python.org/3.5/contents.html).
\ No newline at end of file
diff --git a/resources/pages/poo.md b/resources/pages/poo.md
deleted file mode 100644
index 4c9878c9..00000000
--- a/resources/pages/poo.md
+++ /dev/null
@@ -1,28 +0,0 @@
-## Object-oriented programming!
-
-**Object-oriented programming should be the single programming paradigm used**. Avoiding as far as possible, imperative and functional programming.
-
-![jMetal architecture](../../resources/python_poo_programming.png)
-![jMetal architecture](../../resources/python_functional_programming.png)
-![jMetal architecture](../../resources/python_imperative_programming.png)
-
-In classes, we directly access the attributes, which are usually defined as public.
-
-![jMetal architecture](../../resources/without_getter_setter.png)
-
-Only when we want to **implement additional logic in the accesses to the attributes** we define getter/setter methods, but **always by using the ***property*** annotation or the ***property*** function**:
-
-![jMetal architecture](../../resources/property_annotation.png)
-![jMetal architecture](../../resources/property_functional.png)
-
-By using ***property***, we continue to access the attributes directly:
-
-![jMetal architecture](../../resources/good_access.png)
-
-Do not use getter/setter methods without the *property* annotation or the *property* function:
-
-![jMetal architecture](../../resources/with_getter_setter.png)
-
-Since this way of accessing the attribute is not commonly used in Python:
-
-![jMetal architecture](../../resources/bad_access.png)
\ No newline at end of file
diff --git a/resources/pages/profiling.md b/resources/pages/profiling.md
deleted file mode 100644
index 6ff92e8b..00000000
--- a/resources/pages/profiling.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# Profiling with Python using `cProfile`
-
-Python allow us to collect and analize statistics about it's performance using the profiler module.
-This can be done by running
-
-`CProfile` is one of the three built-in modules of Python. [It is recommended for most users](https://docs.python.org/2/library/profile.html#introduction-to-the-profilers).
-
-This way we can know which functions are faster than others. The module can be invoked as a script:
-
-```bash
-python -m cProfile -o [OUTPUT.FILE] [SCRIPT.PY]
-```
-
-When `-o` is not supplied, we can use `-s` to specify one of the `sort_stats()` sort values to sort the output by.
-
-## Reading profile results
-
-The `pstats.Stats` class allow us to examine the profile data:
-
-```python
-import pstats
-
-p = pstats.Stats('restats')
-p.strip_dirs().sort_stats(-1).print_stats()
-```
-
-# Memory usage
-
-`memory_profiler` is a python module for monitoring memory consumption of a process as well as line-by-line analysis of memory consumption for python programs
-
-To use it, simply install with
-
-```bash
- pip install -U memory_profiler
- pip install psutil
-```
-
-From its website:
-> (Installing the psutil package here is recommended because it greatly improves the performance of the memory_profiler).
-
-Then decorate a function with `@profile` to view line-by-line memory usage:
-
-```python
-from memory_profiler import profile
-
-@profile
-def function():
- ...
-```
-
-And execute:
-
-```bash
-python -m memory_profiler example.py
-```
\ No newline at end of file
diff --git a/resources/pages/project_structure.md b/resources/pages/project_structure.md
deleted file mode 100644
index 3e3b4cdf..00000000
--- a/resources/pages/project_structure.md
+++ /dev/null
@@ -1,5 +0,0 @@
-## Structure!
-
-Python is not Java. In Java you cannot, by design, have more than one class in a file. In Python, you can do it.
-
-In Python, **it is appropriate to group several classes into a single .py file. For that reason, the .py files are called modules.**
diff --git a/resources/pages/workflow_git.md b/resources/pages/workflow_git.md
deleted file mode 100644
index f3ab6596..00000000
--- a/resources/pages/workflow_git.md
+++ /dev/null
@@ -1,36 +0,0 @@
-## Git WorkFlow
-
-We have a set of branches on the remote Git server.
-Some branches are temporary, and others are constant throughout the life of the repository.
-
-* Branches always present in the repository:
- * *master*: You have the latest released to production, receive merges from the develop branch, or merge from a *hotfix* branch (emergency).
- * Do I have to put a TAG when doing a merge from develop to master? yes
- * Do I have to put a TAG when doing a merge from a hotfix branch to master? yes
- * After merge from a hotfix to master, do I have to merge from master to develop? yes
- * *develop*: It is considered the "Next Release", receives merges from branches of each developer, either corrections (*fix*) or new features (*feature*).
-
-* Temporary branches:
- * *feature/\\-\*: When we are doing a development, we create a local branch with the prefix "feature/", then only if there is a task id, we indicate it and we add a hyphen. The following we indicate a description according to the functionality that we are developing. The words are separated by hyphens.
- * Where does this branch emerge? This branch always emerge from the develop branch
- * When I finish the development in my feature branch, which branch to merge into?: You always merge feature branch into develop branch
-
- * *fix/\\-\*: When we are making a correction, we create a local branch with the prefix "fix/", then only if there is a task id, we indicate it and we add a hyphen. The following we indicate a description according to the functionality that we are correcting. The words are separated by hyphens.
- * Where does this branch emerge? This branch always emerge from the develop branch
- * When I finish the correction in my fix branch, which branch to merge into?: You always merge feature branch into develop branch
-
- * *hotfix/\\-\*: When we are correcting an emergency incidence in production, we create a local branch with the prefix "hotfix/", then only if there is a task id, we indicate it and we add a hyphen. The following we indicate a description according to the functionality that we are correcting. The words are separated by hyphens.
- * Where does this branch emerge?: This branch always emerge from the master branch
- * When I finish the correction in my hotfix branch, which branch to merge into?: This branch always emerge from the master and develop branch
-
-![jMetal architecture](../../resources/WorkflowGitBranches.png)
-
-* Steps to follow when you are creating or going to work on a branch of any kind (feature / fix / hotfix):
- 1. After you create your branch (feature / fix / hotfix) locally, upload it to the remote Git server. The integration system will verify your code from the outset.
- 2. Each time you commit, as much as possible, you send a push to the server. Each push will trigger the automated launch of the tests, etc.
- 3. Once the development is finished, having done a push to the remote Git server, and that the test phase has passed without problem, you create an pull request:
-https://help.github.com/articles/creating-a-pull-request/
-
NOTE: Do not forget to remove your branch (feature / fix / hotfix) once the merge has been made.
-
-* Some useful Git commands:
- * git fetch --prune: Cleaning branches removed and bringing new branches
diff --git a/setup.py b/setup.py
index ae560e21..ee867b5a 100644
--- a/setup.py
+++ b/setup.py
@@ -1,24 +1,38 @@
-from setuptools import setup, find_packages
+from setuptools import find_packages
-setup(name='jmetalpy',
- version='0.2',
- description='JMetalPy. Python version of the jMetal framework',
- author='Antonio J. Nebro',
- author_email='ajnebro@uma.es',
- maintainer='Antonio Nebro',
- maintainer_email='ajnebro@uma.es',
- license='MIT',
- url='https://github.com/jMetal/jMetalPy',
- classifiers=[
- 'Development Status :: 3 - Alpha',
+try:
+ from setuptools import setup
+except ImportError:
+ from distutils.core import setup
- 'Intended Audience :: Science/Research',
-
- 'License :: OSI Approved :: MIT License',
-
- 'Topic :: Scientific/Engineering :: Artificial Intelligence',
-
- 'Programming Language :: Python :: 3.6'],
-
- packages=find_packages(exclude=['test_']),
- )
+setup(
+ name='jmetalpy',
+ version='0.5.0',
+ description='JMetalPy. Python version of the jMetal framework',
+ author='Antonio J. Nebro',
+ author_email='antonio@lcc.uma.es',
+ maintainer='Antonio J. Nebro',
+ maintainer_email='antonio@lcc.uma.es',
+ license='MIT',
+ url='https://github.com/jMetal/jMetalPy',
+ long_description=open('README.md').read(),
+ packages=find_packages(exclude=['test_']),
+ classifiers=[
+ 'Development Status :: 3 - Alpha',
+ 'Intended Audience :: Science/Research',
+ 'License :: OSI Approved :: MIT License',
+ 'Topic :: Scientific/Engineering :: Artificial Intelligence',
+ 'Programming Language :: Python :: 3.6'
+ ],
+ install_requires=[
+ 'numpy',
+ 'matplotlib==2.0.2',
+ 'bokeh==0.12.16',
+ 'tqdm'
+ ],
+ tests_require=[
+ 'mockito'
+ 'PyHamcrest',
+ 'pytest'
+ ]
+)
diff --git a/sonar-project.properties b/sonar-project.properties
deleted file mode 100644
index f41b87cc..00000000
--- a/sonar-project.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-# Required metadata
-sonar.projectKey=jmetalpy
-sonar.projectName=jmetalpy
-sonar.projectVersion=1.0.0
-sonar.language=py
-sonar.sources=jmetal/
-sonar.binaries=dist/
-sonar.projectBaseDir=./jMetalPy/
-sonar.python.coverage.reportPath=coverage.xml
\ No newline at end of file