Introduction¶
This package implements a multi-objective - non-dominated archive for 2, 3 or 4 objectives, providing easy and fast access to multiple hypervolume indicators:
+Introduction¶
This package implements a multi-objective +non-dominated archive for 2, 3 or 4 objectives, providing easy and fast access to multiple hypervolume indicators:
- the hypervolume of the entire archive,
- the contributing hypervolume of each element, @@ -14591,17 +7527,16 @@
- 1.1.0 added possibility of normalization of the indicators by adding
ideal_pointandweightsmethods to the archive - 1.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_improvementby extracting a sublist first. - 0.6.0 the
infosattribute is alistwith corresponding (arbitrary) information, e.g. for keeping the respective solutions. - 0.5.3 fixed assertion error when not using
fractions.Fraction - 0.5.2 first published version
- Initialization
- Constrained MOArchive
- Accessing solution information
- Adding solutions
- Archive size -
- Performance indicators +
- Performance indicators and normalization
- Contributing hypervolumes
- Hypervolume improvement
- Distance to the Pareto front @@ -14641,392 +7578,303 @@
- Performance tests
Introduction
Additionally, the package provides a constrained version of the archive,
which allows to store points with constraints.
The source code is available on GitHub.
-Installation¶
On a system shell, either like
-
-pip install moarchiving
+Installation¶
On a system shell, either like
+pip install moarchiving
+
or from GitHub, for example
-
-pip install git+https://github.com/CMA-ES/moarchiving.git@development
+pip install git+https://github.com/CMA-ES/moarchiving.git@development
+
installing from the development branch.
-Testing¶
-python -m moarchiving.test
+Testing¶
python -m moarchiving.test
+
on a system shell should output something like
-
doctest.testmod(<module 'moarchiving.moarchiving2obj' from '...\\moarchiving\\moarchiving2obj.py'>)
TestResults(failed=0, attempted=90)
@@ -14611,28 +7546,30 @@ Testing¶
unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromModule(<module 'moarchiving.tests.test_sorted_list' from '...\\moarchiving\\tests\\test_sorted_list.py'>))
.......
----------------------------------------------------------------------
-Ran 7 tests in 0.001s
-Links¶
+Ran 7 tests in 0.001s
+
+Links¶
-Details¶
moarchiving with 2 objectives uses the fractions.Fraction type to avoid rounding errors when computing hypervolume differences, but its usage can also be easily switched off by assigning the respective class attributes hypervolume_computation_float_type and hypervolume_final_float_type. The Fraction type can become prohibitively computationally expensive with increasing precision.
+Details¶
moarchiving with 2 objectives uses the fractions.Fraction type to avoid rounding errors when computing hypervolume differences, but its usage can also be easily switched off by assigning the respective class attributes hypervolume_computation_float_type and hypervolume_final_float_type. The Fraction type can become prohibitively computationally expensive with increasing precision.
The implementation of the two-objective archive is heavily based on the bisect module, while in three and four objectives it is based on the sortedcontainers module.
Releases¶
+
-Usage examples¶
+Usage examples¶
Usage examplesVisualization of indicator values
-
pip install moarchivingpip install moarchiving
+pip install git+https://github.com/CMA-ES/moarchiving.git@developmentpip install git+https://github.com/CMA-ES/moarchiving.git@development
+development branch.python -m moarchiving.testpython -m moarchiving.test
+doctest.testmod(<module 'moarchiving.moarchiving2obj' from '...\\moarchiving\\moarchiving2obj.py'>)
TestResults(failed=0, attempted=90)
@@ -14611,28 +7546,30 @@ Testing¶
unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromModule(<module 'moarchiving.tests.test_sorted_list' from '...\\moarchiving\\tests\\test_sorted_list.py'>))
.......
----------------------------------------------------------------------
-Ran 7 tests in 0.001sLinks¶
-Details¶
moarchiving with 2 objectives uses the fractions.Fraction type to avoid rounding errors when computing hypervolume differences, but its usage can also be easily switched off by assigning the respective class attributes hypervolume_computation_float_type and hypervolume_final_float_type. The Fraction type can become prohibitively computationally expensive with increasing precision.
Details¶
moarchiving with 2 objectives uses the fractions.Fraction type to avoid rounding errors when computing hypervolume differences, but its usage can also be easily switched off by assigning the respective class attributes hypervolume_computation_float_type and hypervolume_final_float_type. The Fraction type can become prohibitively computationally expensive with increasing precision.
The implementation of the two-objective archive is heavily based on the bisect module, while in three and four objectives it is based on the sortedcontainers module.
Releases¶
-
+
Usage examples¶
-
+
Usage examples¶
Usage examplesVisualization of indicator values
1. Initialization¶
The MOArchive object can be created using the get_mo_archive function by providing a list of objective values, a reference point, or at least the number of objectives.
+
1. Initialization¶
The MOArchive object can be created using the get_mo_archive function by providing a list of objective values, a reference point, or at least the number of objectives.
Further solutions can be added using add or add_list methods, but the reference point cannot be changed once the instance is created. A list of information strings can be provided for each element, which will be stored as long as the corresponding element remains in the archive (e.g., the x values of the element). At any time, the list of non-dominated elements and their corresponding information can be accessed.
from moarchiving import get_mo_archive
+
+from moarchiving import get_mo_archive
-moa2obj = get_mo_archive([[1, 5], [2, 3], [4, 5], [5, 0]], reference_point=[10, 10], infos=["a", "b", "c", "d"])
-moa3obj = get_mo_archive([[1, 2, 3], [3, 2, 1], [3, 3, 0], [2, 2, 1]], [10, 10, 10], ["a", "b", "c", "d"])
-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"])
+moa2obj = get_mo_archive([[1, 5], [2, 3], [4, 5], [5, 0]], reference_point=[10, 10], infos=["a", "b", "c", "d"])
+moa3obj = get_mo_archive([[1, 2, 3], [3, 2, 1], [3, 3, 0], [2, 2, 1]], [10, 10, 10], ["a", "b", "c", "d"])
+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"])
-print("points in the 2 objective archive:", list(moa2obj))
-print("points in the 3 objective archive:", list(moa3obj))
-print("points in the 4 objective archive:", list(moa4obj))
+print("points in the 2 objective archive:", list(moa2obj))
+print("points in the 3 objective archive:", list(moa3obj))
+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.
-moa = get_mo_archive(reference_point=[4, 4, 4])
-print("points in the empty archive:", list(moa))
+
+moa = get_mo_archive(reference_point=[4, 4, 4])
+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.
- +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 and added to the archive when all its constraint values are less than or equal to zero.
from moarchiving import get_cmo_archive
+
+from moarchiving import get_cmo_archive
cmoa = get_cmo_archive([[1, 2, 3], [1, 3, 4], [4, 3, 2], [1, 3, 0]], [[3, 0], [0, 0], [0, 0], [0, 1]],
- reference_point=[5, 5, 5], infos=["a", "b", "c", "d"])
-print("points in the archive:", list(cmoa))
+ reference_point=[5, 5, 5], infos=["a", "b", "c", "d"])
+print("points in the archive:", list(cmoa))
-
-
points in the archive: [[4, 3, 2], [1, 3, 4]]
# infos of the previously defined empty archive
-print("infos of the empty archive", moa.infos)
-print("infos of the constrained archive", cmoa.infos)
+
+# infos of the previously defined empty archive
+print("infos of the empty archive", moa.infos)
+print("infos of the constrained archive", cmoa.infos)
-
-
infos of the empty archive [] -infos of the constrained archive ['c', 'b'] +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).
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).
moa.add([1, 2, 3], "a")
-print("points:", list(moa))
-print("infos:", moa.infos)
-
-moa.add_list([[3, 2, 1], [2, 3, 2], [2, 2, 2]], ["b", "c", "d"])
-print("points:", list(moa))
-print("infos:", moa.infos)
+
+moa.add([1, 2, 3], "a")
+print("points:", list(moa))
+print("infos:", moa.infos)
+
+moa.add_list([[3, 2, 1], [2, 3, 2], [2, 2, 2]], ["b", "c", "d"])
+print("points:", list(moa))
+print("infos:", moa.infos)
-
-
points: [[1, 2, 3]] -infos: ['a'] +infos: ['a'] points: [[3, 2, 1], [2, 2, 2], [1, 2, 3]] -infos: ['b', 'd', 'a'] +infos: ['b', 'd', 'a']
When adding to the constrained archive, constraint values must be added as well.
-cmoa.add_list([[3, 3, 3], [1, 1, 1]], [[0, 0], [42, 0]], ["e", "f"])
-print("points:", list(cmoa))
-print("infos:", cmoa.infos)
+
+cmoa.add_list([[3, 3, 3], [1, 1, 1]], [[0, 0], [42, 0]], ["e", "f"])
+print("points:", list(cmoa))
+print("infos:", cmoa.infos)
-
-
points: [[4, 3, 2], [3, 3, 3], [1, 3, 4]] -infos: ['c', 'e', 'b'] +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.
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.
print("Points in the archive:", list(moa))
-print("Length of the archive:", len(moa))
-print("[2, 2, 2] in moa:", [2, 2, 2] in moa)
-print("[3, 2, 0] in moa:", [3, 2, 0] in moa)
+
+print("Points in the archive:", list(moa))
+print("Length of the archive:", len(moa))
+print("[2, 2, 2] in moa:", [2, 2, 2] in moa)
+print("[3, 2, 0] in moa:", [3, 2, 0] in moa)
-
-
Points in the archive: [[3, 2, 1], [2, 2, 2], [1, 2, 3]] Length of the archive: 3 [2, 2, 2] in moa: True @@ -15034,316 +7882,316 @@5. Archive size -
+---6. Performance indicators¶
An archive provides the following performance indicators:
++6. Performance indicators and normalization¶
An archive provides the following performance indicators:
-
hypervolumehypervolume_plus, providing additionally the closest distance to the reference area for an empty archive, see here and herehypervolume_plus_constr(for CMOArchive), based on, but not completely equal to the one defined hereIndicators are defined for maximization (the original
- +hypervolume_plus_constrindicator 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_constrindicator 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 usingideal_pointkeyword or later usingideal_pointmethod. Custom weights for each dimension can be set in the same way usingweightskeyword or method. The default weights are equal to 1 for all objectives.-++-In [8]:+In [30]:-- +-print("Hypervolume of the archive:", moa.hypervolume) -print("Hypervolume plus of the archive:", moa.hypervolume_plus) ++- -# 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.
+++++++++In [31]:++++++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_constrattribute can be accessed as well.-++-In [9]:+In [32]:-- +-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) ++- -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: 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 +++++++++In [33]:++++++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_hypervolumesattribute provides a list of hypervolume contributions for each point of the archive. Alternatively, the contribution for a single point can be computed using thecontributing_hypervolume(point)method.+7. Contributing hypervolumes¶
The
contributing_hypervolumesattribute provides a list of hypervolume contributions for each point of the archive. Alternatively, the contribution for a single point can be computed using thecontributing_hypervolume(point)method.-++-In [10]:+In [34]:-- +-for i, objectives in enumerate(moa): ++- -for i, objectives in enumerate(moa): assert moa.contributing_hypervolume(objectives) == moa.contributing_hypervolumes[i] - print("contributing hv of point", objectives, "is", moa.contributing_hypervolume(objectives)) + print("contributing hv of point", objectives, "is", moa.contributing_hypervolume(objectives)) -print("All contributing hypervolumes:", moa.contributing_hypervolumes) +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.+8. Hypervolume improvement¶
The
hypervolume_improvement(point)method returns the improvement of the hypervolume if we would add the point to the archive.-++-In [11]:+In [35]:-- +-point = [1, 3, 0] -print(f"hypervolume before adding {point}: {moa.hypervolume}") -print(f"hypervolume improvement of point {point}: {moa.hypervolume_improvement(point)}") ++- -point = [1, 3, 0] +print(f"hypervolume before adding {point}: {moa.hypervolume}") +print(f"hypervolume improvement of point {point}: {moa.hypervolume_improvement(point)}") moa.add(point) -print(f"hypervolume after adding {point}: {moa.hypervolume}") +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.+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.-++-In [12]:+In [36]:-- +-print(f"Current archive: {list(moa)}") -print("Distance of [3, 2, 1] to pareto front:", moa.distance_to_pareto_front([3, 2, 1])) -print("Distance of [3, 2, 2] to pareto front:", moa.distance_to_pareto_front([3, 3, 3])) ++- -print(f"Current archive: {list(moa)}") +print("Distance of [3, 2, 1] to pareto front:", moa.distance_to_pareto_front([3, 2, 1])) +print("Distance of [3, 2, 2] to pareto front:", moa.distance_to_pareto_front([3, 3, 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_typeandhypervolume_computation_float_typefunction attributes.+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_typeandhypervolume_computation_float_typefunction attributes.-++-In [13]:+In [37]:-- +-import fractions ++- -import fractions get_mo_archive.hypervolume_computation_float_type = fractions.Fraction get_mo_archive.hypervolume_final_float_type = fractions.Fraction @@ -15356,89 +8204,67 @@10. Enabling or disabling fractions 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]) print(moa3_nofr.hypervolume)
- ---- - - - - --+ +-161245156349030777798724819133399/10141204801825835211973625643008 15.899999999999999-+---11. Additional functions¶
MOArchive also implements additional functions to check whether a given point is in the archive:
++11. Additional functions¶
MOArchive also implements additional functions to check whether a given point is in the archive:
-
in_domain: Is the point in the domain?dominates: Is the point dominated by the archive?dominators: Which points (and how many) dominate the given point?-++-In [14]:+In [38]:-- +-points_list = [[5, 5, 0], [2, 2, 3], [0, 2, 3]] -print("archive:", list(moa), "\n") -print("point | in domain | dominates | num of dominators | dominators") -print("----------|-----------|-----------|-------------------|-----------") ++- -points_list = [[5, 5, 0], [2, 2, 3], [0, 2, 3]] +print("archive:", list(moa), "\n") +print("point | in domain | dominates | num of dominators | dominators") +print("----------|-----------|-----------|-------------------|-----------") for point in points_list: - print(f"{point} | {moa.in_domain(point):9} | {moa.dominates(point):9} | " - f"{moa.dominators(point, number_only=True):17} | {moa.dominators(point)}") + print(f"{point} | {moa.in_domain(point):9} | {moa.dominates(point):9} | " + f"{moa.dominators(point, number_only=True):17} | {moa.dominators(point)}")- - --+---12. Visualization of indicator values¶
By saving the values of indicators for each solution added to the archive, we can visualize their change over time.
- ++12. Visualization of indicator values¶
By saving the values of indicators for each solution added to the archive, we can visualize their change over time.
-++-In [15]:+In [48]:-- --import matplotlib.pyplot as plt ++- -import matplotlib.pyplot as plt import random n_obj = 3 @@ -15488,133 +8310,111 @@12. Visualization of indicator va objectives = [random.random() for _ in range(n_obj)] constraints = [max(random.random() - 0.1, 0), max(random.random() - 0.1, 0)] - cmoa.add(objectives, constraints, info=f"point_{i}") - moa.add(objectives, info=f"point_{i}") + cmoa.add(objectives, constraints, info=f"point_{i}") + moa.add(objectives, info=f"point_{i}") indicators_cmoa.append((cmoa.hypervolume_plus_constr, cmoa.hypervolume_plus, cmoa.hypervolume)) indicators_moa.append((moa.hypervolume_plus, moa.hypervolume))
-+++-In [16]:+In [49]:-- +-fig, axs = plt.subplots(1, 2, figsize=(10, 5)) -axs[0].plot([x[2] for x in indicators_cmoa], label="hypervolume") -axs[0].plot([x[1] for x in indicators_cmoa], label="hypervolume_plus") -axs[0].plot([x[0] for x in indicators_cmoa], label="hypervolume_plus_constr") -axs[0].axhline(0, color="black", linestyle="--", zorder=0) -axs[0].axhline(-cmoa.tau, color="black", linestyle="--", zorder=0) -axs[0].set_title("Constrained MOArchive") ++- -fig, axs = plt.subplots(1, 2, figsize=(10, 5)) +axs[0].plot([x[2] for x in indicators_cmoa], label="hypervolume") +axs[0].plot([x[1] for x in indicators_cmoa], label="hypervolume_plus") +axs[0].plot([x[0] for x in indicators_cmoa], label="hypervolume_plus_constr") +axs[0].axhline(0, color="black", linestyle="--", zorder=0) +axs[0].axhline(-cmoa.tau, color="black", linestyle="--", zorder=0) +axs[0].set_title("Constrained MOArchive") axs[0].legend() -axs[1].plot([x[1] for x in indicators_moa], label="hypervolume") -axs[1].plot([x[0] for x in indicators_moa], label="hypervolume_plus") -axs[1].set_title("MOArchive") -axs[1].axhline(0, color="black", linestyle="--", zorder=0) +axs[1].plot([x[1] for x in indicators_moa], label="hypervolume") +axs[1].plot([x[0] for x in indicators_moa], label="hypervolume_plus") +axs[1].set_title("MOArchive") +axs[1].axhline(0, color="black", linestyle="--", zorder=0) axs[1].legend() plt.show()- ---- - - - - - - ----+ +
+-
--++-In [17]:+In [41]:-- +-import time ++- -import time from moarchiving.tests.point_sampling import get_non_dominated_points test_archive_sizes = [0] + [2 ** i for i in range(21)] get_mo_archive.hypervolume_computation_float_type = fractions.Fraction get_mo_archive.hypervolume_final_float_type = fractions.Fraction--++-In [18]:+In [42]:-- +-n_repeats = 100 ++- -n_repeats = 100 time_limit = 10 for n_obj in [2, 3, 4]: - print(f"Testing {n_obj} objectives") + print(f"Testing {n_obj} objectives") times = [] archive_sizes = [] @@ -15627,46 +8427,37 @@13.1. Initializing the archivet1 = time.time() times.append(max((t1 - t0) / n_repeats, 10e-4)) - print(".", end="") + print(".", end="") archive_sizes.append(archive_size) if t1 - t0 > time_limit: break print() - plt.plot(archive_sizes, times, '-o', label=f"{n_obj} objectives") + plt.plot(archive_sizes, times, '-o', label=f"{n_obj} objectives") -plt.title("Initialization and hypervolume computation") -plt.xlabel("Archive size") -plt.ylabel("Time [s]") -plt.yscale("log") -plt.xscale("log") +plt.title("Initialization and hypervolume computation") +plt.xlabel("Archive size") +plt.ylabel("Time [s]") +plt.yscale("log") +plt.xscale("log") plt.grid(True) plt.legend() plt.show()
- --- - - - - -+ +--Testing 2 objectives -............... +.............. Testing 3 objectives ............. Testing 4 objectives @@ -15674,52 +8465,38 @@13.1. Initializing the archive - - - - - - - -
--+ +
+-
-+ --++-In [19]:+In [43]:-- +-n_repeats = 10 ++- -n_repeats = 10 time_limit = 10 for n_obj in [2, 3, 4]: - print(f"Testing {n_obj} objectives") + print(f"Testing {n_obj} objectives") times = [] archive_sizes = [] @@ -15735,7 +8512,7 @@13.2. Adding a solution t1 = time.time() times.append(max((t1 - t0) / n_repeats, 10e-4)) - print(".", end="") + print(".", end="") archive_sizes.append(archive_size) if t1 - t0 > time_limit: @@ -15743,37 +8520,28 @@
13.2. Adding a solution print() time.sleep(1) - plt.plot(archive_sizes, times, '-o', label=f"{n_obj} objectives") + plt.plot(archive_sizes, times, '-o', label=f"{n_obj} objectives") -plt.title("Adding a point to the archive") -plt.xlabel("Archive size") -plt.ylabel("Time [s]") -plt.yscale("log") -plt.xscale("log") +plt.title("Adding a point to the archive") +plt.xlabel("Archive size") +plt.ylabel("Time [s]") +plt.yscale("log") +plt.xscale("log") plt.grid(True) plt.legend() plt.show()
- --+ - - - - - - - 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/w5bm44iIqMqYIBEREVV3pZMa1fcHBkQ5tChERLUd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", - "text/plain": [ - "- - - - - --+ +-Testing 2 objectives ...................... Testing 3 objectives @@ -15783,35 +8551,15 @@13.2. Adding a solution
- - - - - - - ----+ +
+-![]()
" - ] - }, - "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/Ea53DmyatasWcrf318ZDIYcozbyGj2zYcMG1bhxY+Xg4KAqV66s3njjDfXLL7/kGgVSkFFjQL7/sjKkpaWp119/XVWuXFk5ODioZs2aqXXr1uV5/O3bt6umTZsqe3t7BWTfV17D55VSasGCBapRo0bKzs5Oubu7q759+2aPXLqfxzYve/fuVa1bt1ZOTk7Ky8tLPffccyo0NDTPkUoFvZ9Lly6pJ598Urm4uChXV1f15JNPqr179xZq1Njtrx+l8h/Jo5RSu3btUoCaNm1ansfkn+HRc+fOVQEBAcrW1lbVrVtXLV26NNe+V69eVePGjVP+/v7K1tZWeXp6qubNm6t33nkne7RS1uih6dOn5/t7xMfHK0dHxzyH+Gc5evSo6tOnj3J3d1d2dnaqcePGuR6fvEYqKaXUpk2bVJMmTZSjo6OqUaOG+uKLL/J9P90+NPxu+bMe49unFFBKqd27d6vHHntMeXp6KltbW1W5cmX12GOP5dovLzdu3FDjx49X1apVU7a2tsrb21s99thj6uTJk9n7XL9+Xb300kuqYsWKysbGRvn5+am33norexh6Uf0uHTp0UPXr11e7du1SLVq0UPb29qpixYrq7bffVhkZGTluHx0drQYMGKA8PT2Vu7u7+r//+z914MCBXM9FWlqaeu6555SXl5fS6XQ53scF/SyKi4tTAwYMUB4eHtnHuP13vvPzsCCvm/yey/xeT+LedEopVYx1lhBC3LfXXnuNefPmcfHixTxbCnU6HUFBQXzxxRcapBOWomPHjly7do1jx45pHUWUQnJqTAhhcfbt28fp06eZO3cuL774Yp5FkBBCFAUphIQQFqd169Y4OTnRu3dvpk6dqnUcIUQZJqfGhBBCCGG1ZPi8EEIIIayWFEJCCCGEsFpSCAkhhBDCakln6XswmUxERUXh6uqa77T7QgghhLAsSikSExOpVKkSen3+7T5SCN1DVFRUrtWAhRBCCFE6XLx48a4zx0shdA+urq6A+YF0c3MrsuNmZGSwdetWunfvnu+K2KJ0kOeybJHns+yQ57LsuJ/nMiEhgapVq2Z/j+dHCqF7yDod5ubmVuSFkJOTE25ubvIGLeXkuSxb5PksO+S5LDse5Lm8V7cW6SwthBBCCKslhZAQQgghrJacGisCJpOJ9PT0Qt0mIyMDGxsbUlNTMRqNxZRMlISs5zItLQ29Xo/BYNA6khBCiAKSQugBpaenExERgclkKtTtlFL4+vpy8eJFGZZfymU9lxcuXECn0+Hh4YGvr688r0IIUQpIIfQAlFJER0djMBioWrXqXecpuJPJZCIpKQkXF5dC3U5Ynqzn0tnZmdTUVGJjYwGoWLGixsmEEELcixRCDyAzM5Pk5GQqVaqEk5NToW6bdTrNwcFBCqFSLuu5dHR0xNnZGYDY2Fi8vb3lNJkQQlg4+QZ+AFl9e+zs7DROIixJVlGckZGhcRIhhBD3IoVQPoKDgwkMDKRly5b33Ff6gojbyetBCCFKDymE8hEUFER4eDghISFaRxFCWCijyUhITAib/t5ESEwIRpOMABWitJE+QkIIcR+2R25n2v5pXEm+kr3Nx8mHN1u9SVe/rhomE0IUhrQIWQCjSfHnuev8FHaZP89dx2hSWke6LzqdjnXr1j3wPg9q8uTJNGnSpFjvQ1i37ZHbmbBrQo4iCCA2OZYJuyawPXK7RsmEEIUlhZDGNh+L4ZGPdzL4632MXxHG4K/38cjHO9l8LLrY7vOjjz6iZcuWuLq64u3tzRNPPMGpU6eK7f5uFx0dTc+ePYvseHkVVq+//jo7duwosvsQ4nZGk5Fp+6ehyP0HS9a2j/d/LKfJhCglpBDS0I5T1wladojo+NQc22PiUxn9fWixFUO7d+8mKCiIffv2sW3bNjIzM+nevTu3bt0qlvu7na+vL/b29sV6Hy4uLpQvX75Y70NYr9DY0FwtQbdTKGKSYwiNDS3BVEKI+yWFUBFSSpGcnlmgf4mpGXy87e88/qYke9vk9eEkpmYU6HhKFfx02ubNmxkxYgT169encePGLFy4kAsXLnDw4MG73m7evHkEBARgZ2dHnTp1WLJkSa59slp8HB0d8ff3Z/Xq1Tmuv7MF5/LlywwaNIhy5cpRvnx5+vbty/nz53Pc5ttvv6V+/frY29tTsWJFxo4dC0D16tUB6NevHzqdLvvn20+NbdmyBQcHB27evJnjmOPGjaNDhw7ZP+/du5f27dvj6OhI1apVGTduXI7CcO7cudSqVQsHBwd8fHwYMGDAXR8rUXZdTb5apPsJIbQlnaWLUEqGkcD3thTJsRQQk5BKw8lbC7R/+PuP4mR3f09nfHw8AJ6envnus3btWsaPH8+sWbPo2rUrGzduZOTIkVSpUoVOnTpl7/fuu+8ybdo0Zs+ezZIlSxg8eDANGjSgXr16uY6ZnJxMp06daNeuHXv27MHGxoapU6fSo0cPjhw5gp2dHfPmzWPChAlMmzaNnj17Eh8fzx9//AFASEgI3t7eLFy4kB49euQ5eWHXrl3x8PDgxx9/ZNSoUYB5/qdVq1bx/vvvA3D06FEeffRRPvjgA7755huuXr3K2LFjGTt2LAsXLuTAgQOMGzeOJUuW0KZNG+Li4vjtt9/u67EWpZ+Xk1eR7ieE0JYUQlZOKcWECRN45JFHaNCgQb77zZgxgxEjRjBmzBgAJkyYwL59+5gxY0aOQmjgwIE899xzAHzwwQds27aNzz//nLlz5+Y65ooVK9Dr9SxYsCB77p2FCxfi4eHBrl276N69O1OnTuW1115j/Pjx2bfLmtvJy8v8RZO1tldeDAYDgwYNYtmyZdmF0I4dO7hx4wYDBw4EYPr06QwZMoRXXnkFgFq1ajFnzhw6dOjAvHnzuHDhAs7OzvTu3RtXV1f8/Pxo2rTpvR9cUSY1826Gj5NPvqfHdOjwcfKhmXezEk4mhLgfUggVIUdbA+HvP1qgffedu8az3939VBTAopEtaeWff0vN7fd9P8aOHcuRI0f4/fff77rfiRMneOGFF3Jsa9u2LbNnz86xrXXr1rl+DgsLy/OYBw8e5OzZs7i6uubYnpqayrlz54iNjSUqKoouXboU8LfJ29ChQ2ndujVRUVFUqlSJpUuX0qtXL8qVK5cjx9KlS7Nvo5TCZDIRERFBt27d8PPzo0aNGvTo0YMePXrQr1+/Qi+rIsoGg97Am63e5NVdr+a6Toe5oJ/YaiIGvSyvIkRpIIVQEdLpdAU+PdWulhc+rnbEJqbn2U9IB/i6O9CulhcGffHMVPzyyy+zfv169uzZQ5UqVe65/50zJiulCjSLcn77mEwmmjdvnqMAyeLl5VVka7C1atWKgIAAVqxYwejRo1m7di0LFy7MkePFF19k3LhxuW5brVo17OzsCA0NZdeuXWzdupX33nuPyZMnExISgoeHR5FkFKVLV7+uBJYPJPx6eI7tPk4+TGw1UeYREqIUkUJIIwa9jv90rcHra0+igxzFUFbZMKlPYLEUQUopXn75ZdauXcuuXbvw9/e/523q1avH77//zrBhw7K37d27N1ffn3379uXYZ9++ffmeRmrWrBkrV67E29sbNze3PPepXr06O3bsyHH67Xa2trbZa77dzZAhQ1i6dClVqlRBr9fz2GOP5chx/Phxatasme/tbWxs6Nq1K127dmXSpEl4eHiwc+dO+vfvf8/7FmXP9ZTrnIozTzkxte1UbPW2eDl50cy7mbQECVHKyKgxDXWpU57gIU3xdXfIsd3X3YF5/9eMHg0qFsv9BgUF8f3337Ns2TJcXV2JiYkhJiaGlJSUfG/zxhtvsGjRIubPn8+ZM2f47LPPWLNmDa+//nqO/VavXs23337L6dOnmTRpEvv3788e5XWnoUOHUqFCBfr27ctvv/1GREQEu3fvZvz48Vy6dAkwjwD79NNPmTNnDmfOnCE0NJTPP/88+xhZhVJMTAw3btzIN//QoUMJDQ3lww8/ZMCAATg4/PuYT5w4kT///JOgoCDCwsI4c+YM69ev5+WXXwZg48aNzJkzh7CwMCIjI1m8eDEmk4k6derc+8EWZdKmiE0YlZEG5RvQt2ZfetXoRUvfllIECVEaKXFX8fHxClDx8fG5rktJSVHh4eEqJSWl0Mc1Go3qxo0bymg0qkyjSe09e02tO3RJ7T17TWUaTUURPV+YG6By/Vu4cOFdbzd37lxVo0YNZWtrq2rXrq0WL16c67jBwcGqW7duyt7eXvn5+anly5fn2mft2rXZP0dHR6thw4apChUqKHt7e1WjRg31/PPP53i858+fr+rUqaNsbW1VxYoV1csvv5x93fr161XNmjWVjY2N8vPzU0opNWnSJNW4ceNc+Vu2bKkAtXPnzlzX7d+/X3Xr1k25uLgoZ2dn1ahRI/Xhhx8qpZT67bffVIcOHVS5cuWUo6OjatSokVq5cmX2bW9/LpV6sNeF0F56erpat26dSk9Pz3efgesHqgaLGqhlJ5aVYDJRWAV5LkXpcD/P5d2+v2+nU6oQE9BYoYSEBNzd3YmPj891+iY1NZWIiAj8/f1ztDAUhMlkIiEhATc3tyLrC2Pp0tLScHBwYNu2bXTtWnb6UNz5XD7I60JoLyMjg02bNtGrVy9sbW1zXX/6xmmeXP8kNnobdg7cSTmHchqkFAVxr+dSlB7381ze7fv7dtJHSJSIhIQE1qxZg16vp27dulrHEeK+bTy3EYD2ldtLESREGSCFkCgRkyZNYtmyZXz88ccFGqEmhCXKNGWy8W9zIfR4zcc1TiOEKApSCIkSMXPmTGbOnKl1DCEeyF/Rf3E15Sru9u60r9xe6zhCiCJgHZ1ThBCiCKw/tx6AntV7YmuQPidClAVSCAkhRAEkpSex88JOAPrW7KtxGiFEUZFCSAghCmBb5DZSjan4u/tTv3x9reMIIYqIFEJCCFEAWafFHg94vEBLywghSgcphIQQ4h4uJV7iwJUD6NDRu0ZvreMIIYqQjBoTQoh7yBoy36piK3ydfTVOI0olkxEi90LSFXDxAb82IEuyWARpEcpHcHAwgYGBtGzZsvjvzGSEiN/g6A/m/5vuvYioJdLpdKxbt+6B93lQkydPpkmTJsV6H8J6KKXYcG4DYD4tJkShha+HWQ3gu97w4yjz/2c1MG+3YkaT4s9z1/kp7DJ/nruO0aTNQhfSIpSPoKAggoKCsqfoLjYnNsCWNyEh6t9tbpWgx8cQWDwfuvPmzWPevHmcP38egPr16/Pee+/Rs2fPYrm/20VHR1OuXNHNxqvT6Vi7di1PPPFE9rbXX389e8FUIR7U4auHuZB4AUcbR7pWKztLw4gSEr4eVg3DvKTjbRKizdufWlxsn/WWbPOxaKZsCCc6PjV7W0V3Byb1CSy2BcfzIy1CGrI9+wu61cNzFkHw7xukmP5aqFKlCtOmTePAgQMcOHCAzp0707dvX44fP14s93c7X19f7O3ti/U+XFxcKF++fLHeh7AeWZ2ku/l1w8nWSeM0olQxGWHzRHIVQfDvts1vltqzAPdr87FoRn8fmqMIAoiJT2X096FsPhZdonmkECpKSkH6rYL9S03A8dfJ3P0NMhFSEwp2vEKsndunTx969epF7dq1qV27Nh9++CEuLi7s27fvrrebN28eAQEB2NnZUadOHZYsWZJrn+joaHr27ImjoyP+/v6sXr06x/V3nhq7fPkygwYNoly5cpQvX56+fftmt1Rl+fbbb6lfvz729vZUrFiRsWPHAlC9enUA+vXrh06ny/759lNjW7ZswcHBgZs3b+Y45rhx4+jQoUP2z3v37qV9+/Y4OjpStWpVxo0bx61bt7Kvnzt3LrVq1cLBwQEfHx8GDBhw18dKlA1pxjQ2n98MQJ+APhqnEaVO5N7cf+jmoCDhsnk/K2E0KaZsCL/bNx9TNoSX6GkyOTVWlDKS4X+VCrTrvStQZX4DTatasPt+OwrsnAu2722MRiOrV6/m1q1btG7dOt/91q5dy/jx45k1axZdu3Zl48aNjBw5kipVqtCpU6fs/d59912mTZvG7NmzWbJkCYMHD6ZBgwbUq1cv1zGTk5Pp1KkT7dq1Y8+ePdjY2DB16lR69OjBkSNHsLOzY968eUyYMIFp06bRs2dP4uPj+eOPPwAICQnB29ubhQsX0qNHDwyG3B0Pu3btioeHBz/++COjRo3K/p1XrVrF+++/D8DRo0d59NFH+eCDD/jmm2+4evUqY8eOZezYsSxcuJADBw4wbtw4lixZQps2bYiLi+O3334r9GMtSp9dF3eRmJ6Ir7MvrXxbaR1HlDZJV4p2vzJgf0Rcrpag2ykgOj6V/RFxtA4omZZ9KYSs1NGjR2ndujWpqam4uLiwdu1aAgMD891/xowZjBgxgjFjxgAwYcIE9u3bx4wZM3IUQgMHDuS5554D4IMPPmDbtm18/vnnzJ07N9cxV6xYgV6vZ8GCBdnzsixcuBAPDw927dpF9+7dmTp1Kq+99hrjx4/Pvl1WB3YvLy8APDw88PXNeySPwWBg0KBBLFu2LLsQ2rFjBzdu3GDgwIEATJ8+nSFDhvDKK68AUKtWLebMmUOHDh2YN28eFy5cwNnZmd69e+Pq6oqfnx9Nmza994MsSr2sTtK9a/RGr5MGdFFILj5Fu18ZEJuYfxF0P/sVBSmEipKtk7llpgBMEb+jX/7UvXcc+oN5mGVB7rsQ6tSpQ1hYGDdv3uTHH39k+PDh7N69O99i6MSJE7zwwgs5trVt25bZs2fn2HZnq1Lr1q0JCwvL85gHDx7k7NmzuLq65tiemprKuXPniI2NJSoqii5duhTqd7vT0KFDad26NVFRUVSqVImlS5fSq1ev7E7bWTmWLl2afRulFCaTiYiICLp164afnx81atSgR48e9OjRg379+uHkJP1FyrK41Dh+v/w7IKfFxH2q1hpsHCEzJZ8ddObBMQX5jC8jvF0dinS/oiCFUFHS6Qp+eiqgMyaXiuiSYtDlebb0nzdIQOdimWvCzs6OmjVrAtCiRQtCQkKYPXs2X375Zb63uXM2XaVUgWbYzW8fk8lE8+bNcxQgWby8vNDri+Yv8FatWhEQEMCKFSsYPXo0a9euZeHChTlyvPjii4wbNy7XbatVq4adnR2hoaHs2rWLrVu38t577zF58mRCQkLw8PAokozC8vxy/heMykjDCg2p4V5D6ziiNDq48O5FEECPaVY1n1DL6uVwtDOQkp53B3Ed4OvuQCt/zxLLJG29WtEbSOk46Z8f7iwUSv4NopQiLS0t3+vr1avH77//nmPb3r17c/X9ubPD9b59+6hbt26ex2zWrBlnzpzB29ubmjVr5vjn7u6Oq6sr1atXZ8eOHfnmsrW1xWi894iLIUOGsHTpUjZs2IBer+exxx7LkeP48eO5MtSsWRM7OzsAbGxs6Nq1K5988glHjhzh/Pnz7Ny58573K0qvnyN+BqQ1SNynSwdg81vmy02GmP+wvZ1bJascOr/g94i7FkEAk/oEYtCX3DI20iKkoYyaPVEDv0OX5zxC04rtDfL222/Ts2dPqlatSmJiIitWrGDXrl1s3rw539u88cYbPPXUUzRr1owuXbqwYcMG1qxZw/bt23Pst3r1alq0aMEjjzzC0qVL2b9/P998802exxw6dCjTp0+nb9++vP/++1SpUoULFy6wZs0a3njjDapUqcLkyZN56aWX8Pb2pmfPniQmJvLHH39kzxOUVSi1bdsWe3v7fOcoGjp0KFOmTOHDDz9kwIABODj82+w6ceJEHn74YYKCgnj++edxdnbmxIkT2f2bNm7cyN9//0379u0pV64cmzZtwmQyUadOncI+9KKUiDHGcDLxJDZ6G3pWL/75tUQZkxwHq4aDKQPqPQ5954IyWf3M0j8fiWbaLycBGNi8Cr+fvZaj47SvRvMISSGktXp9oF7vEn2DXLlyhWeeeYbo6Gjc3d1p1KgRmzdvplu3bvne5oknnmD27NlMnz6dcePG4e/vz8KFC+nYsWOO/aZMmcKKFSsYM2YMvr6+LF26NN9+R05OTuzZs4eJEyfSv39/EhMTqVy5Ml26dMHNzQ2A4cOHk5qaysyZM3n99depUKFCjqHrn376KRMmTODrr7+mcuXKuYbeZ6lVqxYtW7YkJCSEWbNm5biuUaNG7N69m3feeYd27dqhlCIgIIBBgwYB5s7Ya9asYfLkyaSmplKrVi2WL19O/fqyAnlZFZYeBkCHKh3wcPDQNIsoZUwmWPM8JFwCzwDoG2zuNqEzgH87rdNp5mDkDV5dFQbAiDbVmfx4fYwmxf6IOGITU/F2NZ8OK8mWoCw6pQoxAY0VyppZOj4+PvvLOUtqaioRERH4+/vnaGEoCJPJREJCAm5ubkXWF8bSpaWl4eDgwLZt2+jatezM0Hvnc/kgrwuhvZS0FDqv7EySSmJWp1l0qfZgnfWFdjIyMti0aRO9evXC1ta2ZO509yfw64fmTtLPbQffBiVzvxYs8vot+s3dS9ytdLrW8+bLZ1oUuuC5n+fybt/ft5MWIVEiEhISWLNmDXq9Pt8+Q0JYgv0x+0lSSXjYe9C+cnut44jS5Nyv8Ov/zJd7fyZFEHDjVjojF4YQdyudhpXdmTO4qSatPncjhZAoEZMmTWLZsmV8/PHHVKlSRes4QuRrY4R5pflH/R7F1lBCrQii9Iu/bF5QFQXNhpk7SFu5tEwjLy45yN/XblHZw5FvhrfAyc7yyg7LSyTKpJkzZzJz5kytYwhxV0npSfx66VcAevv31jiNKDWMGfDDSEi+Dr4NoecnWifSnFKK//xwhP3n43C1t+HbES3xdrPMrgLW0TlFCCEKYFvkNtKMaXjpvQj0zH+mdSFy2DYJLv4F9u7mIfG2jlon0tzMbaf5KSwKG72Ouf/XjDq+rve+kUakEBJCiH9krTTfxK5JgSYLFYLj62BfsPlyv3ngKZNvrj5wkTk7zwLwYb8GtKvlpXGiu5NCSAghgEuJlzhw5QA6dDS2a6x1HFEaXDsLP401X247Huo+dvf9rcAfZ6/x1pqjAAR1CmBQy2oaJ7o3KYSEEALY+Le5k3RLn5Z46D20DSMsX3oyrBoG6Yng1xY6v6d1Is2duZLIS98fJNOk6NO4Eq91Kx2TzkohJISwekqpHCvNC3FXSsHPr0HscXD2hgHfgsG6xx7FJqYyYmEIiamZtPArx/QBjdBb2DD5/EghJISweoevHuZC4gUcbRzpXKWz1nGEpQtdDIeXgU5vLoJcfbVOpKmUdCPPf3eAyzdTqF7eia+GtcDBtvQsHyKFkAUwmoyExISw6e9NhMSEYDTdexFRS6TT6Vi3bt0D7/OgJk+eTJMmTYr1PkTZktVJuptfN5xsnTROIyxaVBhsesN8ufO7Vr1sBoDRpBi/4hCHL8VTzsmWhSNb4elsp3WsQpFCSGPbL2zn0R8f5dktzzLxt4k8u+VZHv3xUbZHbr/3jYvARx99hE6n45VXXimR+4uOjqZnz6JbxDKvwur111+/64r1QtwuzZjG5vPmBYcfD7CulcBFIaXcMPcLMqZB7Z7Q9hWtE2nuf5tOsDX8CnY2er4e1gL/Cs5aRyo0KYQ0tDtqN6/vfp0ryVdybI9NjmXCrgnFXgyFhITw1Vdf0ahRo2K9n9v5+vpib29frPfh4uJC+fLli/U+RNmx6+IuEtMT8XX2paVvS63jCEulFKwbAzcjwaOaeai8lawTmZ/v9p7nm98jAPh0YGNaVPfUONH9se5nsYgppUjOSC7Qv8S0RGYdnYUi95q36p//pu2fRmJaYoGOV9i1c5OSkhg6dChff/015cqVK9Bt5s2bR0BAAHZ2dtSpU4clS5bk2ierxcfR0RF/f39Wr16d4/o7W3AuX77MoEGDKFeuHOXLl6dv3765VpD/9ttvqV+/Pvb29lSsWJGxY83DVatXrw5Av3790Ol02T/ffmpsy5YtODg4cPPmzRzHHDduHB06dMj+ee/evbRv3x5HR0eqVq3KuHHjuHXrVvb1c+fOpVatWjg4OODj48OAAQMK9JgJy3d7J2m9Tj4SRT7+mA2nNoHBzjxpomPBPjfLqh0nrjBlw3EA3ni0Dn0aV9I40f2z7m7uRSwlM4WHlj1UZMe7knyFNivaFGjfv4b8Vai+DUFBQTz22GN07dqVqVOn3nP/tWvXMn78eGbNmkXXrl3ZuHEjI0eOpEqVKnTq1Cl7v3fffZdp06Yxe/ZslixZwuDBg2nQoAH16tXLdczk5GQ6depEu3bt2LNnDzY2NkydOpUePXpw5MgR7OzsmDdvHhMmTGDatGn07NmT+Ph4/vjjD8DcouXt7c3ChQvp0aMHBkPuznldu3bFw8ODH3/8kVGjRgFgNBpZtWoV77//PgBHjx7l0Ucf5YMPPuCbb77h6tWrjB07lrFjx7Jw4UIOHDjAuHHjWLJkCW3atCEuLo7ffvutwI+1sFzXU67z++XfAegT0EfjNMJinf8ddpg/L+j5CVRqqm0ejR27HM/YZYcwKRjUoipjOgZoHemBSCFkhVasWEFoaCghISEFvs2MGTMYMWIEY8aMAWDChAns27ePGTNm5CiEBg4cyHPPPQfABx98wLZt2/j888+ZO3dunjn0ej0LFizInsV34cKFeHh4sGvXLrp3787UqVN57bXXGD9+fPbtWrY0n77w8jLPVurh4YGvb96jNgwGA4MGDWLZsmXZhdCOHTu4ceMGAwcOBGD69OkMGTIku59UrVq1mDNnDh06dGDevHlcuHABZ2dnevfujaurK35+fjRtat0fhGXFpohNGJWRhhUaUsNdZgQWeUi8Aj88C8oIjZ6G5iO0TqSpqJspPLsohJQMI+1qVWBqvwalfhZ2KYSKkKONI38N+atA+x6IPkDQr0H33G9ul7k092leoPsuiIsXLzJ+/Hi2bt2Kg0PBF8A7ceIEL7zwQo5tbdu2Zfbs2Tm2tW7dOtfPYWFheR7z4MGDnD17FlfXnGvQpKamcu7cOWJjY4mKiqJLly4FzpmXoUOH0rp1a6KioqhUqRJLly6lV69e2acEs3IsXbo0+zZKKUwmExEREXTr1g0/Pz9q1KhBjx496NGjB/369cPJSUYXlXZZp8WkNUjkyZhpLoKSroB3IPT+DEr5l/6DSEzN4NlFIcQmplHHx5Xgoc2wNZT+08lSCBUhnU5X4NNTrSu1xsvBi2up1/LsJ6RDh4+TD20qtcGgL7r5GA4ePEhsbCzNm/9bXBmNRvbs2cMXX3xBWlpanqeYgFxVv1KqQH8J5LePyWSiefPmOQqQLF5eXuiLqCNiq1atCAgIYMWKFYwePZq1a9eycOHCHDlefPFFxo0bl+u21apVw87OjtDQUHbt2sXWrVt57733mDx5MiEhIXh4eBRJRlHyTt84zYm4E9jobehZvehGMooy5NepEPk72LmY+wXZlb4RUUUlw2hizNJQTsYk4uVqz7cjW+LmYKt1rCJR+ku5UsqgNzC+ofl0j46chULWzxNbTSzSIgigS5cuHD16lLCwsOx/LVq0YOjQoYSFheVbBNWrV4/ff/89x7a9e/fm6vuzb9++XD/XrVs3z2M2a9aMM2fO4O3tTc2aNXP8c3d3x9XVlerVq991KLytrS1G473nXRoyZAhLly5lw4YN6PV6Hnvs3zWBmjVrxvHjx3NlqFmzJnZ25vkwbGxs6Nq1K5988glHjhzh/Pnz7Ny58573KyxXVmtQhyod8HDw0DaMsDwnN8HvM82X+34BFWppm0dDSineXXeM385cw9HWwLfDW1LZo2BnIUoDKYQ01KFSB2Z0mIG3k3eO7T5OPnzW8TO6+nUt8vt0dXWlQYMGOf45OztTvnx5GjRokO/t3njjDRYtWsT8+fM5c+YMn332GWvWrOH111/Psd/q1av59ttvOX36NJMmTWL//v3Zo7zuNHToUCpUqEDfvn357bffiIiIYPfu3YwfP55Lly4B5hFgn376KXPmzOHMmTOEhoby+eefZx8jq1CKiYnhxo0b+eYfOnQooaGhfPjhhwwYMCDHacGJEyfy559/EhQURFhYGGfOnGH9+vW8/PLLAGzcuJE5c+YQFhZGZGQkixcvxmQyUadO6VhHR+SWacrMXltMTouJXOIiYN1L5ssPjYb6/bTNo7F5u8+xIuQieh18PrgpDau4ax2pSMmpMY11rdaVLtW6EBobytXkq3g5edHMu1mRtwQ9qCeeeILZs2czffp0xo0bh7+/PwsXLqRjx4459psyZQorVqxgzJgx+Pr6snTpUgIDA/M8ppOTE3v27GHixIn079+fxMREKleuTJcuXXBzcwNg+PDhpKamMnPmTF5//XUqVKiQY+j6p59+yoQJE/j666+pXLlyrqH3WWrVqkXLli0JCQlh1qxZOa5r1KgRu3fv5p133qFdu3YopQgICGDQoEGAuTP2mjVrmDx5MqmpqdSqVYvly5dTv379+3swheb+iv6LaynX8LD3oH3l9lrHEZYkIxVWD4fUeKjSCrq9r3UiTW04HMUnm08B8F7vQLoG+micqOjpVGEnoLEyCQkJuLu7Ex8fn/3lnCU1NZWIiAj8/f0L1fEYzP1SEhIScHNzK7K+MJYuLS0NBwcHtm3bRteuRd/apZU7n8sHeV2IkvGfPf/hl4hfGFx3MG8/9HaO6zIyMti0aRO9evXC1rZs9IGwVvf1XG4YDwcXgVN5eHEPuFcp1oyW7MD5OIYs+Iv0TBPPtvXnvT55/1FbEu7nubzb9/ftpEVIlIiEhATWrFmDXq/Pt8+QECUhKT2JnRfM/btkSQ2RQ9hycxGEDp5cYNVF0Plrt3h+8QHSM010C/ThncdyzwVXVkghJErEpEmTWLZsGR9//DFVqljvh4vQ3rbIbaQZ0/B396d+eTm9Kf5x5ThsfNV8ueNbENBZ2zwaunErnZGLQriRnEGjKu7MfroJBn3ZnTZACiFRImbOnMnMmTO1jiEEP537CTC3BpX2ieBEEUlNgJXPQGYKBHSB9m9onUgzaZlGXlxykIhrt6js4ciC4S1wsivbpYJVdE7p168f5cqVk/WhhLBylxIvcfDKQXTo6F2jt9ZxhCVQCta/DHHnwK0K9P/aahdTNZkUb6w+wv7zcbg62LBwZEu8Xct+P0ereLbHjRvH4sWLi+340t9c3M5kMmkdQeQja8h8q4qt8HXOe1kWYWX+mg/h60BvCwMXgXN5rRNp5rNtp1l/OAobvY75/9ec2j6u975RGVC227v+0alTJ3bt2lXkx7W1tUWn03H16lW8vLwK1cxuMplIT08nNTXVakaNlVVZz2VKSgqZmZlcvXoVvV6fPRmjsAxKqexJFPsG9NU4jbAIF/fD1v+aLz/6IVRtqW0eDa0KucgXv54F4KP+DWlbs4LGiUqO5oXQnj17mD59OgcPHiQ6Opq1a9fyxBNP5Nhn7ty5TJ8+nejoaOrXr8+sWbNo166dNoFvYzAYqFKlCpcuXcp3/pr8KKVISUnB0dFR+imUcnc+l05OTlSrVk0KXAtz+OphLiRewNHGkS7VHmz9OlEG3LoGq0eAKRPq94dWL9zzJmXV72eu8fbaowC83LkmA1tU1ThRydK8ELp16xaNGzdm5MiRPPnkk7muX7lyJa+88gpz586lbdu2fPnll/Ts2ZPw8HCqVasGQPPmzUlLS8t1261bt1KpUqVize/i4kKtWrXIyMgo1O0yMjLYs2cP7du3l7lKSrms57JDhw7Y29tjY2Mjxa0FWn9uPQDd/LoVeE1AUUaZjPDjc5BwGcrXgsfnWM1iqkaTYn9EHLGJqXi7OuDhZMvo7w+SaVL0bVKJCd1qax2xxGleCPXs2ZOePfNf8PCzzz5j1KhRPPfccwDMmjWLLVu2MG/ePD766CPAvJBoUUlLS8tRVCUkJADmL7u7FTv5rdGVH5PJRGZmJgaDodC3FZYl67nMagHKzMzUOJG4U5oxjc0RmwHo5dfrru/lrOsK+8eNsDz5PZf6PR9j+PtXlK0TmU8uBL0DWMHzveX4FaZuOklMwr/fcXodmBS08PPgw76BFvv5dT/vy4Luq3khdDfp6ekcPHiQN998M8f27t27s3fv3mK5z48++ogpU6bk2r5161acnIr+r8ht27YV+TGFNuS5tFzH0o+RmJGIu86d2IOxbNJtuudt5PksO25/Lr0TjvDwuU8BCK00jEshfwN/a5Ss5By+ruPb01mn6/9t/TIpAEVtm+vs2LpZi2iFUpj3ZXJycoH2s+hC6Nq1axiNRnx8cq5t4uPjQ0xMTIGP8+ijjxIaGsqtW7eoUqUKa9eupWXLvDvFvfXWW0yYMCH754SEBKpWrUr37t3vOkV3YWVkZLBt2za6desmp8ZKOXkuLd+WXVsgGfrX60/vJncfNi/PZ9mR67mMv4TNN6+gQ2FsNoJGPafSSOuQJcBoUnz06R4gdxcSMx2/XnPivWHtLXbixPt5X2ad0bkXiy6EstzZ30IpVag+GFu2bCnwvvb29tjb2+fabmtrWywfisV1XFHy5Lm0TNdTrrM32tyC/ETtJwr8HMnzWQaYjJRPPIHd6RRsXHxg5weQEgeVmmLo9QkGG+t4fg+cu57jdFheouPTOHQpkdYBlj19QGHelwXdz6ILoQoVKmAwGHK1/sTGxuZqJRJCiLxsitiEURlpWKEhNdxraB1HlJTw9dj8MpFHEqPg7G3bbZ1g4Hdgk/sP3rIqNjG1SPcrayx6fK+dnR3NmzfPdU5w27ZttGnTRqNUQojSJGvuoD4BfTROIkpM+HpYNQwSo3Jfl5EM0YdLPpOGCjo7tDXMIp0XzVuEkpKSOHv233I9IiKCsLAwPD09qVatGhMmTOCZZ56hRYsWtG7dmq+++ooLFy7w0ksvaZhaCFEanL5xmhNxJ7DR29Czev6jU0UZYjLC5omAIu8OFDrY/CbUfQz01jFit5W/J77uDsTE593iowN83R1o5e9ZssEshOaF0IEDB+jUqVP2z1kdlYcPH86iRYsYNGgQ169f5/333yc6OpoGDRqwadMm/Pz8ijVXcHAwwcHBGI3GYr0fIUTxyWoN6lClAx4OHtqGESUjci8k5NESlE2Z5w+K3Av+2k/MWxIMeh2d6nixfP/FXNdlFYuT+gRabEfp4qZ5IdSxY8d7rtU1ZswYxowZU0KJzIKCgggKCiIhIQF3d/cSvW8hxIPLNGVmry0mp8WsSNKVot2vDDhzJZE1oZcBcHWwITH137mCfN0dmNQnkB4NKmoVT3OaF0JCCFEc/or+i2sp1/Cw96B95fZaxxElxaWAA2kKul8pl5phZNyKMNIyTbSv7cU3w1pwIPJG9szSrfw9rbYlKIsUQkKIMumncz8B0NO/J7YG6xgmLQC/NuDoaR4mnycduFUy72cFPtl8ihPRCZR3tmPGwEbY2ugtfoh8SbPoUWNCCHE/ktKT2HlhJwCPBzyucRpRouL+howUAHJ3uvin5aPHNKvoKL3rVCzf/hEBwPSBjax2VNi9SCEkhChztkVuI82YRg33GtQvX1/rOKKkpMbD8sGQmQIV6oDrHf1e3CrBU4shsOwXx9eS0nh99REAhrf2o3Nd6zgVeD/k1JgQoszJOi3WJ6BPoWahF6WYyQRrXoTrZ8CtMozYSKatG3+tnsXDDapj417ZfDrMClqClFK8sfow15LSqOPjylu96mkdyaJJIZQPGT4vROl0KfESB68cRIeO3jXuvq6YKEN2T4PTv4DBHgZ9Dy7ekJHBddd6qPq9wIqWS1n8ZyS/nrqKnY2eOYOb4mBb9ou/ByGnxvIRFBREeHg4ISEhWkcRQhRC1pD5hyo+hK+zr8ZpRIk4sQF2f2y+3Gc2VG6mbR4NnYxJ4MNNJwB4p1c96vi6apzI8kkhJIQoM5RS2ZMoSidpKxF7Atb+s9LAw2OgyWBt82goNcPI+OVhpGea6FzXm2Gti3fi4bJCCiEhRJlx+OphLiRewNHGkS7VumgdRxS3lBuwYgikJ4F/e+j2gdaJNPXRphOcupJIBRd7PhnQSPrHFZAUQkKIMmP9ufUAdPPrhpOtk8ZpRLEyGeHH58zD5d2rwYBFYLDebq87T17huz8jAZgxsBEVXOw1TlR6SCEkhCgT0oxpbD6/GZDTYlZh51Q4ux1sHOHp78HZeicJjE1M5Y1/hso/29afjnW8NU5UukghJIQoE3Zd3EVieiK+zr609G2pdRxRnI6tgd8/M1/u+wVUbKxtHg2ZTIrXVx/h+q106lV0Y2LPOlpHKnWkEBJClAlZnaT71OiDXicfbWVWzDH4Kch8uc04aDhA2zwaW7j3PHtOX8XeRs+cp5tgbyND5QtLPi3yERwcTGBgIC1byl+WQli66ynX+f3y7wD0DpC5g8qs5Dhz5+iMZAjoDF0na51IU8ej4vn4l5MAvNs7kFo+MlT+fkghlA+ZR0iI0mNTxCaMykjDCg2p4V5D6ziiOBgz4YeRcDMSylWHJ7+xilmi85OSbmT8ijDSjSa6Bfow9KFqWkcqtaQQEkKUejJ3kBXYPgn+3gW2zvD0MnDy1DqRpqb+HM7Z2CS8Xe35+EkZKv8gpBASQpRqp2+c5kTcCWz0NvSo3kPrOKI4HFkFf35hvtxvHvhY90K6W4/HsPSvCwB89lQTPJ3tNE5UukkhJIQo1bJagzpU6YCHg4e2YUTRiwqD9S+bL7d7DQL7ahpHa1cSUpn4o3mo/Avta/BIrQoaJyr9pBASQpRamabM7LXF5LRYGZR0FVYMhcxUqNUdOr2jdSJNmUyKCavCuJGcQYPKbrzeXYbKFwUphIQQpdZf0X9xLeUaHvYetKvcTus4oigZM2D1CEi4BJ4B0P9rq+4cDbDg97/54+x1HG0NzH66KXY28hVeFORRFEKUWj+d+wmAnv49sTXYapxGFKmt/4XI38HOFQYvB0cPrRNp6tjleKZvOQXApD6BBHi5aJyo7LDehVmEEKWS0WQkNDaUiwkX2R65HZDTYmXOoaXw13zz5f5fgpd1nwJKTs9k3PJDZBgVPer7MqhlVa0jlSlSCOUjODiY4OBgjEaj1lGEEP/YHrmdafuncSX5SvY2g85AdFI0DSo00DCZKDKXDsLGV82XO74FdR/TNo8FeH9DOH9fu4WvmwPTnmwoQ+WLmJway4dMqCiEZdkeuZ0JuybkKIIAjMrIa7tfy24dEqVY4hVY+X9gTIM6j0H7/2idSHO/HI1mRchFdDr4bFBjPJxkqHxRk0JICGHxjCYj0/ZPQ6Hy3efj/R9jNEkLbqmVmQ6rhkFiFFSoDf3mg966v6Kibqbw5pqjALzUIYA2ATJUvjhY96tMCFEqhMaG5moJup1CEZMcQ2hsaAmmEkVq80S4uA/s3eDp5eDgpnUiTRn/GSofn5JB4yruTOhWW+tIZZYUQkIIi3c1+WqR7icszIGFcOBbQAdPLoAKNbVOpLn5u8+x7+84nOzMQ+VtDfJ1XVzkkRVCWDwvJ68i3U9YkAt/waY3zJc7/xdqP6ptHgtw+OJNZm47DcDkx+tTvYKzxonKNimEhBAWr5l3M3ycfPK9XocOXydfmnk3K8FU4oElRMGqZ8CUYV46o91rWifSXFJaJuNXHCLTpHisUUUGNq+idaQyTwohIYTFM+gNvNnqzTyv02EeSjyx1UQMVj7zcKmSmQYrn4GkK+AdCH3nggwLZ/L645y/nkwldwf+94QMlS8JUggJIUqFyi6V89zu4+TDZx0/o6tf1xJOJO6bUvDzBLh8ABw84OmlYC8zJW84HMUPBy+h18Gsp5vi7iSzpZcEmVBRCGHxlFLMODADgB7Ve/BUnae4mnwVLycvmnk3k5ag0iZkARz6HnR6GPAteNbQOpHmLt1I5u215qHyQZ1q0srfU+NE1kMKISGExdt9aTf7Y/Zjp7fj1eavUsmlktaRxP06/wds/uc0Z9fJULOLpnEsgdGkeHVlGImpmTSt5sG4LrW0jmRV5NRYPoKDgwkMDKRly5ZaRxHCqmWYMvj0wKcA/F/g/0kRVJrFXzJPmmjKhAZPQptxWieyCMG/niXk/A1c7G2YPUiGypc0ebTzIUtsCGEZfjj9A+cTzlPOvhzPNXxO6zjifmWkwIqhkHwNfBvC419I52jgYOQNZu84A8D7fetTrbyTxomsjxRCQgiLlZieyLyweQCMaTIGVztXjROJ+6IUbBgP0WHg6AmDloKdfOEnpmbwyspDGE2Kvk0q0a9p3gMCRPGSQkgIYbEWHF3AjbQb+Lv7M6D2AK3jiPu1bx4cWQk6AwxcBOX8tE5kEd776TgX41KoUs6RD55oIEPlNSKdpYUQFuly0mW+D/8egNeav4aNXj6uSgWTESL3mucHcvEBYzps/a/5ukc/hBodtM1nIdYduszaQ5fR62D2001wc5Ch8lqRTxYhhEWaHTqbdFM6D/k+RPsq7bWOIwoifL158dSEqNs26gAFjQfDQy9plUxzRpNif0QcsYmp6IB3/hkqP65LLZr7yVB5LUkhJISwOEevHuWXiF/QoeP1lq/LKYPSIHy9eUQY6o4r/vm5Zler7Ry9+Vg0UzaEEx2fmmN7gJczYzvJArNakz5CQgiLopRi+oHpADwe8Dh1PetqnEjck8lobgnKVQRl0cG298z7WZnNx6IZ/X1oriII4NzVW2w/cUWDVOJ2UggJISzK9gvbORR7CEcbR15u+rLWcURBRO6943TYnRQkXDbvZ0WMJsWUDeF3Kw+ZsiEcoym/PURJkEJICGExMowZzDw4E4Dh9Yfj45z/ivPCgiQVsFWjoPuVEfsj4vJsCcqigOj4VPZHxJVcKJGLFEJCCIux/ORyLiZepIJjBUbWH6l1HFFQLgUsWAu6XxkRm5h/EXQ/+4niIYWQEMIixKfF8+WRLwF4uenLONnKhHulhl8bcPW9yw46cKts3s+KeLs6FOl+onhIISSEsAjzD88nIT2BWuVq0Tegr9ZxRGEok3nG6Dz9M1KsxzTQG0oskiVo5e+Jm0P+g7N1QEV3B1lpXmNSCAkhNHch4QIrTq0A4PXmr2Owsi/MUm/zWxAbDjYO4Oyd8zq3SvDUYgh8XJtsGvrz3HWS0jLzvC5rIoFJfQIx6K1zWgFLIfMI5SM4OJjg4GCMRusb7ilESZt5cCaZpkzaVm5Lm8rWdfqk1DvwLYR8DehgwLdQu0fOmaX92lhdSxDAuatJjFl6EJMytwxdiEsm5raO077uDkzqE0iPBhU1TClACqF8BQUFERQUREJCAu7u7lrHEaLMOnjlINsvbEev0/N689e1jiMKI+I32PSG+XLn/0Ldx8yX/dtpl8kC3ExO57nvDpCQmkmzah4sfrYVtgZ99szS3q7m02HSEmQZpBASQmjGpEzMCJkBQP9a/alZTmbZLTXiIswzSZsyocGT0O41rRNZhAyjiTFLQ4m4dovKHo58+UwLHGzNLWKtA8prnE7kRfoICSE080vELxy7fgwnGyeCmgRpHUcUVFoirBgCKXFQsQk8/oXVLp9xO6UUk9cfZ++56zjZGVgwvAVervZaxxL3IIWQEEITqZmpzA6dDcCohqOo4FhB40SiQEwmWPOCuXO0iw8MXg52MtUBwOI/I1n61wV0Opj9dFPqVXTTOpIoACmEhBCa+P7E90TfisbHyYdnAp/ROo4oqJ0fwKlNYLCHp5eZR4UJ9py+ypQNxwF4s0ddugVa1+SRpZkUQkKIEheXGseCowsAGN9sPI42jhonEgVy9Af4/TPz5cc/hyottM1jIc7GJhK0LBSTggHNq/BC+xpaRxKFIIWQEKLEzQ2by62MWwSWD+SxGo9pHUcUxOWD8NM//bjajofGg7TNYyFu3Epn1HcHSEzNpGX1cnzYrwE66S9VqkghJIQoUX/f/JsfTv8AwOstXkevk48hi5cQDSuGQmYq1HoUukzSOpFFSM808dL3B4m8nkyVco7M/7/m2NtY35xJpZ18AgkhStRnBz/DqIx0qtqJlr4ttY4j7iUjBVYOhcRo8KoLTy6wygkS76SUYtL6Y/wVEYeLvQ3fDG9JeRcZIVYaSSEkhCgxf0X/xe5Lu7HR2TCh+QSt44h7UQrWjzOfFnMsZx4h5iAjoQC+/eM8y/dfRKeDOYObUMfXVetI4j5JISSEKBFGk5EZB8yTJz5V5ymqu1fXNpC4tz9mwdFVoDPAwO/AUzoBA/x6MpYPfw4H4J1e9ehcV0aIlWZSCAkhSsSGvzdwMu4krrauvNT4Ja3jiHs59Qtsn2K+3PNjqNFB2zwW4vSVRF5efgiTgkEtqjLqEX+tI4kHJIWQEKLYJWck83no5wC80OgFyjmU0ziRuKvYE/Djc4CCFs9Cq+e1TmQRrielMeq7EJLSMmnl78kHT8gIsbJACiEhRLH7Lvw7YlNiqexSmSH1hmgdR9xNchwsfxrSk6B6O+j5idaJLEJappGXvj/IxbgUqnk6Mf//mmNnI1+hZYE8i0KIYnU1+SoLjy0E4JXmr2BnsNM4kciXMcO8kOqN8+DhZ+4XZLDVOpXmlFL8d+0xQs7fwNXehm+Gt8DTWV7HZYUUQkKIYvVF2BekZKbQ2Ksxj/o9qnUccTe/TITzv4GdCwxZCc6yWjrA17/9zeqDl9Dr4PMhTanlIyPEyhIphPIRHBxMYGAgLVvKPCdC3K9TcadYe2YtYJ48UfpTWLCQBXDgG0BnnivIu57WiSzCjhNX+OiXkwC82zuQjnW8NU4kipoUQvkICgoiPDyckJAQraMIUSoppfj0wKcoFN39utPEu4nWkUR+In4ztwYBdHkX6vTUNo+FOBmTwLjlh1AKhjxUjRFtqmsdSRQDKYSEEMXi98u/82f0n9jqbXml+StaxxH5iYuAVc+AKRMaDoRHZKJLgGtJaYxadIBb6UbaBJRnyuP1pUWzjJJCSAhR5DJNmXx64FMAhtQdQlXXqhonEnlKTYDlgyHlBlRqZl5RXr7sScs08uKSg1y+mUL18k7MHdoMW4N8XZZV8swKIYrcmjNrOBd/Dnd7d55vJHPQWCSTEda8AFdPgIsvPL0UbB21TqU5pRRvrTnKwcgbuDrY8M2Ilng4yQixskwKISFEkUpKTyI4LBiA0Y1H427vrnEikaedH8DpX8BgD08vA7dKWieyCPN3/82a0MsY9DrmDm1GgJeL1pFEMZNCSAhRpL499i1xqXH4ufnxVO2ntI4j8nJkFfw+03y5bzBUaa5tHgux5XgMn2wxjxCb1CeQdrW8NE4kSoIUQkKIIhNzK4bF4YsBeLX5q9jKZHyW59JB+Gms+fIjr0KjgdrmsRDHo+J5dWUYSsEzD/sxrHV1rSOJEiKFkBCiyMwJnUOaMY3mPs3pXLWz1nHEnRKiYMUQMKZB7Z7Q+T2tE1mE2MRUnv/uAMnpRh6pWYH3+gRqHUmUICmEhBBF4vj142z4ewMAb7R4Q4YaW5qMFHMRlBQDXvXgya9BL18BqRlGXlh8kKj4VGpUcCZ4iIwQszY2Bdlpzpw5hT7wyJEjcXWVaciFsAZKKWaEzACgd43e1K9QX+NEIgelzKfDog6BoycMXg728vmslGLij0cIu3gTd0dbvhnREncnOZ1rbQpUCL3yyitUqVIFg8FQoINevHiR3r17SyEkhJX49eKvHLhyAHuDPeObjdc6jrjT7zPh2A+gt4GnFoOnv9aJLELwr2f5KSwKG72OeUOb4V/BWetIQgMFKoQADhw4gLd3wdZYkQJICOuRYcpg5kHzCKRhgcPwdfbVOJHI4dQvsON98+Wen4B/O23zWIhfjkYzY+tpAKb0rU+bmhU0TiS0UqAToZMmTcLFpeBzKbz99tt4enredyghROmx6tQqziecx9PBk1ENR2kdR9zuSjj8+BygoOVz0FKeH4Bjl+N5dVUYACPaVGfoQ37aBhKaKlCL0KRJkwp10Lfeeuu+wgghSpeE9ATmH54PQFCTIJxt5dSCxbh1HZY/DelJUL0d9JimdSKLEJuQynPfHSA1w0T72l7897F6WkcSGivwqbEsKSkpKKVwcnICIDIykrVr1xIYGEj37t2LPKAQwnJ9feRrbqbdJMA9gP61+msdx7qZjBC5F5KugFN52DMDbkZCOX9zvyCZ04nUDCPPLz5ATEIqNb1d+GJIU2xkhJjVK3Qh1LdvX/r3789LL73EzZs3eeihh7C1teXatWt89tlnjB49ujhyCiEszKXESyw9sRSA11q8ho2+0B8noqiEr4fNE83zBN3OxsE8QszJOrsqGE2KM/E6NhyJpqKHE9/vi+TwpXg8nGz5ZngL3BykOBT3UQiFhoYyc6a5Y+QPP/yAj48Phw4d4scff+S9996TQkgIKzErdBYZpgxaV2zNI5Uf0TqO9QpfD6uGASr3dZmpcO0MeFvf6Z/Nx6KZvP44MQkGCD+avV2vg3lDm+NXXk7jCrNCtwkmJydnjwrbunUr/fv3R6/X8/DDDxMZGVnkAYUQlicsNowt57egQ8drLV6TyRO1YjKaW4LyKoIA0MHmN837WZHNx6IZ/X0oMQlpua4zKYhPSdcglbBUhS6Eatasybp167h48SJbtmzJ7hcUGxuLm5tbkQcUQlgWpRTTD0wH4ImaT1DHs47GiaxY5N7cp8NyUJBw2byflTCaFFM2hN+tNGTKhnCMpvz2ENam0IXQe++9x+uvv0716tV56KGHaN26NWBuHWratGmRBxRCWAajyUhITAjTQqZx5OoRHAwOjG06VutY1i3pStHuVwbsj4gjOj413+sVEB2fyv6IuJILJSxaofsIDRgwgEceeYTo6GgaN26cvb1Lly7069evSMMJISzD9sjtTNs/jSvJ/36hGvQGjlw9Qle/rhoms3IuPkW7XxkQm5h/EXQ/+4my777GDfr6+tK0aVP0ty3Y16pVK+rWrVtkwYQQlmF75HYm7JqQowgCuJVxiwm7JrA9crtGyQR+bcDubjP568Ctsnk/K+Ht6lCk+4myr0CFUP/+/UlISCjwQYcOHUpsbOx9hxJCWAajyci0/dNQ+fa4gI/3f4zRyjrjWowT6yE9MZ8r/+nA3mMa6Au2TmRZ0MrfExf7/E926ICK7g608rfOKQVEbgUqhH766SeuXr1KQkLCPf/Fx8ezYcMGkpKSijt7sQoODiYwMJCWLVtqHUUIzYTGhuZqCbqdQhGTHENobGgJphIARB+BdWPMl2v3BLdKOa93q2SeSDHw8ZLPpqGtx2NISsvM87qssY2T+gRi0MtIR2FWoD5CSilq165d3FksSlBQEEFBQSQkJODu7q51HCE0cTX5apHuJ4rIrWuwYihkJENAZxj0Peh0/84s7eJjPh1mRS1BkHMNsU51vTgRlZBjCL2vuwOT+gTSo0FFjRIKS1SgQujXX38t9IErV65c6NsIISyLl5NXke4nikBmunkCxfgL4BkAA74Fwz8f5Va8snxsQirPL/53DbGvn2lBZmYmX6zcTI36Tajo4Uwrf09pCRK5FKgQ6tChQ3HnEEJYoGbezfBx8sn39JgOHT5OPjTzblbCyazY5okQ+Ye5k/Tg5eBYTutEmkvNMPLCkoNEx6dSw8uZzweb1xBTJh213BW9GlXE1laW0xB5k9XmhBD5MugNvNj4xTyv0/3T42Jiq4kYrOwUjGZCvoED3wI6GPANeMlklkop3vzxCGEXb+LuaMs3w1vi7ihFjyg4KYSEEHd1LfkaALb6nF8uPk4+fNbxM5lHqKSc/wN++Y/5cpf3oPaj2uaxEPN2n2NdWBQGvY55Q5vhX0HWEBOFI8tFCyHyZTQZWXN2DQBT2kzB19mXq8lX8XLyopl3M2kJKik3L8CqZ8CUCQ2ehEde1TqRRdh6PIbpW04BMPnx+rSpWUHjRKI0kkJICJGvP6L+IOZWDO727nSv3h17g73WkaxP+i1YPgSSr0PFxvD4F+YRYlbuRHQCr6wMQyl45mE/nnnYT+tIopS6r1NjmZmZbN++nS+//JLERPNkXlFRUaV+7iAhRE4/nP4BgMcDHpciSAtKmecKunIUnL3g6WVg56R1Ks1dS0rjue8OkJxupG3N8rzXJ1DrSKIUK3SLUGRkJD169ODChQukpaXRrVs3XF1d+eSTT0hNTWX+/PnFkVMIUcJik2PZc2kPAANqDdA4jZX6bQaErwO9rXmuIPcqWifSXFqmkZeWHOTyzRSql3cieEgzbA3S3VXcv0K/esaPH0+LFi24ceMGjo6O2dv79evHjh07ijScEEI7686uw6iMNPNuRg2PGlrHsT4nN8HOqebLj30K1R7WNo8FUErxztpjHIi8gauDDQuGt8TDyU7rWKKUK3SL0O+//84ff/yBnV3OF5+fnx+XL18usmBCCO2YlIkfT/8IwIDa0hpU4mJPwJrnzZdbvQDNh2ubx0Is+C2CHw5eQq+D4CHNqOntonUkUQYUukXIZDJhNOZeYPHSpUu4ut5tFWQhRGnxZ9SfRN2KwtXOlW5+3bSOY12S42D5YEhPgurt4NH/aZ3IIuw8eYX//XICgHd7B9K+tsxmLopGoQuhbt26MWvWrOyfdTodSUlJTJo0iV69ehVlNiGERm7vJO1g46BxGitizIQfRsKNCPCoBgO/A4NMDnj6SiLjlptHiA1uVZURbaprHUmUIYU+NTZz5kw6depEYGAgqampDBkyhDNnzlChQgWWL19eHBmFECXoWso1dl3cBcCTtZ7UNIvV2fpf+HsX2DrD4BXgXF7rRJqLu5XOqO9CSErL5CF/T6Y83gCdTB8gilChC6FKlSoRFhbG8uXLCQ0NxWQyMWrUKIYOHZqj87QQonRad3YdmSqTxl6NqVWultZxrMeh7+GveebL/b8En/ra5rEA6ZkmRn9/kItxKVTzdGLe/zXHzkZGiImidV8TKjo6OvLss8/y7LPPFnUeIYSGpJO0Ri7uh43/zBbd8S2o10fbPBZAKcWk9cf4KyIOF3sbFgxvgaezjBATRe++CqHLly/zxx9/EBsbi8lkynHduHHjiiSYEKLk/RX9F5eSLuFi60J3v+5ax7EOCVGw8v/AmA51e0P7/2idyCIs2nue5fsvotPBnMFNqO0jg3FE8Sh0IbRw4UJeeukl7OzsKF++fI5ztTqdTgohIUqxH8+YW4Meq/EYTrYyg3Gxy0iBFUMg6Qp414d+X4JeTv3sPn2VDzaGA/B2z3p0ruujcSJRlhW6EHrvvfd47733eOutt9DLG1aIMuN6ynV2XDBPijqw9kCN01gBpWD9OIg6BI6eMHgZ2Mu8OGdjkxi7LBSTgoHNq/BcO3+tI4kyrtCVTHJyMk8//bQUQUKUMevPrSfTlEnDCg2p41lH6zhl397P4egq0Bngqe+gXHWtE2nuZnI6z30XQmJqJi38yjG1n4wQE8Wv0NXMqFGjWL16dXFkEUJoRCmVfVpMhsyXgDPbYfsk8+WeH4N/e23zWIAMo4mgZaGcv55MZQ9H5j/THHsbg9axhBUo9Kmxjz76iN69e7N582YaNmyIrW3Oyb4+++yzIgsnhCgZB64cIDIhEicbJ3r699Q6Ttl27Qz88CwoEzQbBi2f0zqRRXh/Qzh/nL2Ok52BBcNbUMHFXutIwkoUuhD63//+x5YtW6hTx9x0fmdnaSFE6bP6tLmVVzpJF7PUePPyGWnxUPVh6PUpyOcmS/48z5J9keh0MGtQE+pVdNM6krAihS6EPvvsM7799ltGjBhRDHGEECXtRuoNtkduB2TuoGJlMsIPo+D6GXCrAoOWgI3Mi/PH2WtM3mAeIfbGo3XoXt9X40TC2hS6j5C9vT1t27YtjixCCA1sOLeBDFMG9TzrEVg+UOs4ZdeOKXB2G9g4wtNLwcVb60Sai7h2izFLQzGaFP2aVmZ0hwCtIwkrVOhCaPz48Xz++efFkUUIUcKUUvxwxrzAqrQGFaMjq+GP2ebLTwRDpSaaxrEE8SkZjPouhPiUDJpU9eCj/g2le4XQRKFPje3fv5+dO3eyceNG6tevn6uz9Jo1a4osnBCieIXGhhIRH4GjjSO9/HtpHadsuhwK68eaLz8yARrIqLxMo4mXlx/i76u3qOjuwFfDmuNgKyPEhDYKXQh5eHjQv3//4sgihChhP5w2twb18u+Fi51M5lfkEq/AiqGQmQq1HoXO/9U6kUX4cNMJ9py+iqOtga+HtcDb1UHrSMKK3dcSG0KI0i8+LZ6t57cCMndQschMM68hlhgFFWrDk1+DXlo9lu+/wMI/zgPw2VONaVDZXdtAwurJ9NBCWKmNf28k3ZROnXJ1aFChgdZxyhal4OcJcGk/OLjD4BXm/1u5fX9f5911xwCY0K02PRtW1DiREAVsEWrWrBk7duygXLlyNG3a9K4d2kJDQ4ssnBCieCilsk+LDag9QDqpFrX9X8Gh70GnhwELobyMhrpwPZnR3x8k06To07gSL3euqXUkIYACFkJ9+/bF3t48y+cTTzxRnHmEECXg8NXDnL15FgeDA4/VeEzrOGXL37tg81vmy90+gJpdNI1jCRJTzSPEbiRn0KiKO9MHNJLiW1iMAhVCkyZN4tlnn2X27NlMmjSpuDMJIYpZVmvQo9UfxdXOVeM0ZUhcBKweAcoIjZ6G1kFaJ9Kc0aQYvyKMM7FJ+LjZ8/WwFjJCTFiUAneW/u6775g2bRqurvKhKURplpCewJbzWwCZO+iBmYwQuReSroC9K2x9D1JuQOXm0Ge2VS6fYTQp9kfEEZuYirerAztOXmHnyVjsbfR89UwLfNxkhJiwLAUuhJRSxZlDCFFCfv77Z1KNqdT0qEljr8Zaxym9wtfD5omQEJVzu4MHDFoKttb3hb/5WDRTNoQTHZ+a67oZAxvTuKpHyYcS4h4KNWpMzukKUbpJJ+kiEr4eVg3LXQQBpN6ESyElHklrm49FM/r70DyLIABbg7zWhGUqVCFUu3ZtPD097/rP0ly8eJGOHTsSGBhIo0aNWL16tdaRhNDMsWvHOH3jNPYGe3rX6K11nNLJZDS3BJFfK7kONr9p3s9KGE2KKRvC7/aIMGVDOEaTnFkQlqdQEypOmTIFd/fSNReGjY0Ns2bNokmTJsTGxtKsWTN69eqFs7Oz1tGEKHFZ64p19+uOu33pei9bjMi9ebcEZVOQcNm8n3+7Eoulpf0Rcfm2BIG5ZIyOT2V/RBytA8qXXDAhCqBQhdDTTz+Nt3fpWjG5YsWKVKxonrTL29sbT09P4uLipBASVicpPYlfIn4BpJP0A0m6UrT7lQGxifkXQfeznxAlqcCnxoqrL8GePXvo06cPlSpVQqfTsW7dulz7zJ07F39/fxwcHGjevDm//fbbfd3XgQMHMJlMVK1a9QFTC1H6bIrYREpmCjXca9DUu6nWcUovF5+i3a8MKOhaYbKmmLBEmo8au3XrFo0bN2bkyJE8+WTu9Y5WrlzJK6+8wty5c2nbti1ffvklPXv2JDw8nGrVqgHQvHlz0tLSct1269atVKpUCYDr168zbNgwFixYcNc8aWlpOY6VkJAAQEZGBhkZGff9e94p61hFeUyhjdLyXK4+Ze4f90TAE2RmZmqcxnLd8/n0aYKNwQ6dMT3PqxU6cKtEZqWWYOGviaLStIor7o42xKfk/brSAb7u9jSt4lqi75PS8t4U93Y/z2VB99UpCxoXr9PpWLt2bY7Zqx966CGaNWvGvHnzsrfVq1ePJ554go8++qhAx01LS6Nbt248//zzPPPMM3fdd/LkyUyZMiXX9mXLluHk5FSwX0QIC3M58zLzkuZhwMBEt4k46eW1fF+UosmFb/CL25PdMfj2tvKsbSH+LxPt0bKEw2knIhHmHDNgQof5Ucj9qDxb20Tj8hbzdSOsQHJyMkOGDCE+Ph43N7d89yv06vMlKT09nYMHD/Lmm2/m2N69e3f27t1boGMopRgxYgSdO3e+ZxEE8NZbbzFhwoTsnxMSEqhatSrdu3e/6wNZWBkZGWzbto1u3bpha2tbZMcVJa80PJdT90+Fs9DNrxsD2kr/oLu52/Op//0zDHF7UDo9pjbj0R9ZaV5dPotbZYzdPqRp3d5Yy8nHyzdTeH/+X5hIp1FlN2IT04hJ+LdVvaK7A+/0rMuj9Uv+VGFpeG+Kgrmf5zLrjM69WHQhdO3aNYxGIz4+Od9APj4+xMTEFOgYf/zxBytXrqRRo0bZ/Y+WLFlCw4YN89zf3t4+e12129na2hbLG6m4jitKnqU+l8kZyWw+vxmAp+o+ZZEZLVGu5/PIatj9PwB0PT/B0Op56PLuvzNLu/ig82uDjd56lo+4lZbJS0vDuH4rnXoV3Vj+QmscbA05ZpZu5e+JQa/tHEKW+t4UhVeY57Kg+1l0IZTlzo7aSqkCd95+5JFHMJlMxRFLiFLhl4hfSM5Mxs/NjxY+LbSOUzpF7oWfxpgvtx4LrZ43X9YbrGaI/J1MJsWrK8M4GZNIBRd7FgxvgbO9+StFhsiL0qRQEyqWtAoVKmAwGHK1/sTGxuZqJRJC5C17JulaMpP0fbl2BlYMAWM61HvcvKK8YMbWU2wNv4KdQc+XzzSnsoej1pGEuC8WXQjZ2dnRvHlztm3blmP7tm3baNOmjUaphCg9Tsad5Nj1Y9jobXi85uNaxyl9bl2DpQP+WUi1BfT/CvQW/bFZItYeusTcXecA+HhAQ5r7ldM4kRD3T/NTY0lJSZw9ezb754iICMLCwvD09KRatWpMmDCBZ555hhYtWtC6dWu++uorLly4wEsvvVSsuYKDgwkODsZotJ5p8kXZk9Ua1KVaFzwdLG8JHIuWkQLLB8ON8+DhB4NXgK20ehyMvMHEH48CMKZjAP2aVtE4kRAPRvNC6MCBA3Tq1Cn756wRW8OHD2fRokUMGjSI69ev8/777xMdHU2DBg3YtGkTfn5+xZorKCiIoKAgEhISSt2yIkKAuZP0z3//DMhM0oWmTBg2jIVL+82ryQ/9AVy8tE6lucs3U3hxyQHSM010D/Th9e51tI4kxAPTvBDq2LHjPSdrHDNmDGPGjCmhREKUDVvObyEpI4mqrlVp5dtK6zilSmDUavSxP4PeFp5eCl61tY6kuVtpmTz33QGuJZlHiM0c1AS9xqPBhCgKcrJbiDIqa4HV/rX6o9fJW72g9KGLqBVrbkmjbzBUf0TbQBYga4TYiegEKrjY5RghJkRpJ5+OQpRBp2+c5sjVI9jobHii5hNaxyk9zmxHv3kiAMb2E6HxII0DWYZPt90+QqyFjBATZYoUQkKUQT+e/hGATtU6UcGxgsZpSomYo7B6ODpl5ILnI5geeV3rRBZh3aHLBP9qHiE27UkZISbKHimEhChjUjJT2PD3BgCerJV7IWORh/jLsPQpSE/CVL0dYVWfBZlziUMXbvCfH48AMLpjAP2byQgxUfZIIZSP4OBgAgMDadnSehZOFGXDtshtJKYnUsm5Eq0rtdY6juVLS4Rlg8xrhnnVxfjkIpRe+r9E3Uzh+cUHSc800S3QhzdkhJgoo6QQykdQUBDh4eGEhIRoHUWIQsk6LfZk7Selk/S9GDNh9Qi4chScvWHIKnCQ6TKS07NGiKVR19eVWTJCTJRh8ikpRBly7uY5QmNDMegM0kn6XpSCX96As9vBxhGGrIByxTs/WWmQNUIsXEaICSshhZAQZUjWTNLtq7TH28lb4zQWbu/ncOBbQAcDvoHKzbVOZBE+23aaLcf/XUOsSjknrSMJUaykEBKijEgzpmV3kpaZpO/h+DrY9q75co+PoO5jmsaxFD+FXeaLX81LHn3UvyHN/WRZFlH2SSEkRBmxPXI78Wnx+Dr70rZSW63jWK6L+2Hti+bLrV6Eh0drm8dCHLpwgzd+MI8Qe7FDDZ5sLiPEhHWQQkiIMiLrtFj/Wv0x6A0ap7FQcX/D8qchMxVq9zS3BgmibqbwwhLzCLGu9bz5z6N1tY4kRImRQkiIMiAiPoIDVw6g1+npV7Of1nEsU3IcLB0IydehYhNzvyApGElOz+T5xQe4mvjPCLGnm2KQEWLCikghlA+ZR0iUJmvOrAGgXeV2+Dr7apzGAmWmwYqhcP0suFeFISvBzlnrVJozmRSvrTrM8agEyjubR4i5yAgxYWWkEMqHzCMkSot0Yzo/nf0JkE7SeVIKfgqCC3vB3s08V5CrFIsAM7ef5pdjMTJCTFg1KYSEKOV2XtjJjbQbeDt680hlWSk9l18/hKOrQW8DTy0Gn0CtE1mEn8Iu8/lO8wix//VvSIvqMkJMWCcphIQo5bI6Sfer1Q8bWRoip0Pfw57p5su9Z0FAJ03jWIqwizf/HSHWvgYDZISYsGJSCAlRil1IuMBfMX+hQ0f/Wv21jmNZ/t4FG8abL7d7HZo9o2kcSxEdn8Lziw+QnmmiS11v/tNDRogJ6yaFkBCl2I9nzOuKta3clkoulTROY0FiT8DKZ8CUCQ0HQuf/ap3IItw+QqyOjyuzB8sIMSGkEBKilMowZrDu7DoABtSSTtLZEq+Yh8mnJUC1NtA3GHTyZW8yKV5ffZhjl2WEmBC3k0JIiFLq14u/EpcaRwXHCrSv2l7rOJYh/RYsewriL4JnADy9FGzstU5lEWbtOMOmozHYGnTMf6Y5VT1lhJgQIIWQEKVW1mmxfjX7Yau31TiNBTAZ4cfnIDoMnMrD0NXgJCOhANYfjmLOjjMA/K9fQ1rKCDEhskkhJEQpdCnxEnuj9gJIJ+ksW96GU5vAYA9PL4fyAVonsghhF2/yxurDALzQvgYDW1TVOJEQlkUKoXzIzNLCkmXNJN26YmuquMrQZ/bNg7/mmy/3/xKqPaRtHgsRE5/KC4sPkPbPCLGJMkJMiFykp1w+goKCCAoKIiEhAXd3d63jCJEtw5TB2rNrASudSdpkhMi9kHQFXHwg5SZsfst8XdcpUF/WWgNISTfy/OIDxCamUdvHhVlPN5ERYkLkQQohIUqZPZf2cC3lGp4OnnSqamUTBIavh80TISEq93XNR0Lb8SWfyUIYTYr9EXHEJqbi5WLP9/siOXo5Hk9nO74Z3hJXB+lHJkRepBASopTJmkm6b82+2Bqs6MstfD2sGgaovK/372C1w+Q3H4tmyoZwouNTc2w36GH+/8kIMSHuRvoICVGKRCVF8cflPwB4staTGqcpQSajuSUovyIIHWx9x7yfldl8LJrR34fmKoIAjCaIu5WmQSohSg8phIQoRdacWYNC8ZDvQ/i5+Wkdp+RE7s37dFg2BQmXzftZEaNJMWVD+N3KQ6ZsCMdoym8PIYQUQkKUEpmmTOvtJJ10pWj3KyP2R8Tl2RKURQHR8ansj4gruVBClDJSCAlRSvx++Xdik2PxsPegc7XOWscpWS4+RbtfGRGbmH8RdD/7CWGNpBASopTI7iQd0Bc7g53GaUqYXxtw9b3LDjpwq2zez4p4uzoU6X5CWCMphIQoBWJuxfDb5d8AeLK2FXWSzqYDl/wKoX9GivWYBnpDiSWyBK38PXGxz/931gEV3R1o5S9LagiRHxk+L4QFM5qMhMaGsvzkckzKRHPv5vi7+2sdq+TtCzavIaa3AcdycOvqv9e5VTIXQYGPaxZPKxuPRJGUlvdIuayJBCb1CZSJFIW4CymE8hEcHExwcDBGo/UNxxWWYXvkdqbtn8aV5H87AJ+9eZbtkdvp6tdVw2Ql7GIIbJ9svtzzE2g+IufM0n5trK4lCODQhRu88cMRALoF+nDscnyOjtO+7g5M6hNIjwYVtYooRKkghVA+ZIkNoaXtkduZsGsC6o6B0fHp8UzYNYHPOn5mHcVQyg344VkwZZqXzmjxrHnSRP92WifTVNTNFJ5ffJD0TBNd6/kw//+aA2TPLO3taj4dJi1BQtybFEJCWBijyci0/dNyFUG3+3j/x3Sq2glDWW4JUQp+GgvxF6CcP/SZY7UzR9/uVlomo747wLWkNOr6uuZYQ6x1QHmN0wlR+khnaSEsTGhsaI7TYXdSKGKSYwiNDS3BVBr460s4uREMdjBwITi4aZ1IcyaT4tWVYZyITqCCix0LhrfAxV7+nhXiQUghJISFuZp89d47FWK/UulyKGz9r/ly96lQqam2eSzE9K2n2Bp+BTsbPV8+04Iq5WQNMSEelBRCQlgYLyevIt2v1EmNhx9GgikD6vaGVi9oncgi/HjwEvN2nQPgkycb0dyvnMaJhCgbpBASwsI0826Gj1P+MyTr0OHr5Esz72YlmKqEKAXrx8GN8+BRDfp+If2CgAPn43hrzVEAxnaqyRNNK2ucSIiyQwohISyMQW9geODwPK/T/TM7zMRWE8tmR+kD30L4OvN8QQMWmucMsnIX45J5cclB0o0metT3ZUK32lpHEqJMkUJICAt06OohAOwN9jm2+zj5lN2h89FHYPNb5stdp0CVFtrmsQCJqRk8990Brt9Kp0FlNz4b1Bi9DIkXokjJcAMhLEz49XC2RW5Dh47ve31PYnoiV5Ov4uXkRTPvZmWzJSgtEVaPAGMa1O4BrYO0TqQ5o0kxfkUYp64k4u1qz9fDWuBkJx/ZQhQ1eVcJYWGCw4IB6Onfk7qedTVOUwKUgo2vQtw5cKsCT8yTfkHAtF9OsPNkLPY2er4e1oKK7o5aRxKiTJJTY0JYkLDYMPZc2oNBZ2BMkzFaxykZh5bA0dWgM8CAb8BJFghdGXKBr3+LAODTpxrTuKqHtoGEKMOkEBLCgnwR9gUAfWv2xc/NT+M0JeBKOGz6j/ly5/9CtYe1zWMB9v19nXfWHgPgla616N2oksaJhCjbpBDKR3BwMIGBgbRs2VLrKMJK7I/ez1/Rf2Gjt+HFRi9qHaf4pd8y9wvKTIGALtD2Fa0TaS7y+i1e+v4gmSZF70YVGd+lltaRhCjzpBDKR1BQEOHh4YSEhGgdRVgBpVR2a9CAWgOo5GIFrQCb3oBrp8DFF/p9CXrr/jhKSM3g2UUh3EzOoHEVd2YMbIxO+koJUeys+5NHCAvxR9QfHIo9hL3BnucbPa91nOIXthzCloJOb+4X5FJGZ8kuoEyjibHLDnHu6i183Rz4elgLHGzL4OhAISyQFEJCaEwpxeeHPgfg6TpP4+3krXGiYnb1NPz8mvlyx7eg+iPa5rEAU38+wZ7TV3G0NbBgeAu83Ry0jiSE1ZBCSAiN7by4k/Dr4TjaOPJsw2e1jlO8MlLM/YIyboF/e2j3mtaJNPf9vkgW7T0PwMxBjWlQ2V3bQEJYGSmEhNCQSZn44pC5b9D/1fs/PB3K+NDxzW9C7HFw9ob+C6AsTg5ZCL+fucak9ccBeOPROvRoUFHjREJYHymEhNDQlvNbOHvzLK62rgyvn/f6YmXG0R/g4CJAB/2/Atf8F5a1Bn9fTWLM0oMYTYp+TSszpmOA1pGEsEpSCAmhkUxTJnPD5gIwvP5w3O3L8CmR6+dgw3jz5favQ0AnbfNoLD45g1HfHSAhNZNm1Tz4qH9DGSEmhEakEBJCIxv/3sj5hPN42Hvwf4H/p3Wc4pORCquHQ3oS+LWFDm9qnUhTGUYTY5YdJOLaLSp7OPLlMzJCTAgtSSEkhAYyjBnMPzwfgFENRuFs66xxomK09b8QcxScysOTC8BgvUscKqWYvP44f5y9jrOdeYSYl6u91rGEsGpSCAmhgbVn13I56TIVHCswqO4greMUn/CfIORr8+V+X4GbFUwUeRff7T3P0r8uoNPB7KebUq+im9aRhLB6UggJUcJSM1P58vCXADzf8HkcbcroquJxEfDTy+bLbV+BWl01jaO1XadieX9jOABv9axL10Dr7iwuhKWQQkiIErb69GpiU2LxdfZlQO0BWscpHpnp8MOzkBYPVR8yL6hqxc7GJvLyskOYFAxsXoXn29XQOpIQ4h9SCAlRgpIzkllwdAEALzV6CTuDncaJisn2yRAVCg4e8OQ3YLDVOpFm4m6l8+yiAySmZdKquicf9pMRYkJYEimEhChBy04uIy41jqquVXm85uNaxykeJzfBvmDz5X7zwaOqtnk0lJ5p4qXvD3IhLpmqno7Mf6Y5djbysSuEJZF3pBAlJDE9kYXHFgIwuvFobPVlsJXk5gVYN9p8+eEgqNNT2zwaUkrx33VH2R8Rh6u9Dd8Ob4mncxltARSiFJNCSIgSsjh8MQnpCQS4B9DLv5fWcYqeMQN+GAWpN6Fyc+g6WetEmvrm9whWHbiEXgdzhjSllo+r1pGEEHmQQigfwcHBBAYG0rJlS62jiDLgRuoNloQvASCoaRCGsrjG1s4P4NJ+sHeHAd+CjfW2fuw4cYUPN50A4L+PBdKpjrfGiYQQ+ZFCKB9BQUGEh4cTEhKidRRRBiw8vpBbGbeo51mPLtW6aB2n6J3eCn/MNl/u+wWUq65pHC2djElg3PJDKAWDW1VjZNvqWkcSQtyFFEJCFLNrKddYfmI5AGObjkWvK2Nvu/jLsPZF8+VWL0BgGe0EXgDXktIYtegAt9KNtAkoz/t968sIMSEsnPXOdS9ECVlwdAGpxlQaeTWiXeV2WscpWsZM+PE5SImDio2h+1StE5Uoo0mxPyKO2MRUyjnZMmv7GS7fTKF6eSfmDm2GraGMFb1ClEFSCAlRjGJuxbDq1CoAXm76ctlrHdg9DS7sBTtXGLAQbKxn3azNx6KZsiGc6PjUHNsdbPV8M6IlHk7W20dKiNJE/lwRohh9eeRLMkwZtPRtyUO+D2kdp2id+xX2zDBffnw2lA/QNk8J2nwsmtHfh+YqggBSM0ycuZKoQSohxP2QFiEhisnFhIusO7MOgLFNxpb+1iCTESL3QtIV80zRGycACpqPhAZPap2uxBhNiikbwlH5XK8DpmwIp1ugLwZ9KX/OhbACUggJUUzmH5lPpsqkbeW2NPNppnWcBxO+HjZPhISonNvdq0KPj7TJpJH9EXF5tgRlUUB0fCr7I+JoHVC+5IIJIe6LnBoTohj8ffNvNv69EYCXm7yscZoHFL4eVg3LXQQBxF+EM9tKPpOGYhPzL4LuZz8hhLakEBKiGMw9PBeTMtG5amfqV6ivdZz7ZzKaW4LudiJo85vm/ayEt6tDke4nhNCWFEJCFLFTcafYcn4LOnQENQ3SOs6Didybd0tQNgUJl837WYkWfuVwuMvCqTqgorsDrfw9Sy6UEOK+SSEkRBH7IuwLAHpU70HtcrU1TvOAkq4U7X5lwKwdp0nNNOV5XVbX6El9AqWjtBClhBRCQhSho1ePsuviLvQ6PaObjNY6zoNz8Sna/Uq5Hw9eIvjXcwCMaONHRfecp7983R2Y93/N6NGgohbxhBD3QUaNCVGEslqD+tTog7+7v8ZpioBfG7B3hbT85sXRgVsl835l3P6ION5ccwSAsZ1q8vqjdXi3d/3smaW9Xc2nw6QlSIjSRQohIYrIwdiD7I3ai43Ohpcav6R1nKJxYsPdiyCAHtNAbyixSFqIvH6LF5ccIMOo6NXQlwndzKc8DXqdDJEXopSTU2NCFAGlFHMPzwWgf63+VHGtonGiInD5IKz9p6Cr/ai55ed2bpXgqcVlfpHV+JQMnl0Uwo3kDBpVcefTgU3QS6uPEGWGtAgJUQTOZZ7jUPwh7PR2PN/oea3jPLj4S7B8MGSmQK1H4enl5u1ZM0u7+JhPh5XxlqAMo4mxy0I5d/UWFd0dWDCsBY52Zft3FsLaSCEkxANSSrE9dTsAT9V5Cl9nX40TPaC0JFj+tLng8a4PA775t+Dxb6dtthKklGLK+uP8duYaTnYGFgxvgbebzA0kRFkjp8aEeEB7Lu/hkvESDgYHRjUcpXWcB2MywprnIeYoOHvBkBXmztJW6Lt9F1j61wV0Opj9dFPqV3LXOpIQohhIi5AQD8CkTMw7Mg+AwXUGU8GxgsaJHtD2SXBqExjszafDPKppnUgTx2/oWLDvFABv96xHt0DrmB5ACGskLUJCPIBtkds4ffM09tgzrN4wreM8mIPfwd7PzZefmAtVW2qbRyOnYhL57rQek4KnW1bluXZlYBoEIUS+pBAS4j4ZTUaCw4IBaOvQFnf7UnzqJGIP/DzBfLnjW9BwgLZ5NHI1MY0Xvj9EmknHw/7leL9vA3Q6GSEmRFkmhZAQ9+nniJ+JiI/A3c6dNvaleELBa2dh5TNgyoQGA6DDRK0TaSI1w8gLSw4QFZ+Kl4Pi86ebYHeXNcWEEGWDvMuFuA8ZpgzmhpnnDRoeOBwHXSkdTZQcB8uegtSbUKUl9A0GK2wBUUrxxg9HOHThJu6ONrxQ14iHk63WsYQQJUAKISHuw7qz67icdJnyDuUZVHuQ1nHuT2Y6rBoGcefAvSo8vQxsS2lB94BmbT/DhsNR2Oh1fPF0E7wdtU4khCgpUgjlIzg4mMDAQFq2tM4OoyJ/acY0vjz8JQDPN3oeR5tS+K2plLlP0PnfwM4FhqwEF2+tU2nip7DLzN5xBoAP+zXg4RqeGicSQpQkKYTyERQURHh4OCEhIVpHERbmh9M/cCX5Cj5OPgyoXUo7Ff/5BRxaAjo9DPgWfOprnUgTByNv8MYP5oVUX2xfg0EtrXO6ACGsmRRCQhRCckYyXx/5GoAXG7+IvcFe40T34eQm2Pqu+fKj/zOvI2aFLsYl8+KSA6RnmugW6MN/etTVOpIQQgNSCAlRCCtOreB66nWquFThiZpPaB2n8KKPwI/PAQpaPAsPvaR1Ik0kpmbw3HcHuJaUTmBFN2YNaoJBFlIVwipJISREASWlJ/HtsW8BGN1kNLb6UjaqKDHGvIZYxi2o0RF6fmKVI8QyjSZeXn6IU1cS8Xa155sRLXC2l0n2hbBWUggJUUBLTiwhPi0ef3d/HvN/TOs4hZOebF5NPuEyVKgNA78DQykr5IrI1J9PsOvUVRxs9SwY3oKK7qWws7sQoshIISREAcSnxbP4+GIAxjQZgyFrNfbSwGSCdS9BVCg4eppHiDl6aJ1KE0v+PM+ivecB+OypJjSq4qFpHiGE9qQQEqIAFh1fRFJGErXL1aa7X3et4xTOrv9B+E+gt4VB34NnDa0TaWLP6atM3hAOwBuP1qFXw4oaJxJCWAIphIS4h+sp11l6YikAY5uMRa8rRW+bwythz3Tz5T6zoXpbbfNo5MyVRIKWhmI0Kfo3q8yYjgFaRxJCWIhS9IkuhDa+OfYNKZkpNCjfgI5VO2odp+Au7IP1Y82XH3kVmg7VNo9Griel8ex3ISSmZdKyejk+6t9QFlIVQmSTQkiIu7hy6worT64E4OWmL5eeL9C4CFgxBIzpULc3dH5P60SaSMs08tL3B7kYl0I1Tye+fKYF9jalqH+XEKLYyZhRIe5gNBkJjQ3lavJVNp/fTLopnWbezWhdqbXW0QomNd48TD75OlRsDP2/Ar31/c2jlOKtH48Scv4Grg42fDuiBZ7OdlrHEkJYGCmEhLjN9sjtTNs/jSvJV3Jsb12pdeloDTJmwuqRcPUkuFaEwSvAzlnrVJqYu+scaw5dxqDXETykGTW9XbWOJISwQNb3Z6IQ+dgeuZ0JuybkKoIA5obNZXvkdg1SFdKWt+DcDrB1MhdBbpW0TqSJTUejmb7lFACTH69P+9peGicSQlgqKYSEwHw6bNr+aShUvvt8vP9jjCZjCaYqpL++gv1fmS/3/woqNdE0jlYOX7zJhFVhAIxsW51nHvbTNpAQwqJJISQEEBobmmdLUBaFIiY5htDY0BJMVQhntsPmiebLXSdDvT6axtFK1M0Unlt8gNQME53qePHfxwK1jiSEsHBSCAkBXE2+WqT7lajYE/DDSFAmaDIU2r6idSJN3ErLZNR3B7iamEYdH1fmDG4qC6kKIe5JCiEhAE8HzwLt5+VkYX1Nbl2DZU9BWgL4tYXes6xyIVWjSTF+RRgnohOo4GLHguEtcHWwzrXUhBCFI6PGhNWLuRXDvMPz7rqPDh0+Tj40825WQqkKICPVPFfQzQtQzh+eWgI21jk8/OPNJ9l+4gp2Nnq+fKYFVT2dtI4khCglpBASVm3HhR1M2juJ+LR47PR2pJvS0aHL0Wlah7mFZWKriZaz2KpSsGEcXPwL7N1hyCpwLq91qhJhNCn2R8QRm5iKt6sDEdeS+GrP3wBMH9CI5n7lNE4ohChNpBASVik1M5UZB2aw8pR51uj65evzSftPOH3jdK55hHycfJjYaiJd/bpqFTe332bAkZWgM8BT34FXba0TlYjNx6KZsiGc6PjUXNeN71KLvk0qa5BKCFGaSSEkrM7ZG2d5Y88bnL15FoCR9UfyctOXsTXYUs2tGp2qdsqeWdrLyYtm3s0spyUI4Pha2DnVfLnXdAjopG2eErL5WDSjvw/Nd4KDur4yYaIQovCkEBJWQynFD2d+4JP9n5BqTKW8Q3n+98j/aFO5TY79DHoDLX1bapTyHi4fhLUvmS8/PAZajtI2TwkxmhRTNoTnWwTpgPc3htO9vq+MFBNCFIoUQsIqxKfFM+XPKWyL3AZA20ptmfrIVCo4VtA42T2YjBC5F5KugE4Pv0yEzFSo9Sh0n6p1uhKzPyIuz9NhWRQQHZ/K/og4WgdYR18pIUTRkEJIlHmhV0KZ+NtEYm7FYKO34ZVmr/BM4DPodRY+e0T4evMkiQlRObe7VYUB34Alna4rZtHxKQXaLzYx/2JJCCHyIoWQKLOMJiNfHf2K+YfnY1ImqrlW45P2n1C/Qn2to91b+HpYNQzyOhmUcAnO/QqBj5d4rJKWaTSx5tBlZvyzbti9eLs6FHMiIURZI4WQKJNibsXw5m9vcvDKQQAeD3ictx96G2fbUrASu8n4z3IZ+a97xuY3oe5jZbZVKNNoYl1YFJ/vPEPk9WQA9Dow5fOQ6ABfdwda+RdsYkwhhMgihZAoc3ZE7uC9ve+RkJ6Ak40T/334v/QJKEVrb0XuzX06LAcFCZfN+/m3K7FYJSHTaOKnfwqg8/8UQJ7OdrzYvga+7g68siIMyFkiZnWNntQnUDpKCyEKTQohUWbkNzdQNbdqGicroLREOPYj/DazYPsn5b9IbGmTaTSx/nAUn+88S8S1W4C5AHqhfQ2eedgPZ3vzR5W9jT7XPEK+7g5M6hNIjwYVNckuhCjdpBASZcLd5gayaEpBVCgc/M5cBKUnFfy2Lj7Fl6uEGE2K9Ycv8/mOs/z9TwFUzsmWF9oHMKz1vwVQlh4NKtIt0DfHzNKt/D2lJUgIcd+kEBKlmlKK1adX80nIJ6QZ0/KdG8jipMbDkVUQ+h3EHP13e/ma0PQZ2DfvnxafvDrF6MCtEvhZ+O94F0aTYuORKGbvOMPfV80FkIeTLS+0r8Gw1tVxsc//o8mg18kQeSFEkZFCSJRa8WnxTN47me0XtgOlYG4gpeDifji4yDw7dOY/Q8IN9hDYF5oPN68gr9OBZ41/Ro3pyLNHTI9ppbKjdFYBNGfHGc7dVgA9364Gw9vcvQASQojiIJ86olQ6eOUgb/72ZumYGyg5zrwu2MFFcPXkv9u96pmLn0aDwOmO0U6Bj8NTi3PPI+RWyVwElbKh80aT4uej0czZcYazsebTf+6Otjzfzp/hbarj6mDhpzCFEGWWFEKiVMlzbqAOn1C/vIXNDaQURP5hLn7C14MxzbzdxhEa9IfmI6BKS3PrT34CHzcPkc+aWdrFx3w6rBS1BJluK4DO/FMAuTnY8Hy7GoxoKwWQEEJ7UgiJUqNUzA2UdBUOL4PQxXD97L/bfRuai5+GA8HBveDH0xtK5RB5k0nxy7EYZu84zekr/xZAz/1TALlJASSEsBBSCIlS4c65gd5t/S69a/TWOpaZMuGVcAzDmh/h1CYwZZi327lAwwHQbDhUanr31p8ywmRSbD4ew+ztZzh1JREAVwcbRj3iz8i2/rg7SgEkhLAsZb4QSkxMpHPnzmRkZGA0Ghk3bhzPP/+8ppnS09NYu2se4VGhpP4aQb+Oo7Gzs9csy7rdXxKbcAFvt2o80eFFi8pi0qsccwM1KN+AT9p/QlW3qsWWw5iZycm/tpBy4zKO5SpT96FHMdjk8VZJjIFD32MTupg2NyP/3V65ubn4afAk2Ls8WBaTspih4nfLYjIpthyPYfaOM5yM+acAsrfh2Uf8efYRKYCEEJarzBdCTk5O7N69GycnJ5KTk2nQoAH9+/enfHltht9+9dM7LL+2jms2enCCNdGHmL/kawZXeIIX+n6oXRaAJJi35EuLyfLFki/R27lz3WT+Yh3ZYCQvNyneuYEObfmOSn9OoT7Xs7dd2VaeqNaTaProcPPyF2d3mIe9n/oFlBEdkGFwQt9kMIaWI82nwYrA5mPRuSYPrKjR5IH5ZXn3sUD0eh2ztp/OUQCNfMSfUW39cXeSAkgIYdnKfCFkMBhwcnICIDU1FaPRiFJ3WcOpGH310zt8ceMnlCHnX/TXDTq+uPET/ESJFSClIcsNgw5MiTjp7JjZ5fNinxvo0JbvaLx3nPmH26J4/X979x4U5XnvAfz7ymXBywpIRZCb8YIiAmUxEYypaAKElIhooyYhWk1TEONY60Ez1lsnKeVMtJlONCcajTGVlJiJ5jQlQSYlxYjGIIVEUZoYCKhcAl6Wy+G2POcPDntcdoFl2Zu738/MzvA+7/O87+/1N7A/n/cmmjCxaCNu1nwCH+U3vS897eM3D93hKcirdkZc/FI4OBnni//TS7VI+0uJ1lOE6u62I+0vJXjj2QizFUMDxVJ7tx3rs0vUy2Nljlg7PxBrH54Ct9HOZomNiGikLH6vcWFhIRITE+Hj4wNJknDq1CmtPgcOHMCUKVPg4uIChUKBM2fODGsfd+7cQVhYGHx9fZGRkQFPT/M/Z6azswPvNZ7q/TLpd62I+L/lvzaeQmdnB2PpI0mAEHDtakfkTxQmjUPV3Q2fc3sA9L7c8159yz7XP+ktglzdgXnpwPovgXV5EKEroBplvNOJqh6BPX8r1/koxb62PX8rh2qgN5Aa0WCx9JEArF84FV9sjcHm2CAWQUR0X7H4jFBrayvCwsLwy1/+EsuWLdNan5OTg02bNuHAgQOYP38+3nzzTTz++OMoLy+Hv3/vO6QUCgU6OrS/tE+fPg0fHx+4ubmhrKwM9fX1SE5OxvLly+Hlpfv1BB0dHRrbUiqVAIDnjyyAk6vhty23Sl1olA1cdwpJwo+OEp46GokxwrSnE+6nWCBJaHKU8LfXojBd5WayOGTdSgShSWMmqF8YAIC/uqzAaY9n0XXdGbh+B8B5CCHQ2DgKJxqKIRnhgug7bV0ap6D6E+idjUl6/Qu4mfjU01Cx9MUT/YA7xjhJ6OrqMmk85tB3DLZwLPaOubQdhuRS376SsNR5Ih0kScLJkyeRlJSkbnvooYcQERGBN954Q902a9YsJCUlITMzc9j7SEtLw6JFi/CLX/xC5/rdu3djz549Wu2z3pgFhxEUQjQyWQ2NSGhts3QY2Ni5Af/dc/++2sJUnpuugsLTav6UEBGhra0NTz/9NO7evQu5XD5gP4vPCA2ms7MTFy9exLZt2zTaY2NjUVRUpNc26uvr4erqCrlcDqVSicLCQqSlpQ3Y/6WXXsLmzZvVy0qlEn5+fnhO9ghcXAyf8r/R/B0+daoZsl98lx8mj5tm8H5sNZZ6t8X4cto8k8WhariK6Np3h+w3L3QmFkwN0RyrUuHSpUsICQmBg8PIi+VrP7bgvwqrhuyX+kggpv5kZHelGSuW2AUP4aEpHkP2ux90dXUhPz8fjz32GJyMdM0XWQZzaTsMyWXfGZ2hWHUh1NjYCJVKpXUay8vLC3V1dXpt4/r161i3bh2EEBBCYMOGDQgNDR2wv0wmg0ymfb3H+mX/OWhFOZTOzg4UvxuBJgdJfR3OvSQh4KkSeOW5kya/ff1+jOWZ1YdNGouquxv1L+fiJ6JJ6xohAOgRQIM0ASuWr9K6lb6rqwuu9d8gQeFnlD+2qh6Bj8rqUHe3faBXrmLSeBf8R3ywyW+l1zeWqGkTbe4N8E5OTvzytBHMpe0YTi717Wfxi6X10f+6CyGE3tdiKBQKlJaWoqysDF9//fWgs0Gm5OwswyrPJAC9X+736lte6Zlklmf4MBZtDo6OuBm1C0Bv0XOvvuXaqF26nydk7FhGSdiVGAxA+5KlvuVdiaYvgqwtFiIiU7DqQsjT0xMODg5asz8NDQ0DXuxszV5Y8go2uC/BBJXmN62nSmCD+xKzPruHsWj7adxqlEX/GT9Kms+YapAmoCz6z73PETKT+BBvvPFsBCaNd9FonzTexay3zltbLERExmbVp8acnZ2hUCiQn5+PpUuXqtvz8/OxZMkSC0ZmuBeWvII1nTt7nyx9rQTBUyMs9mTpvlis4cnS1hLLT+NWQ7X4GVzu92TpSWaYCeovPsQbjwVPsoonS1tTLERExmTxQqilpQXffff/L6esrKxEaWkpPDw84O/vj82bNyMlJQWRkZGIiorCwYMHUV1djdTUVAtGPTLOzjIkx6TD5X9ykRCTYNFz187OMjz12EaL7f9e1hKLg6MjZs9/wtJhAOg9NRU11TJPQe/PmmIhIjIWixdCxcXFiImJUS/33bG1evVqHD16FCtWrEBTUxN+//vfo7a2FiEhIcjNzUVAQIBJ49q/fz/2798PlUpl0v0QERGR5Vi8EFq4cOGQr7xYv3491q9fb6aIeqWnpyM9PR1KpRLjx483676JiIjIPKz6YmkiIiIiU2IhRERERHaLhRARERHZLRZCREREZLdYCBEREZHdYiE0gP379yM4OBhz5861dChERERkIiyEBpCeno7y8nJ89dVXlg6FiIiITMTizxGydn3POFIqlUbdbldXF9ra2qBUKvlW5Pscc2lbmE/bwVzaDkNy2fe9PdSzClkIDaG5uRkA4OfnZ+FIiIiIaLiam5sHfTCyJIYqlexcT08Pbt68iXHjxkGSel8wOXfu3AFPmQ20rn+7UqmEn58fampqIJfLTRP8MAx2TObe3nDG6tN3qD765mygdubSOGOtIZeAdeXT2LkcyTatJZeDrePvpvHH3c+5FEKgubkZPj4+GDVq4CuBOCM0hFGjRsHX11ejzcHBYcBEDLRuoHa5XG4Vv6CDHZO5tzecsfr0HarPcHPGXJpmrDXlErCOfBo7lyPZprXkcrB1/N00/rj7PZf6vCKLF0sbID09fdjrBhtjDYwd30i2N5yx+vQdqs9wc8ZcmmYsc6nNFPEZuk1ryeVg6+wtn8ylcfDUmIX0vcz17t27VvE/FTIcc2lbmE/bwVzaDlPmkjNCFiKTybBr1y7IZDJLh0IjxFzaFubTdjCXtsOUueSMEBEREdktzggRERGR3WIhRERERHaLhRARERHZLRZCREREZLdYCBEREZHdYiFkpT7++GMEBQVh+vTpeOuttywdDo3A0qVL4e7ujuXLl1s6FBqBmpoaLFy4EMHBwQgNDcWJEycsHRIZqLm5GXPnzkV4eDjmzJmDQ4cOWTokGqG2tjYEBARgy5Ytwx7L2+etUHd3N4KDg1FQUAC5XI6IiAh8+eWX8PDwsHRoZICCggK0tLTgnXfewQcffGDpcMhAtbW1qK+vR3h4OBoaGhAREYGKigqMGTPG0qHRMKlUKnR0dGD06NFoa2tDSEgIvvrqK0yYMMHSoZGBtm/fjm+//Rb+/v549dVXhzWWM0JW6MKFC5g9ezYmT56McePGISEhAXl5eZYOiwwUExODcePGWToMGiFvb2+Eh4cDACZOnAgPDw/cunXLskGRQRwcHDB69GgAQHt7O1QqFTgncP/69ttvcfXqVSQkJBg0noWQCRQWFiIxMRE+Pj6QJAmnTp3S6nPgwAFMmTIFLi4uUCgUOHPmjHrdzZs3MXnyZPWyr68vbty4YY7QqZ+R5pKshzFzWVxcjJ6eHvj5+Zk4atLFGLm8c+cOwsLC4Ovri4yMDHh6epoperqXMXK5ZcsWZGZmGhwDCyETaG1tRVhYGF5//XWd63NycrBp0yZs374d//rXv7BgwQI8/vjjqK6uBgCd/zORJMmkMZNuI80lWQ9j5bKpqQnPPfccDh48aI6wSQdj5NLNzQ1lZWWorKxEdnY26uvrzRU+3WOkufzoo48wY8YMzJgxw/AgBJkUAHHy5EmNtgcffFCkpqZqtM2cOVNs27ZNCCHE2bNnRVJSknrdxo0bxfHjx00eKw3OkFz2KSgoEMuWLTN1iKQnQ3PZ3t4uFixYII4dO2aOMEkPI/m97JOamiref/99U4VIejIkl9u2bRO+vr4iICBATJgwQcjlcrFnz55h7ZczQmbW2dmJixcvIjY2VqM9NjYWRUVFAIAHH3wQly5dwo0bN9Dc3Izc3FzExcVZIlwahD65pPuDPrkUQmDNmjVYtGgRUlJSLBEm6UGfXNbX10OpVALofat5YWEhgoKCzB4rDU6fXGZmZqKmpgZVVVV49dVX8atf/Qo7d+4c1n4cjRYx6aWxsREqlQpeXl4a7V5eXqirqwMAODo6Yu/evYiJiUFPTw8yMjJ4N4MV0ieXABAXF4eSkhK0trbC19cXJ0+exNy5c80dLg1Cn1yePXsWOTk5CA0NVV/H8O6772LOnDnmDpcGoU8ur1+/jnXr1kEIASEENmzYgNDQUEuES4PQ92/sSLEQspD+1/wIITTannzySTz55JPmDosMMFQuecff/WOwXD788MPo6emxRFhkgMFyqVAoUFpaaoGoyBBD/Y3ts2bNGoO2z1NjZubp6QkHBwetarahoUGr6iXrxlzaDubSdjCXtsNcuWQhZGbOzs5QKBTIz8/XaM/Pz0d0dLSFoiJDMJe2g7m0Hcyl7TBXLnlqzARaWlrw3XffqZcrKytRWloKDw8P+Pv7Y/PmzUhJSUFkZCSioqJw8OBBVFdXIzU11YJRky7Mpe1gLm0Hc2k7rCKXBt3jRoMqKCgQALQ+q1evVvfZv3+/CAgIEM7OziIiIkL885//tFzANCDm0nYwl7aDubQd1pBLvmuMiIiI7BavESIiIiK7xUKIiIiI7BYLISIiIrJbLISIiIjIbrEQIiIiIrvFQoiIiIjsFgshIiIislsshIiIiMhusRAiIiIiu8VCiIjuO1VVVZAkCaWlpQP2OXr0KNzc3MwWU3+ff/45JEnCnTt3LBYDEQ2NhRARmVxRUREcHBwQHx9vtn2uWLEC//73v822v/6io6NRW1uL8ePHWywGIhoaCyEiMrkjR47gxRdfxBdffIHq6upB+woh0N3dPeJ9urq6YuLEiSPejqGcnZ0xadIkSJJksRiIaGgshIjIpFpbW/H+++8jLS0NP//5z3H06FGN9X2nkPLy8hAZGQmZTIYzZ86gp6cHWVlZmDZtGmQyGfz9/fHKK69ojP3+++8RExOD0aNHIywsDOfOnVOvu/fUWEVFBSRJwtWrVzXG79u3D4GBgeh793R5eTkSEhIwduxYeHl5ISUlBY2NjQMe2w8//IDExES4u7tjzJgxmD17NnJzczWOq+/U2MKFCyFJktanqqoKAHD37l288MILmDhxIuRyORYtWoSysrLh/nMT0TCxECIik8rJyUFQUBCCgoLw7LPP4u2331YXHvfKyMhAZmYmrly5gtDQULz00kvIysrCjh07UF5ejuzsbHh5eWmM2b59O7Zs2YLS0lLMmDEDq1at0jmbFBQUBIVCgePHj2u0Z2dn4+mnn4YkSaitrcXPfvYzhIeHo7i4GJ9++inq6+vx1FNPDXhs6enp6OjoQGFhIb755htkZWVh7NixOvt++OGHqK2tVX+Sk5MRFBQELy8vCCHwxBNPoK6uDrm5ubh48SIiIiKwePFi3Lp1S59/ZiIylCAiMqHo6Gjx2muvCSGE6OrqEp6eniI/P1+9vqCgQAAQp06dUrcplUohk8nEoUOHdG6zsrJSABBvvfWWuu3y5csCgLhy5YoQQoi3335bjB8/Xr1+37594oEHHlAvV1RUCADi8uXLQgghduzYIWJjYzX2U1NTIwCIiooKnXHMmTNH7N69W+e6vuO6ffu21rp9+/YJNzc39XY/++wzIZfLRXt7u0a/qVOnijfffFPn9onIODgjREQmU1FRgQsXLmDlypUAAEdHR6xYsQJHjhzR6hsZGan++cqVK+jo6MDixYsH3X5oaKj6Z29vbwBAQ0ODzr4rV67EDz/8gPPnzwMAjh8/jvDwcAQHBwMALl68iIKCAowdO1b9mTlzJgDg2rVrOre5ceNGvPzyy5g/fz527dqFr7/+etB4AeCTTz7Btm3bkJOTgxkzZqj33dLSggkTJmjsv7KycsB9E5FxOFo6ACKyXYcPH0Z3dzcmT56sbhNCwMnJCbdv34a7u7u6fcyYMeqfXV1d9dq+k5OT+ue+i5J7enp09vX29kZMTAyys7Mxb948vPfee/j1r3+tXt/T04PExERkZWXpHKvL888/j7i4OPz973/H6dOnkZmZib179+LFF1/U2b+8vBwrV67EH//4R8TGxmrs29vbG59//rnWGEs+AoDIHnBGiIhMoru7G8eOHcPevXtRWlqq/pSVlSEgIEDrep17TZ8+Ha6urvjss8+MGtMzzzyDnJwcnDt3DteuXVPPVAFAREQELl++jMDAQEybNk3jc2+R1p+fnx9SU1Px4Ycf4re//S0OHTqks19TUxMSExORnJyM3/zmNxrrIiIiUFdXB0dHR619e3p6GufgiUgnFkJEZBIff/wxbt++jXXr1iEkJETjs3z5chw+fHjAsS4uLti6dSsyMjJw7NgxXLt2DefPnx90jD6Sk5OhVCqRlpaGmJgYjZmq9PR03Lp1C6tWrcKFCxfw/fff4/Tp01i7di1UKpXO7W3atAl5eXmorKxESUkJ/vGPf2DWrFkD7tvV1RW7d+9GXV2d+qNSqfDoo48iKioKSUlJyMvLQ1VVFYqKivC73/0OxcXFIzpmIhocT40RkUkcPnwYjz76qM4HCi5btgx/+MMfUFJSMuD4HTt2wNHRETt37sTNmzfh7e2N1NTUEcUkl8uRmJiIEydOaF2n5OPjg7Nnz2Lr1q2Ii4tDR0cHAgICEB8fj1GjdP+fUaVSIT09HdevX4dcLkd8fDz+9Kc/6exbWFgIAAgMDNRor6ysRGBgIHJzc7F9+3asXbsWP/74IyZNmoRHHnlE6045IjIuSQgd97ESERER2QGeGiMiIiK7xUKIiIiI7BYLISIiIrJbLISIiIjIbrEQIiIiIrvFQoiIiIjsFgshIiIislsshIiIiMhusRAiIiIiu8VCiIiIiOwWCyEiIiKyW/8Lmiw7lU629WMAAAAASUVORK5CYII=", - "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