From 55bdf2623f1e11141ee6936e6ea09e6e80b19dfb Mon Sep 17 00:00:00 2001 From: Cyril Picard Date: Sun, 30 Aug 2020 10:15:55 -0700 Subject: [PATCH] Add wrapper to MODAct problems --- doc/source/portfolio.html | 1 + doc/source/problems/constrained/modact.ipynb | 160 +++++++++++++++++++ doc/source/problems/index.ipynb | 5 +- doc/source/references.bib | 11 ++ pymoo/factory.py | 1 + pymoo/problems/multi/__init__.py | 1 + pymoo/problems/multi/modact.py | 60 +++++++ 7 files changed, 237 insertions(+), 2 deletions(-) create mode 100755 doc/source/problems/constrained/modact.ipynb create mode 100644 pymoo/problems/multi/modact.py diff --git a/doc/source/portfolio.html b/doc/source/portfolio.html index 7f229bad0..d5dceffa2 100644 --- a/doc/source/portfolio.html +++ b/doc/source/portfolio.html @@ -105,6 +105,7 @@

Problems

Constrained: CTP, DASCMOP, + MODAct, MW, CDTLZ
diff --git a/doc/source/problems/constrained/modact.ipynb b/doc/source/problems/constrained/modact.ipynb new file mode 100755 index 000000000..39634daf2 --- /dev/null +++ b/doc/source/problems/constrained/modact.ipynb @@ -0,0 +1,160 @@ +{ + "cells": [ + { + "cell_type": "raw", + "metadata": { + "raw_mimetype": "text/restructuredtext" + }, + "source": [ + ".. _nb_dascmop:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## MODAct\n", + "\n", + "MODAct (multi-objective design of actuators) is a real-world benchmark test-suite for constrained multi-objective optimization. The optimization problems aim at finding small electro-actuators given some objectives and constraints. Currently, there are 20 problems with up to 5 objectives and 10 inequaltiy constraints, summarized in the table below.\n", + "\n", + "In order to solve these problems, you will need to have the [modact](https://github.com/epfl-lamd/modact) package and its dependencies installed (Docker image available). A single solution evaluation takes about 20 ms. Therefore, the use of parallel schemes is advised. The best-known Pareto front can be downloaded here: [best-known PF](https://doi.org/10.5281/zenodo.3824302), and put into a `modact` folder in `pymoo/problems/pf`.\n", + "\n", + "For more information please refer to the associated publication .\n", + "\n", + "|Problem|Variables|Objectives|Constraints|\n", + "|:---|:---|:---|:---|\n", + "| CS1 | 20 | 2 | 7 |\n", + "| CS2 | 20 | 2 | 8 | \n", + "| CS3 | 20 | 2 | 10 | \n", + "| CS4 | 20 | 2 | 9 |\n", + "| CT1, CTS1, CTSE1, CTSEI1 | 20 | 2,3,4 or 5 | 7 | \n", + "| CT2, CTS2, CTSE2, CTSEI2 | 20 | 2,3,4 or 5 | 8 | \n", + "| CT3, CTS3, CTSE3, CTSEI3 | 20 | 2,3,4 or 5 | 10 | \n", + "| CT4, CTS4, CTSE4, CTSEI4 | 20 | 2,3,4 or 5 | 9 | \n", + "\n", + "Some usage examples are highlighted in the following sections." + ] + }, + { + "cell_type": "raw", + "metadata": { + "raw_mimetype": "text/restructuredtext" + }, + "source": [ + ".. _nb_dascmop1:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### CS3" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\n\n\n\n \n \n \n \n 2020-08-30T09:30:52.166530\n image/svg+xml\n \n \n Matplotlib v3.3.1, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from pymoo.factory import get_problem\n", + "from pymoo.util.plotting import plot\n", + "\n", + "problem = get_problem(\"modact\", \"cs3\")\n", + "plot(problem.pareto_front(), no_fill=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### CT1" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\n\n\n\n \n \n \n \n 2020-08-30T09:33:26.935948\n image/svg+xml\n \n \n Matplotlib v3.3.1, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from pymoo.factory import get_problem\n", + "from pymoo.util.plotting import plot\n", + "\n", + "problem = get_problem(\"modact\", \"ct1\")\n", + "plot(problem.pareto_front(), no_fill=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### CTS4" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from pymoo.factory import get_problem, get_visualization\n", + "\n", + "problem = get_problem(\"modact\", \"cts4\")\n", + "pf = problem.pareto_front()\n", + "get_visualization(\"scatter\", angle=(45,45)).add(pf).show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Implementation by [the author (cyrilpic)](https://github.com/cyrilpic)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7-final" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} \ No newline at end of file diff --git a/doc/source/problems/index.ipynb b/doc/source/problems/index.ipynb index 54d6c93be..a2ba3cc68 100755 --- a/doc/source/problems/index.ipynb +++ b/doc/source/problems/index.ipynb @@ -243,7 +243,8 @@ "|[MW13](constrained/mw.ipynb)|15|2|2||\n", "|[MW14](constrained/mw.ipynb)|15|3|1||\n", "|[SymPart](multi/sym_part.ipynb)|2|2| ||\n", - "|[OmniTest](multi/omni_test.ipynb)|s|2| ||" + "|[OmniTest](multi/omni_test.ipynb)|s|2| ||\n", + "|[MODAct](constrained/modact.ipynb)|20|2-5|7-10|Real-world mechanical design problems|" ] }, { @@ -525,4 +526,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file diff --git a/doc/source/references.bib b/doc/source/references.bib index 780a5289a..63227ddfa 100644 --- a/doc/source/references.bib +++ b/doc/source/references.bib @@ -588,3 +588,14 @@ @inproceedings{sym_part } + +@article{modact, + title = {Realistic {{Constrained Multi}}-{{Objective Optimization Benchmark Problems}} from {{Design}}}, + author = {Picard, Cyril and Schiffmann, J{\"u}rg}, + year = {2020}, + pages = {1--1}, + issn = {1941-0026}, + doi = {10.1109/TEVC.2020.3020046}, + journal = {IEEE Transactions on Evolutionary Computation}, +} + diff --git a/pymoo/factory.py b/pymoo/factory.py index 5e3fa8d6f..328412524 100644 --- a/pymoo/factory.py +++ b/pymoo/factory.py @@ -260,6 +260,7 @@ def get_problem_options(): ('dascmop7', DASCMOP7), ('dascmop8', DASCMOP8), ('dascmop9', DASCMOP9), + ('modact', MODAct), ('mw1', MW1), ('mw2', MW2), ('mw3', MW3), diff --git a/pymoo/problems/multi/__init__.py b/pymoo/problems/multi/__init__.py index 067f54df9..83627fd09 100644 --- a/pymoo/problems/multi/__init__.py +++ b/pymoo/problems/multi/__init__.py @@ -3,6 +3,7 @@ from pymoo.problems.multi.ctp import * from pymoo.problems.multi.dascmop import * from pymoo.problems.multi.kursawe import * +from pymoo.problems.multi.modact import * from pymoo.problems.multi.mw import * from pymoo.problems.multi.osy import * from pymoo.problems.multi.tnk import * diff --git a/pymoo/problems/multi/modact.py b/pymoo/problems/multi/modact.py new file mode 100644 index 000000000..373cb8ec4 --- /dev/null +++ b/pymoo/problems/multi/modact.py @@ -0,0 +1,60 @@ +import os + +import numpy as np + +from pymoo.model.problem import Problem +from pymoo.problems.util import load_pareto_front_from_file + + +class MODAct(Problem): + """Multi-Objective Design of Actuators + + MODAct is a framework for real-world constrained multi-objective optimization. + Refer to the python package https://github.com/epfl-lamd/modact from requirements. + + Best-known Pareto fronts must be downloaded from here: https://doi.org/10.5281/zenodo.3824302 + + Parameters + ---------- + + function: str or modact.problems + The name of the benchmark problem to use either as a string or the + problem object instance. Example values: cs1, cs3, ct2, ct4, cts3 + + References: + ---------- + C. Picard and J. Schiffmann, “Realistic Constrained Multi-Objective Optimization Benchmark Problems from Design,” + IEEE Transactions on Evolutionary Computation, pp. 1–1, 2020. + """ + def __init__(self, function, **kwargs): + import modact.problems as pb + + if isinstance(function, pb.Problem): + self.fct = function + else: + self.fct = pb.get_problem(function) + lb, ub = self.fct.bounds() + n_var = len(lb) + n_obj = len(self.fct.weights) + n_constr = len(self.fct.c_weights) + xl = lb + xu = ub + + self.weights = np.array(self.fct.weights) + self.c_weights = np.array(self.fct.c_weights) + + super().__init__(n_var=n_var, n_obj=n_obj, n_constr=n_constr, xl=xl, + xu=xu, elementwise_evaluation=True, type_var=np.double, + **kwargs) + + def _evaluate(self, x, out, *args, **kwargs): + f, g = self.fct(x) + out["F"] = np.array(f)*-1*self.weights + out["G"] = np.array(g)*self.c_weights + + def _calc_pareto_front(self, *args, **kwargs): + """Loads the corresponding PF if it exists""" + fname = f"{self.fct.name}_PF.dat" + F = load_pareto_front_from_file(os.path.join("modact", fname)) + if F is not None: + return F*self.weights*-1