diff --git a/README.md b/README.md index a16179d..0f8e643 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,7 @@ The implementation of the two-objective archive is heavily based on the [`bisect ## Releases +- 1.1.0 added possibility of normalization of the indicators by adding `ideal_point` and `weights` methods to the archive - [1.0.0](https://github.com/CMA-ES/moarchiving/releases/tag/r1.0.0) addition of MOArchive classes for 3 and 4 objectives, as well as a class for handling solutions to constrained problems - 0.7.0 reimplementation of `BiobjectiveNondominatedSortedList.hypervolume_improvement` by extracting a sublist first. - 0.6.0 the `infos` attribute is a `list` with corresponding (arbitrary) information, e.g. for keeping the respective solutions. @@ -75,7 +76,7 @@ The implementation of the two-objective archive is heavily based on the [`bisect 3. [Accessing solution information](#3-accessing-solution-information) 4. [Adding solutions](#4-adding-solutions) 5. [Archive size](#5-archive-size) -6. [Performance indicators](#6-performance-indicators) +6. [Performance indicators and normalization](#6-performance-indicators-and-normalization) 7. [Contributing hypervolumes](#7-contributing-hypervolumes) 8. [Hypervolume improvement](#8-hypervolume-improvement) 9. [Distance to the Pareto front](#9-distance-to-the-pareto-front) @@ -104,7 +105,7 @@ print("points in the 4 objective archive:", list(moa4obj)) points in the 2 objective archive: [[1, 5], [2, 3], [5, 0]] points in the 3 objective archive: [[3, 3, 0], [2, 2, 1], [1, 2, 3]] points in the 4 objective archive: [[1, 3, 0, 1], [1, 2, 3, 4]] - + MOArchive objects can also be initialized empty. @@ -115,10 +116,10 @@ print("points in the empty archive:", list(moa)) ``` points in the empty archive: [] - + ### 2. Constrained MOArchive -Constrained MOArchive supports all the functionalities of a non-constrained MOArchive, with the added capability of handling constraints when adding or initializing the archive. In addition to the objective values of a solution, constraint values must be provided in the form of a list or a number. A solution is deemed feasible when all its constraint values are less than or equal to zero. +Constrained MOArchive supports all the functionalities of a non-constrained MOArchive, with the added capability of handling constraints when adding or initializing the archive. In addition to the objective values of a solution, constraint values must be provided in the form of a list or a number. A solution is deemed feasible and added to the archive when all its constraint values are less than or equal to zero. ```python @@ -130,7 +131,7 @@ print("points in the archive:", list(cmoa)) ``` points in the archive: [[4, 3, 2], [1, 3, 4]] - + ### 3. Accessing solution information `archive.infos` is used to get the information on solutions in the archive. @@ -144,7 +145,7 @@ print("infos of the constrained archive", cmoa.infos) infos of the empty archive [] infos of the constrained archive ['c', 'b'] - + ### 4. Adding solutions Solutions can be added to the MOArchive at any time using the `add` function (for a single solution) or the `add_list` function (for multiple solutions). @@ -164,7 +165,7 @@ print("infos:", moa.infos) infos: ['a'] points: [[3, 2, 1], [2, 2, 2], [1, 2, 3]] infos: ['b', 'd', 'a'] - + When adding to the constrained archive, constraint values must be added as well. @@ -177,7 +178,7 @@ print("infos:", cmoa.infos) points: [[4, 3, 2], [3, 3, 3], [1, 3, 4]] infos: ['c', 'e', 'b'] - + ### 5. Archive size The MOArchive implements some functionality of a list (in the 2 objective case, it actually extends the `list` class, though this is not the case in 3 and 4 objectives). In particular, it includes the `len` method to get the number of solutions in the archive as well as the `in` keyword to check if a point is in the archive. @@ -194,27 +195,46 @@ print("[3, 2, 0] in moa:", [3, 2, 0] in moa) Length of the archive: 3 [2, 2, 2] in moa: True [3, 2, 0] in moa: False + - -### 6. Performance indicators +### 6. Performance indicators and normalization An archive provides the following performance indicators: - `hypervolume` - `hypervolume_plus`, providing additionally the closest distance to the reference area for an empty archive, see [here](https://doi.org/10.1145/3321707.3321852) and [here](https://doi.org/10.1109/TEVC.2022.3210897) - `hypervolume_plus_constr` (for CMOArchive), based on, but not completely equal to the one defined [here](https://doi.org/10.1016/j.ins.2022.05.106) -Indicators are defined for maximization (the original `hypervolume_plus_constr` indicator is multiplied by -1). When the archive is not empty, all the indicators are positive and have the same value. As the archive does not (yet) support an ideal point, the values of indicators are not normalized. +Indicators are defined for maximization (the original `hypervolume_plus_constr` indicator is multiplied by -1). When the archive is not empty, all the indicators are positive and have the same value. The values of indicators are normalized, if the user specifies the ideal point, which can be done at the initialization using `ideal_point` keyword or later using `ideal_point` method. Custom weights for each dimension can be set in the same way using `weights` keyword or method. The default weights are equal to 1 for all objectives. ```python +# not normalized values print("Hypervolume of the archive:", moa.hypervolume) print("Hypervolume plus of the archive:", moa.hypervolume_plus) + +# add ideal point +moa.ideal_point([0, 0, 0]) +print("Hypervolume of the normalized archive:", moa.hypervolume) + +# add also weights +moa.weights([2, 3, 5]) +print("Hypervolume of the normalized archive with weights:", moa.hypervolume) ``` Hypervolume of the archive: 12 Hypervolume plus of the archive: 12 + Hypervolume of the normalized archive: 0.1875 + Hypervolume of the normalized archive with weights: 5.625 + + +When using constrained moarchive, the constraint violations can be normalized as well, if the list of max violations is provided. +```python +cmoa = get_cmo_archive([[1, 2, 3], [4, 4, 2], [3, 3, 3]], [[0, 10], [0.3, 4], [1, 0]], + reference_point=[5, 5, 5], ideal_point=[0, 0, 0], max_g_vals=[1, 10], tau=1) +``` + In case of a constrained MOArchive, the `hypervolume_plus_constr` attribute can be accessed as well. @@ -224,11 +244,24 @@ print("Hypervolume plus of the constrained archive:", cmoa.hypervolume_plus) print("Hypervolume plus constr of the constrained archive:", cmoa.hypervolume_plus_constr) ``` - Hyperolume of the constrained archive: 14 - Hypervolume plus of the constrained archive: 14 - Hypervolume plus constr of the constrained archive: 14 + Hyperolume of the constrained archive: 0.0 + Hypervolume plus of the constrained archive: -inf + Hypervolume plus constr of the constrained archive: -1.7 + +```python +cmoa.add([6, 6, 6], [0, 0]) +print("Hyperolume of the constrained archive:", cmoa.hypervolume) +print("Hypervolume plus of the constrained archive:", cmoa.hypervolume_plus) +print("Hypervolume plus constr of the constrained archive:", cmoa.hypervolume_plus_constr) +``` + + Hyperolume of the constrained archive: 0.0 + Hypervolume plus of the constrained archive: -0.3464101615137755 + Hypervolume plus constr of the constrained archive: -0.3464101615137755 + + ### 7. Contributing hypervolumes The `contributing_hypervolumes` attribute provides a list of hypervolume contributions for each point of the archive. Alternatively, the contribution for a single point can be computed using the `contributing_hypervolume(point)` method. @@ -241,11 +274,11 @@ for i, objectives in enumerate(moa): print("All contributing hypervolumes:", moa.contributing_hypervolumes) ``` - contributing hv of point [3, 2, 1] is 2 - contributing hv of point [2, 2, 2] is 2 - contributing hv of point [1, 2, 3] is 2 - All contributing hypervolumes: [Fraction(2, 1), Fraction(2, 1), Fraction(2, 1)] - + contributing hv of point [3, 2, 1] is 0.9375 + contributing hv of point [2, 2, 2] is 0.9375 + contributing hv of point [1, 2, 3] is 0.9375 + All contributing hypervolumes: [0.9375, 0.9375, 0.9375] + ### 8. Hypervolume improvement The `hypervolume_improvement(point)` method returns the improvement of the hypervolume if we would add the point to the archive. @@ -259,10 +292,10 @@ moa.add(point) print(f"hypervolume after adding {point}: {moa.hypervolume}") ``` - hypervolume before adding [1, 3, 0]: 12 - hypervolume improvement of point [1, 3, 0]: 6 - hypervolume after adding [1, 3, 0]: 18 - + hypervolume before adding [1, 3, 0]: 5.625 + hypervolume improvement of point [1, 3, 0]: 2.8125 + hypervolume after adding [1, 3, 0]: 8.4375 + ### 9. Distance to the empirical Pareto front The `distance_to_pareto_front(point)` method returns the distance between the given point and the Pareto front. @@ -276,8 +309,8 @@ print("Distance of [3, 2, 2] to pareto front:", moa.distance_to_pareto_front([3, Current archive: [[1, 3, 0], [3, 2, 1], [2, 2, 2], [1, 2, 3]] Distance of [3, 2, 1] to pareto front: 0.0 - Distance of [3, 2, 2] to pareto front: 1.0 - + Distance of [3, 2, 2] to pareto front: 0.5 + ### 10. Enabling or disabling fractions To avoid loss of precision, fractions are used by default. This can be changed to floats by setting the `hypervolume_final_float_type` and `hypervolume_computation_float_type` function attributes. @@ -300,5 +333,3 @@ print(moa3_nofr.hypervolume) 161245156349030777798724819133399/10141204801825835211973625643008 15.899999999999999 - - diff --git a/index.html b/index.html index 968fc3d..150f355 100644 --- a/index.html +++ b/index.html @@ -1,13 +1,9 @@ - - - + + + moarchiving - - - - - - - - - - - - - - + + - - + + + + +
-
- - - - - - - diff --git a/moarchiving.ipynb b/moarchiving.ipynb index ec149b0..f3a7add 100644 --- a/moarchiving.ipynb +++ b/moarchiving.ipynb @@ -69,6 +69,7 @@ "\n", "\n", "## Releases\n", + "- 1.1.0 added possibility of normalization of the indicators by adding `ideal_point` and `weights` methods to the archive\n", "- [1.0.0](https://github.com/CMA-ES/moarchiving/releases/tag/r1.0.0) addition of MOArchive classes for 3 and 4 objectives, as well as a class for handling solutions to constrained problems\n", "- 0.7.0 reimplementation of `BiobjectiveNondominatedSortedList.hypervolume_improvement` by extracting a sublist first.\n", "- 0.6.0 the `infos` attribute is a `list` with corresponding (arbitrary) information, e.g. for keeping the respective solutions.\n", @@ -81,7 +82,7 @@ "3. [Accessing solution information](#3-accessing-solution-information)\n", "4. [Adding solutions](#4-adding-solutions)\n", "5. [Archive size](#5-archive-size)\n", - "6. [Performance indicators](#6-performance-indicators)\n", + "6. [Performance indicators and normalization](#6-performance-indicators-and-normalization)\n", "7. [Contributing hypervolumes](#7-contributing-hypervolumes)\n", "8. [Hypervolume improvement](#8-hypervolume-improvement)\n", "9. [Distance to the Pareto front](#9-distance-to-the-pareto-front)\n", @@ -102,13 +103,23 @@ }, { "cell_type": "code", - "execution_count": 1, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:13.006989Z", - "start_time": "2025-02-11T10:02:12.953105Z" + "end_time": "2025-04-16T08:24:40.129982Z", + "start_time": "2025-04-16T08:24:40.121997Z" } }, + "source": [ + "from moarchiving import get_mo_archive\n", + "\n", + "moa2obj = get_mo_archive([[1, 5], [2, 3], [4, 5], [5, 0]], reference_point=[10, 10], infos=[\"a\", \"b\", \"c\", \"d\"])\n", + "moa3obj = get_mo_archive([[1, 2, 3], [3, 2, 1], [3, 3, 0], [2, 2, 1]], [10, 10, 10], [\"a\", \"b\", \"c\", \"d\"])\n", + "moa4obj = get_mo_archive([[1, 2, 3, 4], [1, 3, 4, 5], [4, 3, 2, 1], [1, 3, 0, 1]], reference_point=[10, 10, 10, 10], infos=[\"a\", \"b\", \"c\", \"d\"])\n", + "\n", + "print(\"points in the 2 objective archive:\", list(moa2obj))\n", + "print(\"points in the 3 objective archive:\", list(moa3obj))\n", + "print(\"points in the 4 objective archive:\", list(moa4obj))" + ], "outputs": [ { "name": "stdout", @@ -120,17 +131,7 @@ ] } ], - "source": [ - "from moarchiving import get_mo_archive\n", - "\n", - "moa2obj = get_mo_archive([[1, 5], [2, 3], [4, 5], [5, 0]], reference_point=[10, 10], infos=[\"a\", \"b\", \"c\", \"d\"])\n", - "moa3obj = get_mo_archive([[1, 2, 3], [3, 2, 1], [3, 3, 0], [2, 2, 1]], [10, 10, 10], [\"a\", \"b\", \"c\", \"d\"])\n", - "moa4obj = get_mo_archive([[1, 2, 3, 4], [1, 3, 4, 5], [4, 3, 2, 1], [1, 3, 0, 1]], reference_point=[10, 10, 10, 10], infos=[\"a\", \"b\", \"c\", \"d\"])\n", - "\n", - "print(\"points in the 2 objective archive:\", list(moa2obj))\n", - "print(\"points in the 3 objective archive:\", list(moa3obj))\n", - "print(\"points in the 4 objective archive:\", list(moa4obj))" - ] + "execution_count": 23 }, { "cell_type": "markdown", @@ -141,13 +142,16 @@ }, { "cell_type": "code", - "execution_count": 2, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:13.021921Z", - "start_time": "2025-02-11T10:02:13.008956Z" + "end_time": "2025-04-16T08:24:40.238685Z", + "start_time": "2025-04-16T08:24:40.214755Z" } }, + "source": [ + "moa = get_mo_archive(reference_point=[4, 4, 4])\n", + "print(\"points in the empty archive:\", list(moa))" + ], "outputs": [ { "name": "stdout", @@ -157,28 +161,31 @@ ] } ], - "source": [ - "moa = get_mo_archive(reference_point=[4, 4, 4])\n", - "print(\"points in the empty archive:\", list(moa))" - ] + "execution_count": 24 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Constrained MOArchive\n", - "Constrained MOArchive supports all the functionalities of a non-constrained MOArchive, with the added capability of handling constraints when adding or initializing the archive. In addition to the objective values of a solution, constraint values must be provided in the form of a list or a number. A solution is deemed feasible when all its constraint values are less than or equal to zero. " + "Constrained MOArchive supports all the functionalities of a non-constrained MOArchive, with the added capability of handling constraints when adding or initializing the archive. In addition to the objective values of a solution, constraint values must be provided in the form of a list or a number. A solution is deemed feasible and added to the archive when all its constraint values are less than or equal to zero. " ] }, { "cell_type": "code", - "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:13.037529Z", - "start_time": "2025-02-11T10:02:13.022929Z" + "end_time": "2025-04-16T08:24:40.254643Z", + "start_time": "2025-04-16T08:24:40.241678Z" } }, + "source": [ + "from moarchiving import get_cmo_archive\n", + "\n", + "cmoa = get_cmo_archive([[1, 2, 3], [1, 3, 4], [4, 3, 2], [1, 3, 0]], [[3, 0], [0, 0], [0, 0], [0, 1]], \n", + " reference_point=[5, 5, 5], infos=[\"a\", \"b\", \"c\", \"d\"])\n", + "print(\"points in the archive:\", list(cmoa))" + ], "outputs": [ { "name": "stdout", @@ -188,13 +195,7 @@ ] } ], - "source": [ - "from moarchiving import get_cmo_archive\n", - "\n", - "cmoa = get_cmo_archive([[1, 2, 3], [1, 3, 4], [4, 3, 2], [1, 3, 0]], [[3, 0], [0, 0], [0, 0], [0, 1]], \n", - " reference_point=[5, 5, 5], infos=[\"a\", \"b\", \"c\", \"d\"])\n", - "print(\"points in the archive:\", list(cmoa))" - ] + "execution_count": 25 }, { "cell_type": "markdown", @@ -206,13 +207,17 @@ }, { "cell_type": "code", - "execution_count": 4, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:13.052920Z", - "start_time": "2025-02-11T10:02:13.040522Z" + "end_time": "2025-04-16T08:24:40.270599Z", + "start_time": "2025-04-16T08:24:40.256637Z" } }, + "source": [ + "# infos of the previously defined empty archive\n", + "print(\"infos of the empty archive\", moa.infos)\n", + "print(\"infos of the constrained archive\", cmoa.infos)" + ], "outputs": [ { "name": "stdout", @@ -223,11 +228,7 @@ ] } ], - "source": [ - "# infos of the previously defined empty archive\n", - "print(\"infos of the empty archive\", moa.infos)\n", - "print(\"infos of the constrained archive\", cmoa.infos)" - ] + "execution_count": 26 }, { "cell_type": "markdown", @@ -239,13 +240,21 @@ }, { "cell_type": "code", - "execution_count": 5, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:13.067856Z", - "start_time": "2025-02-11T10:02:13.054891Z" + "end_time": "2025-04-16T08:24:40.333098Z", + "start_time": "2025-04-16T08:24:40.321464Z" } }, + "source": [ + "moa.add([1, 2, 3], \"a\")\n", + "print(\"points:\", list(moa))\n", + "print(\"infos:\", moa.infos)\n", + "\n", + "moa.add_list([[3, 2, 1], [2, 3, 2], [2, 2, 2]], [\"b\", \"c\", \"d\"])\n", + "print(\"points:\", list(moa))\n", + "print(\"infos:\", moa.infos)" + ], "outputs": [ { "name": "stdout", @@ -258,15 +267,7 @@ ] } ], - "source": [ - "moa.add([1, 2, 3], \"a\")\n", - "print(\"points:\", list(moa))\n", - "print(\"infos:\", moa.infos)\n", - "\n", - "moa.add_list([[3, 2, 1], [2, 3, 2], [2, 2, 2]], [\"b\", \"c\", \"d\"])\n", - "print(\"points:\", list(moa))\n", - "print(\"infos:\", moa.infos)" - ] + "execution_count": 27 }, { "cell_type": "markdown", @@ -277,13 +278,17 @@ }, { "cell_type": "code", - "execution_count": 6, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:13.082815Z", - "start_time": "2025-02-11T10:02:13.069850Z" + "end_time": "2025-04-16T08:24:40.380989Z", + "start_time": "2025-04-16T08:24:40.362040Z" } }, + "source": [ + "cmoa.add_list([[3, 3, 3], [1, 1, 1]], [[0, 0], [42, 0]], [\"e\", \"f\"])\n", + "print(\"points:\", list(cmoa))\n", + "print(\"infos:\", cmoa.infos)" + ], "outputs": [ { "name": "stdout", @@ -294,11 +299,7 @@ ] } ], - "source": [ - "cmoa.add_list([[3, 3, 3], [1, 1, 1]], [[0, 0], [42, 0]], [\"e\", \"f\"])\n", - "print(\"points:\", list(cmoa))\n", - "print(\"infos:\", cmoa.infos)" - ] + "execution_count": 28 }, { "cell_type": "markdown", @@ -310,13 +311,18 @@ }, { "cell_type": "code", - "execution_count": 7, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:13.098772Z", - "start_time": "2025-02-11T10:02:13.084811Z" + "end_time": "2025-04-16T08:24:40.476153Z", + "start_time": "2025-04-16T08:24:40.463189Z" } }, + "source": [ + "print(\"Points in the archive:\", list(moa))\n", + "print(\"Length of the archive:\", len(moa))\n", + "print(\"[2, 2, 2] in moa:\", [2, 2, 2] in moa)\n", + "print(\"[3, 2, 0] in moa:\", [3, 2, 0] in moa)" + ], "outputs": [ { "name": "stdout", @@ -329,49 +335,75 @@ ] } ], - "source": [ - "print(\"Points in the archive:\", list(moa))\n", - "print(\"Length of the archive:\", len(moa))\n", - "print(\"[2, 2, 2] in moa:\", [2, 2, 2] in moa)\n", - "print(\"[3, 2, 0] in moa:\", [3, 2, 0] in moa)" - ] + "execution_count": 29 }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### 6. Performance indicators\n", + "### 6. Performance indicators and normalization\n", "An archive provides the following performance indicators:\n", "- `hypervolume`\n", "- `hypervolume_plus`, providing additionally the closest distance to the reference area for an empty archive, see [here](https://doi.org/10.1145/3321707.3321852) and [here](https://doi.org/10.1109/TEVC.2022.3210897)\n", "- `hypervolume_plus_constr` (for CMOArchive), based on, but not completely equal to the one defined [here](https://doi.org/10.1016/j.ins.2022.05.106)\n", "\n", - "Indicators are defined for maximization (the original `hypervolume_plus_constr` indicator is multiplied by -1). When the archive is not empty, all the indicators are positive and have the same value. As the archive does not (yet) support an ideal point, the values of indicators are not normalized.\n" + "Indicators are defined for maximization (the original `hypervolume_plus_constr` indicator is multiplied by -1). When the archive is not empty, all the indicators are positive and have the same value. The values of indicators are normalized, if the user specifies the ideal point, which can be done at the initialization using `ideal_point` keyword or later using `ideal_point` method. Custom weights for each dimension can be set in the same way using `weights` keyword or method. The default weights are equal to 1 for all objectives.\n" ] }, { "cell_type": "code", - "execution_count": 8, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:13.113735Z", - "start_time": "2025-02-11T10:02:13.101772Z" + "end_time": "2025-04-16T08:24:40.537987Z", + "start_time": "2025-04-16T08:24:40.524025Z" } }, + "source": [ + "# not normalized values\n", + "print(\"Hypervolume of the archive:\", moa.hypervolume)\n", + "print(\"Hypervolume plus of the archive:\", moa.hypervolume_plus)\n", + "\n", + "# add ideal point\n", + "moa.ideal_point([0, 0, 0])\n", + "print(\"Hypervolume of the normalized archive:\", moa.hypervolume)\n", + "\n", + "# add also weights\n", + "moa.weights([2, 3, 5])\n", + "print(\"Hypervolume of the normalized archive with weights:\", moa.hypervolume)" + ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hypervolume of the archive: 12\n", - "Hypervolume plus of the archive: 12\n" + "Hypervolume plus of the archive: 12\n", + "Hypervolume of the normalized archive: 0.1875\n", + "Hypervolume of the normalized archive with weights: 5.625\n" ] } ], + "execution_count": 30 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "When using constrained moarchive, the constraint violations can be normalized as well, if the list of max violations is provided." + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-16T08:24:40.616136Z", + "start_time": "2025-04-16T08:24:40.604811Z" + } + }, + "cell_type": "code", "source": [ - "print(\"Hypervolume of the archive:\", moa.hypervolume)\n", - "print(\"Hypervolume plus of the archive:\", moa.hypervolume_plus)" - ] + "cmoa = get_cmo_archive([[1, 2, 3], [4, 4, 2], [3, 3, 3]], [[0, 10], [0.3, 4], [1, 0]], \n", + " reference_point=[5, 5, 5], ideal_point=[0, 0, 0], max_g_vals=[1, 10], tau=1)" + ], + "outputs": [], + "execution_count": 31 }, { "cell_type": "markdown", @@ -381,30 +413,57 @@ ] }, { - "cell_type": "code", - "execution_count": 9, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:13.128695Z", - "start_time": "2025-02-11T10:02:13.115740Z" + "end_time": "2025-04-16T08:24:40.710883Z", + "start_time": "2025-04-16T08:24:40.696918Z" } }, + "cell_type": "code", + "source": [ + "print(\"Hyperolume of the constrained archive:\", cmoa.hypervolume)\n", + "print(\"Hypervolume plus of the constrained archive:\", cmoa.hypervolume_plus)\n", + "print(\"Hypervolume plus constr of the constrained archive:\", cmoa.hypervolume_plus_constr)" + ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Hyperolume of the constrained archive: 14\n", - "Hypervolume plus of the constrained archive: 14\n", - "Hypervolume plus constr of the constrained archive: 14\n" + "Hyperolume of the constrained archive: 0.0\n", + "Hypervolume plus of the constrained archive: -inf\n", + "Hypervolume plus constr of the constrained archive: -1.7\n" ] } ], + "execution_count": 32 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-16T08:24:40.818704Z", + "start_time": "2025-04-16T08:24:40.805739Z" + } + }, + "cell_type": "code", "source": [ + "cmoa.add([6, 6, 6], [0, 0])\n", "print(\"Hyperolume of the constrained archive:\", cmoa.hypervolume)\n", "print(\"Hypervolume plus of the constrained archive:\", cmoa.hypervolume_plus)\n", "print(\"Hypervolume plus constr of the constrained archive:\", cmoa.hypervolume_plus_constr)" - ] + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hyperolume of the constrained archive: 0.0\n", + "Hypervolume plus of the constrained archive: -0.3464101615137755\n", + "Hypervolume plus constr of the constrained archive: -0.3464101615137755\n" + ] + } + ], + "execution_count": 33 }, { "cell_type": "markdown", @@ -416,32 +475,32 @@ }, { "cell_type": "code", - "execution_count": 10, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:13.144651Z", - "start_time": "2025-02-11T10:02:13.131685Z" + "end_time": "2025-04-16T08:24:40.880637Z", + "start_time": "2025-04-16T08:24:40.860691Z" } }, + "source": [ + "for i, objectives in enumerate(moa):\n", + " assert moa.contributing_hypervolume(objectives) == moa.contributing_hypervolumes[i]\n", + " print(\"contributing hv of point\", objectives, \"is\", moa.contributing_hypervolume(objectives))\n", + "\n", + "print(\"All contributing hypervolumes:\", moa.contributing_hypervolumes)" + ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "contributing hv of point [3, 2, 1] is 2\n", - "contributing hv of point [2, 2, 2] is 2\n", - "contributing hv of point [1, 2, 3] is 2\n", - "All contributing hypervolumes: [Fraction(2, 1), Fraction(2, 1), Fraction(2, 1)]\n" + "contributing hv of point [3, 2, 1] is 0.9375\n", + "contributing hv of point [2, 2, 2] is 0.9375\n", + "contributing hv of point [1, 2, 3] is 0.9375\n", + "All contributing hypervolumes: [0.9375, 0.9375, 0.9375]\n" ] } ], - "source": [ - "for i, objectives in enumerate(moa):\n", - " assert moa.contributing_hypervolume(objectives) == moa.contributing_hypervolumes[i]\n", - " print(\"contributing hv of point\", objectives, \"is\", moa.contributing_hypervolume(objectives))\n", - "\n", - "print(\"All contributing hypervolumes:\", moa.contributing_hypervolumes)" - ] + "execution_count": 34 }, { "cell_type": "markdown", @@ -453,31 +512,31 @@ }, { "cell_type": "code", - "execution_count": 11, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:13.159612Z", - "start_time": "2025-02-11T10:02:13.145649Z" + "end_time": "2025-04-16T08:24:40.928217Z", + "start_time": "2025-04-16T08:24:40.915135Z" } }, + "source": [ + "point = [1, 3, 0]\n", + "print(f\"hypervolume before adding {point}: {moa.hypervolume}\")\n", + "print(f\"hypervolume improvement of point {point}: {moa.hypervolume_improvement(point)}\")\n", + "moa.add(point)\n", + "print(f\"hypervolume after adding {point}: {moa.hypervolume}\")" + ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "hypervolume before adding [1, 3, 0]: 12\n", - "hypervolume improvement of point [1, 3, 0]: 6\n", - "hypervolume after adding [1, 3, 0]: 18\n" + "hypervolume before adding [1, 3, 0]: 5.625\n", + "hypervolume improvement of point [1, 3, 0]: 2.8125\n", + "hypervolume after adding [1, 3, 0]: 8.4375\n" ] } ], - "source": [ - "point = [1, 3, 0]\n", - "print(f\"hypervolume before adding {point}: {moa.hypervolume}\")\n", - "print(f\"hypervolume improvement of point {point}: {moa.hypervolume_improvement(point)}\")\n", - "moa.add(point)\n", - "print(f\"hypervolume after adding {point}: {moa.hypervolume}\")" - ] + "execution_count": 35 }, { "cell_type": "markdown", @@ -489,13 +548,17 @@ }, { "cell_type": "code", - "execution_count": 12, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:13.175569Z", - "start_time": "2025-02-11T10:02:13.161608Z" + "end_time": "2025-04-16T08:24:40.960132Z", + "start_time": "2025-04-16T08:24:40.945173Z" } }, + "source": [ + "print(f\"Current archive: {list(moa)}\")\n", + "print(\"Distance of [3, 2, 1] to pareto front:\", moa.distance_to_pareto_front([3, 2, 1]))\n", + "print(\"Distance of [3, 2, 2] to pareto front:\", moa.distance_to_pareto_front([3, 3, 3]))" + ], "outputs": [ { "name": "stdout", @@ -503,15 +566,11 @@ "text": [ "Current archive: [[1, 3, 0], [3, 2, 1], [2, 2, 2], [1, 2, 3]]\n", "Distance of [3, 2, 1] to pareto front: 0.0\n", - "Distance of [3, 2, 2] to pareto front: 1.0\n" + "Distance of [3, 2, 2] to pareto front: 0.5\n" ] } ], - "source": [ - "print(f\"Current archive: {list(moa)}\")\n", - "print(\"Distance of [3, 2, 1] to pareto front:\", moa.distance_to_pareto_front([3, 2, 1]))\n", - "print(\"Distance of [3, 2, 2] to pareto front:\", moa.distance_to_pareto_front([3, 3, 3]))" - ] + "execution_count": 36 }, { "cell_type": "markdown", @@ -523,23 +582,12 @@ }, { "cell_type": "code", - "execution_count": 13, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:13.191547Z", - "start_time": "2025-02-11T10:02:13.176566Z" + "end_time": "2025-04-16T08:24:41.023755Z", + "start_time": "2025-04-16T08:24:41.013655Z" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "161245156349030777798724819133399/10141204801825835211973625643008\n", - "15.899999999999999\n" - ] - } - ], "source": [ "import fractions\n", "get_mo_archive.hypervolume_computation_float_type = fractions.Fraction\n", @@ -553,7 +601,18 @@ "\n", "moa3_nofr = get_mo_archive([[1, 2, 3], [2, 1, 3], [3, 3, 1.32], [1.3, 1.3, 3], [1.7, 1.1, 2]], reference_point=[4, 4, 4])\n", "print(moa3_nofr.hypervolume)" - ] + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "161245156349030777798724819133399/10141204801825835211973625643008\n", + "15.899999999999999\n" + ] + } + ], + "execution_count": 37 }, { "cell_type": "markdown", @@ -568,13 +627,21 @@ }, { "cell_type": "code", - "execution_count": 14, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:13.206978Z", - "start_time": "2025-02-11T10:02:13.192523Z" + "end_time": "2025-04-16T08:24:41.054700Z", + "start_time": "2025-04-16T08:24:41.041716Z" } }, + "source": [ + "points_list = [[5, 5, 0], [2, 2, 3], [0, 2, 3]]\n", + "print(\"archive:\", list(moa), \"\\n\")\n", + "print(\"point | in domain | dominates | num of dominators | dominators\")\n", + "print(\"----------|-----------|-----------|-------------------|-----------\")\n", + "for point in points_list:\n", + " print(f\"{point} | {moa.in_domain(point):9} | {moa.dominates(point):9} | \"\n", + " f\"{moa.dominators(point, number_only=True):17} | {moa.dominators(point)}\")" + ], "outputs": [ { "name": "stdout", @@ -590,15 +657,7 @@ ] } ], - "source": [ - "points_list = [[5, 5, 0], [2, 2, 3], [0, 2, 3]]\n", - "print(\"archive:\", list(moa), \"\\n\")\n", - "print(\"point | in domain | dominates | num of dominators | dominators\")\n", - "print(\"----------|-----------|-----------|-------------------|-----------\")\n", - "for point in points_list:\n", - " print(f\"{point} | {moa.in_domain(point):9} | {moa.dominates(point):9} | \"\n", - " f\"{moa.dominators(point, number_only=True):17} | {moa.dominators(point)}\")" - ] + "execution_count": 38 }, { "cell_type": "markdown", @@ -610,14 +669,12 @@ }, { "cell_type": "code", - "execution_count": 15, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:14.715856Z", - "start_time": "2025-02-11T10:02:13.208974Z" + "end_time": "2025-04-16T09:15:13.388152Z", + "start_time": "2025-04-16T09:15:13.299125Z" } }, - "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import random\n", @@ -639,29 +696,18 @@ " indicators_cmoa.append((cmoa.hypervolume_plus_constr, cmoa.hypervolume_plus, cmoa.hypervolume))\n", " indicators_moa.append((moa.hypervolume_plus, moa.hypervolume))\n", " " - ] + ], + "outputs": [], + "execution_count": 48 }, { "cell_type": "code", - "execution_count": 16, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:15.047297Z", - "start_time": "2025-02-11T10:02:14.716857Z" + "end_time": "2025-04-16T09:15:14.807477Z", + "start_time": "2025-04-16T09:15:14.496281Z" } }, - "outputs": [ - { - "data": { - "image/png": "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9evXY8WKFQgJCcHGjRuxc+dO9O7dW65imiTYjYGIqFaqzD36goODsXbtWpw8eRI///wzgoKCEB4ejitXrtip1EREZE+y3AcJABo0aIDt27dbjDGViEydOhVTp06Vq1hW4X2QiIhqj8reo2/8+PEGy6tWrcKmTZtw4sQJPPzww7KX+y5evCMisgfZWpCIiIiqk8rco+9eBQUF+Pjjj6HRaNChQwe5ikpERA4kWwsSERFRdVKZe/SV2rNnD8aNG4fc3Fz4+/tj//79Fictys/PR35+vrRs25uYs3cDEZGc2IJkgmA3BiKiGkPOe/SVeuihh5CSkoL4+HgMHjwYY8aMQWZmptl43sSciKjmYguSBbwPEhFR9SfnPfpKeXh44IEHHsADDzyAHj16oEWLFti0aRMWL15sMn7x4sWYO3eutJyTk1P1JIkTCBER2QUTJCIiqtHkvEefOUIIgy5095LzJuac5puISF7sYkdERHVCZe7Rd/v2bbz00ktITEzEn3/+iePHj2P69On466+/MHr0aEd9FCIikhETJCIiqjOsvUefSqXCb7/9hieeeALBwcEYNmwYrly5gp9++glt27Z1xEcgIiKZsYudCbxRLBFR7WTtPfpcXV3x9ddfy12sCmLdRERkD2xBIiIiIiIiKsEEiYiIiIiIqAQTJCIiIiIiohJMkEzgjWKJiKja4fhYIiK7YIJkQXl3ViciIrI71k1ERLJigkRERERERFSCCRIREREREVEJJkgmcAwSEREREVHdxATJAgXYz5uIiKob1k1ERHJigkRERERERFSCCRIREREREVEJJkimcAgSERFVN7wPEhGRXTBBsoBjkIiIqNrhfZCIiGTFBImIiIiIiKgEEyQiIiIiIqISTJBM4H2QiIio+mHdRERkD0yQLFCwnzcREVU7rJuIiOTEBImIiIiIiKgEEyQiIqKagNN8ExHZBRMkEzgGiYiIiIiobmKCREREVJNwfCwRkayYIBEREREREZVggkRERFQjsPs3EZE9MEEyQXAgLBERERFRncQEyQIF7zVBRETVDusmIiI5MUEiIiIiIiIqwQSJiIioJmD3byIiu2CCZALvg0RERNUWp/kmIpIVEyQLFKyEiIiIiIjqFCZIREREREREJZggERER1Qjs/k1EZA9MkEzgfZCIiKj6YvdvIiI5MUGygPdBIiIiIiKqW5ggERERERERlWCCREREVBOw+zcRkV0wQSIiIqpJeAsKIiJZyZYgZWVlISIiAhqNBhqNBhEREbhx44bFbW7duoXIyEg0btwYbm5uaN26NT788EO5ikhERERERGRAtgRp/PjxSElJQWxsLGJjY5GSkoKIiAiL28yZMwexsbHYvn07UlNTMWfOHDz//PP4v//7P7mKaRFvFEtEREREVLfIkiClpqYiNjYWGzduRFhYGMLCwrBhwwbs2bMHaWlpZrdLSEjApEmT0K9fPwQFBeHpp59Ghw4dcPToUTmKSUREVINwDBIRkT3IkiAlJCRAo9Gge/fu0roePXpAo9EgPj7e7Ha9e/fG7t278ffff0MIgUOHDuH333/HoEGD5CgmERFRDcTeDUREcnKS40UzMjKg1WqN1mu1WmRkZJjd7v3338eMGTPQuHFjODk5QalUYuPGjejdu7fZbfLz85Gfny8t5+TkVK3wAASv0hERERER1UlWtSBFRUVBoVBYfJR2hzM1fkcIYXFcz/vvv4/ExETs3r0bx44dw8qVKzFr1iz8+9//NrtNdHS0NBGERqNBkyZNrPlIFvFGsUREREREdYtVLUiRkZEYN26cxZigoCCcOHECly9fNnruypUr8PX1NbndnTt38NJLL2HXrl145JFHAADt27dHSkoK3nnnHQwYMMDkdosXL8bcuXOl5ZycHJsmSURERNUC74NERGQXViVIPj4+8PHxKTcuLCwM2dnZOHLkCEJDQwEASUlJyM7ORs+ePU1uU1hYiMLCQiiVho1aKpUKer3e7Hup1Wqo1WorPgUREVENxhlWiYhkJcskDa1bt8bgwYMxY8YMJCYmIjExETNmzMCwYcPQsmVLKa5Vq1bYtWsXAMDT0xN9+/bFggULEBcXh3PnzmHLli345JNPMGLECDmKaZbgVToiIiIiojpJlkkaAGDHjh144YUXEB4eDgAYPnw41q5daxCTlpaG7Oxsafnzzz/H4sWLMWHCBFy/fh2BgYF48803MXPmTLmKSUREREREJJEtQWrQoAG2b99uMebelho/Pz/ExMTIVSQiIqIajL0biIjsQZYudkRERCQXjkEiIpITEyQTeB8kIiIiIqK6iQmSBZbu2URERGQ3OZeA3c87uhRERHUCEyQiIqLq7s//3P1/w5bm44iIqMqYIBEREVV3pZMa1fcHBkQ5tChERLUdEyQTOAaJiIiql5J6qWFL3iiWiEhmTJAsUHCmICIiqlZYLxERyY0JEhERUXUn2LOBiMhemCARERHVFOxeR0QkOyZIpvBCHRERVSusmIiI7IUJkgUcg0REVLtkZWUhIiICGo0GGo0GERERuHHjRoW3f+aZZ6BQKLB69WrZymgZ6yUiIrkxQSIiojpj/PjxSElJQWxsLGJjY5GSkoKIiIgKbfvNN98gKSkJAQEBMpfSBI5BIiKyGydHF4CIiMgeUlNTERsbi8TERHTv3h0AsGHDBoSFhSEtLQ0tW5q/Aevff/+NyMhIfP/993jkkUfsVWRjHINERCQ7tiCZwPsgERHVPgkJCdBoNFJyBAA9evSARqNBfHy82e30ej0iIiKwYMECtG3btkLvlZ+fj5ycHIMHERHVDEyQLFDwSh0RUa2RkZEBrVZrtF6r1SIjI8Psdv/85z/h5OSEF154ocLvFR0dLY1z0mg0aNKkSaXKfBcv3BER2QsTJCIiqtGioqKgUCgsPo4ePQrA9IUvIYTZC2LHjh3De++9hy1btlh10Wzx4sXIzs6WHhcuXKjchzPCC3dERHLjGCQiIqrRIiMjMW7cOIsxQUFBOHHiBC5fvmz03JUrV+Dr62tyu59++gmZmZlo2rSptE6n02HevHlYvXo1zp8/b3I7tVoNtVpd8Q9RHk7SQERkN0yQTBCsiIiIagwfHx/4+PiUGxcWFobs7GwcOXIEoaGhAICkpCRkZ2ejZ8+eJreJiIjAgAEDDNYNGjQIERERmDJlStULby12/SYikh0TJAt4HyQiotqjdevWGDx4MGbMmIGPPvoIAPD0009j2LBhBjPYtWrVCtHR0RgxYgS8vb3h7e1t8DrOzs7w8/OzOOud7fHCHRGRvXAMEhER1Rk7duxASEgIwsPDER4ejvbt22Pbtm0GMWlpacjOznZQCcvDC3dERHJjCxIREdUZDRo0wPbt2y3GlNfN2ty4I1mx6zcRkd2wBckE3geJiIiqJY5BIiKSHRMkS1gPERERERHVKUyQiIiIqj32bCAishcmSERERDUGuzYQEcmNCRIREVF1x0kaiIjshgmSCZykgYiIqiVO0kBEJDsmSBbwRrFERFQ98MIdEZG9MEEiIiKqMXjhjohIbkyQiIiIqjuOQSIishsmSCaUdxd1IiIih+AYJCIi2TFBsoBjkIiIqHrghTsiInthgkRERERERFSCCRIREREREVEJJkhERETVHcfGEhHZDRMkCxQcDEtERNUJ6yUiItk5OboARNbS6XQoLCx0dDGI6iRnZ2eoVCpHF6MOYgsSEZG9MEGiGkMIgYyMDNy4ccPRRSGq07y8vODn58dWdofgPicikhsTJBMEr9RVS6XJkVarhbu7O0/OiOxMCIHc3FxkZmYCAPz9/R1cojqEY5CIiOyGCZIFvA9S9aHT6aTkyNvb29HFIaqz3NzcAACZmZnQarXsbmdvvDBERCQ7TtJANULpmCN3d3cHl4SISn+HHAtIRES1ERMkqlHYrY7I8fg7dCTueyIiuTFBMkGwrzcREVUnrJeIiOyGCRKRzPr164fZs2c7uhiyCQoKwurVqx1dDKK6ga13RESyY4JERERERERUQrYE6c0330TPnj3h7u4OLy+vCm0jhEBUVBQCAgLg5uaGfv364dSpU3IVkajO0ul00Ov1ji4GEVUYu9gREdmLbAlSQUEBRo8ejWeffbbC26xYsQKrVq3C2rVrkZycDD8/PwwcOBA3b96Uq5gm8T5IZGt6vR4LFy5EgwYN4Ofnh6ioKADA1KlTMWzYMIPYoqIi+Pn5YfPmzQCKu+hFRkYiMjISXl5e8Pb2xiuvvGIwVq6goAALFy5Eo0aN4OHhge7duyMuLk56fsuWLfDy8sKePXvQpk0bqNVqbNiwAa6urkY33n3hhRfQt29faXnnzp1o27Yt1Go1goKCsHLlSrOf8/z581AoFEhJSZHW3bhxAwqFQipPXFwcFAoFvv/+e3Tq1Alubm7o378/MjMz8d1336F169bw9PTEk08+idzcXOl1hBBYsWIFmjdvDjc3N3To0AFfffVVRXY/US3CLnZERHKT7T5Ir732GoDiE7OKEEJg9erVePnllzFy5EgAwNatW+Hr64tPP/0UzzzzjFxFNYszNVVvQgjcKdQ55L3dnFVWfT+2bt2KuXPnIikpCQkJCZg8eTJ69eqF6dOn48EHH8SlS5ekm27u27cPt27dwpgxYwy2nzZtGpKSknD06FE8/fTTCAwMxIwZMwAAU6ZMwfnz5/H5558jICAAu3btwuDBg3Hy5Em0aNECAJCbm4vo6Ghs3LgR3t7eaNy4MZYuXYqdO3di2rRpAIpblr788kssW7YMAHDs2DGMGTMGUVFRGDt2LOLj4zFr1ix4e3tj8uTJVdqHUVFRWLt2Ldzd3TFmzBiMGTMGarUan376KW7duoURI0ZgzZo1ePHFFwEAr7zyCr7++mt8+OGHaNGiBX788Uc89dRTaNiwoUFCR1QrcZIGIiK7qTY3ij137hwyMjIQHh4urVOr1ejbty/i4+PNJkj5+fnIz8+XlnNycmQvK1UPdwp1aPPq9w5579PLBsHdpeI/n/bt22Pp0qUAgBYtWmDt2rU4cOAAli9fjpYtW2Lbtm1YuHAhACAmJgajR49GvXr1pO2bNGmCd999FwqFAi1btsTJkyfx7rvvYsaMGTh79iw+++wz/PXXXwgICAAAzJ8/H7GxsYiJicFbb70FoPieNevWrUOHDh2k1x07diw+/fRTKUE6cOAAsrKyMHr0aADAqlWr8PDDD2PJkiUAgODgYJw+fRpvv/12lROkN954A7169QIATJs2DYsXL8bZs2fRvHlzAMCoUaNw6NAhvPjii7h9+zZWrVqFgwcPIiwsDADQvHlz/Pzzz/joo4+YIFHdwQt3RESyqzaTNGRkZAAAfH19Ddb7+vpKz5kSHR0NjUYjPZo0aSJrOYkqo3379gbL/v7+yMzMBABMnz4dMTExAIDMzEzs3bsXU6dONYjv0aOHQYtVWFgYzpw5A51Oh+PHj0MIgeDgYNSrV096HD58GGfPnpW2cXFxMSrHhAkTEBcXh4sXLwIAduzYgaFDh+K+++4DAKSmpkpJTKlevXpJ710VZcvi6+sLd3d3KTkqXVe6j06fPo28vDwMHDjQ4DN+8sknBp+RqPZiCxIRkb1Y1YIUFRUldZ0zJzk5GV27dq10ge7ttiSEsNiVafHixZg7d660nJOTU+UkifdBqhncnFU4vWyQw97bGs7OzgbLCoVCmiRh4sSJWLRoERISEpCQkICgoCD06dOnwq+t1+uhUqlw7NgxqFSG5SrbCuXm5mb0WwoNDcX999+Pzz//HM8++yx27dolJWuA6d+fpd+HUqk0iiksLDQZW3afKBQKi/uo9N+9e/eiUaNGBnFqtdpseYhqH7YgERHJzaoEKTIyEuPGjbMYExQUVKmC+Pn5AShuSSodiwEUX1G/t1WpLLVaLdsJkoIVUbWmUCis6uZWXXl7e+Pxxx9HTEwMEhISMGXKFKOYxMREo+UWLVpApVKhU6dO0Ol0yMzMtCqxKjV+/Hjs2LEDjRs3hlKpxCOPPCI916ZNG/z8888G8fHx8QgODjZKxgCgYcOGAIBLly6hU6dOAGAwYUNllU4skZ6ezu50VDfxwh0Rkd1YdXbp4+MDHx8fWQrSrFkz+Pn5Yf/+/dKJVUFBAQ4fPox//vOfsrwnUXUxffp0DBs2DDqdDpMmTTJ6/sKFC5g7dy6eeeYZHD9+HGvWrJFmkwsODsaECRMwceJErFy5Ep06dcLVq1dx8OBBhISEYOjQoRbfe8KECXjttdfw5ptvYtSoUXB1dZWemzdvHrp164bXX38dY8eORUJCAtauXYt169aZfC03Nzf06NEDy5cvR1BQEK5evYpXXnmlCnumWP369TF//nzMmTMHer0evXv3Rk5ODuLj41GvXj2T+4yoVuIYJCIi2cl2+T09PR3Xr19Heno6dDqddBX5gQcekLr9tGrVCtHR0RgxYgQUCgVmz56Nt956Cy1atECLFi3w1ltvwd3dHePHj5ermETVwoABA+Dv74+2bdtKEy2UNXHiRNy5cwehoaFQqVR4/vnn8fTTT0vPx8TE4I033sC8efPw999/w9vbG2FhYeUmR0DxpBHdunVDcnIyVq9ebfBc586d8eWXX+LVV1/F66+/Dn9/fyxbtsziBA2bN2/G1KlT0bVrV7Rs2RIrVqwwmHylsl5//XVotVpER0fjjz/+gJeXFzp37oyXXnqpyq9NVP2xBYmIyF4UQqYBN5MnT8bWrVuN1h86dAj9+vUrfnOFAjExMdLJlhACr732Gj766CNkZWWhe/fu+OCDD9CuXbsKv29OTg40Gg2ys7Ph6elZqbK/kfgGvkj7As+0fwaRnSIr9RpkW3l5eTh37hyaNWtm0MJRW+Tm5iIgIACbN2+Wprkv1a9fP3Ts2NEoeSFyFEu/R1scg2ujKu+XhA+A718CQsYAT2ywfQGJiGqpyhx/ZWtB2rJlS7n3QLo3N1MoFIiKipJuoulovA8SyU2v1yMjIwMrV66ERqPB8OHDHV0kIiIiojqt5o9wJ6rB0tPT0axZMzRu3BhbtmyBkxN/kkRkAidpICKyG56NETlQUFBQudPKx8XF2acwRFT9sWcDyUyn05m9PQNRdeXs7Gxydt3KYoJERERU7bEFieQlhEBGRgZu3Ljh6KIQVYqXlxf8/PxsMkSGCZIFvA8SERFVL6yXSB6lyZFWq4W7uzvHYVONIYRAbm4uMjMzAcDgfqqVxQSJiIiouuMYJJKRTqeTkiNvb29HF4fIam5ubgCAzMxMaLXaKne3U9qiUERERGQHvKpPMigdc+Tu7u7gkhBVXun31xZj6JggERERVXtsQSL5sVsd1WS2/P4yQTJBpnvnEhERVRFPYImI5MYEyQJO0kC20K9fP8yePdvRxZBNUFAQVq9e7ehiVNmWLVvg5eXl6GIQEZEVWMeSHJggERERVXfs2UBEZDdMkIjqIJ1OB71e7+hiEJG1OEaEqNpjHVvzMUEyQXAwLNmYXq/HwoUL0aBBA/j5+SEqKgoAMHXqVAwbNswgtqioCH5+fti8eTOA4u4DkZGRiIyMhJeXF7y9vfHKK68YjJUrKCjAwoUL0ahRI3h4eKB79+6Ii4uTni/tPrZnzx60adMGarUaGzZsgKurq9FNAV944QX07dtXWt65cyfatm0LtVqNoKAgrFy50uznPH/+PBQKBVJSUqR1N27cgEKhkMoTFxcHhUKB77//Hp06dYKbmxv69++PzMxMfPfdd2jdujU8PT3x5JNPIjc3V3odIQRWrFiB5s2bw83NDR06dMBXX31Vkd0vvefevXvRoUMHuLq6onv37jh58qTZbSZPnozHH3/cYN3s2bPRr18/afmrr75CSEgI3Nzc4O3tjQEDBuD27dsVKhORdVgvEZnDOtaxdWxtxATJEl6oq96EAApuO+ZhZXeXrVu3wsPDA0lJSVixYgWWLVuG/fv3Y/r06YiNjcWlS5ek2H379uHWrVsYM2aMwfZOTk5ISkrC+++/j3fffRcbN26Unp8yZQr+85//4PPPP8eJEycwevRoDB48GGfOnJFicnNzER0djY0bN+LUqVN46qmn4OXlhZ07d0oxOp0OX375JSZMmAAAOHbsGMaMGYNx48bh5MmTiIqKwpIlS7BlyxZr/1pGoqKisHbtWsTHx+PChQsYM2YMVq9ejU8//RR79+7F/v37sWbNGin+lVdeQUxMDD788EOcOnUKc+bMwVNPPYXDhw9X+D0XLFiAd955B8nJydBqtRg+fHilpwO9dOkSnnzySUydOhWpqamIi4vDyJEjOckLyYwVE9mHEAK5BUUOeVh7HGUda8wRdWxtwhvFUs1VmAu8FeCY937pIuDiUeHw9u3bY+nSpQCAFi1aYO3atThw4ACWL1+Oli1bYtu2bVi4cCEAICYmBqNHj0a9evWk7Zs0aYJ3330XCoUCLVu2xMmTJ/Huu+9ixowZOHv2LD777DP89ddfCAgo3h/z589HbGwsYmJi8NZbbwEovi/AunXr0KFDB+l1x44di08//RTTpk0DABw4cABZWVkYPXo0AGDVqlV4+OGHsWTJEgBAcHAwTp8+jbfffhuTJ0+u5M4r9sYbb6BXr14AgGnTpmHx4sU4e/YsmjdvDgAYNWoUDh06hBdffBG3b9/GqlWrcPDgQYSFhQEAmjdvjp9//hkfffSRwdU4S5YuXYqBAwcCKK4QGzdujF27dhlUlBV16dIlFBUVYeTIkQgMDAQAhISEWP06RBXCxJvs7E6hDm1e/d4h73162SC4u1T8FJV1rDFH1LG1CVuQiOygffv2Bsv+/v7IzMwEAEyfPh0xMTEAiu8AvXfvXkydOtUgvkePHgbz+4eFheHMmTPQ6XQ4fvw4hBAIDg5GvXr1pMfhw4dx9uxZaRsXFxejckyYMAFxcXG4ePEiAGDHjh0YOnQo7rvvPgBAamqqdIAt1atXL+m9q6JsWXx9feHu7i4duEvXle6j06dPIy8vDwMHDjT4jJ988onBZyxP6YEfABo0aICWLVsiNTW1UuXv0KEDHn74YYSEhGD06NHYsGEDsrKyKvVaRBXGBiQiI6xjjTmijq1N2IJkAscg1RDO7sUtOY56b2vCnZ0NlhUKhTSAc+LEiVi0aBESEhKQkJCAoKAg9OnTp8KvrdfroVKpcOzYMahUKoPnyl4hc3NzM7qJWmhoKO6//358/vnnePbZZ7Fr1y6pIgGKu1jcu42lrg9KpdIoxlwXtrL7RKFQWNxHpf/u3bsXjRo1MohTq9Vmy1MR5m4sp1QqjT5r2c+iUqmwf/9+xMfH44cffsCaNWvw8ssvIykpCc2aNatSmYiMsV4i+3JzVuH0skEOe29rsI41Vl3q2JqKCZIFvA9SNadQWNXNrbry9vbG448/jpiYGCQkJGDKlClGMYmJiUbLLVq0gEqlQqdOnaDT6ZCZmWnVQb/U+PHjsWPHDjRu3BhKpRKPPPKI9FybNm3w888/G8THx8cjODjYqKIAgIYNGwIo7n7WqVMnADAYTFpZpYNe09PTq9TUn5iYiKZNmwIAsrKy8Pvvv6NVq1YmYxs2bIhff/3VYF1KSopRpdOrVy/06tULr776KgIDA7Fr1y7MnTu30mUksoz1EtmHQqGwqptbdcU6tny2qmNrk5r/zSeqBaZPn45hw4ZBp9Nh0qRJRs9fuHABc+fOxTPPPIPjx49jzZo10kw3wcHBmDBhAiZOnIiVK1eiU6dOuHr1Kg4ePIiQkBAMHTrU4ntPmDABr732Gt58802MGjUKrq6u0nPz5s1Dt27d8Prrr2Ps2LFISEjA2rVrsW7dOpOv5ebmhh49emD58uUICgrC1atX8corr1RhzxSrX78+5s+fjzlz5kCv16N3797IyclBfHw86tWrZ3KfmbJs2TJ4e3vD19cXL7/8Mnx8fIxmqivVv39/vP322/jkk08QFhaG7du349dff5UqpaSkJBw4cADh4eHQarVISkrClStX0Lp16yp/XiIjHINEVGmsYy2zVR1bmzBBIqoGBgwYAH9/f7Rt21YaBFrWxIkTcefOHYSGhkKlUuH555/H008/LT0fExODN954A/PmzcPff/8Nb29vhIWFlXvgBooHtHbr1g3JyclGd+vu3LkzvvzyS7z66qt4/fXX4e/vj2XLllkcPLp582ZMnToVXbt2RcuWLbFixQqEh4dXeF+Y8/rrr0Or1SI6Ohp//PEHvLy80LlzZ7z00ksVfo3ly5fjH//4B86cOYMOHTpg9+7dcHFxMRk7aNAgLFmyBAsXLkReXh6mTp2KiRMnSlODe3p64scff8Tq1auRk5ODwMBArFy5EkOGDKnyZyUyi/dBIrIa69jy2aKOrU0UopbNSZuTkwONRoPs7Gx4enpW6jWi4qOw88xOPNfxOczsMNPGJaTKyMvLw7lz59CsWTODqy+1RW5uLgICArB582aMHDnS4Ll+/fqhY8eORgdWqri4uDg89NBDyMrKgpeXl6OLU+NZ+j3a4hhcG1V5v/z4DnDwdaDzRGD4mvLjiazAOpZ1bG1g7ntcmeMvW5BM0IviwWoqhXWDBImspdfrkZGRgZUrV0Kj0WD48OGOLhIRVUu16lomkV2wjqXK4jTfJuhE8dSKSgV3D8krPT0djRo1wpdffonNmzfDyYnXLCpj5syZBlOTln3MnMlWYLorKysLERER0Gg00Gg0iIiIMLrT/b0mT54MhUJh8OjRo4d9CmyEXeyIKop1LFUWvykmsAWJ7CUoKKjcO4bHxcXZpzA12LJlyzB//nyTz3l6ekKr1Vp9Z3aqncaPH4+//voLsbGxAICnn34aERER+Pbbby1uN3jwYIPpec2NXZMNv75EVmMdS5XFBMkEtiAR1SxarRZardbRxaBqLjU1FbGxsUhMTET37t0BABs2bEBYWBjS0tLQsmVLs9uq1Wr4+fnZq6jmcZIGIiLZMQMwofRqg0rJFiQiotoiISEBGo1GSo4AoEePHtBoNIiPj7e4bVxcHLRaLYKDgzFjxgzpDvT2wyYkIiJ7YQuSCWxBIiKqfTIyMky2NGq1WmRkZJjdbsiQIRg9ejQCAwNx7tw5LFmyBP3798exY8fM3mU+Pz8f+fn50nJOTk7VPwAAjkEiIpIfMwATOAaJiKjmiIqKMppE4d7H0aNHAQAKE13UhBAm15caO3YsHnnkEbRr1w6PPvoovvvuO/z+++/Yu3ev2W2io6OliSA0Gg2aNGlStQ/JMXRERHbDFiQT2IJERFRzREZGYty4cRZjgoKCcOLECVy+fNnouStXrsDX17fC7+fv74/AwECcOXPGbMzixYsxd+5caTknJ6fqSRLAMUhERHbABMmE0hYkJkhERNWfj48PfHx8yo0LCwtDdnY2jhw5gtDQUABAUlISsrOz0bNnzwq/37Vr13DhwgX4+/ubjVGr1Wa731UOW5CIiOyFGYAJbEEiW+rXrx9mz57t6GLIJigoqFbcgXzLli3w8vJydDFIRq1bt8bgwYMxY8YMJCYmIjExETNmzMCwYcMMZrBr1aoVdu3aBQC4desW5s+fj4SEBJw/fx5xcXF49NFH4ePjgxEjRjjgU7AFiags1rE1Q02rY5kBmKDXcwwSEdVekydPxuOPP+7oYjjEjh07EBISgvDwcISHh6N9+/bYtm2bQUxaWhqys7MBACqVCidPnsRjjz2G4OBgTJo0CcHBwUhISED9+vUd8RGIiEhm7GJngh7sYke1m06ng0KhgFLJ7ziZV1hYCGdnZ0cXw6YaNGiA7du3W4wpe2NJNzc3fP/993IXq3ycpIGoxmAdW/PxL2cCZ7EjW9Pr9Vi4cCEaNGgAPz8/REVFAQCmTp2KYcOGGcQWFRXBz88PmzdvBlDcfSAyMhKRkZHw8vKCt7c3XnnlFYOTuIKCAixcuBCNGjWCh4cHunfvbnB38NKm7T179qBNmzZQq9XYsGEDXF1dcePGDYP3f+GFF9C3b19peefOnWjbti3UajWCgoKwcuVKs5/z/PnzUCgUSElJkdbduHEDCoVCKk9cXBwUCgW+//57dOrUCW5ubujfvz8yMzPx3XffoXXr1vD09MSTTz6J3Nxc6XWEEFixYgWaN28ONzc3dOjQAV999VVFdr/0nnv37kWHDh3g6uqK7t274+TJk2a3MdXKMnv2bPTr109a/uqrrxASEgI3Nzd4e3tjwIABuH37doXKtHnzZmm/+vv7IzIyUnouPT0djz32GOrVqwdPT0+MGTPGYHKBqKgodOzYEdu2bUNQUBA0Gg3GjRuHmzdvllu2qKgobN26Ff/3f/8nzfAWFxcn/e2+/PJL9OvXD66uruUmEuQAnKSByAjrWNaxtsYEyQSdnmOQagIhBHILcx3yEFZezd26dSs8PDyQlJSEFStWYNmyZdi/fz+mT5+O2NhYXLp0SYrdt28fbt26hTFjxhhs7+TkhKSkJLz//vt49913sXHjRun5KVOm4D//+Q8+//xznDhxAqNHj8bgwYMNZtnKzc1FdHQ0Nm7ciFOnTuGpp56Cl5cXdu7cKcXodDp8+eWXmDBhAgDg2LFjGDNmDMaNG4eTJ08iKioKS5YswZYtW6z9cxmJiorC2rVrER8fjwsXLmDMmDFYvXo1Pv30U+zduxf79+/HmjVrpPhXXnkFMTEx+PDDD3Hq1CnMmTMHTz31FA4fPlzh91ywYAHeeecdJCcnQ6vVYvjw4SgsLKxU+S9duoQnn3wSU6dORWpqKuLi4jBy5MgKfTc+/PBDPPfcc3j66adx8uRJ7N69Gw888ACA4u/1448/juvXr+Pw4cPYv38/zp49i7Fjxxq8xtmzZ/HNN99gz5492LNnDw4fPozly5eXW7b58+djzJgxGDx4MC5duoRLly4ZTFDw4osv4oUXXkBqaioGDRpUqX1DcmALEtmZEEDBbcc8WMda+9cyUpfrWFtgFzsT8nR5AABXJ1cHl4QsuVN0B90/7e6Q904anwR3Z/cKx7dv3x5Lly4FALRo0QJr167FgQMHsHz5crRs2RLbtm3DwoULAQAxMTEYPXo06tWrJ23fpEkTvPvuu1AoFGjZsiVOnjyJd999FzNmzMDZs2fx2Wef4a+//kJAQAAAYP78+YiNjUVMTAzeeustAMXdpdatW4cOHTpIrzt27Fh8+umnmDZtGgDgwIEDyMrKwujRowEAq1atwsMPP4wlS5YAAIKDg3H69Gm8/fbbmDx5ciX3XrE33ngDvXr1AgBMmzYNixcvxtmzZ9G8eXMAwKhRo3Do0CG8+OKLuH37NlatWoWDBw8iLCwMANC8eXP8/PPP+OijjwyuxlmydOlSDBw4EEBxhdi4cWPs2rXLoKKsqEuXLqGoqAgjR45EYGAgACAkJKRC277xxhuYN28e/vGPf0jrunXrBgD497//jRMnTuDcuXPStNDbtm1D27ZtkZycLMXp9Xps2bJFGgcTERGBAwcO4M033yy3bG5ubsjPz4efn59R2WbPno2RI0dauzvIbtiCRHZSmAu8FeCY937pIuDiUeFw1rHG6nIdawtsIjEhv6j47ueuKiZIZBvt27c3WPb390dmZiYAYPr06YiJiQEAZGZmYu/evZg6dapBfI8ePQxuZBkWFoYzZ85Ap9Ph+PHjEEIgODgY9erVkx6HDx/G2bNnpW1cXFyMyjFhwgTExcXh4sWLAIoHsA8dOhT33XcfACA1NVU6wJbq1auX9N5VUbYsvr6+cHd3lw7cpetK99Hp06eRl5eHgQMHGnzGTz75xOAzlqf0wA8Uj0Vp2bIlUlNTK1X+Dh064OGHH0ZISAhGjx6NDRs2ICsrq9ztMjMzcfHiRTz88MMmn09NTUWTJk0M7pnTpk0beHl5GZQ1KCjIYJKAst+pypYNALp27VqhOLIzjkEiMot1rLG6WsfaCluQ7nE++zzOZhd/GdiCVL25ObkhaXySw97bGvcOdFcoFNJsiRMnTsSiRYuQkJCAhIQEBAUFoU+fPhV+bb1eD5VKhWPHjkGlMhw3V/YKmZubm0EFAAChoaG4//778fnnn+PZZ5/Frl27pIoEKO7ude82lpq3Sweklo0x17xedp8oFAqL+6j0371796JRo0YGcVW918y9n6+UUqk0+qxlP4tKpcL+/fsRHx+PH374AWvWrMHLL7+MpKQkNGvWzOz7ublZ/u6Y2uem1lvaX5UtGwB4eFT8qi3Z0V9Hiv/lGCSyF2f34pYcR723NeGsY43U1TrWVpgg3eOLtC+k/1t7Ekz2pVAorOrmVl15e3vj8ccfR0xMDBISEjBlyhSjmMTERKPlFi1aQKVSoVOnTtDpdMjMzLTqoF9q/Pjx2LFjBxo3bgylUolHHnlEeq5Nmzb4+eefDeLj4+MRHBxsVFEAQMOGDQEUN4136tQJAAwGk1ZW6aDX9PT0Cjf1m5KYmIimTZsCALKysvD777+jVatWJmMbNmyIX3/91WBdSkqKUaXTq1cv9OrVC6+++ioCAwOxa9cuzJ0712wZ6tevj6CgIBw4cAAPPfSQ0fNt2rRBeno6Lly4ILUinT59GtnZ2WjdunWFP6ulsrm4uFT56iTZ2R9xxf9ybCzZi0JhVTe36op1bPlqUx1rK0yQ7tHQvSFa3NcCLbxa4H6v+x1dHKojpk+fjmHDhkGn02HSpElGz1+4cAFz587FM888g+PHj2PNmjXSTDfBwcGYMGECJk6ciJUrV6JTp064evUqDh48iJCQEAwdOtTie0+YMAGvvfYa3nzzTYwaNQqurndbTufNm4du3brh9ddfx9ixY5GQkIC1a9di3bp1Jl/Lzc0NPXr0wPLlyxEUFISrV6/ilVdeqcKeKVa/fn3Mnz8fc+bMgV6vR+/evZGTk4P4+HjUq1fP5D4zZdmyZfD29oavry9efvll+Pj4mL0fUP/+/fH222/jk08+QVhYGLZv345ff/1VqpSSkpJw4MABhIeHQ6vVIikpCVeuXKlQEhMVFYWZM2dCq9ViyJAhuHnzJv7zn//g+eefx4ABA9C+fXtMmDABq1evRlFREWbNmoW+fftWuPtbeWULCgrC999/j7S0NHh7e0Oj0VTodcmBWg0Dbl0GQqzvy09U17GOtay21bG2wATpHlPbTcXUdlPLDySyoQEDBsDf3x9t27aVBoGWNXHiRNy5cwehoaFQqVR4/vnn8fTTT0vPx8TESAP///77b3h7eyMsLKzcAzdQPKC1W7duSE5ONrpbd+fOnfHll1/i1Vdfxeuvvw5/f38sW7bM4uDRzZs3Y+rUqejatStatmyJFStWIDw8vML7wpzXX38dWq0W0dHR+OOPP+Dl5YXOnTvjpZdeqvBrLF++HP/4xz9w5swZdOjQAbt374aLi4vJ2EGDBmHJkiVYuHAh8vLyMHXqVEycOFGattTT0xM//vgjVq9ejZycHAQGBmLlypUYMmRIueWYNGkS8vLy8O6772L+/Pnw8fHBqFGjABRfMfvmm2/w/PPP48EHH4RSqcTgwYMNZhsqT3llmzFjBuLi4tC1a1fcunULhw4dQlBQUIVfnxxg3A5Hl4CoxmIdW77aVMfagkLYa748O8nJyYFGo0F2djY8PT0dXRyykby8PJw7dw7NmjUzuPpSW+Tm5iIgIACbN282mkGsX79+6Nixo9GBlSouLi4ODz30ELKysuDl5eXo4tR4ln6PPAabxv1C1RnrWNaxVVFd6lhz3+PKHH/ZgkTkQHq9HhkZGVi5ciU0Gg2GDx/u6CIRERHVCqxjqbI42pPIgdLT09GoUSN8+eWX2Lx5M5yceM2iMmbOnGkwNWnZx8yZM+1eHnNlqVevHn766Se7l4eIqC5iHWsb1a2OtQd2saMaobY3/1PVZGZmIicnx+Rznp6e0Gq1di3P//73P7PPNWrUqNypvqs7drGzHvcLVWesY8mS6lbHmsMudkREZWi12mpzgAaABx54wNFFICIisonqVsfag2xd7N5880307NkT7u7uFRqwVVhYiBdffBEhISHw8PBAQEAAJk6cKN19mIiIiIiISG6yJUgFBQUYPXo0nn322QrF5+bm4vjx41iyZAmOHz+Or7/+Gr///jsH1JGB0rs9E5Hj8HdIVDvxt001mS2/v7J1sXvttdcAAFu2bKlQvEajwf79+w3WrVmzBqGhoUhPT5fuzEt1k4uLC5RKJS5evIiGDRvCxcUFCoXC0cUiqlOEECgoKMCVK1egVCrN3t+CiGoW1rFUk8lRN1XrMUjZ2dlQKBQWu+jl5+cjPz9fWjY3iIxqNqVSiWbNmuHSpUvsdknkYO7u7mjatCmUSk6ESlQbsI6l2sCWdVO1TZDy8vKwaNEijB8/3uKME9HR0VJrFdVuLi4uaNq0KYqKiqDT6RxdHKI6SaVSwcnJiVeXiWoZ1rFUk9m6brIqQYqKiio3GUlOTkbXrl2rVKjCwkKMGzcOer0e69atsxi7ePFizJ07V1rOyclBkyZNqvT+VH0pFAo4OzvD2dnZ0UUhIiKqVVjHEhWzKkGKjIzEuHHjLMYEBQVVpTwoLCzEmDFjcO7cORw8eLDc+crVajXUanWV3pOIiIiIiAiwMkHy8fGBj4+PXGWRkqMzZ87g0KFD8Pb2lu29iIiIiIiI7iXbCNv09HSkpKQgPT0dOp0OKSkpSElJwa1bt6SYVq1aYdeuXQCAoqIijBo1CkePHsWOHTug0+mQkZGBjIwMFBQUyFVMIiIiIiIiiWyTNLz66qvYunWrtNypUycAwKFDh9CvXz8AQFpaGrKzswEAf/31F3bv3g0A6Nixo8Frld2mPEIIAJzNjojIEUqPvaXHYirGuomIyDEqUy8pRC2rxf766y9O0kBE5GAXLlxA48aNHV2MaoN1ExGRY1lTL9W6BEmv1+PixYuoX79+pab6K50F78KFC+VOEEGmcR9WDfdf1XD/VU1V958QAjdv3kRAQADvk1QG6ybH4v6rGu6/quM+rJqq7L/K1EvV9j5IlaVUKm1y1dLT05Nf4CriPqwa7r+q4f6rmqrsP41GY+PS1Hysm6oH7r+q4f6rOu7Dqqns/rO2XuLlPSIiIiIiohJMkIiIiIiIiEowQbqHWq3G0qVLefPZKuA+rBruv6rh/qsa7r/qiX+XquH+qxruv6rjPqwae++/WjdJAxERERERUWWxBYmIiIiIiKgEEyQiIiIiIqISTJCIiIiIiIhKMEEiIiIiIiIqwQTpHuvWrUOzZs3g6uqKLl264KeffnJ0kRwuKioKCoXC4OHn5yc9L4RAVFQUAgIC4Obmhn79+uHUqVMGr5Gfn4/nn38ePj4+8PDwwPDhw/HXX3/Z+6PYzY8//ohHH30UAQEBUCgU+Oabbwyet9U+y8rKQkREBDQaDTQaDSIiInDjxg2ZP538ytt/kydPNvpO9ujRwyCmru6/6OhodOvWDfXr14dWq8Xjjz+OtLQ0gxh+/2oe1k3GWDdZh/VS1bBeqpqaVjcxQSrjiy++wOzZs/Hyyy/jl19+QZ8+fTBkyBCkp6c7umgO17ZtW1y6dEl6nDx5UnpuxYoVWLVqFdauXYvk5GT4+flh4MCBuHnzphQze/Zs7Nq1C59//jl+/vln3Lp1C8OGDYNOp3PEx5Hd7du30aFDB6xdu9bk87baZ+PHj0dKSgpiY2MRGxuLlJQUREREyP755Fbe/gOAwYMHG3wn9+3bZ/B8Xd1/hw8fxnPPPYfExETs378fRUVFCA8Px+3bt6UYfv9qFtZN5rFuqjjWS1XDeqlqalzdJEgSGhoqZs6cabCuVatWYtGiRQ4qUfWwdOlS0aFDB5PP6fV64efnJ5YvXy6ty8vLExqNRqxfv14IIcSNGzeEs7Oz+Pzzz6WYv//+WyiVShEbGytr2asDAGLXrl3Ssq322enTpwUAkZiYKMUkJCQIAOK3336T+VPZz737TwghJk2aJB577DGz23D/3ZWZmSkAiMOHDwsh+P2riVg3mca6qfJYL1UN66Wqq+51E1uQShQUFODYsWMIDw83WB8eHo74+HgHlar6OHPmDAICAtCsWTOMGzcOf/zxBwDg3LlzyMjIMNhvarUaffv2lfbbsWPHUFhYaBATEBCAdu3a1cl9a6t9lpCQAI1Gg+7du0sxPXr0gEajqRP7NS4uDlqtFsHBwZgxYwYyMzOl57j/7srOzgYANGjQAAC/fzUN6ybLWDfZBo8LtsF6qeKqe93EBKnE1atXodPp4Ovra7De19cXGRkZDipV9dC9e3d88skn+P7777FhwwZkZGSgZ8+euHbtmrRvLO23jIwMuLi44L777jMbU5fYap9lZGRAq9Uavb5Wq631+3XIkCHYsWMHDh48iJUrVyI5ORn9+/dHfn4+AO6/UkIIzJ07F71790a7du0A8PtX07BuMo91k+3wuFB1rJcqribUTU4V/zh1g0KhMFgWQhitq2uGDBki/T8kJARhYWG4//77sXXrVmkAYmX2W13ft7bYZ6bi68J+HTt2rPT/du3aoWvXrggMDMTevXsxcuRIs9vVtf0XGRmJEydO4OeffzZ6jt+/moV1kzHWTbbH40LlsV6quJpQN7EFqYSPjw9UKpVRdpmZmWmUzdZ1Hh4eCAkJwZkzZ6QZgyztNz8/PxQUFCArK8tsTF1iq33m5+eHy5cvG73+lStX6tx+9ff3R2BgIM6cOQOA+w8Ann/+eezevRuHDh1C48aNpfX8/tUsrJsqjnVT5fG4YHusl0yrKXUTE6QSLi4u6NKlC/bv32+wfv/+/ejZs6eDSlU95efnIzU1Ff7+/mjWrBn8/PwM9ltBQQEOHz4s7bcuXbrA2dnZIObSpUv49ddf6+S+tdU+CwsLQ3Z2No4cOSLFJCUlITs7u87t12vXruHChQvw9/cHULf3nxACkZGR+Prrr3Hw4EE0a9bM4Hl+/2oW1k0Vx7qp8nhcsD3WS4ZqXN1U4ekc6oDPP/9cODs7i02bNonTp0+L2bNnCw8PD3H+/HlHF82h5s2bJ+Li4sQff/whEhMTxbBhw0T9+vWl/bJ8+XKh0WjE119/LU6ePCmefPJJ4e/vL3JycqTXmDlzpmjcuLH497//LY4fPy769+8vOnToIIqKihz1sWR18+ZN8csvv4hffvlFABCrVq0Sv/zyi/jzzz+FELbbZ4MHDxbt27cXCQkJIiEhQYSEhIhhw4bZ/fPamqX9d/PmTTFv3jwRHx8vzp07Jw4dOiTCwsJEo0aNuP+EEM8++6zQaDQiLi5OXLp0SXrk5uZKMfz+1Sysm0xj3WQd1ktVw3qpampa3cQE6R4ffPCBCAwMFC4uLqJz587S9IN12dixY4W/v79wdnYWAQEBYuTIkeLUqVPS83q9XixdulT4+fkJtVotHnzwQXHy5EmD17hz546IjIwUDRo0EG5ubmLYsGEiPT3d3h/Fbg4dOiQAGD0mTZokhLDdPrt27ZqYMGGCqF+/vqhfv76YMGGCyMrKstOnlI+l/ZebmyvCw8NFw4YNhbOzs2jatKmYNGmS0b6pq/vP1H4DIGJiYqQYfv9qHtZNxlg3WYf1UtWwXqqamlY3KUoKTUREREREVOdxDBIREREREVEJJkhEREREREQlmCARERERERGVYIJERERERERUggkSERERERFRCSZIREREREREJZggERERERERlWCCREREREREVIIJEhERERERUQkmSERERERERCWYIBEREREREZVggkRERERERFTi/wEncT/88Feu0QAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "fig, axs = plt.subplots(1, 2, figsize=(10, 5))\n", "axs[0].plot([x[2] for x in indicators_cmoa], label=\"hypervolume\")\n", @@ -678,7 +724,20 @@ "axs[1].axhline(0, color=\"black\", linestyle=\"--\", zorder=0)\n", "axs[1].legend()\n", "plt.show()" - ] + ], + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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9qXKP4OcnBxoNBq0adOmRsdUua7L74er7uc0depUJCcn45dffgEAxMTEQKVSSWP8AeDmzZs4ffq03s+oefPmEEJIPyMiooelpudxnsN5Dif5MUEiHUqlEkOGDMHJkyf1JlmoSvkJMDMzU2/djRs34OrqWusyWFtbY+7cuTh16hT+/PNPfPXVV7h69SqGDx9ucNrSyipeNSv33Xff4f79+9i1axdeeOEFPP744+jTpw9sbW1rXUZDWrRoAaVSiSlTpuD48eNVvsoTJRcXF70baAFUuawmpkyZgtu3b2P9+vV48cUXDcYNGzYMAIxO7/rdd9/B2tpaunn2q6++Qn5+Po4dO4YWLVpIr27dukEIgbi4OOTk5Ojso/LPoGXLllAqlTX6XtXH888/D5VKhS1btkCj0WDbtm149tlnda6Eurq6IiAgwODPaPHixbKWkYioKjU5j/McznM4yY8JEulZtGgRhBAIDw9HUVGR3vri4mJ8//33AEq74AFg+/btOjHHjx9Heno6hgwZUq+yODs7Y8yYMfj73/+OP//8U7oqVtMrURWVn+wrzswnhMDGjRvrVcaKHBwc8OSTT+Knn35Ct27d0KdPH71XeVL55JNP4ty5c/j555919vHll1/W6bNbt26N119/HX/5y18wefJkg3HPPfccunTpguXLl1c5rPDrr7/GDz/8gOnTp0u9WZs2bULz5s1x8OBBJCYm6rw++ugjFBYWIjY21mj57O3tMWjQIPy///f/ZL2616JFCzz77LP44osvsGfPHmRlZekNUwkJCcGlS5fg4uJS5c/IXA8JJqKmrSbncZ7DeQ4n+fE5SKQnKCgIn376KWbMmIHevXvj1VdfRdeuXVFcXIyffvoJn332Gfz9/fGXv/wFfn5+eOmll7B27VpYWVnh6aefxpUrV7B48WJ4e3tjzpw5tf78v/zlL/D390efPn3QqlUr/P7771izZg18fHzQoUMHAKXjlAHg448/xuTJk2FjYwM/P78qH4pabtiwYbC1tcXzzz+PBQsWoKCgAJ9++qneVbP6+vjjj/H4449j4MCBePXVV+Hr64u7d+/iv//9L77//nscOnQIADB79mxs3rwZzzzzDN577z24u7sjNjZWGlZQF8uXL682RqlUYufOnRg2bBiCgoIwb948BAUFobCwEN9//z0+++wzDBo0CCtXrgQAnD17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AIGBgVAqlZg5cyZeeuklaX1MTIx04//169fh4uKCoKCgak/cQOkNrY899hiOHz+u9yTyXr164ZtvvsE777yDd999F56enli2bJnRewc3b96MqVOnok+fPvDz88OKFSsQHBxc47ow5N1334WbmxuioqLw22+/wdnZGb169cKbb75Z430sX74cr732Gi5evIju3btj9+7dsLW1rTJ2+PDhWLx4MRYsWICCggJMnToVkyZNkqYtdXJywr///W+sWbMGeXl58PHxwcqVK/H0009XW47JkyejoKAAq1evxvz58+Hq6ooxY8YAKL1i9t1332HmzJl44oknYGVlhREjRujMNlSd6soWHh6Ow4cPo0+fPrh37x4SExPr/Aw7ekjGx5q7BEQWi21s9RpTG2sKCtHInoyal5cHtVqN3Nxckz0TicyvoKAAly9fRrt27er8rK2GLD8/H15eXti8ebPeDGKDBw9Gjx499E6sVHOHDx/Gk08+iZycHDg7O5u7OBbP2O8jz8FVY71QQ8Y2lm1sfTSUNtbQ97gu51/2IBGZkVarRVZWFlauXAm1Wo1Ro0aZu0hERESNAttYqive5UlkRhkZGWjdujW++eYbbN68GdbWvGZRF6+88orO1KQVX6+88spDL4+hsjRr1gw//vjjQy8PEVFTxDbWNBpaG/swcIgdWYTG3v1P9ZOdnY28vLwq1zk5OcHNze2hlue///2vwXWtW7eudqrvho5D7GqP9UINGdtYMqahtbGGcIgdEVEFbm5uDeYEDQCPPvqouYtARERkEg2tjX0YOMSOiIiIiIioDBMksijlT3smIvPh7yFR48TfbbJkpvz+cogdWQRbW1tYWVnhxo0baNWqFWxtbaFQKMxdLKImRQiBoqIi3Lp1C1ZWVgafb0FEloVtLFkyOdomJkhkEaysrNCuXTtkZmbixo0b5i4OUZPm4OCAtm3bwsqKgxCIGgO2sdQYmLJtYoJEFsPW1hZt27ZFSUkJNBqNuYtD1CQplUpYW1vz6jJRI8M2liyZqdsmJkhkURQKBWxsbGBjY2PuohARETUqbGOJSnF8BBERERERURkmSERERERERGWYIBEREREREZVpdPcgCSEAAHl5eWYuCRFR01N+7i0/F1Mptk1EROZRl3ap0SVId+/eBQB4e3ubuSRERE3X3bt3oVarzV2MBoNtExGRedWmXVKI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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 49 }, { "cell_type": "markdown", @@ -689,14 +748,12 @@ }, { "cell_type": "code", - "execution_count": 17, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:02:15.062512Z", - "start_time": "2025-02-11T10:02:15.049276Z" + "end_time": "2025-04-16T08:24:41.669409Z", + "start_time": "2025-04-16T08:24:41.656415Z" } }, - "outputs": [], "source": [ "import time\n", "from moarchiving.tests.point_sampling import get_non_dominated_points\n", @@ -704,7 +761,9 @@ "\n", "get_mo_archive.hypervolume_computation_float_type = fractions.Fraction\n", "get_mo_archive.hypervolume_final_float_type = fractions.Fraction" - ] + ], + "outputs": [], + "execution_count": 41 }, { "cell_type": "markdown", @@ -715,37 +774,12 @@ }, { "cell_type": "code", - "execution_count": 18, "metadata": { "ExecuteTime": { - "end_time": "2025-02-11T10:04:03.275197Z", - "start_time": "2025-02-11T10:02:15.063400Z" + "end_time": "2025-04-16T08:26:25.970029Z", + "start_time": "2025-04-16T08:24:41.671375Z" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Testing 2 objectives\n", - "...............\n", - "Testing 3 objectives\n", - ".............\n", - "Testing 4 objectives\n", - ".........\n" - ] - }, - { - "data": { - "image/png": "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DZk+cuRIribqwvwerVu3xtHRke+//z7H9kuXLmU3jReFvB4vgC+//PK+j9mpUycSExNZv359ju3Lli2772PezXPPPYednR1Dhw7l1KlTjB07Ns/9duzYkeNL0Gg0snLlSgICArLnaenduzfHjh0jICCAFi1a5Pp3ZyGUn3r16vHQQw+xcOFCli1bRlpaGiNHjsyxT5cuXbIL0dstXrwYJyenuw6brl69OrGxsTl+n/T0dLZs2VKgfAXVtm1bPDw8CA8Pz/PxaNGiRXbLS1569uzJ6dOn2blzZ777dOnShaSkJNatW5dj++LFi7OvL0r5vTb1ej3t27cHyB6Rd+TIkRz73Xk7yP99XZjPInt7+wK30DzI60Y8GGkREppp0KABAF999RWurq44ODjg7++fq8kXoFu3btjZ2TF48GD+85//kJqayrx587hx48Z93XfPnj25efMmX3zxBcePH89xXUBAAF5eXvTu3ZsPPviASZMm0aFDB06dOsX777+Pv79/jiHXrq6u+Pn58dNPP9GlSxc8PT2pUKFCnsOgPTw8ePfdd3n77bcZNmwYgwcP5vr160yZMgUHBwcmTZp0X7/Pndq0aUO5cuV46aWXmDRpEra2tixdupTDhw/f9zGHDRvGzJkzGTZsGB9++CG1atVi06ZNRf4lncXDw4Nhw4Yxb948/Pz8cvVhylKhQgU6d+7Mu+++i7OzM3PnzuXkyZM5htC///77bNu2jTZt2jBu3Djq1KlDamoq58+fZ9OmTcyfP7/Ak9s9++yzvPjii0RFRdGmTZtcrVSTJk3K7pP03nvv4enpydKlS/n555/55JNPcHd3z/fYgwYN4r333uPpp5/mjTfeIDU1lTlz5uQYAl4UXFxc+Pzzzxk+fDhxcXEMGDAAb29vrl69yuHDh7l69WqultDbvfLKK6xcuZK+ffvy5ptv0qpVK1JSUti9eze9e/emU6dODBs2jODgYIYPH8758+dp2LAhv//+O//73//o1avXXfsX3Y/y5cszevRoLly4QO3atdm0aRNff/01o0ePzj6N5+vrS9euXfnoo48oV64cfn5+7NixgzVr1uQ6XsOGDQH4+OOP6dmzJwaDgUaNGhXqs6hhw4asWbOGefPm0bx5c/R6PS1atMgz/4O8bsQD0riztihF8hs15uzsnGvf/Ea53DmyatasWcrf318ZDIYc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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "n_repeats = 100\n", "time_limit = 10\n", @@ -781,48 +815,48 @@ "plt.grid(True)\n", "plt.legend()\n", "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 13.2. Adding a solution to an existing archive" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "ExecuteTime": { - "end_time": "2025-02-11T10:14:31.369609Z", - "start_time": "2025-02-11T10:04:03.276157Z" - } - }, + ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Testing 2 objectives\n", - "......................\n", + "..............\n", "Testing 3 objectives\n", - "................\n", + ".............\n", "Testing 4 objectives\n", - "...........\n" + ".........\n" ] }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAHJCAYAAABpOFaGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAACLXElEQVR4nOzdd3wU1frH8c9m0ysESEIIBAgQCD0UKSJEei8iKKjY7lVA0Zurgj8LRRQQRSwBO4qCdBAQqYKggJSIAlEEDKGFhJpCSNs9vz/W5LKkbcJuZrN53r54uTtz9uw3J+3JzJkzOqWUQgghhBCiEnLSOoAQQgghhFakEBJCCCFEpSWFkBBCCCEqLSmEhBBCCFFpSSEkhBBCiEpLCiEhhBBCVFpSCAkhhBCi0pJCSAghhBCVlhRCQgghhKi0pBASwkLvvfceOp2OZs2alep1X3zxBTqdjlOnTpXYtm7dujz88MP5z3fs2IFOp2PHjh2lC+ugdDodU6ZMKdNr582bxxdffGFx+zfeeIM1a9aU6b3K0m/e18mBAwes/p5amDJlCjqdjkuXLpXY9taveyHKkxRCQljo888/B+Do0aP88ssv5fKekZGR7Nmzh8jIyHJ5P3u3Z88eHn/88TK91t4Locps9erVvPLKK1rHEJWUFEJCWODAgQP89ttv9O/fH4DPPvusXN7X19eXDh064OvrWy7vZ+86dOhASEiI1jEqLYPBQFZWltX7bd26NWFhYVbvVwhLSCEkhAXyCp+ZM2fSqVMnlixZQkZGRoF2e/fupXPnzri7uxMcHMyLL75ITk5OgXY5OTm88MILBAUF4enpyZ133sm+ffsKtCvs1NjDDz+Mt7c3J06coF+/fnh7e1O7dm3++9//FvgldfbsWYYPH46Pjw9VqlRh9OjR7N+/H51OV+LRkYsXLzJu3DgiIiLw9vYmICCAu+++m127dlkwYqbTHQMGDGD16tW0aNECd3d36tevz3vvvVeg7enTp3nggQcICAjAzc2NJk2a8Pbbb2M0Gs3a3XpqLO900vbt2xk7dizVq1enWrVqDBs2jPPnz5tlOXr0KD/++CM6nQ6dTkfdunWLzK7T6bh+/Tpffvllfvtu3brl7z9y5AiDBw+matWquLu706pVK7788ssSx6SkfgHS0tKK/VjyLF26lI4dO+Ll5YW3tze9e/fm119/LTGDpZ/XU6dOodPpePPNN5k+fTr16tXDzc2N7du3A/DLL78wcOBAqlWrhru7O2FhYTz77LMF3i8pKYn7778fPz8/AgMDefTRR0lJSTFrc/OpsYsXL+Lq6lroEaI///wTnU5n9jV04cIFnnjiCUJCQnB1daVevXpMnTqV3NzcEsdCCACUEKJYGRkZys/PT7Vr104ppdSnn36qAPXFF1+YtTt69Kjy9PRUERER6ptvvlHffvut6t27t6pTp44CVHx8fH7bMWPGKJ1Op55//nm1efNmNWfOHFWrVi3l6+urxowZk99u+/btClDbt283e62rq6tq0qSJeuutt9TWrVvVq6++qnQ6nZo6dWp+u/T0dNWgQQPl7++vYmJi1KZNm9R//vMfVa9ePQWoBQsWFPtx//nnn2rs2LFqyZIlaseOHWr9+vXqscceU05OTmZ5ihIaGqpq1aql6tSpoz7//HO1YcMGNXr0aAWo2bNn57dLTk5WtWrVUjVq1FAffvih2rhxo3rqqacUoMaOHWvWJ6AmT56c/3zBggUKUPXr11dPP/202rRpk/r0009V1apVVVRUVH672NhYVb9+fdW6dWu1Z88etWfPHhUbG1tk9j179igPDw/Vr1+//PZHjx7NHxcfHx8VFhamFi5cqL777jt1//33K0DNmjWr2DEprl9LPxallHr99deVTqdTjz76qFq/fr1atWqV6tixo/Ly8srvryiWfl7j4+MVoGrVqqWioqLUihUr1ObNm1V8fLzauHGjcnFxUS1atFBffPGF+uGHH9Tnn3+u7rvvvvzXT548WQEqPDxcvfrqq2rLli1qzpw5ys3NTT3yyCNmmUJDQ82+7ocOHapq166tDAaDWbsXXnhBubq6qkuXLimllEpMTFS1a9dWoaGh6qOPPlJbt25Vr732mnJzc1MPP/xwseMgRB4phIQowcKFCxWgPvzwQ6WUUmlpacrb21t16dLFrN3IkSOVh4eHunDhQv623Nxc1bhxY7NC6I8//lCA+s9//mP2+kWLFinAokIIUMuWLTN7fb9+/VR4eHj+85iYGAWo77//3qzdE088YVEhdKvc3FyVk5OjunfvroYOHVpi+9DQUKXT6dShQ4fMtvfs2VP5+vqq69evK6WUmjRpkgLUL7/8YtZu7NixSqfTqWPHjuVvK6oQGjdunNlr33zzTQWoxMTE/G1NmzZV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jQQGBjJ37lyioqKYP38+p0+fxsvLiwEDBuDj40NoaCitW7e2bKDLSAohIUS52pu4lz+u/IGHswf3h8vNVUUZuXiajsxYImE3LLLg9MroFRDaybL3LoXw8HAOHTrEtWvXWLlyJWPGjOHHH38sshj6448/+Pe//222rXPnzrz77rtm2249qtSxY0cOHTpUaJ8HDx7kxIkT+Pj4mG3PzMzk5MmTJCcnc/78ebp3716qj+1Wo0ePpmPHjpw/f57g4GAWLVpEv379qFq1qlmORYsW5b9GKYXRaCQ+Pp6ePXsSGhpK/fr16dOnD3369GHo0KF4epZuzEtDCiEhRLlacMR0O41hDYdRxb2KtmFExaXTWX56Kuxu8A02TYwudJ6QzrQ/7G5wKnjK53a5urrSoEEDANq2bcv+/ft59913+eijj4p8za1XUSqlLLqysqg2RqORNm3amBUgeWrUqIGTk3WmDLdv356wsDCWLFnC2LFjWb16NQsWLDDL8cQTTzBhwgSMRiPp6el4e3vj5OREnTp1cHV1JTY2lh07drB582ZeffVVpkyZwv79+6lSpYpVMt5KJksLIcpN3OU49iTuQa/T82DEg1rHEZWFkx76zPrnya2Fwj/P+8y0SRFUGKUUWVlZRe5v0qQJP/30k9m23bt3F5j7c+uE671799K4ceNC+4yMjOT48eMEBATQoEEDs39+fn74+PhQt27dYi+Fd3FxwWAoed2lUaNGsWjRItatW4eTkxP9+/c3y3H06NH8965fv37+Y1dXVwCcnZ3p0aMHb775Jr///junTp3ihx9+KPF9y0oKISFEufniyBcA9K7bm1retbQNIyqXiEEwYiH41jTf7hts2h4xyCZv+3//93/s2rWLU6dOcfjwYV566SV27NjB6NGji3zN888/zxdffMGHH37I8ePHmTNnDqtWreK5554za7d8+XI+//xz/vrrLyZPnsy+ffvyr/K61ejRo6levTqDBw9m165dxMfH8+OPP/LMM89w9uxZwHQF2Ntvv817773H8ePHiY2N5f3338/vI69QunDhAlevXi0y/+jRo4mNjeX1119n+PDhuLu75++bOHEie/bsYfz48Rw6dIiTJ0+ydu1ann76aQDWr1/Pe++9x6FDh0hISGDhwoUYjUbCw8NLHuwyklNjQohycSbtDJsSNgHwaLNHNU4jKqWIQdC4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I0fy119/ldv73apTp04kJibi5+enWQYhRMmkEBJC2Nznn3/O008/zU8//cTp06eLbauUIjc397bf08PDg4CAgNvup6xcXV0JCgpCp9NplkEIUTIphIQQNnX9+nWWLVvG2LFjGTBgAF988YXZ/rxTSJs2baJt27a4ubmxa9cujEYjs2bNokGDBri5uVGnTh1ef/11s9f+/fffREVF4enpScuWLdmzZ0/+vptPjR07dgydTseff/5p9vo5c+ZQt25d8u49HRcXR79+/fD29iYwMJAHH3yQS5cuFfmxJSQkMHDgQKpWrYqXlxdNmzZlw4YNZh9X3qmxbt26odPpCvw7deoUACkpKfz73/8mICAAX19f7r77bn777bfSDrcQopSkEBJC2NTSpUsJDw8nPDycBx54gAULFuQXHjd74YUXmDFjBn/88QctWrTgxRdfZNasWbzyyivExcWxePFiAgMDzV7z0ksv8dxzz3Ho0CEaNWrE/fffX+jRpPDwcNq0acOiRYvMti9evJhRo0ah0+lITEyka9eutGrVigMHDrBx40aSkpIYMWJEkR/b+PHjycrKYufOnRw+fJhZs2bh7e1daNtVq1aRmJiY/2/YsGGEh4cTGBiIUor+/ftz4cIFNmzYwMGDB4mMjKR79+5cuXLFkmEWQpSVEkIIG+rUqZOaO3euUkqpnJwcVb16dbVly5b8/du3b1eAWrNmTf621NRU5ebmpj755JNC+4yPj1eA+vTTT/O3HT16VAHqjz/+UEoptWDBAuXn55e/f86cOap+/fr5z48dO6YAdfToUaWUUq+88orq1auX2fucOXNGAerYsWOF5mjevLmaMmVKofvyPq6rV68W2DdnzhxVpUqV/H63bdumfH19VWZmplm7sLAw9dFHHxXavxDCOuSIkBDCZo4dO8a+ffu47777AHB2dmbkyJF8/vnnBdq2bds2//Eff/xBVlYW3bt3L7b/Fi1a5D+uWbMmAMnJyYW2ve+++0hISGDv3r0ALFq0iFatWhEREQHAwYMH2b59O97e3vn/GjduDMDJkycL7XPChAlMnz6dzp07M3nyZH7//fdi8wJ8//33TJo0iaVLl9KoUaP8905PT6datWpm7x8fH1/kewshrMNZ6wBCCMf12WefkZubS61atfK3KaVwcXHh6tWrVK1aNX+7l5dX/mMPDw+L+ndxccl/nDcp2Wg0Ftq2Zs2aREVFsXjxYjp06MA333zDE088kb/faDQycOBAZs2aVehrC/P444/Tu3dvvvvuOzZv3syMGTN4++23efrppwttHxcXx3333cfMmTPp1auX2XvXrFmTHTt2FHiNlksACFEZyBEhIYRN5ObmsnDhQt5++20O/X87d+ySTBjAcfz3hoMuTg4ZhDfoIDS5tQiBkIsQ6iJt52K4FEEOWTS19geES1sITiEo6CBoESI5NJoOEYJU0OZw9G6Sr1e8UE33/cCz3D3PPc+z/e557rm7u1np9/sKBAIL3+t8FAqF5PF41Gg0fnRM29vbury81PX1tQaDwWylSpIikYju7+9lGIaCweBc+RjS/rW6uqpcLqdKpaL9/X2dn5/b1nt+flYikVAymdTe3t7cvUgkovF4LJfLtdC3z+f7mckDsEUQAvArrq6u9Pr6qmw2q7W1tbmSTqdVKpU+bet2u1UoFHRwcKCLiwsNBgPd3Nx82eZ/JJNJvb29aWdnRxsbG3MrVfl8Xi8vL8pkMrq9vdXDw4Pq9bpM05RlWbbP293dVa1W03A4VK/XU7PZVDgc/rRvj8ejk5MTjcfjWbEsS7FYTOvr69ra2lKtVtNoNFKn01GxWFS32/3WnAF8ja0xAL+iVCopFovZ/lAwlUrp9PRUvV7v0/ZHR0dyuVw6Pj7W09OT/H6/crnct8bk9XqVSCRULpcXvlNaWVlRu91WoVDQ5uamptOpAoGA4vG4lpbs3xkty1I+n9fj46O8Xq/i8bjOzs5s67ZaLUmSYRhz14fDoQzDULVa1eHhoUzT1GQy0fLysqLR6MJJOQA/68/7u805VgAAAAdgawwAADgWQQgAADgWQQgAADgWQQgAADgWQQgAADgWQQgAADgWQQgAADgWQQgAADgWQQgAADgWQQgAADgWQQgAADjWXyfR6TLhAehRAAAAAElFTkSuQmCC", "text/plain": [ "
" - ] + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAHJCAYAAABpOFaGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAACauUlEQVR4nOzdd3yTVdvA8V+S7g2li1XKpuwyFBABGbKUIYiAMkQehSLw4MDxynKhOBgCbpA9ZAiIbEEUkFF22bJbKFDooDs57x+xfShtoYW0d5pcXz98vHPn5D5XkzS5eqZOKaUQQgghhLBDeq0DEEIIIYTQiiRCQgghhLBbkggJIYQQwm5JIiSEEEIIuyWJkBBCCCHsliRCQgghhLBbkggJIYQQwm5JIiSEEEIIuyWJkBBCCCHsliRCIt9mz56NTqdj7969D/R4nU7HuHHjsm5HRkYybtw4zp07l6PsgAEDqFChwgPVk9tjK1SowIABAx7oeveTlJTEuHHj2Lp1a477Mp+z3H5GW3Hu3Dl0Oh2zZ8++Z7mHff/Ymvw+b0Iba9euzfZ59SAWLFjA5MmTc73v7s9DoR0HrQMQ9mPnzp2ULVs263ZkZCTjx4+nZcuWORKX9957jxEjRlis7hUrVuDl5WWx690pKSmJ8ePHA9CyZcts93Xq1ImdO3cSFBRUKHULIQrH2rVrmT59+kMlKwsWLODIkSOMHDkyx313fx4K7UgiJIrMo48+mu+ylSpVsmjd9evXt+j18svPzw8/Pz9N6haWYTQaycjIwNnZWetQhA0pyOehKFzSNSYeyoABA/Dw8OD06dN07NgRDw8PypUrx2uvvUZqamq2snc2Bc+ePZuePXsC0KpVK3Q6XbZugty6t6ZPn87jjz+Ov78/7u7u1K5dm08//ZT09PT7xnl311jLli2z6rz7X2YM165dY+jQoYSGhuLh4YG/vz9PPPEE27dvz7rOuXPnshKd8ePHZ10js668usZ+/PFH6tati4uLCyVLlqRbt24cO3bsgZ/b3CxevJh27doRFBSEq6srNWrU4K233uL27dsPXE9UVBTPPvssnp6eeHt706tXL65cuXLfWO6UkJDAkCFDKFWqFL6+vnTv3p2oqKis+wcNGkTJkiVJSkrK8dgnnniCmjVrZt3W6XQMGzaMb775hqpVq+Ls7ExoaCiLFi3K8dgrV67w8ssvU7ZsWZycnAgJCWH8+PFkZGRklcnsrvr000/54IMPCAkJwdnZmSVLluDk5MR7772X47rHjx9Hp9MxderUrHNHjhyhS5culChRAhcXF+rVq8dPP/103+cmry7hcePGodPpsp3L/NlnzZpFtWrVcHV1pWHDhuzatQulFJMmTSIkJAQPDw+eeOIJTp8+neO6mzZtonXr1nh5eeHm5kazZs3YvHnzfeMEuHXrFq+99hoVK1bE2dkZf39/OnbsyPHjx7PKxMbGMnToUMqUKYOTkxMVK1bk3XffzfWz4WF+lpYtW1KrVi22b9/Oo48+iqurK2XKlOG9997DaDRmldu6dSs6nS5HN/bd3ZQDBgxg+vTpWbFl/sv8Pc7PZ1HLli359ddfOX/+fLZr3Pkz393alJ/3TebPsHDhQt59911Kly6Nl5cXbdq04cSJE/d/4UROSoh8mjVrlgLUnj17ss71799fOTk5qRo1aqjPPvtMbdq0SY0ZM0bpdDo1fvz4bI8H1NixY5VSSsXExKiPPvpIAWr69Olq586daufOnSomJibrusHBwdke/9///lfNnDlTrVu3Tm3ZskV9+eWXqlSpUmrgwIHZyuX22ODgYNW/f/+s20ePHs2qM/NfmzZtlMFgUDt27FBKKXX8+HE1ZMgQtWjRIrV161a1Zs0aNWjQIKXX69Xvv/+ulFIqJSVFrVu3TgFq0KBBWdc6ffp0tufs7NmzWXVn/ty9e/dWv/76q5ozZ46qWLGi8vb2VidPnnyg5zY377//vvryyy/Vr7/+qrZu3aq+/vprFRISolq1apXj+cpPPUlJSapGjRrK29tbTZs2Ta1fv14NHz5clS9fXgFq1qxZ94wn87moWLGievXVV9X69evV999/r0qUKJEtpoMHDypAfffdd9kef/To0az3SyZAlStXToWGhqqFCxeqVatWqfbt2ytALV26NKtcdHS0KleunAoODlbffPON2rRpk3r//feVs7OzGjBgQFa5s2fPKkCVKVNGtWrVSv38889qw4YN6uzZs6pbt26qXLlyymg0ZovrzTffVE5OTur69etKKfP7xtPTU1WqVEnNmTNH/frrr6p3794KUJ988kmOuu583nJ77yql1NixY9XdH9eACg4OVk2bNlXLly9XK1asUFWrVlUlS5ZU//3vf1WXLl3UmjVr1Pz581VAQICqU6eOMplMWY+fO3eu0ul0qmvXrmr58uVq9erVqnPnzspgMKhNmzbd66VU8fHxqmbNmsrd3V1NmDBBrV+/Xi1btkyNGDFCbdmyRSmlVHJysqpTp45yd3dXn332mdqwYYN67733lIODg+rYsaNFf5YWLVooX19fVbp0aTV16tSs9yagwsPDs8r9/vvvCsj6/c3rtTh9+rTq0aOHArJ9RqSkpCil8vdZdPToUdWsWTMVGBiY7Rp3/syZn4dK5f99k/kzVKhQQfXt21f9+uuvauHChap8+fKqSpUqKiMj456vnchJEiGRb3klQoBasmRJtrIdO3ZU1apVy3bu7l/8pUuX5vqhlHnd3L4QMhmNRpWenq7mzJmjDAaDio2Nvedj706E7jZp0iQFqG+//TbPMhkZGSo9PV21bt1adevWLev8tWvXcvxsme5OhG7evKlcXV1zfBFcuHBBOTs7qz59+mT7OfL73N6PyWRS6enpatu2bQpQBw8eLHA9M2fOVID65ZdfspUbPHhwgRKhoUOHZjv/6aefKkBFR0dnnWvRooWqV69etnJDhgxRXl5eKiEhIescoFxdXdWVK1eyzmVkZKjq1aurypUrZ517+eWXlYeHhzp//ny2a3722WcKUEePHlVK/e8LsVKlSiotLS1b2VWrVilAbdiwIVtdpUuXVs8880zWueeee045OzurCxcuZHt8hw4dlJubm7p161a2uh4mEQoMDFSJiYlZ51auXKkAVa9evWyJwuTJkxWgDh06pJRS6vbt26pkyZLqqaeeynZNo9Go6tatqxo3bpwjhjtNmDBBAWrjxo15lvn6669zfV998sknOZ7Hh/lZlDK/X/J6b+r1+qzXPb+JkFJKhYeH53jOc3Ovz6JOnTrl+Tl292dGft83mT/D3Z8hS5YsyUrcRMFI15h4aDqdjqeeeirbuTp16nD+/HmL1rN//36efvppfH19MRgMODo60q9fP4xGIydPnnzg6y5cuJA333yT//u//2Pw4MHZ7vv6668JCwvDxcUFBwcHHB0d2bx5c45urPzauXMnycnJOWawlStXjieeeCJHt8TDPLf//PMPffr0ITAwMOv5atGiBUCO+PNTz++//46npydPP/10tnJ9+vS5byx3uvvxderUAchW14gRIzhw4AB//fUXAPHx8cydO5f+/fvj4eGR7fGtW7cmICAg67bBYKBXr16c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" }, "metadata": {}, "output_type": "display_data" } ], + "execution_count": 42 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 13.2. Adding a solution to an existing archive" + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-16T08:39:14.001884Z", + "start_time": "2025-04-16T08:26:25.974019Z" + } + }, "source": [ "n_repeats = 10\n", "time_limit = 10\n", @@ -862,7 +896,32 @@ "plt.grid(True)\n", "plt.legend()\n", "plt.show()" - ] + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Testing 2 objectives\n", + "......................\n", + "Testing 3 objectives\n", + "................\n", + "Testing 4 objectives\n", + "...........\n" + ] + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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5ZVXXsHW1jarjZeXF02aNOHDDz/MsY/M4lSIvEghJEQu9Ho9CxYsoFatWnz//ffZ9q9fv57PPvuM3377jV69etGxY0fWrl1LbGxs1lEXvV7PsmXLTF6XeZXQ4sWLadGiRdb25cuXF+mVLu3bt2f58uX89ttvWacKAJYuXWrW63U6XdZf75mOHTvG/v37s50Wys3Jkyc5evSoyemxJUuW4ObmlrU2UufOnfnoo48IDw83WS9p4cKF6HQ6OnbsaNZ75cfR0bFAR4hya9+5c2dWr17NtWvXTH7RLly4EBcXFx599NEizfGg7t27Y2dnx/nz5xk4cGCBX/+wn9e6detSq1Yt5s6dS2hoaLa+ikqDBg145JFHmDdvXtZl+88995xJm169erFhwwZq1apF+fLlLZJDlH5SCAmRi99++41r164xffr0bJc4AzRq1Iivv/6aH374gV69evF///d/rF27lk6dOvHee+/h4uJCWFgYd+/eNXldgwYNGD58ODNnzsTe3p4uXbpw4sQJPv300yJdL2jkyJF8/vnnDB8+nKlTp1K7dm1+++03Nm3aBICNTd5nxnv16sUHH3zApEmTaN++PadPn+b9998nICDA7ILNz8+PPn36MHnyZCpXrsyPP/7Ili1bmD59Oi4uLgC8+uqrLFy4kCeffJL3338ff39/fv31V2bNmsWYMWOoW7fuww3EPxo3bszSpUtZtmwZNWvWxMnJicaNG+fZfufOnaxbt47KlSvj5uZGvXr1mDRpUtbclPfee48KFSqwePFifv31Vz7++GM8PDzyzZFTv+aqUaMG77//Pu+88w5///03wcHBlC9fntjYWA4ePEi5cuWYMmVKrq8vis9rWFgYvXv35tFHH+XVV1+levXqXLp0iU2bNrF48WKzP5b8PP/887z44otcu3aNtm3bZhun999/ny1bttC2bVvGjx9PvXr1SElJ4cKFC2zYsIFvvvlG1p0S+dN4srYQVqtfv37KwcFBxcXF5dpmyJAhys7OLutKsb1796pHH31UOTo6Kl9fX/XGG2+o7777Ltvl86mpqeq1115T3t7eysnJST366KNq//792a6eye2qsXLlymXLknmVzv0uXbqkBgwYoFxdXZWbm5saOHCg2rBhgwLUL7/8kufHn5qaql5//XVVpUoV5eTkpIKCgtSaNWvUyJEjlb+/f56vVcp4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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 43 } ], "metadata": { diff --git a/moarchiving/__init__.py b/moarchiving/__init__.py index 842ca8d..dd9e396 100644 --- a/moarchiving/__init__.py +++ b/moarchiving/__init__.py @@ -18,7 +18,7 @@ __author__ = "Nikolaus Hansen, Nace Sever, Mila Nedic, Tea Tusar" __license__ = "BSD 3-clause" -__version__ = "1.0.0" +__version__ = "1.1.0" from .get_archive import get_mo_archive diff --git a/moarchiving/constrained_moarchive.py b/moarchiving/constrained_moarchive.py index 3f72d5d..d6d7fa9 100644 --- a/moarchiving/constrained_moarchive.py +++ b/moarchiving/constrained_moarchive.py @@ -5,12 +5,7 @@ from moarchiving.moarchiving import BiobjectiveNondominatedSortedList as MOArchive2obj from moarchiving.moarchiving3obj import MOArchive3obj from moarchiving.moarchiving4obj import MOArchive4obj - -import warnings as _warnings -try: - import fractions -except ImportError: - _warnings.warn('`fractions` module not installed, arbitrary precision hypervolume computation not available') +from moarchiving.moarchiving_utils import true_fraction inf = float('inf') @@ -19,15 +14,15 @@ class CMOArchive: """ Class CMOArchive provides additional functionality for constrained multi-objective optimization to the MOArchive classes, while keeping the same interface. """ try: - hypervolume_final_float_type = fractions.Fraction - hypervolume_computation_float_type = fractions.Fraction + hypervolume_final_float_type = true_fraction + hypervolume_computation_float_type = true_fraction except: hypervolume_final_float_type = float hypervolume_computation_float_type = float def __init__(self, list_of_f_vals=None, list_of_g_vals=None, reference_point=None, - infos=None, n_obj=None, tau=1, hypervolume_final_float_type=None, - hypervolume_computation_float_type=None): + infos=None, ideal_point=None, weights=None, n_obj=None, tau=1, max_g_vals=None, + hypervolume_final_float_type=None, hypervolume_computation_float_type=None): """ Initialize a CMOArchive object. Additionally to the list of objective values `list_of_f_vals`, also list of constraint @@ -35,7 +30,10 @@ def __init__(self, list_of_f_vals=None, list_of_g_vals=None, reference_point=Non The reference point is used for the hypervolume computation and pruning of the archive. The list of additional information `infos` can be used to store additional information for each objective vector. - Tau is a threshold that is used for computing the indicator. + + `ideal_point` and `weights` are used for the normalization of the indicator values, + `max_g_vals` is used for the normalization of the constraint violations. + `tau` is a threshold that is used for calculation of hypervolume_plus_constr indicator. """ hypervolume_final_float_type = CMOArchive.hypervolume_final_float_type \ if hypervolume_final_float_type is None else hypervolume_final_float_type @@ -44,17 +42,17 @@ def __init__(self, list_of_f_vals=None, list_of_g_vals=None, reference_point=Non if n_obj == 2: self.archive = MOArchive2obj( - reference_point=reference_point, + reference_point=reference_point, ideal_point=ideal_point, weights=weights, hypervolume_final_float_type=hypervolume_final_float_type, hypervolume_computation_float_type=hypervolume_computation_float_type) elif n_obj == 3: self.archive = MOArchive3obj( - reference_point=reference_point, + reference_point=reference_point, ideal_point=ideal_point, weights=weights, hypervolume_final_float_type=hypervolume_final_float_type, hypervolume_computation_float_type=hypervolume_computation_float_type) elif n_obj == 4: self.archive = MOArchive4obj( - reference_point=reference_point, + reference_point=reference_point, ideal_point=ideal_point, weights=weights, hypervolume_final_float_type=hypervolume_final_float_type, hypervolume_computation_float_type=hypervolume_computation_float_type) @@ -62,20 +60,29 @@ def __init__(self, list_of_f_vals=None, list_of_g_vals=None, reference_point=Non self.n_obj = n_obj self._hypervolume_plus_constr = -inf + try: + self.max_g_vals = list(max_g_vals) + except TypeError: + self.max_g_vals = None if max_g_vals is None else [max_g_vals] + if list_of_f_vals is not None: self.add_list(list_of_f_vals, list_of_g_vals, infos) def __iter__(self): - """ Return an iterator over the objective vectors in the archive. """ + """return an iterator over the objective vectors in the archive. """ return iter(self.archive) def __len__(self): - """ Return the number of objective vectors in the archive. """ + """return the number of objective vectors in the archive. """ return len(self.archive) def add(self, f_vals, g_vals, info=None): - """ Add the objective vector f_vals with corresponding constraints to the archive - if it is feasible. If no feasible solution was found yet, also update the indicator. + """add the objective vector `f_vals` with constraints `g_vals` to the archive + + objective vector is added if the all the constraints are <= 0. Otherwise, only + hypervolume_plus_constr indicator value is updated. + + Additionally, the information `info` are stored. >>> from moarchiving.get_archive import get_cmo_archive >>> moa = get_cmo_archive(reference_point=[5, 5], tau=10) @@ -90,9 +97,11 @@ def add(self, f_vals, g_vals, info=None): [[2, 2]] """ try: - constraint_violation = sum([max(0, g) for g in g_vals]) + g_vals = list(g_vals) except TypeError: - constraint_violation = max(g_vals, 0) + g_vals = [g_vals] + + constraint_violation = self._get_normalized_constraint_violation(g_vals) if constraint_violation > 0: if (self.archive.reference_point is not None and @@ -105,8 +114,11 @@ def add(self, f_vals, g_vals, info=None): self._hypervolume_plus_constr = max(self.archive._hypervolume_plus, -self.tau) def add_list(self, list_of_f_vals, list_of_g_vals, infos=None): - """ Add a list of objective vectors f_vals with corresponding constraints vectors g_vals - and infos to the archive. + """add a list of objective vectors with corresponding constraints to the archive. + + Only the objective vectors with all constraints <= 0 are added to the archive. + + Additionally, the list of `infos` are stored for objective vectors. >>> from moarchiving.get_archive import get_cmo_archive >>> moa = get_cmo_archive(reference_point=[5, 5], tau=10) @@ -136,7 +148,7 @@ def add_list(self, list_of_f_vals, list_of_g_vals, infos=None): self._hypervolume_plus_constr = self.archive._hypervolume_plus def remove(self, f_vals): - """ Remove a feasible point with objective vector f_vals from the archive. + """remove a feasible point with objective vector `f_vals` from the archive. >>> from moarchiving.get_archive import get_cmo_archive >>> moa = get_cmo_archive([[2, 3], [1, 4], [4, 1]], [0, 0, 0], reference_point=[5, 5]) @@ -152,74 +164,78 @@ def remove(self, f_vals): @property def hypervolume(self): - """ Return the hypervolume indicator. """ + """return the hypervolume indicator. """ return self.archive.hypervolume @property def hypervolume_plus(self): - """ Return the hypervolume_plus indicator. """ + """return the hypervolume_plus indicator. """ return self.archive.hypervolume_plus @property def hypervolume_plus_constr(self): - """ Return the hypervolume_plus_constr (icmop) indicator. """ + """return the hypervolume_plus_constr (icmop) indicator. """ if self.archive.reference_point is None: raise ValueError("to compute the hypervolume_plus_constr indicator a reference" " point is needed (must be given initially)") - return self._hypervolume_plus_constr + if self._hypervolume_plus_constr > 0: + return self._hypervolume_plus_constr * self.archive._hv_factor + else: + return self._hypervolume_plus_constr @property def contributing_hypervolumes(self): - """ Return the hypervolume contributions of each point in the archive. """ + """return the hypervolume contributions of each point in the archive. """ return self.archive.contributing_hypervolumes @property def infos(self): - """ Return the list of additional information for each point in the archive. """ + """return the list of additional information for each point in the archive. """ return self.archive.infos def compute_hypervolume(self, reference_point=None): - """ Compute the hypervolume of the archive. """ + """compute the hypervolume of the archive. """ if self.n_obj == 2: return self.archive.compute_hypervolume(reference_point) return self.archive.compute_hypervolume() def contributing_hypervolume(self, f_vals): - """ Compute the hypervolume contribution of the objective vector f_vals to the archive. """ + """compute the hypervolume contribution of the objective vector f_vals to the archive. """ return self.archive.contributing_hypervolume(f_vals) def copy(self): - """ Return a deep copy of the CMOArchive object. """ - new_cmoa = CMOArchive(reference_point=self.archive.reference_point, tau=self.tau) + """return a deep copy of the CMOArchive object. """ + new_cmoa = CMOArchive(reference_point=self.archive.reference_point, tau=self.tau, + max_g_vals=self.max_g_vals, n_obj=self.n_obj) new_cmoa.archive = self.archive.copy() new_cmoa._hypervolume_plus_constr = self._hypervolume_plus_constr return new_cmoa def distance_to_hypervolume_area(self, f_vals): - """ Compute the distance of the objective vector f_vals to the hypervolume area. """ + """compute the distance of the objective vector `f_vals` to the hypervolume area. """ return self.archive.distance_to_hypervolume_area(f_vals) def distance_to_pareto_front(self, f_vals, ref_factor=1): - """ Compute the distance of the objective vector f_vals to the Pareto front. """ + """compute the distance of the objective vector `f_vals` to the empirical Pareto front. """ return self.archive.distance_to_pareto_front(f_vals, ref_factor=ref_factor) def dominates(self, f_vals): - """ Returns True if the objective vector f_vals is dominated by any of the - points in the archive. """ + """returns True if the vector `f_vals` is dominated by any of the points in the archive. """ return self.archive.dominates(f_vals) def dominators(self, f_vals, number_only=False): - """ Returns a list of points in the archive that dominate the objective vector f_vals. + """returns a list of points in the archive that dominate the objective vector `f_vals`. + If number_only is True, only the number of dominators is returned. """ return self.archive.dominators(f_vals, number_only=number_only) def hypervolume_improvement(self, f_vals): - """ Compute the hypervolume improvement of the archive - if the objective vector f_vals is added. """ + """compute the hypervolume improvement of the archive if objective vector `f_vals` is added. + """ return self.archive.hypervolume_improvement(f_vals) def hypervolume_plus_constr_improvement(self, f_vals, g_vals): - """ Compute the improvement of the indicator if the objective vector f_vals is added. + """compute the improvement of the indicator if the objective vector f_vals is added. >>> from moarchiving.get_archive import get_cmo_archive >>> get_cmo_archive.hypervolume_final_float_type = float @@ -246,9 +262,12 @@ def hypervolume_plus_constr_improvement(self, f_vals, g_vals): 3 """ try: - constraint_violation = sum([max(0, g) for g in g_vals]) + g_vals = list(g_vals) except TypeError: - constraint_violation = max(g_vals, 0) + g_vals = [g_vals] + + constraint_violation = self._get_normalized_constraint_violation(g_vals) + if constraint_violation > 0: if constraint_violation + self.tau < -self._hypervolume_plus_constr: return - self._hypervolume_plus_constr - (constraint_violation + self.tau) @@ -267,9 +286,24 @@ def hypervolume_plus_constr_improvement(self, f_vals, g_vals): return 0 def in_domain(self, f_vals, reference_point=None): - """ Returns True if the objective vector f_vals dominates the reference point. """ + """returns True if the objective vector f_vals dominates the reference point. """ return self.archive.in_domain(f_vals, reference_point=reference_point) + def _get_normalized_constraint_violation(self, g_vals): + """returns the sum of normalized constraint violation of the constraint vector g_vals, + + with respect to the maximal constraint violations self.max_g_vals. If the maximal constraint + values are not provided, it returns the sum of the positive constraint violations. + """ + if self.max_g_vals is None: + return sum([max(0, g) for g in g_vals]) + + if len(self.max_g_vals) != len(g_vals): + raise ValueError("list of constraint violations `g_vals` must be of same length as " + "list of maximal constraint violations `max_g_vals`") + + return sum([min(max(0, g) / g_max, 1) for g, g_max in zip(g_vals, self.max_g_vals)]) + if __name__ == "__main__": import doctest diff --git a/moarchiving/get_archive.py b/moarchiving/get_archive.py index 62e03a6..5eeb403 100644 --- a/moarchiving/get_archive.py +++ b/moarchiving/get_archive.py @@ -7,16 +7,14 @@ from moarchiving.moarchiving3obj import MOArchive3obj from moarchiving.moarchiving4obj import MOArchive4obj from moarchiving.constrained_moarchive import CMOArchive +from moarchiving.moarchiving_utils import true_fraction import warnings as _warnings -try: - import fractions -except ImportError: - _warnings.warn('`fractions` module not installed, arbitrary precision hypervolume computation not available') -def get_mo_archive(list_of_f_vals=None, reference_point=None, infos=None, n_obj=None): - """Return a nondominated archive instance with the proper number of objectives. +def get_mo_archive(list_of_f_vals=None, reference_point=None, infos=None, ideal_point=None, + weights=None, n_obj=None): + """return a nondominated archive instance with the proper number of objectives. `list_of_f_vals` is a list of objective vectors with `n_obj` objectives. If `list_of_f_vals` is not provided, `n_obj` can be @@ -26,17 +24,14 @@ def get_mo_archive(list_of_f_vals=None, reference_point=None, infos=None, n_obj= the archive. A list of additional information for each objective vector, for example the solution from which the objective values were computed, can be provided in `infos`. + + `ideal_point` and weights are lists of length `n_obj` and are used for + normalization of the hypervolume indicators. """ if not hasattr(get_mo_archive, "hypervolume_final_float_type"): - try: - get_mo_archive.hypervolume_final_float_type = fractions.Fraction - except: - get_mo_archive.hypervolume_final_float_type = float + get_mo_archive.hypervolume_final_float_type = true_fraction if not hasattr(get_mo_archive, "hypervolume_computation_float_type"): - try: - get_mo_archive.hypervolume_computation_float_type = fractions.Fraction - except: - get_mo_archive.hypervolume_computation_float_type = float + get_mo_archive.hypervolume_computation_float_type = true_fraction if (list_of_f_vals is None or len(list_of_f_vals) == 0) and n_obj is None and reference_point is None: n_obj = 2 @@ -71,23 +66,26 @@ def get_mo_archive(list_of_f_vals=None, reference_point=None, infos=None, n_obj= if n_obj == 2: return MOArchive2obj(list_of_f_vals, reference_point=reference_point, infos=infos, + ideal_point=ideal_point, weights=weights, hypervolume_final_float_type=get_mo_archive.hypervolume_final_float_type, hypervolume_computation_float_type=get_mo_archive.hypervolume_computation_float_type) elif n_obj == 3: return MOArchive3obj(list_of_f_vals, reference_point=reference_point, infos=infos, + ideal_point=ideal_point, weights=weights, hypervolume_final_float_type=get_mo_archive.hypervolume_final_float_type, hypervolume_computation_float_type=get_mo_archive.hypervolume_computation_float_type) elif n_obj == 4: return MOArchive4obj(list_of_f_vals, reference_point=reference_point, infos=infos, + ideal_point=ideal_point, weights=weights, hypervolume_final_float_type=get_mo_archive.hypervolume_final_float_type, hypervolume_computation_float_type=get_mo_archive.hypervolume_computation_float_type) else: raise ValueError(f"Unsupported number of objectives: {n_obj}") -def get_cmo_archive(list_of_f_vals=None, list_of_g_vals=None, reference_point=None, - infos=None, n_obj=None, tau=1): - """Return a constrained nondominated archive instance with the proper number of objectives. +def get_cmo_archive(list_of_f_vals=None, list_of_g_vals=None, reference_point=None, infos=None, + ideal_point=None, weights=None, n_obj=None, tau=1, max_g_vals=None): + """return a constrained nondominated archive instance with the proper number of objectives. `list_of_f_vals` is a list of objective vectors with `n_obj` objectives, `list_of_g_vals` is a list of constraint violation vectors (or values). @@ -96,18 +94,19 @@ def get_cmo_archive(list_of_f_vals=None, list_of_g_vals=None, reference_point=No `reference_point` is used for the hypervolume computation and pruning of the archive. A list of additional information for each objective vector can be provided in `infos`. + + `ideal_point` and weights are lists of length `n_obj` and are used for + normalization of the hypervolume indicators. `max_g_vals` is a list of + maximum constraint violation values for each objective vector, used for + normalization of the hypervolume_plus_constr indicator. + + `tau` is a threshold that is used for calculation of hypervolume_plus_constr indicator. """ if not hasattr(get_cmo_archive, "hypervolume_final_float_type"): - try: - get_cmo_archive.hypervolume_final_float_type = fractions.Fraction - except: - get_cmo_archive.hypervolume_final_float_type = float + get_cmo_archive.hypervolume_final_float_type = true_fraction if not hasattr(get_cmo_archive, "hypervolume_computation_float_type"): - try: - get_cmo_archive.hypervolume_computation_float_type = fractions.Fraction - except: - get_cmo_archive.hypervolume_computation_float_type = float + get_cmo_archive.hypervolume_computation_float_type = true_fraction if (list_of_f_vals is None or len(list_of_f_vals) == 0) and n_obj is None and reference_point is None: n_obj = 2 @@ -148,6 +147,7 @@ def get_cmo_archive(list_of_f_vals=None, list_of_g_vals=None, reference_point=No raise ValueError("list_of_f_vals and list_of_g_vals must have the same length") return CMOArchive(list_of_f_vals=list_of_f_vals, list_of_g_vals=list_of_g_vals, - reference_point=reference_point, infos=infos, n_obj=n_obj, tau=tau, + reference_point=reference_point, infos=infos, ideal_point=ideal_point, + weights=weights, n_obj=n_obj, tau=tau, max_g_vals=max_g_vals, hypervolume_final_float_type=get_cmo_archive.hypervolume_final_float_type, hypervolume_computation_float_type=get_cmo_archive.hypervolume_computation_float_type) diff --git a/moarchiving/moarchiving.py b/moarchiving/moarchiving.py index 7898755..d6b08b0 100644 --- a/moarchiving/moarchiving.py +++ b/moarchiving/moarchiving.py @@ -4,14 +4,13 @@ implemented as sorted list and with incremental update in logarithmic time. """ from __future__ import division, print_function, unicode_literals + +from moarchiving.moarchiving_base import MOArchiveBase +from moarchiving.moarchiving_utils import true_fraction + import warnings as _warnings # from collections import deque # does not support deletion of slices!? import bisect as _bisect # to find the insertion index efficiently -try: - import fractions -except ImportError: - _warnings.warn( - '`fractions` module not installed, arbitrary precision hypervolume computation not available') del division, print_function, unicode_literals inf = float('inf') @@ -28,26 +27,7 @@ def _debug_trace(*args, **kwargs): return s -def true_fraction(val, copy=False): - """return a `fractions.Fraction` object from `val`. - - Fixes the issue that `Fraction` does not convert an `np.intc` or - `np.int32` type to infinite representation `int`. - """ - try: - fractions.Fraction - except NameError: - return val - if isinstance(val, fractions.Fraction): - if copy: # Fraction(.) is almost 20 times slower than float(.) - return fractions.Fraction(val) - return val - if not isinstance(val, (int, float)): - val = float(val) - return fractions.Fraction(val) - - -class BiobjectiveNondominatedSortedList(list): +class BiobjectiveNondominatedSortedList(list, MOArchiveBase): """A sorted list of non-dominated unique objective-pairs. Non-domination here means smaller in at least one objective. The list is @@ -133,6 +113,8 @@ def __init__(self, list_of_f_pairs=None, reference_point=None, sort=sorted, + ideal_point=None, + weights=None, infos=None, hypervolume_final_float_type=None, hypervolume_computation_float_type=None): @@ -147,28 +129,24 @@ def __init__(self, CAVEAT: the interface, in particular the positional interface may change in future versions. """ - if hypervolume_final_float_type is None: - self.hypervolume_final_float_type = BiobjectiveNondominatedSortedList.hypervolume_final_float_type - else: - self.hypervolume_final_float_type = hypervolume_final_float_type - if hypervolume_computation_float_type is None: - self.hypervolume_computation_float_type = BiobjectiveNondominatedSortedList.hypervolume_computation_float_type - else: - self.hypervolume_computation_float_type = hypervolume_computation_float_type + hypervolume_final_float_type = BiobjectiveNondominatedSortedList.hypervolume_final_float_type \ + if hypervolume_final_float_type is None else hypervolume_final_float_type + hypervolume_computation_float_type = BiobjectiveNondominatedSortedList.hypervolume_computation_float_type \ + if hypervolume_computation_float_type is None else hypervolume_computation_float_type + self.make_expensive_asserts = BiobjectiveNondominatedSortedList.make_expensive_asserts self.maintain_contributing_hypervolumes = BiobjectiveNondominatedSortedList.maintain_contributing_hypervolumes - self.n_obj = 2 + + MOArchiveBase.__init__(self, reference_point=reference_point, ideal_point=ideal_point, + weights=weights, n_obj=2, + hypervolume_final_float_type=hypervolume_final_float_type, + hypervolume_computation_float_type=hypervolume_computation_float_type) + + list_of_f_pairs = self._convert_and_validate_f_vals(list_of_f_pairs, n_obj=2) if list_of_f_pairs is not None and len(list_of_f_pairs): - try: - list_of_f_pairs = list_of_f_pairs.tolist() - except: - pass - if len(list_of_f_pairs[0]) != 2: - raise ValueError("need elements of len 2, got %s" - " as first element" % str(list_of_f_pairs[0])) if sort is None: list.__init__(self, list_of_f_pairs) else: @@ -179,12 +157,6 @@ def __init__(self, else: list.__init__(self, sort(list_of_f_pairs)) - # super(BiobjectiveNondominatedSortedList, self).__init__(sort(list_of_f_pairs)) - if reference_point is not None: - self.reference_point = list(reference_point) - else: - self.reference_point = reference_point - if infos is not None: if len(infos) != len(list_of_f_pairs): raise ValueError(f"need as many infos as f_pairs, got " @@ -199,19 +171,10 @@ def __init__(self, raise NotImplementedError('update of _contributing_hypervolumes in _add_HV and _subtract_HV not implemented') else: self._contributing_hypervolumes = [] + self._set_HV() + self._update_hv_plus(list_of_f_pairs) - if reference_point is not None: - if self._hypervolume > 0: - self._hypervolume_plus = self._hypervolume - else: - if list_of_f_pairs is None or len(list_of_f_pairs) == 0: - self._hypervolume_plus = -inf - else: - self._hypervolume_plus = -min([self.distance_to_hypervolume_area(f) - for f in list_of_f_pairs]) - else: - self._hypervolume_plus = None self.make_expensive_asserts and self._asserts() def _debug_info(self): @@ -267,9 +230,7 @@ def add(self, f_pair, info=None): raise ValueError("argument `f_pair` must be of length 2, was" " ``%s``" % str(f_pair)) if not self.in_domain(f_pair): - if self.hypervolume_plus is not None and self.hypervolume_plus < 0: - self._hypervolume_plus = max((self._hypervolume_plus, - -self.distance_to_hypervolume_area(f_pair))) + self._update_hv_plus([f_pair]) self._removed = [f_pair] return None idx = self.bisect_left(f_pair) @@ -533,44 +494,6 @@ def dominators(self, f_pair, number_only=False): idx -= 1 return res - def in_domain(self, f_pair, reference_point=None): - """return `True` if `f_pair` is dominating the reference point, - - `False` otherwise. `True` means that `f_pair` contributes to - the hypervolume if not dominated by other elements. - - `f_pair` may also be an index in `self` in which case - ``self[f_pair]`` is tested to be in-domain. - - >>> from moarchiving import BiobjectiveNondominatedSortedList as NDA - >>> a = NDA([[2.2, 0.1], [0.5, 1]], reference_point=[2, 2]) - >>> assert len(a) == 1 - >>> a.in_domain([0, 0]) - True - >>> a.in_domain([2, 1]) - False - >>> all(a.in_domain(ai) for ai in a) - True - >>> a.in_domain(0) - True - - TODO: improve name? - """ - if reference_point is None: - reference_point = self.reference_point - if reference_point is None: - return True - try: - f_pair = self[f_pair] - except TypeError: - pass - except IndexError: - raise # return None - if (f_pair[0] >= reference_point[0] or - f_pair[1] >= reference_point[1]): - return False - return True - @property def infos(self): """`list` of complementary information corresponding to each archive entry""" @@ -605,8 +528,8 @@ def hypervolume(self): raise ValueError("to compute the hypervolume a reference" " point is needed (must be given initially)") if self.make_expensive_asserts: - assert abs(self._hypervolume - self.compute_hypervolume(self.reference_point)) < 1e-12 - return self._hypervolume + assert abs(self._hypervolume - self._compute_hypervolume(self.reference_point)) < 1e-12 + return self._hypervolume * self._hv_factor @property def hypervolume_plus(self): @@ -642,7 +565,12 @@ def hypervolume_plus(self): if self.reference_point is None: raise ValueError("to compute the hypervolume_plus a reference" " point is needed (must be given initially)") - return self._hypervolume_plus + if self._hypervolume_plus < 0: + # if hypervolume is < 0, the factors are already included in the computation of the + # distance to the hypervolume area + return self._hypervolume_plus + else: + return self._hypervolume_plus * self._hv_factor @property @@ -667,7 +595,7 @@ def contributing_hypervolumes(self): if self.maintain_contributing_hypervolumes: if not hasattr(self, '_contributing_hypervolumes'): self._contributing_hypervolumes = [ - self.contributing_hypervolume(i) + self._contributing_hypervolume(i) for i in range(len(self))] if len(self._contributing_hypervolumes) == len(self): return self._contributing_hypervolumes @@ -693,9 +621,35 @@ def contributing_hypervolume(self, idx): pass else: # idx is a pair if idx in self: - idx = self.index(idx) + return self._contributing_hypervolume_of_idx(self.index(idx)) * self._hv_factor else: return self.hypervolume_improvement(idx) + return self._contributing_hypervolume_of_idx(idx) * self._hv_factor + + def _contributing_hypervolume(self, idx): + """return contributing hypervolume of element `idx`, without normalization + + If `idx` is an `f_pair`, return contributing hypervolume of element + with value `f_pair`. If `f_pair` is not in `self`, return + `hypervolume_improvement(f_pair)`, i.e., its uncrowded contributing + hypervolume (which can be negative). + + The return type is ``self.hypervolume_computation_float_type` and + by default `fractions.Fraction`, which can be converted to `float` + like ``float(....contributing_hypervolume(idx))``. + """ + try: len(idx) + except TypeError: pass + else: # idx is a pair + if idx in self: + return self._contributing_hypervolume_of_idx(self.index(idx)) + else: + return self._hypervolume_improvement(idx) + return self._contributing_hypervolume_of_idx(idx) + + def _contributing_hypervolume_of_idx(self, idx): + """return contributing hypervolume of element with the index `idx`, without normalization + """ if idx == 0: y = self.reference_point[1] if self.reference_point else inf else: @@ -711,7 +665,7 @@ def contributing_hypervolume(self, idx): assert dHV >= 0 return dHV - def distance_to_pareto_front(self, f_pair, ref_factor=1): + def _distance_to_pareto_front_with_weights(self, f_pair, weights, ref_factor=1): """of a dominated `f_pair` also considering the reference domain. Non-dominated points have (by definition) a distance of zero, @@ -752,37 +706,59 @@ def distance_to_pareto_front(self, f_pair, ref_factor=1): ref_d1 = 0 if len(self) == 0: # otherwise we get an index error below - return (ref_d0**2 + ref_d1**2)**0.5 + return ((ref_d0 * weights[0])**2 + (ref_d1 * weights[1])**2)**0.5 # distances to the two outer kink points, given by the extreme # points and the respective the reference point coordinate, for # the left (and up) most point: - squared_distances = [max((0, f_pair[0] - self[0][0]))**2 + - ref_d1**2] + squared_distances = [(max((0, f_pair[0] - self[0][0])) * weights[0])**2 + (ref_d1 * weights[1])**2] # and the right most (and lowest) point - squared_distances += [ref_d0**2 + - max((0, f_pair[1] - self[-1][1]))**2] + squared_distances += [(ref_d0 * weights[0])**2 + (max((0, f_pair[1] - self[-1][1])) * weights[1])**2] if len(self) == 1: return min(squared_distances)**0.5 for idx in range(self.bisect_left(f_pair), 0, -1): if idx == len(self): continue squared_distances.append( - max((0, f_pair[1] - self[idx - 1][1]))**2 + - max((0, f_pair[0] - self[idx][0]))**2) + (max((0, f_pair[1] - self[idx - 1][1])) * weights[1])**2 + + (max((0, f_pair[0] - self[idx][0])) * weights[0])**2) if self[idx][1] >= f_pair[1] or idx == 1: break if self.make_expensive_asserts and len(squared_distances) > 2: assert min(squared_distances[2:]) == min( - [max((0, f_pair[0] - self[i + 1][0]))**2 + - max((0, f_pair[1] - self[i][1]))**2 + [(max((0, f_pair[0] - self[i + 1][0])) * weights[0])**2 + + (max((0, f_pair[1] - self[i][1])) * weights[1])**2 for i in range(len(self) - 1)]) return min(squared_distances)**0.5 - def distance_to_hypervolume_area(self, f_pair): - return (max((0, f_pair[0] - self.reference_point[0]))**2 - + max((0, f_pair[1] - self.reference_point[1]))**2)**0.5 \ - if self.reference_point else 0 + + def distance_to_pareto_front(self, f_pair, ref_factor=1): + """of a dominated `f_pair` also considering the reference domain. + + Non-dominated points have (by definition) a distance of zero, + unless the archive is empty and the point does not dominate the + reference point. + + The implementation assumes that all points of the archive are in + the reference domain (and more extreme points have been pruned, as + it is the default behavior). + """ + weights = [w * w_ip for (w, w_ip) in zip(self._weights, self._weights_ideal_point)] + return self._distance_to_pareto_front_with_weights(f_pair, weights, ref_factor) + + def _distance_to_pareto_front(self, f_pair, ref_factor=1): + """of a dominated `f_pair` also considering the reference domain, without using the normalization weights + + Non-dominated points have (by definition) a distance of zero, + unless the archive is empty and the point does not dominate the + reference point. + + The implementation assumes that all points of the archive are in + the reference domain (and more extreme points have been pruned, as + it is the default behavior). + """ + weights = [1 for _ in range(self.n_obj)] + return self._distance_to_pareto_front_with_weights(f_pair, weights, ref_factor) def _hypervolume_improvement0(self, f_pair): """deprecated and only used for testing: return how much `f_pair` would improve the hypervolume. @@ -800,7 +776,7 @@ def _hypervolume_improvement0(self, f_pair): dist = self.distance_to_pareto_front(f_pair) if dist: return -dist - hv0 = self.hypervolume + hv0 = self._hypervolume state = self._state() removed = self.discarded # to get back previous state added = self.add(f_pair) is not None @@ -809,7 +785,7 @@ def _hypervolume_improvement0(self, f_pair): else: add_back = [] assert len(add_back) + len(self) - added == state[0] - hv1 = self.hypervolume + hv1 = self._hypervolume if added: self.remove(f_pair) if add_back: @@ -818,12 +794,12 @@ def _hypervolume_improvement0(self, f_pair): if self.hypervolume_computation_float_type is not float and ( self.hypervolume_final_float_type is not float): assert state == self._state() - if hv0 != self.hypervolume: + if hv0 != self._hypervolume: _warnings.warn("HV changed from %f to %f while computing hypervolume_improvement" % - (hv0, self.hypervolume)) + (hv0, self._hypervolume)) self._infos = save_infos self._hypervolume_plus = save_hypervolume_plus - return self.hypervolume_computation_float_type(hv1) - self.hypervolume + return self.hypervolume_computation_float_type(hv1) - self._hypervolume def hypervolume_improvement(self, f_pair): """return how much `f_pair` would improve the hypervolume. @@ -847,6 +823,43 @@ def hypervolume_improvement(self, f_pair): dist = self.distance_to_pareto_front(f_pair) if dist: return -dist + return self._hypervolume_improvement_of_nondominated_point(f_pair) * self._hv_factor + + def _hypervolume_improvement(self, f_pair): + """return how much `f_pair` would improve the hypervolume, without normalization + + If dominated, return the distance to the empirical pareto front + multiplied by -1. + Else if not in domain, return distance to the reference point + dominating area times -1. + + Overall this amounts to the uncrowded hypervolume improvement, + see https://arxiv.org/abs/1904.08823 + + Details: when ``self.reference_point is None`` and `f_pair` is + a new extreme point, the returned hypervolume improvement is + ``float('inf')``. + + This method extracts a sublist first and thereby tries + to circumentvent to compute small differences between large + hypervolumes. + """ + dist = self._distance_to_pareto_front(f_pair) + if dist: + return -dist + return self._hypervolume_improvement_of_nondominated_point(f_pair) + + def _hypervolume_improvement_of_nondominated_point(self, f_pair): + """return how much `f_pair` would improve the hypervolume. + + Details: when ``self.reference_point is None`` and `f_pair` is + a new extreme point, the returned hypervolume improvement is + ``float('inf')``. + + This method extracts a sublist first and thereby tries + to circumentvent to compute small differences between large + hypervolumes. + """ if self.reference_point is None: if f_pair[0] < self[0][0] or f_pair[1] < self[-1][1]: return inf @@ -862,31 +875,20 @@ def hypervolume_improvement(self, f_pair): BiobjectiveNondominatedSortedList.make_expensive_asserts = False # prevent infinite recursion sub = BiobjectiveNondominatedSortedList(self[i0:i1], reference_point=[r0, r1], sort=None) BiobjectiveNondominatedSortedList.make_expensive_asserts = assaved - hv0 = sub.hypervolume + hv0 = sub._hypervolume sub.add(f_pair) - res = self.hypervolume_computation_float_type(sub.hypervolume) - hv0 + res = (self.hypervolume_computation_float_type(sub._hypervolume) - hv0) if BiobjectiveNondominatedSortedList.make_expensive_asserts: assert abs(res - self._hypervolume_improvement0(f_pair)) < 1e-9 * (0.1 + res), ( res, self._hypervolume_improvement0(f_pair)) return res - def _set_HV(self): - """set current hypervolume value using `self.reference_point`. - - Raise `ValueError` if `self.reference_point` is `None`. - - TODO: we may need to store the list of _contributing_ hypervolumes - to handle numerical rounding errors later. - """ - if self.reference_point is None: - return None - self._hypervolume = self.compute_hypervolume(self.reference_point) - if self._hypervolume > 0: - self._hypervolume_plus = self._hypervolume - return self._hypervolume - def compute_hypervolume(self, reference_point): """return hypervolume w.r.t. `reference_point`""" + return self._compute_hypervolume(reference_point) * self._hv_factor + + def _compute_hypervolume(self, reference_point=None): + """return hypervolume w.r.t. `reference_point`, without normalization""" if reference_point is None: raise ValueError("to compute the hypervolume a reference" " point is needed (was `None`)") @@ -996,7 +998,7 @@ def _add_HV(self, idx): raise NotImplementedError("update list of hypervolumes") if self.reference_point is None: return None - dHV = self.contributing_hypervolume(idx) + dHV = self._contributing_hypervolume(idx) Ff = self.hypervolume_final_float_type if self._hypervolume and ( Ff in (float, int) or isinstance(self._hypervolume, (float, int))) \ @@ -1166,7 +1168,8 @@ def _asserts(self): assert self.dominates(pair) assert not self.dominates([v - 0.001 for v in pair]) if self.reference_point is not None: - assert abs(self._hypervolume - self.compute_hypervolume(self.reference_point)) < 1e-11 + assert abs(self._hypervolume - self._compute_hypervolume(self.reference_point)) < 1e-11, \ + (self._hypervolume, self._compute_hypervolume(self.reference_point)) assert sum(self.contributing_hypervolumes) < self.hypervolume + 1e-11 if self.maintain_contributing_hypervolumes: assert len(self) == len(self._contributing_hypervolumes) @@ -1176,7 +1179,7 @@ def _asserts(self): if self.reference_point: tmp, self.make_expensive_asserts = self.make_expensive_asserts, False - self.hypervolume_improvement([0, 0]) # does state assert + self._hypervolume_improvement([0, 0]) # does state assert self.make_expensive_asserts = tmp assert self._infos is None or len(self._infos) == len(self.infos) == len(self), ( diff --git a/moarchiving/moarchiving3obj.py b/moarchiving/moarchiving3obj.py index 9309114..5dc0424 100644 --- a/moarchiving/moarchiving3obj.py +++ b/moarchiving/moarchiving3obj.py @@ -4,7 +4,6 @@ objective space and efficiently calculating hypervolume with respect to the given reference point. """ - from moarchiving.moarchiving import BiobjectiveNondominatedSortedList as MOArchive2obj from moarchiving.moarchiving_utils import (DLNode, ArchiveSortedList, compute_area_simple, remove_from_z, restart_list_y, lexicographic_less, one_contribution_3_obj, @@ -19,10 +18,6 @@ except ImportError: pass -try: - import fractions -except ImportError: - _warnings.warn('`fractions` module not installed, arbitrary precision hypervolume computation not available') inf = float('inf') @@ -55,15 +50,9 @@ class MOArchive3obj(MOArchiveParent): >>> moa2.hypervolume 10.0 """ - try: - hypervolume_final_float_type = fractions.Fraction - hypervolume_computation_float_type = fractions.Fraction - except: - hypervolume_final_float_type = float - hypervolume_computation_float_type = float - - def __init__(self, list_of_f_vals=None, reference_point=None, infos=None, - hypervolume_final_float_type=None, + + def __init__(self, list_of_f_vals=None, reference_point=None, infos=None, ideal_point=None, + weights=None, hypervolume_final_float_type=None, hypervolume_computation_float_type=None): """ Create a new 3 objective archive object. @@ -71,31 +60,24 @@ def __init__(self, list_of_f_vals=None, reference_point=None, infos=None, to compute the hypervolume. infos are an optional list of additional information about the points in the archive. """ - - hypervolume_final_float_type = MOArchive3obj.hypervolume_final_float_type \ - if hypervolume_final_float_type is None else hypervolume_final_float_type - hypervolume_computation_float_type = MOArchive3obj.hypervolume_computation_float_type \ - if hypervolume_computation_float_type is None else hypervolume_computation_float_type + list_of_f_vals = self._convert_and_validate_f_vals(list_of_f_vals, n_obj=3) super().__init__(list_of_f_vals=list_of_f_vals, reference_point=reference_point, infos=infos, + ideal_point=ideal_point, + weights=weights, n_obj=3, hypervolume_final_float_type=hypervolume_final_float_type, hypervolume_computation_float_type=hypervolume_computation_float_type) self._removed = [] self.preprocessing() - hv = self._set_HV() + + self._set_HV() + self._update_hv_plus(list_of_f_vals) + self._length = len(list(self)) - if hv is not None and hv > 0: - self._hypervolume_plus = self._hypervolume - else: - if list_of_f_vals is None or len(list_of_f_vals) == 0: - self._hypervolume_plus = -inf - else: - self._hypervolume_plus = -min([self.distance_to_hypervolume_area(f) - for f in list_of_f_vals]) def add(self, f_vals, info=None, update_hypervolume=True): """ Adds a new point to the archive, and updates the hypervolume if needed. @@ -334,7 +316,9 @@ def add_list(self, list_of_f_vals, infos=None, add_method="compare"): self.add(f_val, info=info, update_hypervolume=False) self._set_HV() elif add_method == "reinit": - self.__init__(list(self) + list_of_f_vals, self.reference_point, self.infos + infos) + self.__init__(list(self) + list_of_f_vals, reference_point=self.reference_point, + infos=self.infos + infos, ideal_point=self._ideal_point, + weights=self._weights) else: raise ValueError(f"Unknown add method: {add_method}, " f"should be one of: 'compare', 'one_by_one', 'reinit'") @@ -357,7 +341,8 @@ def copy(self): >>> list(moa), moa.infos ([[3, 2, 1], [1, 2, 3]], ['C', 'A']) """ - return MOArchive3obj(list(self), self.reference_point, self.infos) + return MOArchive3obj(list(self), reference_point=self.reference_point, infos=self.infos, + ideal_point=self._ideal_point, weights=self._weights) def _get_kink_points(self): """ Function that returns the kink points of the archive. @@ -410,7 +395,7 @@ def _get_kink_points(self): return kink_points def hypervolume_improvement(self, f_vals): - """ Returns the hypervolume improvement of adding a point to the archive + """returns the hypervolume improvement of adding a point to the archive >>> from moarchiving.get_archive import get_mo_archive >>> moa = get_mo_archive([[1, 2, 3], [3, 2, 1]], reference_point=[4, 4, 4]) @@ -425,14 +410,19 @@ def hypervolume_improvement(self, f_vals): return -1 * self.distance_to_pareto_front(f_vals) return one_contribution_3_obj(self.head, DLNode(x=f_vals), - self.hypervolume_computation_float_type) + self.hypervolume_computation_float_type) * self._hv_factor def compute_hypervolume(self, reference_point=None): - """ Compute the hypervolume of the current state of archive + """compute the hypervolume of the current state of archive + """ + return self._compute_hypervolume(reference_point=reference_point) * self._hv_factor + + def _compute_hypervolume(self, reference_point=None): + """compute the hypervolume of the archive without normalization weights >>> from moarchiving.get_archive import get_mo_archive >>> moa = get_mo_archive([[1, 2, 3], [3, 2, 1]], reference_point=[4, 4, 4]) - >>> moa.compute_hypervolume() + >>> moa._compute_hypervolume() 10.0 """ if reference_point is not None: @@ -465,8 +455,10 @@ def compute_hypervolume(self, reference_point=None): return self.hypervolume_final_float_type(volume) def preprocessing(self): - """ Preprocessing step to determine the closest points in x and y directions, - as described in the paper and implemented in the original C code. """ + """preprocessing step to determine the closest points in x and y directions, + + as described in the paper and implemented in the original C code. + """ di = self.n_obj - 1 t = ArchiveSortedList(iterable=[self.head, self.head.next[di]], key=lambda node: (node.x[1], node.x[0])) diff --git a/moarchiving/moarchiving4obj.py b/moarchiving/moarchiving4obj.py index 6181abd..9bd4e10 100644 --- a/moarchiving/moarchiving4obj.py +++ b/moarchiving/moarchiving4obj.py @@ -5,18 +5,10 @@ """ -from moarchiving.moarchiving_utils import hv4dplusR, remove_from_z +from moarchiving.moarchiving_utils import hv4dplusR, remove_from_z, true_fraction from moarchiving.moarchiving3obj import MOArchive3obj from moarchiving.moarchiving_parent import MOArchiveParent -import warnings as _warnings - -try: - import fractions -except ImportError: - _warnings.warn('`fractions` module not installed, arbitrary precision hypervolume computation not available') - - inf = float('inf') @@ -27,6 +19,7 @@ class MOArchive4obj(MOArchiveParent): The archive is implemented as a doubly linked list, and can be modified using functions add and remove. Points of the archive can be accessed as a list of points order by the fourth coordinate using function points_list. + >>> from moarchiving.get_archive import get_mo_archive >>> moa = get_mo_archive([[1, 2, 3, 4], [4, 3, 2, 1]]) >>> list(moa) # returns the list of points in the archive sorted by the third coordinate @@ -35,7 +28,7 @@ class MOArchive4obj(MOArchiveParent): True >>> moa.add([3, 3, 3, 3]) False - >>> get_mo_archive.hypervolume_final_float_type = fractions.Fraction + >>> get_mo_archive.hypervolume_final_float_type = true_fraction >>> moa = get_mo_archive([[1, 2, 3, 4], [2, 3, 4, 5], [4, 3, 2, 1]], ... reference_point=[5, 5, 5, 5], infos=["A", "B", "C"]) >>> moa.infos # returns the list of infos for each point in the archive @@ -50,48 +43,34 @@ class MOArchive4obj(MOArchiveParent): 44.0 """ - try: - hypervolume_final_float_type = fractions.Fraction - hypervolume_computation_float_type = fractions.Fraction - except: - hypervolume_final_float_type = float - hypervolume_computation_float_type = float - - def __init__(self, list_of_f_vals=None, reference_point=None, infos=None, - hypervolume_final_float_type=None, - hypervolume_computation_float_type=None): + + def __init__(self, list_of_f_vals=None, reference_point=None, infos=None, ideal_point=None, weights=None, + hypervolume_final_float_type=None, hypervolume_computation_float_type=None): """ Create a new 4 objective archive object. f-vals beyond the `reference_point` are pruned away. The `reference_point` is also used to compute the hypervolume. infos are an optional list of additional information about the points in the archive. """ - - hypervolume_final_float_type = MOArchive4obj.hypervolume_final_float_type \ - if hypervolume_final_float_type is None else hypervolume_final_float_type - hypervolume_computation_float_type = MOArchive4obj.hypervolume_computation_float_type \ - if hypervolume_computation_float_type is None else hypervolume_computation_float_type + list_of_f_vals = self._convert_and_validate_f_vals(list_of_f_vals, n_obj=4) super().__init__(list_of_f_vals=list_of_f_vals, reference_point=reference_point, infos=infos, + ideal_point=ideal_point, + weights=weights, n_obj=4, hypervolume_final_float_type=hypervolume_final_float_type, hypervolume_computation_float_type=hypervolume_computation_float_type) self._hypervolume_already_computed = False self.remove_dominated() - hv = self._set_HV() + + self._set_HV() + self._update_hv_plus(list_of_f_vals) + self._length = len(list(self)) - self._hypervolume_already_computed = True - if hv is not None and hv > 0: - self._hypervolume_plus = self._hypervolume - else: - if list_of_f_vals is None or len(list_of_f_vals) == 0: - self._hypervolume_plus = -inf - else: - self._hypervolume_plus = -min([self.distance_to_hypervolume_area(f) - for f in list_of_f_vals]) + def add(self, f_vals, info=None, update_hypervolume=True): """ Add a new point to the archive. @@ -128,7 +107,8 @@ def add(self, f_vals, info=None, update_hypervolume=True): self._hypervolume_plus = -dist_to_hv_area return False - self.__init__(list(self) + [f_vals], self.reference_point, self.infos + [info]) + self.__init__(list(self) + [f_vals], reference_point=self.reference_point, + infos=self.infos + [info], ideal_point=self._ideal_point, weights=self._weights) return True def remove(self, f_vals): @@ -153,8 +133,10 @@ def remove(self, f_vals): return False point_idx = points_list.index(f_vals) point_info = self.infos[point_idx] - self.__init__([p for p in points_list if p != f_vals], self.reference_point, - [info for p, info in zip(points_list, self.infos) if p != f_vals]) + self.__init__([p for p in points_list if p != f_vals], + reference_point=self.reference_point, + infos=[info for p, info in zip(points_list, self.infos) if p != f_vals], + ideal_point=self._ideal_point, weights=self._weights) return point_info def add_list(self, list_of_f_vals, infos=None): @@ -175,7 +157,8 @@ def add_list(self, list_of_f_vals, infos=None): if infos is None: infos = [None] * len(list_of_f_vals) - self.__init__(list(self) + list_of_f_vals, self.reference_point, self.infos + infos) + self.__init__(list(self) + list_of_f_vals, reference_point=self.reference_point, + infos=self.infos + infos, ideal_point=self._ideal_point, weights=self._weights) def copy(self): """ Return a copy of the archive. @@ -195,7 +178,8 @@ def copy(self): >>> list(moa), moa.infos ([[4, 3, 2, 1], [1, 2, 3, 4]], ['C', 'A']) """ - return MOArchive4obj(list(self), self.reference_point, self.infos) + return MOArchive4obj(list(self), reference_point=self.reference_point, infos=self.infos, + ideal_point=self._ideal_point, weights=self._weights) def _get_kink_points(self): """ Function that returns the kink points of the archive. @@ -271,19 +255,25 @@ def hypervolume_improvement(self, f_vals): return self.hypervolume_final_float_type(moa_copy.hypervolume - self.hypervolume) def compute_hypervolume(self, reference_point=None): - """ Compute the hypervolume of the archive. + """compute the hypervolume of the archive. """ + return self._compute_hypervolume(reference_point=reference_point) * self._hv_factor + + def _compute_hypervolume(self, reference_point=None): + """compute the hypervolume of the archive without normalization weights >>> from moarchiving.get_archive import get_mo_archive >>> moa = get_mo_archive([[1, 2, 3, 4], [4, 3, 2, 1]], reference_point=[5, 5, 5, 5]) - >>> moa.compute_hypervolume() + >>> moa._compute_hypervolume() 44.0 """ if reference_point is not None: _warnings.warn("Reference point given at the initialization is used " - "in 3 objective hypervolume computation") + "in 4 objective hypervolume computation") if self._hypervolume_already_computed: return self._hypervolume + + self._hypervolume_already_computed = True return self.hypervolume_final_float_type( hv4dplusR(self.head, self.hypervolume_computation_float_type)) diff --git a/moarchiving/moarchiving_base.py b/moarchiving/moarchiving_base.py new file mode 100644 index 0000000..832bd1e --- /dev/null +++ b/moarchiving/moarchiving_base.py @@ -0,0 +1,261 @@ +# -*- coding: utf-8 -*- +"""Base class for functionality used with any number of objectives. +""" + +import math +import warnings as _warnings + +from moarchiving.moarchiving_utils import true_fraction + +inf = float('inf') + + +class MOArchiveBase: + """Provide functionality used with any number of objectives""" + + hypervolume_final_float_type = true_fraction + """HV computation takes increasingly longer with increasing precision (number of iterations). + + Set ``BiobjectiveNondominatedSortedList.hypervolume_final_float_type = float`` + when speed is an issue. + """ # lambda x: x is marginally faster than float + hypervolume_computation_float_type = true_fraction + """HV computation takes increasingly longer with increasing precision (number of iterations). + + Precision may be less relevant here than for + `hypervolume_final_float_type`. + + Set ``BiobjectiveNondominatedSortedList.hypervolume_computation_float_type = float`` + here first when speed is an issue. + """ + + def __init__(self, + reference_point=None, + ideal_point=None, + weights=None, + n_obj=None, + hypervolume_final_float_type=None, + hypervolume_computation_float_type=None): + """ Create a new MOArchiveBase object. + + Used for normalization and methods that are common to all MOArchive classes. + """ + if hypervolume_final_float_type is None: + self.hypervolume_final_float_type = MOArchiveBase.hypervolume_final_float_type + else: + self.hypervolume_final_float_type = hypervolume_final_float_type + + if hypervolume_computation_float_type is None: + self.hypervolume_computation_float_type = MOArchiveBase.hypervolume_computation_float_type + else: + self.hypervolume_computation_float_type = hypervolume_computation_float_type + + self.n_obj = n_obj + + # set the reference point + if reference_point is not None: + self.reference_point = list(reference_point) + else: + self.reference_point = reference_point + + self._hypervolume_plus = -inf + self._hypervolume = 0 + + # set the ideal point and weights used for normalization + self._weights = [1] * self.n_obj + self._ideal_point = None + self._weights_ideal_point = [1] * self.n_obj + self._hv_factor = 1 + + self.weights(weights) + self.ideal_point(ideal_point) + + def in_domain(self, f_vals, reference_point=None): + """return `True` if `f_vals` is dominating the reference point, + + `False` otherwise. `True` means that `f_vals` contributes to + the hypervolume if not dominated by other elements. + + `f_vals` may also be an index in `self` in which case + ``self[f_vals]`` is tested to be in-domain. + + >>> from moarchiving import BiobjectiveNondominatedSortedList as NDA + >>> a = NDA([[2.2, 0.1], [0.5, 1]], reference_point=[2, 2]) + >>> assert len(a) == 1 + >>> a.in_domain([0, 0]) + True + >>> a.in_domain([2, 1]) + False + >>> all(a.in_domain(ai) for ai in a) + True + >>> a.in_domain(0) + True + >>> from moarchiving.get_archive import get_mo_archive + >>> archive3obj = get_mo_archive(reference_point=[3, 3, 3]) + >>> archive3obj.in_domain([2, 2, 2]) + True + >>> archive3obj.in_domain([0, 0, 3]) + False + >>> archive4obj = get_mo_archive(reference_point=[3, 3, 3, 3]) + >>> archive4obj.in_domain([2, 2, 2, 2]) + True + >>> archive4obj.in_domain([0, 0, 0, 3]) + False + + TODO: improve name? + """ + if reference_point is None: + reference_point = self.reference_point + if reference_point is None: + return True + try: + if self.n_obj == 2: + f_vals = self[f_vals] + else: + f_vals = list(self)[f_vals] + except TypeError: + pass + except IndexError: + raise # return None + if any(f_vals[i] >= reference_point[i] for i in range(self.n_obj)): + return False + return True + + def distance_to_hypervolume_area(self, f_vals): + """return the distance to the hypervolume area of the archive + + >>> from moarchiving.get_archive import get_mo_archive + >>> moa = get_mo_archive(reference_point=[1, 1, 1]) + >>> moa.distance_to_hypervolume_area([1, 2, 1]) + 1.0 + >>> moa.distance_to_hypervolume_area([1, 1, 1]) + 0.0 + >>> moa.distance_to_hypervolume_area([0, 0, 0]) + 0.0 + >>> moa.distance_to_hypervolume_area([4, 5, 1]) + 5.0 + """ + if self.reference_point is None: + return 0 + return sum([(max((0, f_vals[i] - self.reference_point[i])) * + self._weights_ideal_point[i] * self._weights[i]) ** 2 + for i in range(self.n_obj)]) ** 0.5 + + def weights(self, value=None): + """return hypervolume weights, set to `value` when ``value is not None`` and return previous value + + >>> from moarchiving.get_archive import get_mo_archive + >>> moa = get_mo_archive(reference_point=[1, 1, 1]) + >>> moa.weights([1, 2, 3]) + [1, 1, 1] + >>> moa.weights() + [1, 2, 3] + """ + if value is None: + try: + return self._weights + except AttributeError: + self._weights = None + return None + if len(value) != self.n_obj: + raise ValueError("{0} are not eligible weights when n_obj={1}".format(value, self.n_obj)) + value, self._weights = self._weights, value + + self._update_weights() + return value + + def ideal_point(self, value=None): + """return ideal point, set to `value` when ``value is not None`` and return previous value + + >>> from moarchiving.get_archive import get_mo_archive + >>> moa = get_mo_archive(reference_point=[1, 1, 1]) + >>> moa.ideal_point([0, 0, 0]) + >>> moa.ideal_point() + [0, 0, 0] + """ + if value is None: + try: + return self._ideal_point + except AttributeError: + self._ideal_point = None + return None + if len(value) != self.n_obj: + ValueError("{0} is not an eligible ideal point when n_obj={1}".format(value, self.n_obj)) + if self.reference_point is None: + raise ValueError("Ideal point can't be defined without the reference point") + if any(self.reference_point[i] <= value[i] for i in range(len(value))): + raise ValueError("{0} is not an eligible ideal point when reference_point={1}" + "(it must be smaller in all objectives)".format(value, self.reference_point)) + + value, self._ideal_point = self._ideal_point, value + self._weights_ideal_point = [1 / (self.reference_point[i] - self._ideal_point[i]) + for i in range(self.n_obj)] + self._update_weights() + return value + + def _update_weights(self): + """recalculates the hv_factor when weights or ideal point change. + + Also warns if the hypervolume_plus is not updated after changing weights or ideal point. + """ + self._hv_factor = math.prod(self._weights) * math.prod(self._weights_ideal_point) + + if (hasattr(self, '_hypervolume_plus') and self._hypervolume_plus and + -inf < self._hypervolume_plus < 0): + _warnings.warn("hypervolume_plus indicator was not updated after changing " + "weights or ideal point") + + def _set_HV(self): + """set current hypervolume value using `self.reference_point`. + + Also sets the hypervolume_plus indicator when hypervolume > 0. + + TODO: we may need to store the list of _contributing_ hypervolumes + to handle numerical rounding errors later. + """ + if self.reference_point is None: + return None + if self.n_obj == 2: + self._hypervolume = self._compute_hypervolume(self.reference_point) + else: + self._hypervolume = self._compute_hypervolume() + + if self._hypervolume > 0: + self._hypervolume_plus = self._hypervolume + return self._hypervolume + + def _compute_hypervolume(self, reference_point=None): + raise NotImplementedError("This method should be overridden in subclasses") + + def _update_hv_plus(self, list_of_f_vals): + """updates the hypervolume plus indicator with the new list of solutions `list_of_f_vals`. + + Needed when ``hypervolume == 0``. + """ + if self.reference_point is None: + self._hypervolume_plus = None + return None + + if self._hypervolume > 0: + self._hypervolume_plus = self._hypervolume + else: + for f in list_of_f_vals: + d = self.distance_to_hypervolume_area(f) + if d < - self._hypervolume_plus: + self._hypervolume_plus = -d + + @staticmethod + def _convert_and_validate_f_vals(list_of_f_vals, n_obj): + """converts `list_of_f_vals` to a list, ensures that the inner lists have correct length + """ + if list_of_f_vals is None or len(list_of_f_vals) == 0: + return [] + + try: + list_of_f_vals = list_of_f_vals.tolist() + except: + pass + list_of_f_vals = [list(f_vals) for f_vals in list_of_f_vals] + if len(list_of_f_vals[0]) != n_obj: + raise ValueError(f"need elements of length {n_obj}, got {list_of_f_vals[0]} as first element") + return list_of_f_vals diff --git a/moarchiving/moarchiving_parent.py b/moarchiving/moarchiving_parent.py index bc1f0dd..44ea388 100644 --- a/moarchiving/moarchiving_parent.py +++ b/moarchiving/moarchiving_parent.py @@ -6,42 +6,30 @@ from moarchiving.moarchiving_utils import setup_cdllist, weakly_dominates +from moarchiving.moarchiving_base import MOArchiveBase inf = float('inf') -class MOArchiveParent: +class MOArchiveParent(MOArchiveBase): """Parent class for Moarchiving 3 and 4 objective classes, to avoid code duplication """ - def __init__(self, list_of_f_vals=None, reference_point=None, infos=None, n_obj=None, - hypervolume_final_float_type=None, - hypervolume_computation_float_type=None): + def __init__(self, list_of_f_vals=None, reference_point=None, infos=None, ideal_point=None, weights=None, + n_obj=None, hypervolume_final_float_type=None, hypervolume_computation_float_type=None): """Create a new archive object. """ - self.hypervolume_final_float_type = hypervolume_final_float_type - self.hypervolume_computation_float_type = hypervolume_computation_float_type - - if list_of_f_vals is not None and len(list_of_f_vals): - try: - list_of_f_vals = list_of_f_vals.tolist() - except: - pass - list_of_f_vals = [list(f_vals) for f_vals in list_of_f_vals] - if len(list_of_f_vals[0]) != n_obj: - raise ValueError(f"need elements of length {n_obj}, got {list_of_f_vals[0]}" - " as first element") - else: - list_of_f_vals = [] - self.n_obj = n_obj + + MOArchiveBase.__init__(self, reference_point=reference_point, ideal_point=ideal_point, weights=weights, + n_obj=n_obj, hypervolume_final_float_type=hypervolume_final_float_type, + hypervolume_computation_float_type=hypervolume_computation_float_type) + self._length = 0 if infos is None: infos = [None] * len(list_of_f_vals) - if reference_point is not None: - self.reference_point = list(reference_point) + if self.reference_point is not None: self.head = setup_cdllist(self.n_obj, list_of_f_vals, self.reference_point, infos) else: - self.reference_point = None self.head = setup_cdllist(self.n_obj, list_of_f_vals, [inf] * self.n_obj, infos) self._kink_points = None @@ -119,42 +107,9 @@ def dominators(self, f_val, number_only=False): break return dominators - def in_domain(self, f_vals, reference_point=None): - """return `True` if `f_vals` is dominating the reference point, - `False` otherwise. `True` means that `f_vals` contributes to - the hypervolume if not dominated by other elements. - - >>> from moarchiving.get_archive import get_mo_archive - >>> archive3obj = get_mo_archive(reference_point=[3, 3, 3]) - >>> archive3obj.in_domain([2, 2, 2]) - True - >>> archive3obj.in_domain([0, 0, 3]) - False - >>> archive4obj = get_mo_archive(reference_point=[3, 3, 3, 3]) - >>> archive4obj.in_domain([2, 2, 2, 2]) - True - >>> archive4obj.in_domain([0, 0, 0, 3]) - False - """ - - try: - if len(f_vals) != self.n_obj: - raise ValueError(f"argument `f_vals` must be of length {self.n_obj}, " - f"was ``{f_vals}``") - except TypeError: - raise TypeError(f"argument `f_vals` must be a list, was ``{f_vals}``") - - if reference_point is None: - reference_point = self.reference_point - if reference_point is None: - return True - - if any(f_vals[i] >= reference_point[i] for i in range(self.n_obj)): - return False - return True - def _points_generator(self, include_head=False): """returns the points in the archive in a form of a python generator + instead of a circular doubly linked list """ first_iter = True di = self.n_obj - 1 @@ -173,8 +128,7 @@ def _points_generator(self, include_head=False): @property def infos(self): - """`list` of complementary information corresponding to each archive entry, - corresponding to each of the points in the archive + """`list` of complementary information corresponding to each archive entry >>> from moarchiving.get_archive import get_mo_archive >>> moa = get_mo_archive([[1, 2, 3], [3, 2, 1], [2, 2, 2]], infos=["a", "b", "c"]) @@ -185,19 +139,22 @@ def infos(self): @property def hypervolume(self): - """Return the hypervolume of the archive """ + """return the hypervolume of the archive """ if self.reference_point is None: raise ValueError("to compute the hypervolume indicator a reference" " point is needed (must be given initially)") - return self._hypervolume + return self._hypervolume * self._hv_factor @property def hypervolume_plus(self): - """Return the hypervolume_plus of the archive """ + """return the hypervolume_plus of the archive """ if self.reference_point is None: raise ValueError("to compute the hypervolume_plus indicator a reference" " point is needed (must be given initially)") - return self._hypervolume_plus + if self._hypervolume_plus < 0: + return self._hypervolume_plus + else: + return self._hypervolume_plus * self._hv_factor @property def contributing_hypervolumes(self): @@ -205,7 +162,7 @@ def contributing_hypervolumes(self): return [self.contributing_hypervolume(point[:self.n_obj]) for point in self] def contributing_hypervolume(self, f_vals): - """Return the hypervolume contribution of a point in the archive + """return the hypervolume contribution of a point in the archive >>> from moarchiving.get_archive import get_mo_archive >>> get_mo_archive.hypervolume_final_float_type = float @@ -225,9 +182,9 @@ def contributing_hypervolume(self, f_vals): raise TypeError(f"argument `f_vals` must be a list, was ``{f_vals}``") if f_vals in self: - hv_before = self._hypervolume + hv_before = self.hypervolume removed_info = self.remove(f_vals) - hv_after = self._hypervolume + hv_after = self.hypervolume self.add(f_vals, info=removed_info) return hv_before - hv_after else: @@ -237,8 +194,9 @@ def _get_kink_points(self): raise NotImplementedError("This method should be implemented in the child class") def distance_to_pareto_front(self, f_vals, ref_factor=1): - """Return the distance to the Pareto front of the archive, - by calculating the distances to the kink points + """return the distance to the Pareto front of the archive, + + by calculating the minimum distance to the kink points >>> from moarchiving.get_archive import get_mo_archive >>> moa = get_mo_archive([[1, 2, 3], [3, 2, 1], [2, 2, 2]], reference_point=[5, 5, 5]) @@ -260,48 +218,23 @@ def distance_to_pareto_front(self, f_vals, ref_factor=1): ref_di = [0] * self.n_obj if len(self) == 0: - return sum([ref_di[i] ** 2 for i in range(self.n_obj)]) ** 0.5 + return sum([(r_di * w * w_ip) ** 2 for r_di, w, w_ip in + zip(ref_di, self._weights, self._weights_ideal_point)]) ** 0.5 if self._kink_points is None: self._kink_points = self._get_kink_points() - distances_squared = [] + dist_squared = [] for point in self._kink_points: - distances_squared.append(sum([max((0, f_vals[i] - point[i])) ** 2 - for i in range(self.n_obj)])) - return min(distances_squared) ** 0.5 - - def distance_to_hypervolume_area(self, f_vals): - """Return the distance to the hypervolume area of the archive - - >>> from moarchiving.get_archive import get_mo_archive - >>> moa = get_mo_archive(reference_point=[1, 1, 1]) - >>> moa.distance_to_hypervolume_area([1, 2, 1]) - 1.0 - >>> moa.distance_to_hypervolume_area([1, 1, 1]) - 0.0 - >>> moa.distance_to_hypervolume_area([0, 0, 0]) - 0.0 - >>> moa.distance_to_hypervolume_area([4, 5, 1]) - 5.0 - """ - if self.reference_point is None: - return 0 - return sum([max((0, f_vals[i] - self.reference_point[i])) ** 2 - for i in range(self.n_obj)])**0.5 + distances = [ref_di[i] if self.reference_point and point[i] == self.reference_point[i] + else max(0, f_vals[i] - point[i]) for i in range(self.n_obj)] + dist_squared.append(sum([(d * w * w_ip) ** 2 for d, w, w_ip in + zip(distances, self._weights, self._weights_ideal_point)])) + return min(dist_squared) ** 0.5 def hypervolume_improvement(self, f_vals): raise NotImplementedError("This method should be implemented in the child class") - def _set_HV(self): - """Set the hypervolume of the archive """ - if self.reference_point is None: - return None - self._hypervolume = self.hypervolume_final_float_type(self.compute_hypervolume()) - if self._hypervolume > 0: - self._hypervolume_plus = self._hypervolume - return self._hypervolume - def compute_hypervolume(self): raise NotImplementedError("This method should be implemented in the child class") diff --git a/moarchiving/moarchiving_utils.py b/moarchiving/moarchiving_utils.py index 70ca11e..2dc85ec 100644 --- a/moarchiving/moarchiving_utils.py +++ b/moarchiving/moarchiving_utils.py @@ -6,6 +6,29 @@ _warnings.warn('`sortedcontainers` module not installed, moarchiving for 3 and 4 objectives will not work') SortedKeyList = list +try: + import fractions +except ImportError: + _warnings.warn('`fractions` module not installed, arbitrary precision hypervolume computation not available') + +def true_fraction(val, copy=False): + """return a `fractions.Fraction` object from `val`. + + Fixes the issue that `Fraction` does not convert an `np.intc` or + `np.int32` type to infinite representation `int`. + """ + try: + fractions.Fraction + except NameError: + return val + if isinstance(val, fractions.Fraction): + if copy: # Fraction(.) is almost 20 times slower than float(.) + return fractions.Fraction(val) + return val + if not isinstance(val, (int, float)): + val = float(val) + return fractions.Fraction(val) + class DLNode: """ A class to represent a node in a doubly linked list. """ diff --git a/moarchiving/test.py b/moarchiving/test.py index 8832cb4..3575fe7 100644 --- a/moarchiving/test.py +++ b/moarchiving/test.py @@ -10,24 +10,29 @@ import moarchiving as moa import moarchiving.tests + def run_doctests(): for doctest_suite in [moa.moarchiving, - moa.moarchiving3obj, - moa.moarchiving4obj, - moa.moarchiving_parent, - moa.constrained_moarchive]: + moa.moarchiving3obj, + moa.moarchiving4obj, + moa.moarchiving_parent, + moa.constrained_moarchive, + moa.moarchiving_base]: print(f'doctest.testmod({doctest_suite})') print(doctest.testmod(doctest_suite)) + def run_unittests(): for unit_test_suite in [moa.tests.test_moarchiving2obj, moa.tests.test_moarchiving3obj, moa.tests.test_moarchiving4obj, moa.tests.test_constrained_moarchiving, - moa.tests.test_sorted_list]: + moa.tests.test_sorted_list, + moa.tests.test_normalization]: print(f'unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromModule({unit_test_suite}))') unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromModule(unit_test_suite)) + if __name__ == "__main__": tmp = moa.BiobjectiveNondominatedSortedList.make_expensive_asserts moa.BiobjectiveNondominatedSortedList.make_expensive_asserts = True @@ -35,6 +40,3 @@ def run_unittests(): run_doctests() run_unittests() - - moa.BiobjectiveNondominatedSortedList.make_expensive_asserts = tmp - # print(moa.moarching.BiobjectiveNondominatedSortedList.make_expensive_asserts) diff --git a/moarchiving/tests/__init__.py b/moarchiving/tests/__init__.py index 78f5284..f001040 100644 --- a/moarchiving/tests/__init__.py +++ b/moarchiving/tests/__init__.py @@ -5,4 +5,5 @@ test_moarchiving3obj, test_moarchiving4obj, test_constrained_moarchiving, - test_sorted_list) + test_sorted_list, + test_normalization) diff --git a/moarchiving/tests/test_normalization.py b/moarchiving/tests/test_normalization.py new file mode 100644 index 0000000..6453282 --- /dev/null +++ b/moarchiving/tests/test_normalization.py @@ -0,0 +1,284 @@ +""" Test the MOArchive3obj class """ +import math + +from moarchiving.get_archive import get_mo_archive, get_cmo_archive +from moarchiving.tests.point_sampling import get_non_dominated_points + +import unittest +import random + + +class TestNormalization(unittest.TestCase): + def test_weights_ideal_point_easy_2dim(self): + """ test the hypervolume after changing weights and ideal point in 2D """ + points = [[2, 1], [1, 4]] + moa = get_mo_archive(points, reference_point=[5, 5]) + self.assertEqual(moa.hypervolume, 13) + + moa.ideal_point([0, 0]) + self.assertAlmostEqual(moa.hypervolume, 13 / 25) + + moa.weights([0.5, 2]) + self.assertAlmostEqual(moa.hypervolume, 13 / 25) + + moa.weights([2, 3]) + self.assertAlmostEqual(moa.hypervolume, (13 / 25) * 6) + + moa.ideal_point([1, 1]) + self.assertAlmostEqual(moa.hypervolume, (13 / 16) * 6) + + def test_weights_ideal_point_easy_3dim(self): + """ test the hypervolume after changing weights and ideal point in 3D """ + points = [[1, 2, 3], [3, 2, 1]] + moa = get_mo_archive(points, reference_point=[4, 4, 4]) + self.assertEqual(moa.hypervolume, 10) + + moa.ideal_point([0, 0, 0]) + self.assertAlmostEqual(moa.hypervolume, 10 / (4 * 4 * 4)) + + moa.weights([0.5, 2, 1]) + self.assertAlmostEqual(moa.hypervolume, 10 / (4 * 4 * 4)) + + moa.weights([2, 3, 0.5]) + self.assertAlmostEqual(moa.hypervolume, (10 / (4 * 4 * 4)) * 3) + + moa.ideal_point([1, 1, 1]) + self.assertAlmostEqual(moa.hypervolume, (10 / (3 * 3 * 3)) * 3) + + def test_weights_ideal_point_easy_4dim(self): + """ test the hypervolume after changing weights and ideal point in 4D """ + points = [[1, 2, 3, 4], [4, 3, 2, 1]] + moa = get_mo_archive(points, reference_point=[5, 5, 5, 5]) + self.assertEqual(moa.hypervolume, 44) + + moa.ideal_point([0, 0, 0, 0]) + self.assertAlmostEqual(moa.hypervolume, 44 / (5 ** 4)) + + moa.weights([0.5, 2, 3, 1/3]) + self.assertAlmostEqual(moa.hypervolume, (44 / (5 ** 4))) + + moa.weights([0.2, 3, 0.5, 5]) + self.assertAlmostEqual(moa.hypervolume, (44 / (5 ** 4)) * 1.5) + + moa.ideal_point([1, 1, 1, 1]) + self.assertAlmostEqual(moa.hypervolume, (44 / (4 ** 4)) * 1.5) + + def test_hypervolume_after_weights_change(self): + """ test the hypervolume after weights update """ + for dim in [2, 3, 4]: + points = get_non_dominated_points(100, n_dim=dim) + moa = get_mo_archive(points, reference_point=[1] * dim) + hv = moa.hypervolume + moa.weights([2] * dim) + self.assertAlmostEqual(moa.hypervolume, hv * (2 ** dim)) + moa.weights([0.5] * dim) + self.assertAlmostEqual(moa.hypervolume, hv / (2 ** dim)) + + random_weights = [random.random() for _ in range(dim)] + moa.weights(random_weights) + + moa2 = get_mo_archive(points, reference_point=[1] * dim, weights=random_weights) + self.assertAlmostEqual(moa2.hypervolume, moa.hypervolume) + + def test_hypervolume_after_ideal_point_change(self): + """ test the hypervolume after ideal point update """ + for dim in [2, 3, 4]: + points = get_non_dominated_points(100, n_dim=dim) + moa = get_mo_archive(points, reference_point=[1] * dim) + hv = moa.hypervolume + moa.ideal_point([-1] * dim) + self.assertEqual(moa.hypervolume, hv / (2 ** dim)) + + def test_hypervolume_improvement(self): + """test the hypervolume improvement of a point, when using weights and ideal point""" + # 2D + moa = get_mo_archive([[1, 3], [3, 1]], reference_point=[4, 4]) + self.assertAlmostEqual(moa.hypervolume_improvement([2, 2]), 1) + self.assertAlmostEqual(moa.hypervolume_improvement([3.5, 3.5]), -math.sqrt(0.5)) + + moa.weights([2, 1]) + self.assertAlmostEqual(moa.hypervolume_improvement([2, 2]), 2) + self.assertAlmostEqual(moa.hypervolume_improvement([3.5, 3.5]), -math.sqrt(1.25)) + + moa.ideal_point([0, 0]) + self.assertAlmostEqual(moa.hypervolume_improvement([2, 2]), 2 / 16) + self.assertAlmostEqual(moa.hypervolume_improvement([3.5, 3.5]), -math.sqrt((1/8)**2 + (1/4)**2)) + + # 3D + moa = get_mo_archive([[1, 2, 3], [3, 2, 1]], reference_point=[4, 4, 4]) + self.assertAlmostEqual(moa.hypervolume_improvement([2, 2, 2]), 2) + self.assertAlmostEqual(moa.hypervolume_improvement([3.5, 3.5, 3.5]), -math.sqrt(0.5)) + + moa.weights([2, 3, 5]) + self.assertAlmostEqual(moa.hypervolume_improvement([2, 2, 2]), 2 * (2 * 3 * 5)) + self.assertAlmostEqual(moa.hypervolume_improvement([3.5, 3.5, 3.5]), -math.sqrt((2/2)**2 + (5/2)**2)) + + moa.ideal_point([0, 0, 0]) + self.assertAlmostEqual(moa.hypervolume_improvement([2, 2, 2]), 2 * (2 * 3 * 5) / (4 ** 3)) + self.assertAlmostEqual(moa.hypervolume_improvement([3.5, 3.5, 3.5]), -math.sqrt((2/8)**2 + (5/8)**2)) + + # 4D + moa = get_mo_archive([[1, 2, 3, 4], [4, 3, 2, 1]], reference_point=[5, 5, 5, 5]) + self.assertAlmostEqual(moa.hypervolume_improvement([2, 2, 2, 2]), 49) + self.assertAlmostEqual(moa.hypervolume_improvement([4.5, 4.5, 4.5, 4.5]), -math.sqrt(0.5)) + + moa.weights([2, 3, 5, 7]) + self.assertAlmostEqual(moa.hypervolume_improvement([2, 2, 2, 2]), 49 * (2 * 3 * 5 * 7)) + self.assertAlmostEqual(moa.hypervolume_improvement([4.5, 4.5, 4.5, 4.5]), -math.sqrt((2/2)**2 + (7/2)**2)) + + moa.ideal_point([0, 0, 0, 0]) + self.assertAlmostEqual(moa.hypervolume_improvement([2, 2, 2, 2]), 49 * (2 * 3 * 5 * 7) / (5 ** 4)) + self.assertAlmostEqual(moa.hypervolume_improvement([4.5, 4.5, 4.5, 4.5]), -math.sqrt((2/10)**2 + (7/10)**2)) + + + def test_contributing_hypervolume(self): + """test the contributing_hypervolume function with different weights and ideal points""" + # 2D + moa = get_mo_archive([[1, 3], [2, 2], [3, 1]], reference_point=[4, 4]) + self.assertAlmostEqual(moa.contributing_hypervolume([2, 2]), 1) + self.assertAlmostEqual(moa.contributing_hypervolume(1), 1) + self.assertAlmostEqual(moa.contributing_hypervolume([1, 1]), 3) + + moa.weights([3, 5]) + self.assertAlmostEqual(moa.contributing_hypervolume([2, 2]), 15) + self.assertAlmostEqual(moa.contributing_hypervolume(1), 15) + self.assertAlmostEqual(moa.contributing_hypervolume([1, 1]), 45) + + moa.ideal_point([0, 0]) + self.assertAlmostEqual(moa.contributing_hypervolume([2, 2]), 15/16) + self.assertAlmostEqual(moa.contributing_hypervolume(1), 15/16) + self.assertAlmostEqual(moa.contributing_hypervolume([1, 1]), 45/16) + + # 3D + moa = get_mo_archive([[1, 2, 3], [3, 1, 2], [2, 3, 1]], reference_point=[4, 4, 4]) + self.assertAlmostEqual(moa.contributing_hypervolume([1, 2, 3]), 3) + self.assertAlmostEqual(moa.contributing_hypervolume([1, 1, 1]), 14) + + moa.weights([2, 3, 5]) + self.assertAlmostEqual(moa.contributing_hypervolume([1, 2, 3]), 3 * 2 * 3 * 5) + self.assertAlmostEqual(moa.contributing_hypervolume([1, 1, 1]), 14 * 2 * 3 * 5) + + moa.ideal_point([0, 0, 0]) + self.assertAlmostEqual(moa.contributing_hypervolume([1, 2, 3]), 3 * 2 * 3 * 5 / 64) + self.assertAlmostEqual(moa.contributing_hypervolume([1, 1, 1]), 14 * 2 * 3 * 5 / 64) + + # 4D + moa = get_mo_archive([[1, 2, 3, 4], [3, 4, 1, 2], [2, 3, 4, 1], [4, 1, 2, 3]], + reference_point=[5, 5, 5, 5]) + self.assertAlmostEqual(moa.contributing_hypervolume([1, 2, 3, 4]), 13) + self.assertAlmostEqual(moa.contributing_hypervolume([2, 2, 2, 2]), 34) + + moa.weights([2, 3, 5, 0.1]) + self.assertAlmostEqual(moa.contributing_hypervolume([1, 2, 3, 4]), 13 * 3) + self.assertAlmostEqual(moa.contributing_hypervolume([2, 2, 2, 2]), 34 * 3) + + moa.ideal_point([0, 0, 0, 0]) + self.assertAlmostEqual(moa.contributing_hypervolume([1, 2, 3, 4]), 13 * 3 / 625) + self.assertAlmostEqual(moa.contributing_hypervolume([2, 2, 2, 2]), 34 * 3 / 625) + + def test_hypervolume_plus(self): + """ test the hypervolume_plus indicator with different weights and ideal points """ + for get_archive, kwargs in zip([get_mo_archive, get_cmo_archive], + [{}, {"list_of_g_vals": [0, 0]}]): + # test weights only + moa = get_archive([[2, 2], [1, 4]], reference_point=[1, 1], weights=[1, 1], + **kwargs) + self.assertEqual(moa.hypervolume_plus, -math.sqrt(2)) + + moa = get_archive([[2, 2], [1, 4]], reference_point=[1, 1], weights=[3, 1], + **kwargs) + self.assertEqual(moa.hypervolume_plus, -3) + + moa = get_archive([[2, 2], [1, 4]], reference_point=[1, 1], weights=[1, 3], + **kwargs) + self.assertEqual(moa.hypervolume_plus, -math.sqrt(10)) + + moa.add_list([[0, 5], [3, 1.5]], **kwargs) + self.assertEqual(moa.hypervolume_plus, -math.sqrt(2 ** 2 + 1.5 ** 2)) + + moa.add_list([[1, 3], [0.4, 1]], **kwargs) + self.assertEqual(moa.hypervolume_plus, 0) + + moa.add_list([[0.5, 0.5], [0.8, 0.7]], **kwargs) + self.assertEqual(moa.hypervolume_plus, 0.5 ** 2 * 3) + + # test ideal point only + moa = get_archive([[2, 2], [1, 4]], reference_point=[1, 1], + ideal_point=[-1, -1], **kwargs) + self.assertEqual(moa.hypervolume_plus, -math.sqrt(0.5)) + + moa = get_archive([[2, 2], [1, 4]], reference_point=[1, 1], + ideal_point=[-3, -1], **kwargs) + self.assertEqual(moa.hypervolume_plus, -math.sqrt(0.5**2 + 0.25**2)) + + moa = get_archive([[2, 2], [1, 4]], reference_point=[1, 1], + ideal_point=[-1, -3], **kwargs) + self.assertEqual(moa.hypervolume_plus, -math.sqrt(0.5**2 + 0.25**2)) + + moa.add_list([[3, 1.5], [0, 3]], **kwargs) + self.assertEqual(moa.hypervolume_plus, -0.5) + + moa.add_list([[1, 3], [0.4, 1]], **kwargs) + self.assertEqual(moa.hypervolume_plus, 0) + + moa.add_list([[0.5, 0.5], [0.8, 0.7]], **kwargs) + self.assertEqual(moa.hypervolume_plus, 0.5 ** 2 / 8) + + # test both weights and ideal point + moa = get_archive([[2, 2], [1, 4]], reference_point=[1, 1], ideal_point=[-1, -2], + weights=[7, 2], **kwargs) + self.assertEqual(moa.hypervolume_plus, -2) + + moa.add_list([[0, 5], [1.5, 1.5]], **kwargs) + self.assertEqual(moa.hypervolume_plus, -math.sqrt((1/4 * 7) ** 2 + (1/6 * 2) ** 2)) + + moa.add_list([[1, 3], [0.4, 1]], **kwargs) + self.assertEqual(moa.hypervolume_plus, 0) + + moa.add_list([[0.5, 0.5], [0.8, 0.7]], **kwargs) + self.assertEqual(moa.hypervolume_plus, (1/4 * 1/6) * 2 * 7) + + def test_hypervolume_plus_constr(self): + """test the hypervolume_plus_constr indicator with different weights and ideal points""" + moa = get_cmo_archive([[2, 2], [1, 4]], list_of_g_vals=[[5, 3], [1, 2]], + reference_point=[1, 1], weights=[1, 1]) + self.assertAlmostEqual(moa.hypervolume_plus_constr, -(1 + (1 + 2))) + + moa.add([0, 5], [1, 0]) + self.assertAlmostEqual(moa.hypervolume_plus_constr, -(1 + 1)) + + moa.add([3, 1], [0, 0]) + self.assertAlmostEqual(moa.hypervolume_plus_constr, -(1 + 0)) + + moa.add([0.5, 0.5], [0, 0]) + self.assertAlmostEqual(moa.hypervolume_plus_constr, 0.25) + + moa = get_cmo_archive([[11, 7], [8, 9]], list_of_g_vals=[[0.5, 30], [0.1, 100]], + reference_point=[10, 10], ideal_point=[4, 2], weights=[7, 2], + tau=2, max_g_vals=[1, 100]) + self.assertAlmostEqual(moa.hypervolume_plus_constr, -(2 + 0.8)) + + moa.add([4, 14], [0.2, 30]) + self.assertAlmostEqual(moa.hypervolume_plus_constr, -(2 + 0.5)) + + moa.add([30, 50], [0, 0]) + self.assertAlmostEqual(moa.hypervolume_plus_constr, -2) + + moa.add([11, 5], [0, 0]) + self.assertAlmostEqual(moa.hypervolume_plus_constr, -7/6) + + moa.add([1, 11], [0, 0]) + self.assertAlmostEqual(moa.hypervolume_plus_constr, -1/4) + + moa.add([10.1, 10.1], [0, 0]) + self.assertAlmostEqual(moa.hypervolume_plus_constr, -((0.7/6) ** 2 + (0.2/8) ** 2) ** 0.5) + + moa.add([3, 3], [-6, 0.2]) + self.assertAlmostEqual(moa.hypervolume_plus_constr, -((0.7/6) ** 2 + (0.2/8) ** 2) ** 0.5) + + moa.add([5, 7], [0, 0]) + self.assertAlmostEqual(moa.hypervolume_plus_constr, (15/48) * (2 * 7)) + + +if __name__ == '__main__': + unittest.main() diff --git a/readme_files/README_31_0.png b/readme_files/README_31_0.png deleted file mode 100644 index 7c447ca..0000000 Binary files a/readme_files/README_31_0.png and /dev/null differ diff --git a/readme_files/README_34_0.png b/readme_files/README_34_0.png new file mode 100644 index 0000000..e90c9e2 Binary files /dev/null and b/readme_files/README_34_0.png differ diff --git a/readme_files/README_35_1.png b/readme_files/README_35_1.png deleted file mode 100644 index 1f1df43..0000000 Binary files a/readme_files/README_35_1.png and /dev/null differ diff --git a/readme_files/README_37_1.png b/readme_files/README_37_1.png deleted file mode 100644 index 853caa9..0000000 Binary files a/readme_files/README_37_1.png and /dev/null differ diff --git a/readme_files/README_38_1.png b/readme_files/README_38_1.png new file mode 100644 index 0000000..2af80eb Binary files /dev/null and b/readme_files/README_38_1.png differ diff --git a/readme_files/README_40_1.png b/readme_files/README_40_1.png new file mode 100644 index 0000000..9769608 Binary files /dev/null and b/readme_files/README_40_1.png differ